malos datos del acelerómetro con vibración

Estoy trabajando en una aplicación de computadora para bicicletas. Tenía la esperanza de calcular la inclinación de la pendiente usando el acelerómetro, pero las cosas no están funcionando demasiado bien.

Puse un código de prueba para obtener los datos del sensor. Solo estoy usando la velocidad de la interfaz de usuario y mantengo un promedio móvil de más de 128 muestras, lo que equivale a aproximadamente 6 segundos. Con el teléfono en la mano, los datos son buenos y puedo calcular un buen ángulo en comparación con mi vector plano de calibración.

Con el teléfono montado en la bici las cosas no van nada bien. Espero obtener una buena cantidad de ruido, pero esperaba que la gran cantidad de muestras durante la gran ventana de tiempo eliminaría los efectos de vibración y los movimientos generales de la bicicleta. Desafortunadamente, esto simplemente no funciona, la magnitud del vector de aceleración realmente no se mantiene alrededor de la marca de 9.8, sino que está cayendo más bajo, lo que me indica que algo no está bien en alguna parte.

Aquí hay una gráfica de los datos de parte de un viaje de prueba. enter image description here

Como puede ver, cuando está parado al principio, la magnitud está bien, pero una vez que me pongo en marcha, cae. Estoy bastante seguro de que el problema está relacionado con la vibración. Inicialmente desciendo y hubo una fuerte vibración. Luego subo y la vibración es menor y la magnitud vuelve a 9.8, pero luego bajo rápidamente en un camino en mal estado y la magnitud termina siendo inferior a 3. .

Esto es con un SonyErricson Xperia Active que usa un sonda BMA250 el datasheat parece que el sensor debería ser capaz. Mi única teoría sobre la causa del problema es que el rango está configurado en el rango de 2 g y la vibración está causando que los datos salgan del rango y esto está causando mis problemas.

¿Alguien ha visto algo así? ¿Alguien tiene alguna idea sobre la causa del problema?
¿Hay alguna forma de cambiar la sensibilidad que no he encontrado?

Información Adicional.

OK, registré los datos del sensor sin procesar antes de filtrar. Una porción muy pequeña presentada aquí Pequeña muestra de datos sin procesar El eje principal está en verde y en plano, como creo, debería ser sin la vibración, debería ser alrededor de 8.5. No hay una sujeción obvia en los datos, pero obtengo más valores por debajo de 8.5 que por encima de 8.5 valores. Incluso si el sensor está configurado para su rango más sensible de 2 g, parece que la vibración debería estar bien. Tengo un valor máximo aquí de poco más de 15 y un mínimo de -10 bien ib a +- 20 rango simplemente no centrado correctamente en el 8.5 debería ser.

Buscaré mi otro teléfono que parece tener un sensor ligeramente diferente, un BMA150, y probaré con eso, pero a menos que sea perfecto, creo que tendré que renunciar a la idea.

preguntado el 22 de mayo de 12 a las 15:05

Esperar. Tu bajas y la G baja, tu subes y la G sube?? ¿No es eso exactamente lo que debería suceder? Al menos, mientras acelera hacia abajo o acelera hacia arriba. +1 por los maravillosos datos, por cierto. -

Acelero hacia abajo a un ritmo lento y al revés subiendo. El eje x en el gráfico está en segundos, por lo que valen unos 10 minutos en el gráfico. Si realmente pudiera hacer ese tipo de aceleración durante minutos, estaría complacido.... -

2 Respuestas

Sospecho que el acelerómetro no es lineal en rangos G tan grandes. Si es así, y si hay alguna asimetría, hará lo que ves.

La solución para eso es rellenar un poco más el soporte del acelerómetro, gomaespuma, cuerda elástica, lo que sea, posiblemente montarlo en un escenario más pesado para filtrar más la vibración.

O (no es una buena solución) intente modelar el error y compensarlo.

contestado el 22 de mayo de 12 a las 15:05

Sí, modificaré mi montura para tratar de detener lo peor de la vibración para ver si eso ayuda. Aunque a largo plazo, no creo que pueda poner la función en la aplicación publicada si el sensor típico es así. La hoja de datos no indica mala no linealidad para el BMA250. Dice +- 0.5% para la línea recta de mejor ajuste, lo que me parece bien. - Yo para

No vi la especificación de linealidad (parte de la información aparece como caracteres de cuadro en mi visor de PDF). Pero tiene que haber límites donde la curva se dobla, aunque tal vez más allá de los límites del digitalizador. Debería ser fácil eliminar su promedio móvil y observar los puntos individuales para sujetarlos a algún valor máximo. Sujeción, podría manejar con un modelo de la distribución del ruido, esencialmente predecir cuánto se sujeta. - bobbi bennett

Sin embargo, parece una sujeción o una limitación, porque cuanto mayor es g (z>y>x), mayor es la caída. - bobbi bennett

Tabla en la página 8 para la línea de no linealidad. Agregaré un código para volcar algunas de las muestras sin procesar originales y veré si aparece algo al examinarlas con más detalle. - Yo para

Usé el mismo teléfono y, por coincidencia, el mismo intervalo promedio de 6 segundos para una aplicación hace unos años y no recuerdo haber visto el comportamiento en el gráfico.

Me pregunto si el problema está en la forma en que se acumulan los promedios de 6 segundos. Un problema que tuve es que el intervalo de muestreo no era constante sino que depende de qué tan ocupado esté el procesador. Se adquiere una muestra en el tiempo especificado, pero la llamada del controlador de eventos depende del programador. Cuando el procesador está descargado, el muestreo ocurre a una frecuencia constante, pero a medida que el procesador trabaja más, la frecuencia de muestreo se vuelve más lenta y errática. Puede escribir su aplicación para mantener baja la carga del procesador durante el muestreo. Lo que hicimos fue muestrear durante 6 segundos, no hacer nada más, luego dejar de muestrear y procesar el último conjunto de muestras, pero esto solo tuvo un éxito parcial, ya que no puede controlar otras aplicaciones que se ejecutan al mismo tiempo y el programador comparte los recursos del procesador entre ellas. todos. En el Xperia Active, descubrí que ocasionalmente puede fallar a segundos entre muestras, lo que atribuí a la recolección de basura en una de las JVM. La solución para nosotros fue marcar el tiempo de cada muestra, luego ejecutar algunos controles de calidad en un conjunto de muestras y descartar aquellos que fallaron en el control de calidad. Esta es una solución deficiente, ya que definir qué es lo suficientemente bueno es impreciso y cuando el usuario ejecuta otra aplicación que usa muchos recursos, la mayoría de los conjuntos de muestra se pueden descartar, por lo que la aplicación necesita una lógica adicional para manejar eso.

La API de Android actual, que no está disponible en Xperia Active, debería haber eliminado esto, ya que las muestras se pueden procesar por lotes como se describe en https://source.android.com/devices/sensors/hal-interface.html#batch_sensor_flags_sampling_period_maximum_report_latency .

Si el algoritmo asumiera un número particular de muestras en lugar de contarlas y el procesador trabajara más duro a medida que la bicicleta fuera más rápida, aunque no estoy seguro de por qué, produciría algo como el primer gráfico porque cuando la bicicleta va cuesta abajo magnitud baja y al subir cuesta arriba. Hay mucha especulación allí, pero un promedio de 6 segundos que da una magnitud de menos de 3 m/s^2 parece inverosímil según mi experiencia con este sensor.

Respondido el 01 de enero de 15 a las 00:01

Gracias por la entrada Ken. Todavía no veo que tendría el error de lectura inferior constante que estaba viendo. Realmente debería volver a habilitar el código (suponiendo que no haya roto demasiado las cosas) con mi nuevo Z3 Compact y ver cómo se ve. - Yo para

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.