Cómo Calibrar el Acelerómetro Android y Reducir el Ruido, Eliminar la Gravedad

Por lo tanto, he estado luchando con este problema durante algún tiempo, y no he tenido ninguna suerte aprovechando la sabiduría de los internets y puestos SO relacionados sobre el tema.

Estoy escribiendo una aplicación de Android que utiliza el acelerómetro ubicuo, pero parece que estoy recibiendo una cantidad increíble de "ruido", incluso mientras está en reposo, y no puede parecer a la forma de tratar con él como mis lecturas deben 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 utilizar varios "filtros", pero no puedo parecerse de envolver mi mente alrededor de ellos. Entiendo que la gravedad debe tratarse de alguna manera, y tal vez ahí es donde me voy mal. Actualmente he intentado esto, adaptado de una respuesta de SO , que se refiere a un ejemplo del iPhone SDK:

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 que "juega con" el valor kFilteringFactor (kFilteringFactor = 0.1f en el ejemplo) hasta que esté satisfecho. Desafortunadamente, todavía parezco tener mucho ruido, y todo esto parece hacer es hacer que las lecturas entren como diminutos decimales, lo cual no me ayuda mucho, y parece que sólo hace que el sensor sea menos sensible. Los centros de matemáticas de mi cerebro también están atrofiados por años de abandono, así que no entiendo completamente cómo funciona este filtro.

¿Puede alguien explicarme con algún detalle cómo obtener una lectura útil del acelerómetro? Un tutorial sucinto sería una ayuda increíble, ya que no he encontrado una muy buena (al menos dirigida 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 apreciada grandemente, y por supuesto puedo proporcionar más muestras de mi código si está necesitado.

Espero no estar pidiendo ser alimentado con cuchara demasiado; Yo no estaría preguntando a menos que he estado tratando de imaginar nuestro por un tiempo. También parece que hay algún interés de otros miembros de SO.

Para obtener una lectura correcta del acelerómetro es necesario utilizar la ecuación velocidad = SQRT (x * x + y * y + z * z). Usando esto, cuando el teléfono está en reposo la velocidad será la de la gravedad – 9.8m / s. Por lo tanto, si restas eso (SensorManager.GRAVITY_EARTH), entonces, cuando el teléfono está en reposo, tendrás una lectura de 0 m / s. En cuanto al ruido, Blrfl podría estar en lo cierto sobre los acelerómetros baratos, incluso cuando mi teléfono está en reposo, parpadea continuamente algunas fracciones de un metro por segundo. Usted podría apenas fijar un pequeño umbral eg 0.4m / sy si la velocidad no va sobre eso, entonces está en descanso.

Respuesta parcial:

Exactitud. Si está buscando una alta precisión, los acelerómetros baratos que encontrará en los teléfonos no cortarán la mostaza. Para la comparación, un sensor de tres ejes adecuado para uso industrial o científico se ejecuta al norte de $ 1.500 para sólo el sensor; Agregando el hardware para encenderlo y convertir sus lecturas en algo que una computadora puede usar duplica el precio. El sensor en un teléfono 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 ambos lados dentro de un rango. Lo mejor que puede hacer es caracterizar el sensor mientras está inmóvil para tener una idea de lo ruidosa 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). Tendrá que hacer Esto en todos los dispositivos, porque no todos utilizan el mismo acelerómetro y todos se comportan de manera diferente. Supongo que esa es una ventaja que tiene el iPhone: el hardware es bastante homogéneo.

Gravedad. Hay alguna discusión en la documentación de SensorEvent sobre el factoring de la gravedad de lo que dice el acelerómetro. Te darás cuenta de que tiene mucha similitud con el código que publicó, excepto que es más claro acerca de lo que está haciendo. Todos los derechos reservados

HTH.

¿Cómo lidiar con el nerviosismo? Usted suavizar los datos. En lugar de mirar la secuencia de valores del sensor como sus valores, los promedio de ellos en forma continua, y la nueva secuencia formada se convierten en los valores que utiliza. Esto mueve cada valor nervioso más cerca de la media móvil. El promedio se deshace de las variaciones rápidas de los valores adyacentes … y es por eso que la gente usa la terminología Filtración de baja frecuencia, ya que los datos que originalmente pudieron haber variado mucho por muestra (o tiempo de unidad) ahora varían más lentamente.

Por ejemplo, en lugar de usar valores 10 6 7 11 7 10, puede promediar estos de muchas maneras. Por ejemplo, podemos calcular el siguiente valor de un peso igual del promedio en ejecución (es decir, del último punto de datos procesado) con el siguiente punto de datos sin procesar. Utilizando una mezcla 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 utilizaría en lugar de los datos ruidosos. Y podríamos usar una mezcla diferente de 50-50 por supuesto.

Como una analogía, imagine que usted está reportando donde una determinada persona se encuentra usando sólo su vista. Usted tiene una buena vista del paisaje más amplio, pero la persona está envuelta en una niebla. Usted verá las piezas del cuerpo que llaman su atención. Una mano izquierda que se mueve, un pie derecho, brillo de anteojos, etc, que son nerviosos, pero cada valor es bastante cerca del verdadero centro de masa. Si ejecutamos algún tipo de promedio, obtendremos valores que se aproximen al centro de masa de ese objetivo a medida que se mueve a través de la niebla y son en efecto más precisos que los valores que (el sensor) informó que fue hecho ruidoso por el niebla.

Ahora parece que estamos perdiendo datos potencialmente interesantes para obtener una curva aburrida. Sin embargo, tiene sentido. 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 añadir datos de un sensor / proceso de medición complementario. Por ejemplo, una persona diferente puede estar cerca de este objetivo. Esa persona puede proporcionar una descripción muy precisa de los movimientos del cuerpo, pero podría estar en el grueso de la niebla y no saber en general donde el objetivo está terminando. Esta es la posición complementaria a lo que primero obtuvimos – los segundos datos dan detalles con precisión sin un sentido de la ubicación aproximada. Las dos piezas de datos serían cosidas juntas. Hemos pasado bajo el primer set (como su problema presentado aquí) para obtener una ubicación general sin ruido. Hemos pasado alto el segundo conjunto de datos para obtener el detalle sin contribuciones engañosas indeseadas a la posición general. Utilizamos datos globales de alta calidad y datos locales de alta calidad, cada conjunto optimizado de manera complementaria y evitado corromper el otro conjunto (a través de las 2 filtrado).

Específicamente, mezclaríamos datos de giroscopios – datos que son exactos en el detalle local de los "árboles" pero que se pierden en el bosque (deriva) – en los datos aquí discutidos (desde el acelerómetro) que ven bien el bosque pero No los árboles.

Para resumir, los datos de paso bajo de los sensores que es nervioso, pero se mantiene cerca del "centro de masa". Combinamos este valor de base suave con datos que son precisos en los detalles, pero los deriva, por lo que este segundo conjunto es de paso alto filtrado. Conseguimos lo mejor de ambos mundos mientras procesamos cada grupo de datos para limpiarlo de aspectos incorrectos. Para el acelerómetro, pasamos los datos de forma eficaz y eficiente pasando una variación de un promedio en sus valores medidos. Si estuviéramos tratando los datos del giroscopio, haríamos las matemáticas que efectivamente guardan el detalle (acepta deltas) mientras rechazamos el error acumulado que eventualmente crecería y corrompería la curva suave del acelerómetro. ¿Cómo? Esencialmente, usamos los valores reales de giroscopios (no promedios), pero usamos un pequeño número de muestras (de deltas) una pieza al derivar nuestros valores finales totales limpios. El uso de un pequeño número de deltas mantiene la curva promedio general sobre todo a lo largo de los mismos promedios seguidos por la etapa de paso bajo (por los datos del acelerómetro promediado) que forma la mayor parte de cada punto final de datos.

  • Aplicar filtros personalizados a la salida de la cámara
  • Android: Filtrar Logcat por etiqueta mediante un regex
  • Android Logcat no muestra los registros cuando cambia de dispositivo
  • Filtros de imagen y video como snapchat en android
  • ¿Cómo crear efectos Lomo / Retro en Android Camera Preview?
  • ¿Cómo abrir mi aplicación de Android cuando se abre el enlace rss en el navegador?
  • Cómo recuperar los artículos de vuelta en arraylist una vez que se borra: Android
  • Cómo filtrar ListView a través de EditText
  • Filtrar fuentes de infrarrojos desde una imagen de cámara Android
  • Asegúrese de que el contenido de su adaptador no se ha modificado desde un subproceso de fondo, sino sólo desde el subproceso de interfaz de usuario
  • ¿Puedo definir un filtro de intenciones dinámico en mi aplicación de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.