Entendendo o filtro de Kalman com um exemplo simples de radar
(kalmanfilter.net)- O filtro de Kalman é um algoritmo ótimo de estimação de estado que estima o estado de um sistema e prevê o futuro em ambientes com muito ruído
- Usando como exemplo um radar de rastreamento de aeronaves, o texto explica como a precisão aumenta ao repetir as etapas de previsão e atualização com medições de distância e velocidade
- Em cada etapa, calcula-se o vetor de estado, a matriz de covariância e o ganho de Kalman (Kalman Gain) para combinar de forma ponderada os valores medidos e previstos
- Considerando ao mesmo tempo a incerteza da medição e a incerteza do modelo, o material mostra numericamente que o erro de estimação (incerteza) diminui com o tempo
- Com exemplos numéricos intuitivos e cálculos passo a passo, oferece uma base de entendimento para projetar e implementar o filtro diretamente
Introdução ao filtro de Kalman
-
O Kalman Filter é um algoritmo de estimação de estado que estima e prevê o estado de um sistema em ambientes onde há incertezas, como ruído de medição ou fatores externos
- É usado como ferramenta essencial em várias áreas, como rastreamento de objetos, navegação, robótica e controle
- Por exemplo, pode ser aplicado para reduzir o ruído na trajetória do mouse e obter movimentos mais suaves, detectar tendências em dados financeiros e fazer previsões meteorológicas
- O material aponta que muitos recursos educacionais se concentram na derivação matemática e carecem de exemplos práticos, por isso este conteúdo oferece uma explicação intuitiva centrada em exemplos numéricos
- Também aborda casos em que um filtro mal projetado falha no rastreamento e apresenta formas de corrigir isso
- O objetivo é estabelecer a compreensão necessária para que o leitor consiga projetar e implementar seu próprio filtro de Kalman
Trilha de aprendizado
- Visão geral em uma única página: apresenta de forma breve os conceitos centrais e as principais fórmulas, exigindo apenas conhecimentos básicos de estatística e álgebra linear
- Tutorial web gratuito: tutorial online com exemplos numéricos passo a passo para desenvolver a intuição, sem exigir conhecimento prévio
- Kalman Filter from the Ground Up (livro): 14 exemplos numéricos completos, filtros não lineares (Extended/Unscented) e fusão de sensores, com código em Python e MATLAB
A necessidade de prever
- A necessidade de estimação e previsão de estado é explicada por meio do exemplo de um radar de rastreamento de aeronaves
- O estado do sistema é a posição da aeronave (distância (r)), e o radar calcula a distância medindo o tempo de reflexão do pulso
- A velocidade (v) pode ser medida pelo efeito Doppler
- A previsão da posição após um intervalo de tempo fixo (\Delta t) é feita com um modelo dinâmico
- Ex.: (r_{t_1} = r_{t_0} + v \cdot \Delta t)
- (\Delta t = 5s), (r_{t_0}=10,000m), (v=200m/s) → (r_{t_1}=11,000m)
- Em ambientes reais, existem ruído de medição (Measurement Noise) e incerteza de modelo (Process Noise)
- Mesmo que vários radares meçam ao mesmo tempo, os resultados diferem ligeiramente
- Fatores externos, como o vento, quebram a suposição de velocidade constante
- O filtro de Kalman executa ao mesmo tempo a estimação do estado atual e a previsão do estado futuro, fornecendo também a incerteza (variância) de cada estimativa
- É um algoritmo ótimo que minimiza a incerteza da estimação do estado
Exemplo de filtro de Kalman
-
Um radar unidimensional mede a distância (r) e a velocidade (v) de uma aeronave
- Vetor de estado (\boldsymbol{x} = [r, v]^T)
- O sistema é representado com vetores e matrizes
-
Iteration 0 — inicialização e previsão
-
Inicialização
- O filtro é inicializado com a primeira medição (\boldsymbol{z}_0 = [10{,}000, 200]^T)
- Incerteza da medição (desvio padrão): distância 4m, velocidade 0.5m/s (\boldsymbol{R}_0 = \begin{bmatrix}16 & 0 \ 0 & 0.25\end{bmatrix})
- Estimativa inicial de estado (\hat{\boldsymbol{x}}_{0,0} = \boldsymbol{z}_0)
- Covariância inicial (\boldsymbol{P}_{0,0} = \boldsymbol{R}_0)
-
Etapa de previsão
- Intervalo de tempo (\Delta t = 5s)
- Matriz de transição de estado (\boldsymbol{F} = \begin{bmatrix}1 & 5 \ 0 & 1\end{bmatrix})
- Estado previsto (\hat{\boldsymbol{x}}{1,0} = \boldsymbol{F}\hat{\boldsymbol{x}}{0,0} = [11{,}000, 200]^T)
- Previsão da covariância (sem ruído de processo): (\boldsymbol{P}{1,0} = \boldsymbol{F}\boldsymbol{P}{0,0}\boldsymbol{F}^T = \begin{bmatrix}22.25 & 1.25 \ 1.25 & 0.25\end{bmatrix})
- Adição de ruído de processo ((\sigma_a = 0.2m/s^2)): (\boldsymbol{Q} = \begin{bmatrix}6.25 & 2.5 \ 2.5 & 1\end{bmatrix})
- Covariância prevista final: (\boldsymbol{P}_{1,0} = \begin{bmatrix}28.5 & 3.75 \ 3.75 & 1.25\end{bmatrix})
-
Resumo da Iteration 0
- A primeira medição inicializa o estado e a covariância
- O modelo de transição de estado é usado para prever o próximo estado e sua incerteza
- Fórmulas de previsão
- Previsão do estado: (\hat{\boldsymbol{x}}{n+1,n} = \boldsymbol{F}\hat{\boldsymbol{x}}{n,n} + \boldsymbol{G}\boldsymbol{u}_n)
- Previsão da covariância: (\boldsymbol{P}{n+1,n} = \boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T + \boldsymbol{Q})
-
Iteration 1 — atualização e previsão
-
Atualização do filtro
- Segunda medição: (\boldsymbol{z}_1 = [11{,}020, 202]^T)
- Aumento da incerteza da medição (desvio padrão: distância 6m, velocidade 1.5m/s) (\boldsymbol{R}_1 = \begin{bmatrix}36 & 0 \ 0 & 2.25\end{bmatrix})
- Em comparação com a covariância prevista (\boldsymbol{P}_{1,0}), a incerteza da previsão é menor
- O filtro de Kalman combina medição e previsão como uma média ponderada
- Peso (K_1): Kalman Gain
- Equação de atualização do estado: (\hat{\boldsymbol{x}}{1,1} = \hat{\boldsymbol{x}}{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1 - \boldsymbol{H}\hat{\boldsymbol{x}}{1,0}))
- Matriz de observação (\boldsymbol{H} = \boldsymbol{I})
- Cálculo do ganho de Kalman: (\boldsymbol{K}1 = \boldsymbol{P}{1,0}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{1,0}\boldsymbol{H}^T + \boldsymbol{R}_1)^{-1}) Resultado: (\boldsymbol{K}_1 = \begin{bmatrix}0.4048 & 0.6377 \ 0.0399 & 0.3144\end{bmatrix})
- Inovação (innovation): (\boldsymbol{z}1 - \hat{\boldsymbol{x}}{1,0} = [20, 2]^T)
- Valor de correção: (\boldsymbol{K}_1[20, 2]^T = [9.37, 1.43]^T)
- Estado atualizado: (\hat{\boldsymbol{x}}_{1,1} = [11{,}009.37, 201.43]^T)
-
Atualização da covariância
- Usa-se a forma simplificada: (\boldsymbol{P}_{1,1} = (\boldsymbol{I} - \boldsymbol{K}1)\boldsymbol{P}{1,0})
- Resultado: (\boldsymbol{P}_{1,1} = \begin{bmatrix}14.57 & 1.43 \ 1.43 & 0.71\end{bmatrix})
- Após a atualização, a incerteza é menor do que a incerteza da previsão e da medição → Combinar medição e previsão sempre reduz a incerteza
-
Etapa de previsão
- Previsão para o próximo instante (t_2)
- Previsão do estado: (\hat{\boldsymbol{x}}{2,1} = \boldsymbol{F}\hat{\boldsymbol{x}}{1,1} = [12{,}016.5, 201.43]^T)
- Previsão da covariância: (\boldsymbol{P}{2,1} = \boldsymbol{F}\boldsymbol{P}{1,1}\boldsymbol{F}^T + \boldsymbol{Q} = \begin{bmatrix}52.86 & 7.47 \ 7.47 & 1.71\end{bmatrix})
- Com o passar do tempo, se não houver medição, a incerteza volta a aumentar
- Previsão para o próximo instante (t_2)
-
Resumo da Iteration 1
- Etapa de atualização: combina previsão e medição com o ganho de Kalman
- Etapa de previsão: leva o estado atualizado ao instante seguinte
- Fórmulas principais
- Atualização do estado: (\hat{\boldsymbol{x}}{n,n} = \hat{\boldsymbol{x}}{n,n-1} + \boldsymbol{K}_n(\boldsymbol{z}n - \boldsymbol{H}\hat{\boldsymbol{x}}{n,n-1}))
- Atualização da covariância (forma de Joseph): (\boldsymbol{P}_{n,n} = (\boldsymbol{I} - \boldsymbol{K}n\boldsymbol{H})\boldsymbol{P}{n,n-1}(\boldsymbol{I} - \boldsymbol{K}_n\boldsymbol{H})^T + \boldsymbol{K}_n\boldsymbol{R}_n\boldsymbol{K}_n^T)
- Ganho de Kalman: (\boldsymbol{K}n = \boldsymbol{P}{n,n-1}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T + \boldsymbol{R}_n)^{-1})
Resumo do exemplo
- As três etapas do filtro de Kalman: inicialização → previsão → atualização
- Depois disso, repete-se o loop de previsão-atualização
- Sempre que uma nova medição é adicionada, a incerteza diminui e a estimação do estado do sistema se torna gradualmente mais precisa
- Materiais adicionais de estudo
- Tutorial online gratuito tutorial: oferece exemplos numéricos passo a passo
- Livro Kalman Filter from the Ground Up: inclui filtros lineares e não lineares, diretrizes de implementação e código em Python/MATLAB
1 comentários
Comentários do Hacker News
Sou o autor. Atualizei recentemente a página inicial do meu tutorial de Kalman Filter. Adicionei um exemplo simples de rastreamento por radar para que mesmo quem só conhece o básico de estatística e álgebra linear consiga entender
Tentei manter a derivação matemática no mínimo, ao mesmo tempo mostrando de forma intuitiva o ruído das medições, o modelo de previsão e o processo de combinação do filtro. Gostaria de ouvir feedback sobre o nível matemático e a clareza da explicação
O guia intuitivo que tenho em mente é o seguinte
No fim, o essencial é o método dos mínimos quadrados, e sob certas hipóteses é possível provar que ele é ótimo
O artigo “How a Kalman Filter Works in Pictures” é realmente muito bom
Por exemplo, um filtro passa-baixa também é um tipo de estimador, mas o filtro de Kalman adiciona a isso um modelo de processo e cálculos de covariância, ajustando-se dinamicamente.
Ele reflete as relações entre variáveis correlacionadas, como posição e velocidade, de modo que uma medição influencia também a estimativa de outras variáveis.
Como se baseia em álgebra linear, porém, ele precisa assumir ruído gaussiano, e para problemas não lineares são necessárias variantes como EKF ou UKF
Para entender o filtro de Kalman, é preciso conhecer estas quatro coisas
O filtro é uma solução matemática para estimar de forma ótima o estado interno e a covariância de um sistema com base em medições.
Acho que o livro de Alex Becker é uma excelente introdução ao tema. Ele tem muitos exemplos e ajuda bem a construir a intuição
Ao aprender o filtro de Kalman, ele fica muito mais intuitivo quando há duas ou mais entradas com características de ruído diferentes. Mas a maioria dos tutoriais trata apenas de uma entrada
O filtro de Kalman é bastante usado na prática também. Por exemplo, a Sendspin o usa para sincronização de alto-falantes
Você pode consultar a demo ao vivo e a documentação de implementação
Fiquei curioso se o conceito de filtro de Kalman poderia ser aplicado também a depoimentos humanos
Em thekalmanfilter.com também dá para ver uma explicação simples
Este texto pareceu uma propaganda de livro caro. Já existe muito material gratuito, por exemplo Kalman and Bayesian Filters in Python e afins. Fiquei curioso para saber qual seria o diferencial deste livro