Diferencia entre revisiones de «Acelerómetro»
Línea 34: | Línea 34: | ||
Y calcular las coordenadas en dicha base, por medio del producto interno. | Y calcular las coordenadas en dicha base, por medio del producto interno. | ||
− | Este método es el utilizado en el código de [[Archivo: | + | Este método es el utilizado en el código de [[Archivo:Need4Butia.tar.gz|need4Butiá]]. |
Revisión del 12:04 9 ago 2012
La página correspondiente de wikipedia define un acelerómetro como: "Se denomina acelerómetro a cualquier instrumento destinado a medir aceleraciones. Esto no es necesariamente la misma que la aceleración de coordenadas (cambio de la velocidad del dispositivo en el espacio), sino que es el tipo de aceleración asociadas con el fenómeno de peso experimentada por una masa de prueba que se encuentra en el marco de referencia del dispositivo. Un ejemplo en el que este tipo de aceleraciones son diferentes es cuando un acelerómetro medirá un valor sentado en el suelo, ya que las masas tienen un peso, a pesar de que no hay cambio de velocidad. Sin embargo, un acelerómetro en caída gravitacional libre hacia el centro de la Tierra medirá un valor de cero, ya que, a pesar de que su velocidad es cada vez mayor, está en un marco de referencia en el que no tiene peso."
En las XO 1.75 es posible acceder al acelerómetro, leyendo del archivo especial /sys/devices/platform/lis3lv02d/position, cuyo contenido tiene el siguiente formato:
(acelx,acely,acelz)\n
Lo que es fácilmente leíble en python con el siguiente código:
def getXYZ():
fh=open("/sys/devices/platform/lis3lv02d/position","r") (acelx, acely, acelz)=eval(fh.read()) fh.close() return (acelx, acely, acelz)
Se puede utilizar eval, ya que el formato del archivo se corresponde con el usado para leer ternas en python. Si bien la función definida cumple su cometido, es lenta, ya que en cada invocación es necesario pedirle al sistema operativo que cree un nuevo file descriptor. Por esta razón será más eficiente el mantener el archivo abierto, releyéndolo cada vez:
def accel_init():
global fh fh=open("/sys/devices/platform/lis3lv02d/position","r")
def getXYZ():
fh.seek(0) (acelx, acely, acelz)=eval(fh.read()) return (acelx, acely, acelz)
def accel_close():
fh.close()
Este código devuelve siempre la aceleración en el mismo sistema de coordenadas, a veces es recomendable cambiarlo, por ejemplo cuando se desea que al comenzar un programa, la aceleración aparezca siempre en la dirección del eje z. Para esto se utilizan herramientas de álgebra lineal, por ejemplo, calculando una base orto-normal a partir de
(acelx, acely, acelz), (0,1,0), (acelx, acely, acelz)^(0,1,0)
Y calcular las coordenadas en dicha base, por medio del producto interno. Este método es el utilizado en el código de Archivo:Need4Butia.tar.gz.