2011-02-01 21 views
13

Por lo tanto, he estado luchando con este problema desde hace algún tiempo, y no he tenido suerte tocando la sabiduría de los internets y SO relacionados con el tema.Cómo calibrar el acelerómetro de Android y reducir el ruido, eliminar la gravedad

Estoy escribiendo una aplicación para Android que utiliza el omnipresente Acelerómetro, pero parece que estoy recibiendo una cantidad increíble de "ruido" incluso mientras descansa, y no puedo entender cómo manejarlo, ya que mis lecturas necesita ser relativamente preciso Pensé que tal vez mi teléfono (HTC Incredible) era disfuncional, pero el sensor parece funcionar bien con otros juegos y aplicaciones que he jugado.

He intentado usar varios "filtros", pero parece que no puedo entenderlos. Entiendo que la gravedad debe ser tratada de alguna manera, y tal vez es allí donde me estoy equivocando. Actualmente he probado esto, adaptada de una SO answer, que hace referencia a un ejemplo del SDK de iPhone:

   accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor); 
       accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor); 


       double x = event.values[0] - accel[0]; 
       double y = event.values[1] - accel[1]; 

El cartel dice "jugar con" el valor kFilteringFactor (kFilteringFactor = 0.1f en el ejemplo) hasta que esté satisfecho . Desafortunadamente, todavía parece hacer mucho ruido, y todo lo que parece hacer es hacer que las lecturas aparezcan como diminutos decimales, lo cual no me ayuda demasiado, y parece que el sensor es menos sensible. Los centros de matemáticas de mi cerebro también están atrofiados por años de negligencia, por lo que no entiendo completamente cómo funciona este filtro.

¿Puede alguien explicarme en detalle cómo obtener un útil leyendo desde el acelerómetro? Un tutorial sucinto sería una ayuda increíble, ya que no he encontrado uno realmente bueno (al menos dirigido a mi nivel de conocimiento). Me siento frustrado porque siento que todo esto debería ser más evidente para mí. Cualquier ayuda o dirección sería muy apreciada, y por supuesto puedo proporcionar más muestras de mi código si es necesario.

Espero no estar pidiendo que me den de comer demasiado; No estaría preguntando a menos que haya estado tratando de resolverlo por un tiempo. También parece que hay algún interés de otros miembros SO.

+7

Háganme saber si obtiene alguna pista sobre la parte de "eliminar la gravedad", mi negocio de aerodeslizador es * tan cerca *! –

+3

Haha Jon, ¿no has oído? Google fijó la gravedad. Pronto lanzarán la API. – malfunction

Respuesta

4

Para obtener una lectura correcta del acelerómetro, debe usar la ecuación de velocidad = SQRT (x * x + y * y + z * z). Con esto, cuando el teléfono está en reposo, la velocidad será de gravedad: 9.8 m/s. Entonces, si resta eso (SensorManager.GRAVITY_EARTH), cuando el teléfono está en reposo, tendrá una lectura de 0 m/s. En cuanto al ruido, Blrfl podría tener razón sobre los acelerómetros baratos, incluso cuando mi teléfono está en reposo, parpadea continuamente algunas fracciones de un metro por segundo. Podrías establecer un pequeño umbral, por ejemplo, 0,4 m/s, y si la velocidad no supera esa cifra, está en reposo.

+0

Gracias por la respuesta bobby! Esto es justo lo que estaba buscando. Tendré que probar esto y publicaré mis resultados una vez que tenga la oportunidad. – malfunction

+2

Solo pensé en mencionar que esta respuesta es bastante drásticamente incorrecta, como se explica en [esta pregunta en Physics SE] (http://physics.stackexchange.com/questions/57523/do-you-use-the-magnitude- ecuación-obtener-velocidad-de-un-acelerómetro). –

+1

hay una diferencia entre la aceleración y la velocidad. Está midiendo la aceleración (m/s^2) y no la velocidad (m/s). La gravedad es 9.8m/s^2 y no 9.8m/s. – Shai

5

respuesta parcial:

Precisión. Si está buscando una alta precisión, los acelerómetros de bajo costo que encuentra en los teléfonos no cortarán la mostaza. A modo de comparación, un sensor de tres ejes adecuado para uso industrial o científico corre al norte de $ 1,500 solo por el sensor; agregar el hardware para alimentarlo y convertir sus lecturas en algo que una computadora puede usar duplica el precio. El sensor en un auricular funciona bien por debajo de $ 5 en cantidad.

Ruido. Los sensores baratos son inexactos y la inexactitud se traduce en ruido. Un sensor inexacto que no se mueve no siempre mostrará ceros, mostrará valores en cualquier lado dentro de algún rango. Lo mejor que puede hacer es caracterizar el sensor mientras está inmóvil para hacerse una idea de lo ruidoso que es y usarlo para redondear sus mediciones a una escala menos precisa basada en el error esperado. (En otras palabras, si está dentro de ± x m/s^2 de cero, es seguro decir que el sensor no se mueve, pero no puede estar seguro porque podría moverse muy lentamente). para hacer esto en cada dispositivo, porque no todos usan el mismo acelerómetro y todos se comportan de manera diferente. Creo que esa es una de las ventajas que tiene el iPhone: el hardware es bastante homogéneo.

Gravity. Existe alguna discusión en el SensorEvent documentation sobre factorizar la gravedad de lo que dice el acelerómetro. Notará que tiene una gran similitud con el código que publicó, excepto que es más claro sobre lo que está haciendo.:-)

HTH.

+0

Gracias por la respuesta reflexiva, Blrfl. Aclare algunos de los problemas más conceptuales que he tenido y confirmó que no estoy loco por haber notado la fluctuación en los valores que provienen del acelerómetro. – malfunction

1

¿Cómo lidiar con el nerviosismo? Usted suaviza los datos. En lugar de mirar la secuencia de valores del sensor como sus valores, los promedia de manera continua, y la nueva secuencia formada se convierte en los valores que usa. Esto mueve cada valor nervioso más cerca de la media móvil. El promedio necesariamente elimina las variaciones rápidas en los valores adyacentes ... y es por eso que las personas usan la terminología Paso (frecuencia) bajo ya que los datos que originalmente variaron mucho por muestra (o unidad de tiempo) ahora varían más lentamente.

por ejemplo, en lugar de usar los valores 10 6 7 11 7 10, puede promediar estos de muchas maneras. Por ejemplo, podemos calcular el siguiente valor a partir de un peso igual al promedio móvil (es decir, de su último punto de datos procesados) con el siguiente punto de datos brutos. Usando una mezcla de 50-50 para los números anteriores, obtendríamos 10, 8, 7.5, 9.25, 8.125, 9.0675. Esta nueva secuencia, nuestros datos procesados, se usaría en lugar de los datos ruidosos. Y podríamos usar una mezcla diferente de 50-50, por supuesto.

Como analogía, imagine que está informando dónde se encuentra determinada persona utilizando solo su vista. Usted tiene una buena vista del paisaje más amplio, pero la persona está envuelta en una niebla. Verá partes del cuerpo que llaman su atención ... una mano izquierda en movimiento, un pie derecho, brillar anteojos, etc., que están inquietos, PERO cada valor está bastante cerca del verdadero centro de masa. Si ejecutamos algún tipo de promediado de ejecución, obtendríamos valores que se aproximan al centro de masa de ese objetivo a medida que se mueve a través de la niebla y son, de hecho, más precisos que los valores que informamos (el sensor) que el ruido hizo ruidoso. niebla.

Parece que estamos perdiendo datos potencialmente interesantes para obtener una curva aburrida. Tiene sentido sin embargo. Si estamos tratando de recrear una imagen precisa de la persona en la niebla, la primera tarea es obtener una buena aproximación suave del centro de masa. A esto podemos agregar datos de un sensor complementario/proceso de medición. Por ejemplo, una persona diferente podría estar cerca de este objetivo. Esa persona podría proporcionar una descripción muy precisa de los movimientos del cuerpo, pero podría estar en el espesor de la niebla y no saber en general dónde termina el objetivo. Esta es la posición complementaria de lo que obtuvimos por primera vez: el segundo dato da detalles con precisión sin un sentido de la ubicación aproximada. Los dos datos se unirían. Pasaríamos de baja el primer set (como su problema presentado aquí) para obtener una ubicación general sin ruido. Pasaríamos alto el segundo conjunto de datos para obtener los detalles sin contribuciones engañosas no deseadas a la posición general. Usamos datos globales de alta calidad y datos locales de alta calidad, cada conjunto optimizado de formas complementarias y evitando corromper el otro conjunto (a través de los 2 filtros).

Específicamente, mezclaríamos los datos del giroscopio, datos que son precisos en el detalle local de los "árboles" pero se pierden en el bosque (derivas) en los datos discutidos aquí (del acelerómetro) que ve el bosque bien pero no los árboles.

En resumen, tenemos datos de paso bajo de sensores que están nerviosos pero se mantienen cerca del "centro de masa". Combinamos este valor básico sin problemas con datos precisos al detalle pero con derivas, por lo que este segundo conjunto se filtra con paso alto. Obtenemos lo mejor de ambos mundos a medida que procesamos cada grupo de datos para limpiarlo de aspectos incorrectos.Para el acelerómetro, suavizamos/bajamos los datos de manera efectiva al ejecutar alguna variación de un promedio continuo en sus valores medidos. Si estuviéramos tratando los datos del giroscopio, haríamos las operaciones matemáticas que mantienen los detalles (acepta deltas) al mismo tiempo que rechazamos el error acumulado que eventualmente crecerá y dañará la curva suave del acelerómetro. ¿Cómo? Esencialmente, utilizamos los valores reales del giroscopio (no promedios), pero utilizamos un pequeño número de muestras (de deltas) en una pieza al derivar nuestros valores de limpieza final total. El uso de un pequeño número de deltas mantiene la curva promedio general en su mayoría a lo largo de los mismos promedios seguidos por la etapa de paso bajo (por los datos del acelerómetro promedio) que forman la mayor parte de cada punto de datos final.

Cuestiones relacionadas