sistemas mathworks kalman filtro extendido etapas control algoritmo java android filter accelerometer kalman-filter

java - mathworks - filtro de kalman python



Filtro de Kalman y calidad de las variables de estado internas (2)

Estoy tratando de desarrollar una aplicación de detección de movimiento para Android. La aplicación debería poder seguir el movimiento del teléfono en el espacio y asignarlo a movimiento en la pantalla de la computadora. Estoy usando un acelerómetro de 3 ejes y dado que los datos son muy ruidosos, estoy usando el filtro Kalman.

El estado interno es el vector de 6 componentes [velocidad-x, velocidad-y, velocidad-z, accel-x, accel-y, accel-z] y el estado medido es 3 vectores de componentes [accel-x, accel-y, accel-z ]

El filtro funciona muy bien en valores medidos, pero la velocidad sigue siendo muy ruidosa.

Ahora me pregunto si esto es un comportamiento normal o si estoy haciendo algo mal, ya que mi comprensión del filtro de Kalman es muy básica. Estoy usando la biblioteca JKalman y siguiendo la matriz de transición de estado (dt es 1/15, que es la frecuencia aproximada de actualización del sensor)

double [] [] A = {{1, 0, 0, dt, 0, 0}, {0, 1, 0, 0, dt, 0}, {0, 0, 1, 0, 0, dt}, {0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 1}};

También he configurado mis propias matrices de covarianza con covarianzas calculadas a partir de datos de prueba. Esto mejoró un poco la señal de aceleración, pero no tuvo efecto en la velocidad.

Actualmente puedo lograr stdvar

[0,0632041857 0,0607274545 0,0886326602] para velocidad [x, y, z]

[0,0041689678 0,004423822 0,0074808552] para la aceleración [x, y, z].

Estoy bastante contento con la señal de aceleración y creo que no puedo mejorarla mucho más, pero me encantaría mejorar la calidad de la señal de velocidad.


No sé mucho sobre los filtros de Kalman, excepto lo que acabo de leer en la Wikipedia, pero diría que estás tratando de aplicar los filtros de Kalman de una manera inapropiada.

Los stdvars solo deberían representar el ruido, pero dudo que sea eso lo que calculó. Pero más fundamentalmente, creo que le faltan algunos datos de entrada: los filtros de Kalman se utilizan cuando tiene muchas entradas diferentes, por ejemplo , acelerómetro + GPS.

Parece imposible, con Kalman o cualquier otra cosa, que pueda leer en una entrada de acelerómetro ruidosa y de alguna manera obtener una trayectoria suave y precisa. Siempre se puede hacer algún tipo de promediación del tiempo de los datos del acelerómetro, lo que le daría una trayectoria suave, pero la trayectoria sería diferente de la real. (Si desea probar la promediación temporal, por ejemplo, a_smooth {i} = 0.6 a {i} + 0.3 a {i-1} + 0.1 a {i-2}.)

Y existe el problema más grande de que la precisión del acelerómetro es muy pobre y que probablemente no se pueda hacer mucho al respecto, especialmente si se hace un seguimiento de la posición, como lo responde @Ali.

EDIT : encontré algunas referencias en la web que tienen ecuaciones similares a las tuyas, sin embargo, esas fueron para un filtro de Kalman utilizado en un modelo con aceleración constante , que obviamente no es lo que quieres.


No funcionará

No importa lo que hagas, la velocidad será extremadamente inexacta en segundos. Aunque la respuesta en el enlace de arriba es acerca de la posición, lo mismo vale para la velocidad. En cuanto al filtro de Kalman, ver también aquí.

Debes probar el GPS para obtener velocidad o (si corresponde) simplemente usar la orientación del teléfono en tu aplicación y renunciar a obtener la velocidad.