- El filtro de Kalman es un algoritmo usado en predicción y control basados en sensores que produce en tiempo real estimaciones de estado más precisas a partir de mediciones ruidosas o inexactas
- No solo suaviza las mediciones, sino que también puede estimar variables de estado como posición y velocidad que son difíciles de observar directamente
- El ejemplo de seguimiento por radar muestra el flujo para estimar la posición y velocidad de un objeto como un vector de estado 4×1 a partir de mediciones de posición 2D y una covarianza
- Después de inicializar el estado con las dos primeras mediciones, repite la predicción, el cálculo de la ganancia de Kalman (Kalman Gain), y la actualización del estado y de la covarianza del error
- Como el único historial que mantiene el filtro es la estimación del estado actual, es fácil de implementar incluso en dispositivos con restricciones de memoria
Panorama general del filtro de Kalman
- El filtro de Kalman puede verse como una caja negra con entradas y salidas
- La entrada son mediciones ruidosas o a veces inexactas
- La salida son estimaciones con menos ruido y mayor precisión
- La estimación puede corresponder a parámetros de estado del sistema que no se midieron ni observaron directamente
- Se usa para estimar con alta precisión y en tiempo real tanto parámetros observables como no observables
- Las estimaciones de alta precisión se aprovechan para predicciones y toma de decisiones más exactas
- Por eso se usa con frecuencia en robótica y en sistemas en tiempo real donde se necesita información confiable
El problema que resuelve el filtro de Kalman
- A partir de mediciones inexactas o ruidosas, estima con mayor precisión el estado de una variable, u otras variables que son difíciles de observar directamente
- Algunas aplicaciones representativas son:
- Seguimiento de objetos: usa la posición medida para estimar con mayor precisión la posición y velocidad de un objeto
- Estimación de peso en una báscula digital: estima el peso de un objeto a partir de la presión aplicada sobre la superficie
- Guiado, navegación y control: estima posición, velocidad y aceleración con sensores IMU y lo usa para controlar el siguiente movimiento
- La fortaleza del filtro de Kalman no está tanto en suavizar mediciones, sino en su capacidad para estimar parámetros del sistema difíciles de medir
- En sistemas en tiempo real, estimaciones más precisas se traducen en mejor control y mejores funciones
Entradas y salidas del ejemplo de seguimiento por radar
- El ejemplo trata una situación de seguimiento por radar de aviones y objetos alrededor de un aeropuerto
- El estado de trayectoria resultante se usa para mostrarse a operadores de control de tráfico aéreo que vigilan el espacio aéreo
- El radar entrega mediciones de posición x, y en un sistema de coordenadas cartesianas 2D
- Las mediciones se representan como el vector columna 2×1 z
- La matriz de varianza-covarianza de las mediciones se representa como R
- La marca de tiempo de la medición se representa como t
- El subíndice m indica el parámetro medido y k indica el orden de la medición
- El filtro de Kalman estima la posición y velocidad del objeto con base en las mediciones del radar
- La estimación se representa como el vector columna 4×1 x
- La matriz de varianza-covarianza de la estimación se representa como la matriz 4×4 P
- La marca de tiempo de la estimación del estado se indica como T
Paso 1: inicialización del estado del sistema
- La forma de inicialización del filtro de Kalman varía según la aplicación
- En este ejemplo de seguimiento por radar, el estado del sistema se inicializa con la primera medición
- La medición de entrada solo contiene información de posición, pero el estado del sistema de salida incluye la posición y velocidad del objeto
- Cuando llega la primera medición, la única información conocida es la posición en ese instante
- Después de la primera estimación, el estado estimado del sistema se fija con la posición de entrada
- La covarianza del error del estado del sistema se fija con la precisión de posición de la primera medición
Paso 2: reinicialización del estado del sistema
- Como para estimar la velocidad se necesita una segunda medición de posición, se reinicializa la estimación del estado del sistema
- La velocidad se calcula con una aproximación lineal
- La velocidad se calcula como distancia recorrida / tiempo transcurrido en el movimiento
- La estimación actualizada del estado del sistema queda compuesta por la posición de la segunda medición y la velocidad calculada
- La covarianza actualizada del error del estado del sistema incluye la precisión de posición de la segunda medición y la precisión aproximada de la velocidad
- El valor aproximado de la precisión de la velocidad puede ajustarse mediante tuning después de pasar datos por el filtro
- En el ejemplo, el término de varianza de la velocidad se fija en 10⁴
- Este valor representa una gran incertidumbre sobre el valor del estado de velocidad
- La unidad de velocidad en el ejemplo es m/s
Procesamiento iterativo después de la inicialización
- Los dos primeros pasos son el proceso de inicializar y reinicializar la estimación del sistema con algunas mediciones
- La forma de inicialización puede variar según la aplicación
- El objetivo es contar con una estimación del estado del sistema que luego pueda actualizarse con las ecuaciones del filtro de Kalman
- A partir de ahí, las nuevas mediciones se incorporan al filtro y se actualiza la estimación del estado
Paso 3: predicción de la estimación del estado del sistema
- Cuando llega la tercera medición, la estimación del estado del sistema se propaga hacia adelante para alinearse en el tiempo con la medición
- Esta alineación es necesaria para combinar la medición con la estimación del estado
- Para la predicción se usa un modelo del sistema
- En el ejemplo, se aproxima el cambio de posición del objeto durante el intervalo de tiempo con un modelo lineal de movimiento a velocidad constante
- El modelo de velocidad constante asume que la aceleración es 0
- La matriz de transición de estado representa esta ecuación de movimiento
- Esta matriz se usa para propagar correctamente la estimación del estado y la matriz de covarianza del error del estado
- Al propagar la estimación del estado a un instante futuro, aparece incertidumbre sobre ese estado, por lo que la covarianza del error aumenta
Matriz Q y matriz H
- La matriz Q representa el ruido de proceso del modelo del sistema
- El modelo del sistema es una aproximación
- La precisión del modelo varía a lo largo de la vida del estado del sistema
- La matriz Q representa esa incertidumbre y se suma al ruido del estado existente
- En el ejemplo, la aceleración y desaceleración reales contribuyen a ese error
- La matriz H es la matriz estado-medición, que transforma la estimación del estado del sistema del espacio de estados al espacio de medición
- En algunas aplicaciones es una matriz compuesta por 0 y 1
- En aplicaciones que usan un filtro de Kalman extendido (Extended Kalman Filter), se llena con ecuaciones diferenciales
- La explicación relacionada continúa en el artículo Extended Kalman Filters
- En este ejemplo, la matriz H es una matriz simple que reduce la estimación del estado y la covarianza del error para poder comparar solo los valores de posición, no toda la posición y velocidad
Paso 4: cálculo de la ganancia de Kalman
- El filtro de Kalman calcula la ganancia de Kalman con cada nueva medición
- La ganancia de Kalman determina cuánto influirá la medición de entrada en la estimación del estado del sistema
- Si el ruido de la medición es muy grande, la ganancia de Kalman hará que se confíe más en la estimación actual del estado que en la información nueva pero imprecisa
- El núcleo del algoritmo del filtro de Kalman está en ponderar adecuadamente la estimación actual y la nueva información medida para producir una estimación óptima
Paso 5: actualización del estado y de la covarianza del error
- El filtro de Kalman usa la ganancia de Kalman para estimar el estado del sistema y la matriz de covarianza del error en el instante de la medición de entrada
- La ganancia de Kalman se usa para dar el peso apropiado a la medición en dos cálculos
- Cálculo de la nueva estimación del estado del sistema
- Cálculo de la covarianza del error del estado del sistema
- La estimación calculada del estado es el único historial de estado que conserva el filtro de Kalman
- Gracias a esta característica, el filtro de Kalman puede implementarse incluso en dispositivos con bajas restricciones de memoria
Resumen
- El filtro de Kalman es un proceso de propósito general para la estimación óptima de estado
- Se usa en diversas aplicaciones donde se necesitan estimaciones precisas
- Si se divide en pasos pequeños, el funcionamiento del filtro de Kalman se vuelve menos intimidante y más fácil de entender
1 comentarios
Comentarios de Hacker News
Cuando se habla del filtro de Kalman, no puede faltar el enlace a este excelente material de aprendizaje. Es un libro escrito como una colección de notebooks de Jupyter: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Pyt...
Este libro trata al filtro alfa-beta como una especie de hermano menor del filtro de Kalman “de verdad”, pero al leer bastante sobre algo parecido que necesitaba recientemente en el trabajo, me di cuenta de que el filtro alfa-beta y la familia Kalman están muy enfocados en la predicción del futuro cercano, mientras que lo que en realidad necesitaba era suavizado de datos pasados
Así que empecé a leer sobre suavizado exponencial doble, y parecía encajar perfecto con mi caso de uso; pero mientras más profundizaba, más claro quedaba que al final era el mismo filtro alfa-beta con nombres de variables distintos
Da la impresión de que toda esta área de las matemáticas se sostiene sobre unas cuantas teorías fundamentales compartidas, pero como distintos campos llegan al mismo sistema desde enfoques diferentes, cambian los nombres y la notación y eso oculta lo que tienen en común. Parece que en el centro de cosas como series de potencias, la constante natural, descenso por gradiente, filtros, sistemas de retroalimentación y teoría general de sistemas hay un núcleo intuitivo relativamente pequeño; si uno lograra captarlo, mucha matemática se conectaría de forma elegante
No es para ahorrar papel ni porque sea más fácil de escribir. En LaTeX, con un teclado en inglés, escribir letras griegas con superíndices y subíndices no es más fácil que escribir palabras. La idea es transmitir al lector cierto tipo de información específica que de otra manera sería difícil comunicar
La notación matemática parece texto, pero en esencia es una notación bastante visual, y las palabras largas terminan tapando esa imagen
Si tomas en serio cursos de control y de señales/sistemas, esa intuición se te queda grabada, y terminas aprendiendo las matemáticas y la terminología sin obsesionarte con una convención de notación en particular. La verdadera intuición es que “todo es un filtro”, y el resto es analizar y sintetizar esa idea
A medida que AI/ML ha crecido, las ideas de la teoría clásica de control también se están combinando con aprendizaje por refuerzo
Normalmente Q y R se ajustan a mano hasta que “se ven bien” y luego ya no se vuelven a cambiar. Además, en vez de ajustar a mano varios valores de Q y R, basta con ajustar una sola ganancia
Si el ruido de las mediciones siempre es el mismo, con el tiempo converge a constantes; solo se vuelve especialmente útil cuando puedes conocer bien la precisión de la medición y aun así esta cambia mucho
Hace poco me tocó implementar un filtro de Kalman, y de verdad fue muy difícil encontrar buen material explicado en un lenguaje que yo, como desarrollador, pudiera entender. Después de aprenderlo durante más o menos un mes, escribí dos artículos, y quizá le sirvan a alguien: https://www.splinter.com.au/2023/12/14/the-kalman-filter-for..., https://www.splinter.com.au/2023/12/15/the-kalman-filter-wit...
Irónicamente, desde la perspectiva de desarrollador, solo entendí las matemáticas después de implementarlo yo mismo. Parece una forma de aprender en la que vas construyendo sobre cosas que ya conoces; me pregunto si existe un término para eso
Siempre he pensado que las matemáticas serían mucho más fáciles de aprender si usaran nombres de variables descriptivos. Al menos en un medio interactivo como la web, podrían poner aunque sea tooltips. Cuando estudio matemáticas, paso el 90% del tiempo buscando qué significa cada símbolo
También aquí me confunde cuando dicen que el subíndice “indica el orden de las mediciones”: no queda claro de qué orden hablan. Supongo que quieren decir el índice. Hace mucho que no toco el filtro de Kalman
Cuanto más pura se vuelve la matemática, más corto suele ser el alcance de la mayoría de las variables. Normalmente una variable se define justo antes de usarse, y su alcance no sale de esa prueba o derivación
Aun así, algunas elecciones de este texto son simplemente raras. Por ejemplo, usar P a la vez como variable y como índice, y usar P para la matriz de covarianza aunque la matriz de precisión sea justamente la inversa de la matriz de covarianza
La parte más irritante de los artículos de investigación es justamente esta ambigüedad. Hay que ser necesariamente claros. Hay que usar descripciones absolutas, no relativas. No deberías decir “mira a la derecha”. Yo podría estar mirando a la izquierda
Si escribes “después de rotar el prisma, el cono de luz...”, falta en qué dirección fue la rotación. Si fue hacia la izquierda o hacia la derecha, en horizontal o hacia arriba y abajo, rápido o lento. La persona que escribe tiene todos esos elementos clave dibujados en su cabeza, pero el lector no puede leerle la mente
El subíndice “p” probablemente significa prediction, es decir, predicción. x_p en el tiempo 3 es el estado esperado en el tiempo 4. Pero cuando realmente llega el tiempo 4, se calcula x_4 incorporando la nueva medición
Para ser claros, este x_4 es distinto del x_p calculado en el tiempo 3. Las predicciones siempre se equivocan un poco
El problema es que quien recién empieza todavía no domina los conceptos ni la notación estándar de cada área del problema, y por eso sigue existiendo el dolor de subirse a un tema nuevo
El filtro de Kalman puede ser uno de esos casos raros en matemáticas donde la versión simplificada está tan simplificada que casi ya no se parece al original
Lo que realmente hace es tomar una medición, simular los posibles estados futuros, luego combinar esa información con la siguiente medición y repetir
Por ejemplo, podrías tomar varias fotos de una pelota de tenis, estimar su posición y velocidad a partir de la primera imagen, simular hacia dónde irá, y luego compararlo con la siguiente foto para ver qué estimación está más cerca de la verdad. O, de una forma más antigua, puedes pensar en medir la altura del sol para trazar una línea de posiciones posibles en un mapa y compararla con el punto donde originalmente creías estar
Claro, el cálculo exacto es prácticamente imposible en la realidad. Por eso se simplifica mediante muestreo. Aun así sigue siendo difícil, así que se asume que la distribución se parece en cierta medida a una distribución gaussiana. Si además se simplifica suponiendo que los cambios del sistema son una transformación lineal, se obtiene el filtro de Kalman del que se habla aquí
Sería sorprendente poder entender qué está pasando realmente mirando solo el álgebra lineal
Esta explicación fue la primera que de verdad me dio una intuición de lo que está pasando. Para alguien de computación como yo, hasta el nombre resulta bastante engañoso, porque no es un filtro en el sentido de procesamiento de streams o de SQL
El filtro de Kalman intenta estimar la entrada oculta que produjo las mediciones. Para hacerlo, plantea el problema de
minimizar respecto de x [medición_real - medición_esperada(x)]^2/s^2, dondeses la sigma del ruidoEsto sale del problema de estimación de estado de
maximizar la verosimilitud de observar la medición_real respecto de x. Porque en la función de verosimilitud, el término importante es solo-([x-expected(x)]/s)^2. Basta con mirar el exponente de una distribución normal, o de hecho de casi cualquier distribución exponencialComo
medición_reales constante, si la funciónmedición_esperadaes lineal, se resuelve directamente como una optimización convexa. Derivas, igualas a 0 y resuelves, y así sale el paso de actualización del filtro de KalmanSi la función es no lineal, eso equivale a linealizar la ecuación, minimizarla y devolver la solución de esa “linealización falsa”: básicamente, un paso de Newton-Raphson. Es cálculo y álgebra lineal de licenciatura, solo que nadie te lo dice así
Pero esto también es completamente incorrecto. Es un hack de los años 60 para maximizar la función de verosimilitud con este tipo de linealización recursiva de un solo paso. Por una mala lectura del límite de Cramér-Rao, varias generaciones de ingenieros han creído que esto es óptimo, pero en realidad no lo es
Hoy tenemos 10,000 veces más recursos de cómputo, y se obtiene mejor rendimiento si se plantean y resuelven ecuaciones no lineales con varios pasos de Newton-Raphson, o si se mantiene un historial largo de mediciones y se resuelve todo ese bloque con varios pasos de Newton-Raphson, o si se usa una representación de mezcla gaussiana para admitir funciones de medición multimodales
Estas cosas han sido bien tratadas en la investigación sobre estimación de estado desde los años 80 hasta hoy, pero los libros de texto siguen como si hubieran quedado grabados en piedra en 1972
El límite de Cramér-Rao solo está definido cuando todas las funciones de verosimilitud de medición pueden linealizarse en el estado verdadero, algo que solo es posible asintóticamente en un bloque que conserve todas las mediciones, imposible antes de tiempo infinito e imposible también con un filtro recursivo
Entre las explicaciones antiguas, este texto estaba bueno: https://www.bzarg.com/p/how-a-kalman-filter-works-in-picture..., https://news.ycombinator.com/item?id=13449229
Si de verdad necesitas un filtro de Kalman, probablemente sí puedas leer y entender este texto, el artículo de Wikipedia o el código de implementación (https://github.com/LdDl/kalman-rs/blob/master/src/kalman/kal...)
Pero, por experiencia, casi todo el mundo aprende mejor con ejemplos, como aprendiz visual. Por eso sorprende que el tutorial de la mitad de la página no meta números de ejemplo en las fórmulas. Puede que se me haya pasado, pero los diagramas tampoco empiezan hasta después de una página entera de texto que dice “qué es un filtro de Kalman”, y hasta esos diagramas son más fórmulas
Esto pasa tan seguido que hasta sorprende. En una versión más leve, el mismo problema aparece en bibliotecas de software que no incluyen ejemplos de código
Lo que sí me hizo clic fue que, si combinas dos distribuciones de medición inciertas, o sea distribuciones con varianza grande, obtienes una medición más confiable, es decir, una distribución más angosta
Si vuelves a combinar esa medición más confiable con la siguiente medición y repites el proceso, eso ya es exactamente un filtro de Kalman
Entre los videos que explican KF, este estuvo realmente bueno. Lo entendí mejor que con el material del post original: https://www.youtube.com/watch?v=CaCcOwJPytQ
Mi difunto padre usó este filtro con frecuencia durante toda su carrera, desde la época en que apenas se estaba inventando. Trabajaba con radares y sistemas de guía de misiles
Cierra los ojos y camina un momento. Imagina dónde estás, y luego abre los ojos: ¿tu posición real es distinta de la que creías?
Ese último paso, o sea usar una observación para actualizar tu creencia sobre las variables de estado, es lo que hace el filtro de Kalman