2010-07-31 25 views
14

¿Alguien puede ayudar a eliminar el factor g de las lecturas del acelerómetro. Estoy usando SensorEventListener con el método onSensorChanged() para obtener datos de Sensor.TYPE_ACCELEROMETER. Solo necesito valores de aceleración puros en todas las direcciones. Entonces, en cualquier estado si el dispositivo es estable (o en velocidad constante), debería dar (0.0,0.0,0.0) aproximadamente. Actualmente, dependiendo de su cabeceo y balanceo, me da salida variable dependiendo de las fuerzas g que actúan en cada eje.Cómo eliminar el factor de gravedad de las lecturas del acelerómetro en el acelerómetro Android de 3 ejes

Espero que haya alguna fórmula para eliminar esto, ya que también obtengo valores de orientación (pitch and roll) del detector Sensor.TYPE_ORIENTATION. Yo había usado algunos pero no funcionó.

¿Alguna ayuda, por favor?

Respuesta

4

Diferenciar con respecto al tiempo una función de tiempo le libera de las constantes.

Por lo tanto, tomando la derivada de la señal del acelerómetro obtendrá el "tirón", que luego puede volver a integrar con el fin de obtener la parte no constante de la aceleración que está buscando.

En términos Layman, tome una muestra del acelerómetro cada 1 segundo y restáurela de la muestra anterior. Si la respuesta es (muy cerca de) cero, no estás acelerando relativamente a la tierra. Si el resultado es distinto de cero, integrelo (en este caso, multiplique por un segundo), tiene su aceleración.

Dos cosas, sin embargo: -Busca ruido en la señal, redondee su entrada. -No espere resultados hiper-precisos de acelerómetros en chip. Puede usarlos para detectar temblores, cambios en la orientación, pero no para saber cuántas G experimenta mientras hace giros bruscos en su automóvil.

3

Una forma (para dispositivos solo con acelerómetro) es eliminar el vector de gravedad de los datos del acelerómetro al restar los valores que vendrían en caso estático para la misma orientación. Pero como la orientación se calcula de nuevo tomando lecturas de aceleración y no de forma independiente, no es muy precisa.

El giroscopio puede ayudar en este caso. Pero pocos androides todavía tienen un verdadero giroscopio. Y usar sus lecturas en bruto no es tan simple.

9

Se puede utilizar un filtro de paso bajo.

hacer esto para cada uno de los valores de los sensores:

g = 0.9 * g + 0.1 * v 

Dónde v es su valor actual del sensor y g es una variable global inicialmente puesto a cero. Tenga en cuenta que necesitará tantas variables g como ejes tenga.

Con v = v - g puede eliminar el factor de gravedad del valor de su sensor.

+0

Tenga en cuenta que esto se puede volver a escribir como 'g = (1-a) * g + a * v', donde' a' es una variable entre 0 y 1 que controla el límite del filtro. –

+3

No entiendo esto. ¿Cómo agregar un filtro de paso bajo * elimina * un sesgo constante? ¿No querrías un pase alto? – matth

+1

Este cálculo no funciona, porque asume que la orientación del dispositivo no cambia con el tiempo, lo cual es extremadamente raro. – fishinear

3

Simplemente reste g (~ 9.8m/s^2) veces la dirección z de la matriz de rotación. O para ser más explícito al respecto, y mucho

a = your accelerometer reading, 
R = your rotation matrix (as a 9-long vector). 

Entonces lo que quiere es

(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]). 
+1

Esto es correcto, pero calcular la matriz de rotación es un poco difícil para un recién llegado. Busque Direction Cosine Matrix si desea más detalles. – xryl669

+1

¿Lo resta solo de la Z? ¿Qué hay de X e Y? – rclai

+1

@rclai siempre que esté orientado con la dirección Z hacia abajo en todo momento, restarlo de Z debería ser suficiente. Una vez que el dispositivo se inclina, los datos estarán apagados, la gravedad sinec no está tirando solo de Z. –

7

Uso Sensor.TYPE_LINEAR_ACCELERATION en lugar de Sensor.TYPE_ACCELEROMETER

+1

La única respuesta correcta, y la más sencilla también ... – fishinear

+3

Nota, no todos los dispositivos tienen Sensor.TYPE_LINEAR_ACCELERATION – Lytic

+1

Los relojes inteligentes no tienen TYPE_LINEAR_ACCELERATION en general –

Cuestiones relacionadas