tag studio android accelerometer sensor

studio - android tag



Acelerador de perfiles de Android (3)

¡Esto suena como un problema interesante!

¿Ha trazado sus datos en función del tiempo para familiarizarse con ellos, para ver con qué tipo de ruido está tratando y para ayudar a decidir cómo podría preprocesar sus datos para ingresar al detector?

^ | A | | | | |_________________> | time | v

Comenzaría con líneas para cada actividad:

  • | Hacha + Ay + Az |
  • | Vx + Vy + Vz | (Aproxime calculando el área de trapezoides formados por sus puntos de datos) ... etc.

Tal vez pueda calcular la orientación del teléfono intentando detectar la gravedad y luego girar los vectores a una orientación "estándar" (por ejemplo, eje Z positivo = arriba). Si puedes hacer eso, entonces los diferentes ejes pueden ser más significativos. Por ejemplo, caminar (en el bolsillo) tendería a tener una velocidad en el plano horizontal, que podría distinguirse de caminar (en la mano) por el movimiento en el plano vertical.

En cuanto a los filtros, si los datos parecen ruidosos, un punto de partida simple es aplicar un promedio móvil para suavizarlos. Esta es una técnica común para datos de sensores en general:

https://en.wikipedia.org/wiki/Moving_average

Además, esta publicación parece relevante para su pregunta:

Cómo eliminar el factor de gravedad de las lecturas del acelerómetro en el acelerómetro de 3 ejes de Android

He escrito una Actividad simple que es un SensorEventListener para Sensor.TYPE_ACCELEROMETER .

En mi onSensorChanged(SensorEvent event) simplemente selecciono los valores en formato X,Y,Z y los escribo en un archivo.

Sumado a este X,Y,Z es una etiqueta, la etiqueta es específica a la actividad que estoy realizando. así que su X,Y,Z,label

Así obtengo mi perfil de actividad. Me gustaría recibir sugerencias sobre qué operaciones realizar después de la recopilación de datos para eliminar el ruido y obtener los mejores datos para una actividad.

El objetivo principal de esta recopilación de datos es construir una aplicación de detección de actividad del usuario utilizando la biblioteca de redes neuronales (NeuroPh para Android).


Cosas identificadas por mí:

  1. Los datos deben preprocesarse como y cómo se necesitan, en mi caso solo quiero 3 entradas y una salida
  2. Los datos deben someterse a Reference suavizado (Suavizado de cinco puntos o cualquier otra técnica que mejor se adapte a usted). Para que el ruido se filtre (aunque no completamente). https://en.wikipedia.org/wiki/Moving_average es una de las técnicas.
  3. Los datos linealizados serían buenos, porque no tiene idea de cómo se muestrearon los datos. Utilice la interpolación para ayudarlo a Linearizar los datos.
  4. Finalmente, utilice FFT (Transformada rápida de Fourier) para extraer la receta del plato, ¡es decir, extraer características de su conjunto de datos!

Hace solo unas semanas escribí un podómetro, y habría podido detectar las tres actividades que mencionaste. Haría las siguientes observaciones:

  1. Además de Sensor.TYPE_ACCELEROMETER , Android también tiene Sensor.TYPE_GRAVITY y Sensor.TYPE_LINEAR_ACCELERATION . Si registra los valores de los tres, notará que los valores de TYPE_ACCELEROMETER son siempre iguales a la suma de los valores de TYPE_GRAVITY y TYPE_LINEAR_ACCELERATION. El onSensorChanged(…) primero le da a TYPE_ACCELEROMETER, seguido de TYPE_GRAVITY y TYPE_LINEAR_ACCELERATION, que son los resultados de su metodología interna de dividir las lecturas del acelerómetro en gravedad y la aceleración que no se debe a la gravedad. Dado que estás interesado en la aceleración debida a las actividades, en lugar de la aceleración debida a la gravedad, puedes encontrar que TYPE_LINEAR_ACCELERATION es mejor para lo que necesitas.
  2. Independientemente de los sensores que utilice, la X, Y, Z que esté midiendo dependerá de la orientación del dispositivo. Sin embargo, para detectar las actividades que menciona, el resultado no puede depender, por ejemplo, de si el usuario sostiene el dispositivo en posición vertical u horizontal, o si el dispositivo es plano o vertical, por lo que los valores individuales de X, Y y Z no servirá de nada. En su lugar, tendrá que mirar la longitud del vector, es decir, sqrt (X X + Y Y + Z Z) que es independiente de la orientación del dispositivo.
  3. Solo necesita suavizar los datos si lo está introduciendo en algo sensible al ruido. En cambio, diría que los datos son los datos, y obtendrá los mejores resultados si usa mecanismos que no son sensibles al ruido y, por lo tanto, no es necesario que los datos se suavicen. Por definición, el suavizado es descartar datos. Desea diseñar un algoritmo que tome datos ruidosos en un extremo y genere la actividad actual en el otro extremo, así que no prejuzgue si es necesario incluir el suavizado como parte de ese algoritmo.
  4. Aquí hay una gráfica de sqrt (X X + Y Y + Z Z) de Sensor.TYPE_ ACCELEROMETER que registré cuando estaba construyendo mi podómetro. Las gráficas muestran las lecturas medidas cuando caminé por 100 pasos. La línea verde es sqrt (X X + Y Y + Z * Z), la línea azul es un promedio móvil ponderado exponencialmente de la línea verde que me da el nivel promedio de la línea verde, y la línea roja muestra los pasos de conteo de mi algoritmo . Pude contar los pasos solo buscando el máximo y el mínimo y cuando la línea verde cruza la línea azul. No utilicé ninguna transformación suavizante o rápida de Fourier. En mi experiencia, para este tipo de cosas, los algoritmos más simples a menudo funcionan mejor, porque aunque los complejos pueden funcionar en algunas situaciones, es más difícil predecir cómo se comportarán en todas las situaciones. Y la robustez es una característica vital de cualquier algoritmo :-).