domingo, 14 de diciembre de 2014

Siente la fuerza (Parte IV)

Qué encontrarás en esta entrada?
  • Mi script para el análisis de los datos de AndroSensor.

Durante estas dos últimos semanas, los que hayáis estado siguiendo la página sabréis que he estado embarcado en un proyecto personal sobre el análisis de datos de sensores de un dispositivo Android, obtenidos a través de AndroSensor.


Tras este tiempo, creo que ha llegado el momento de compartir mi código con vosotros. Aclarar que no se trata de un programa cerrado, sino sólo una serie de ideas puestas en forma de script, en continua revisión.

Actualmente, el código que os suministro lee los datos de los sensores en el formato que exporta AndroSensor (aclarar que este formato puede variar según la configuración, el dispositivo, y la versión de la aplicación). Se centra principalmente en la aceleración y en el campo magnético, y con ellos pretende reconstruir la trayectoria y pintar el campo sobre ella.

El script tiene un diseño modular, y según las opciones con las que lo llamemos carga un módulo u otro (ver documentación más abajo). En general, lo primero que se aborda (tras la carga de datos) son las correcciones a la aceleración.

En estos momentos hay definidas tres correcciones a la aceleración que pasamos a detallar a continuación.

Corrección de picos:


Esta corrección se basa en que picos (máximos y mínimos) que aparezca en un intervalo de tiempo muy pequeño o de muy poca intensidad, no tienen sentido físico, e intenta suavizarlos.

El script ha detectado un pico extraño entre los 6 y los 8 segundos e intenta suavizarlo

Corrección de ceros:


 Esta corrección se hace bajo la hipótesis de que las medidas que hemos tomado se realizan de tal manera que partamos y lleguemos a una situación de reposo (velocidad nula). Imponemos estas condiciones, que en último término implican la suma de un pequeño valor constante a la aceleración, o lo que es lo mismo: un "error de cero".

Se le suma (o resta) un valor constante a la aceleración para conseguir velocidad cero en los extremos

Corrección por cuantización:


Esta corrección intenta "simplificar" la señal de la aceleración bajo la hipótesis de que pequeñas fluctuaciones no son físicamente reales, sino que se tratan de perturbaciones en los sensores. Para ello, definimos un valor de mínima partición y consideramos que la aceleración se forma con múltiplos enteros a partir de éste.

En este caso sólo le permitimos a la aceleración que tome valores múltiplos enteros de 1m/s²


Después de este análisis para ajustar la aceleración, utiliza éste dato ya corregido para reconstruir mediante "diferencias finitas" la velocidad y, posteriormente, la posición. De esta manera recuperamos la trayectoria en tres dimensiones.

Representación de la trayectoria seguida por el móvil

Por último, se cruzan los datos con los del campo magnético para hacer una representación del campo sobre la trayectoria seguida.

Representación del campo magnético sobre la trayectoria seguida por la sonda


Adjunto a continuación la documentación del script (se puede consultar desde MATLAB/OCTAVE escribiendo "help sensor"):

 Programa para analizar los datos de AndroSensor (aplicación para android desde la cual se pueden consultar los datos de todos los sensores de un dispositivo ANDROID).

 Sintaxis:

 [dist,vmax,amax,Bmax,freq,longint]=sensor(F,cord,err0,Qfa,peak,eje,modo,guardargraf)

 Donde (consultar más abajo la descripción ampliada para cada parámetro de entrada):
  • "F": Archivo de datos de entrada. 
  • "cord": Tipo de coordenadas con las que se han grabado los datos.
  • "err0": Activar o no la corrección por error de cero.
  • "Qfa": Factor de cuantización.
  • "peak": Activar o no la corrección de picos aleatorios.
  • "eje": Eje principal.
  • "modo": Modo de ejecución.
  • "guardargraf": Opción para visualizar las gráficas o sólo guardarlas.

 El archivo de datos de entrada, "F", debe ser un archivo ".csv", salida de la aplicación AndroSensor, con separación por comas y columnas dispuestas exactamente de la siguiente manera:

MAGNITUD------------------------------Letra COL--# COL
----------------------------------------------------------------

 - Acelerometro (m/s²) x 3 ejes.
--------A,B,C----1,2,3
 - Gravedad (m/s²) x 3 ejes.------------D,E,F----4,5,6
 - Aceleracion lineal (m/s²) x 3 ejes.--G,H,I----7,8,9
 - Giroscopo (rad/s) x 3 ejes.----------J,K,L----10,11,12
 - Luz (Lux).---------------------------M--------13
 - Campo Magnetico (microT) x 3 ejes.---N,O,P----14,15,16
 - Orientacion (º) x 3 ejes.------------Q,R,S----17,18,19
 - Proximidad (m).----------------------T--------20
 - Presion atmosferica (atm).-----------U--------21
 - Nivel sonido (dB).-------------------V--------22
 - Latitud (º).-------------------------W--------23
 - Longitud (º).------------------------X--------24
 - Altitud (m).-------------------------Y--------25
 - Altitud Google (m)-------------------Z--------26
 - Altitud Presión (m)------------------AA-------27
 - Velocidad (Km/h).--------------------AB-------28
 - Precision (m).-----------------------AC-------29
 - Orientación GPS (º).-----------------AD-------30
 - Numero de Satelites.-----------------AE-------31
 - Tiempo (s).--------------------------AF-------32
 - Fecha.-------------------------------AG-------33

 La variable "cord" es el tipo de coordenada con la que está codificada la información en AndroSensor (por defecto, cord=0):
  • cord=0: Se utiliza como sistema de referencia uno externo fijo al mundo.
  • cord=1: Se utiliza como sistema de referencia uno fijado al dispositivo:
    • Eje x: Eje del ancho de la pantalla.
    • Eje y: Eje del alto de la pantalla.
    • Eje z: Eje de la profundidad del dispositivo.
Este método requiere una transformación de coordenadas basada en la orientación, lo que puede ocasionar errores si el refresco de esta variable es lento como acostumbra.

 La variable "err0" puede tomar dos valores:
  • err0=0 => Sin corrección de error de cero.
  • err0=1 => Se presupone que el objeto está en reposo total tanto al inicio como al final de su trayectoria, y se corrige la aceleración para que así sea.

 La variable "Qfa" es el valor con el que se corrige la sensibilidad de la aceleración. Un valor de "1" indicaría que la aceleración se mediría en pasos enteros de "1 m/s²". Un valor de "0" indica que no se realiza dicha corrección.

 La variable "peak" puede tomar tres valores:
  • peak=0 => Sin corrección de picos.
  • peak=1 => Corrige fluctuaciones demasiado cortas como para tener significado físico.
  • peak=2 => Corrige fluctuaciones demasiado cortas, y poco intensas, como para tener significado físico.

 El "eje" es el eje principal (por ejemplo, el eje en el que se desplaza el objeto), en el que queremos realizar un estudio especial, por ejemplo, de cara a la representación gráfica de la cinemática. Para elegirlo automáticamente, escribir "0".
  • Eje x = 1
  • Eje y = 2
  • Eje z = 3

 Por defecto se toma el eje de máximo desplazamiento.

 El modo de ejecución puede ser uno de los siguientes:
  • modo=-1 => No genera gráficas.
  • modo=0 => Genera todas las gráficas.
  • modo=1 => Genera las gráfica de correción.
  • modo=2 => Genera sólo las gráficas cinemáticas.
  • modo=3 => Genera sólo la gráficas magnéticas.

 El tratamiento de las gráficas viene dado por el parámetro "guardargraf". Puede tomar los siguientes valores:
  • guardargraf=0 => Se muestran los resultados por pantalla.
  • guardargraf=1 => Las gráficas no se muestran, sino que se guardan formato ".png".
  • guardargraf=2 => Las gráficas no se muestran. Se guardan fotogramas para poder crear una animación posteriormente.

 Nota: Se pueden juntar luego los fotogramas para formar un GIF desde Shell de Linux con "convert":

convert -delay 10 *.png -loop 0 Grafico_animado.gif

 Ejemplos de sintaxis:

 sensor(F,cord,err0,Qfa,peak,eje,modo,guardargraf)
 >>sensor('data.csv',1,0,2.32,1,3,2,1);

 Analiza los datos en "data.csv":
 1: Grabados con un sistema de referencia fijo al dispositivo.
 0: Sin corrección de cero.
 2.32: Cuantizando los valores de la aceleración con un paso de "2.32m/s²".
 1: Aplicando corrección de picos.
 3: Los datos cinemáticos serán representados según el "eje z".
 2: Se genera sólo la gráfica magnética.
 1: Las gráficas se guardarán como imágenes para su posterior visualización o procesado.


 Variables de salida: [dist,vmax,amax,Bmax,freq,longint]
  • dist: Distania (m) recorrida por la trayectoria.
  • vmax: Máxima velocidad en el intervalo grabado.
  • amax: Máxima aceleración en el intervalo grabado.
  • Bmax: Campo magnético máximo en el intervalo grabado.
  • freq: Frecuencia de fluctuaciones magnéticas (calculada respecto al valor medio del campo).
  • longint: Número de mediciones para cada variable.


 CRÉDITOS:

 Realizado por Astaroth (O.R.G.) - Diciembre 2014.

Por último, os adjunto el enlace al script (descargar sensor.m). Para ejecutarlo deberéis copiar el script a la carpeta en la que estéis trabajando con MATLAB/OCTAVE y escribir "sensor('data.csv')", donde el archivo "data.csv" son los datos grabados previamente con AndroSensor.

Espero que os haya resultado útil.

No hay comentarios:

Publicar un comentario

Querido astarothista!,

Si te ha gustado la entrada y quieres dejar constancia de ello, tienes alguna sugerencia para completarla o corregirla, quieres mostrar tu opinión respecto a algo de lo que se haya hablado en esta entrada (con respeto) o simplemente quieres dejarme un mensaje a mi o a la comunidad, no dudes en comentar ;)!

Recuerda que también estamos en Facebook y en Google+.