Filtro de Kalman (Kalman Filter)

"Se você não consegue explicar de forma simples, você não entendeu bem o suficiente."

Albert Einstein

Introdução ao Filtro de Kalman

O Filtro de Kalman é um algoritmo para estimar e prever o estado do sistema em presença de incerteza, como ruído de medição (measurement noise) ou influências de fatores externos desconhecidos. O Filtro de Kalman é uma ferramenta essencial em áreas como rastreamento de objetos, navegação, robótica e controle. Por exemplo, pode ser aplicado para estimar a trajetória de um mouse de computador, reduzindo o ruído e compensando tremores da mão, resultando em um caminho de movimento mais estável.

Além da engenharia, o Filtro de Kalman encontra aplicações em análise de mercados financeiros, como a detecção de tendências de preços de ações em dados ruidosos, e em aplicações meteorológicas para previsão do tempo.

Embora o Filtro de Kalman seja um conceito simples, muitos recursos educacionais o apresentam por meio de explicações matemáticas complexas e carecem de exemplos ou ilustrações do mundo real. Isso dá a impressão de que o tema é mais complexo do que realmente é.

Este guia apresenta uma abordagem alternativa que usa exemplos numéricos práticos e explicações simples para tornar o Filtro de Kalman fácil de entender. Também inclui exemplos com cenários de projeto ruins em que o Filtro de Kalman falha em rastrear o objeto corretamente e discute métodos para corrigir tais problemas.

Ao final, você não apenas entenderá os conceitos e a matemática subjacentes, como também será capaz de projetar e implementar o Filtro de Kalman por conta própria.

Caminhos de aprendizagem do Filtro de Kalman

Este projeto explica o Filtro de Kalman em três níveis de profundidade, permitindo que você escolha o caminho que melhor se ajusta ao seu conhecimento e objetivos de aprendizado:

  • Visão geral em uma única página (esta página)
    Uma introdução concisa que apresenta as principais ideias do Filtro de Kalman e as equações essenciais, sem derivações. Esta página explica os conceitos centrais e a estrutura geral do algoritmo usando um exemplo simples, e pressupõe conhecimento básico de estatística e álgebra linear.
  • Tutorial gratuito na web baseado em exemplos
    Um tutorial online passo a passo que constrói a intuição por meio de exemplos numéricos. O tutorial apresenta o material de base necessário e percorre a derivação das equações do Filtro de Kalman. Não é necessário conhecimento prévio.
  • Kalman Filter from the Ground Up (livro)
    Um guia abrangente que inclui 14 exemplos numéricos totalmente resolvidos, com gráficos e tabelas de desempenho. O livro cobre tópicos avançados como Filtros de Kalman não lineares (Filtro de Kalman Estendido e Unscented Kalman Filter), fusão de sensores e diretrizes práticas de implementação. O livro e o código-fonte (Python e MATLAB) para todos os exemplos numéricos estão disponíveis para compra.
Livro do Filtro de Kalman
Guia do Filtro de Kalman baseado em exemplos

A necessidade de predição

Começamos formulando o problema para entender por que precisamos de um algoritmo para estimação e predição de estado.

Para ilustrar, considere o exemplo de um radar de rastreamento:

Radar de rastreamento

Suponha que temos um radar que rastreia uma aeronave. Nesse cenário, a aeronave é o sistema, e a grandeza a ser estimada é sua posição, que representa o estado do sistema.

O radar amostra o alvo direcionando um feixe estreito até ele e fornece medições de posição da aeronave. Com base nessas medições, podemos estimar o estado do sistema (a posição da aeronave).

Para rastrear a aeronave, o radar deve revisitar o alvo em intervalos regulares apontando o feixe em sua direção. Isso significa que o radar precisa prever a posição futura da aeronave para o próximo feixe. Se não fizer isso, o feixe pode ser apontado na direção errada, resultando em perda de rastreamento. Para fazer essa predição, precisamos de conhecimento sobre como a aeronave se move. Em outras palavras, precisamos de um modelo que descreva o comportamento do sistema ao longo do tempo, conhecido como modelo dinâmico (Dynamic Model).

Para simplificar o exemplo, consideremos um mundo em uma dimensão no qual a aeronave se move ao longo de uma linha reta, aproximando-se do radar ou afastando-se dele.

Radar em uma dimensão

O estado do sistema é definido como o alcance da aeronave em relação ao radar, denotado por \( r \). O radar envia um pulso em direção à aeronave, que é refletido pelo alvo e retorna ao radar. Medindo o tempo entre a transmissão e a recepção do pulso e sabendo que o pulso é uma onda eletromagnética que viaja à velocidade da luz, o radar pode calcular facilmente o alcance \( r \) da aeronave. Além do alcance, o radar também pode medir a velocidade \( v \) da aeronave, assim como um radar policial detecta a velocidade de um carro usando o efeito Doppler.

Suponha que no instante \( t_{0} \) o radar meça o alcance e a velocidade da aeronave com altíssima exatidão e precisão. O alcance medido é 10.000 metros e a velocidade é 200 metros por segundo. Isso nos dá o estado do sistema:

\[ r_{t_{0}} = 10,000m \]

O próximo passo é prever o estado do sistema no instante \( t_{1}=t_{0}+\Delta t \), onde \( \Delta t \) é o tempo de revisita do alvo. Dado que se espera que a aeronave mantenha velocidade constante, pode-se usar um modelo dinâmico de velocidade constante para prever sua posição futura.

A distância percorrida durante o intervalo de tempo \( \Delta t \) é dada por:

\[ \Delta r = v \cdot \Delta t \]

Assumindo um intervalo de amostragem de 5 segundos, a posição prevista no instante \( t_{1} \) é:

\[ r_{t_{1}} = r_{t_{0}} + \Delta r = 10,000 + 200 \cdot 5 = 11,000m \]

Este é um algoritmo elementar baseado em princípios simples. O estado atual do sistema é derivado da medição (Measurement) e o modelo dinâmico é usado para prever o estado futuro.

Esquema elementar de estimação de estado

Na vida real, as coisas são mais complexas. Primeiro, as medições do radar não são perfeitamente precisas. Elas são afetadas por ruído e contêm um certo nível de aleatoriedade. Se dez radares diferentes medissem o alcance da aeronave no mesmo instante, eles produziriam dez resultados ligeiramente diferentes. Esses resultados provavelmente estariam próximos uns dos outros, mas não idênticos. A variação nas medições é causada pelo ruído de medição.

Isso leva a uma nova questão: quão certa é nossa estimativa? Precisamos de um algoritmo que não apenas forneça uma estimativa, mas também nos diga quão confiável ela é.

Outra questão é a exatidão do modelo dinâmico. Embora possamos assumir que a aeronave se move a velocidade constante, fatores externos como o vento podem introduzir desvios dessa suposição. Essas influências imprevisíveis são chamadas de ruído do processo (Process Noise).

Assim como queremos avaliar a certeza da nossa estimativa baseada em medição, também queremos entender o nível de confiança da nossa predição.

O Filtro de Kalman é um algoritmo de estimação de estado que fornece tanto uma estimativa do estado atual quanto uma predição do estado futuro, juntamente com uma medida de sua incerteza. Além disso, é um algoritmo ótimo que minimiza a incerteza de estimação de estado. É por isso que o Filtro de Kalman se tornou um algoritmo tão amplamente usado e confiável.

Esquema de estimação e predição de estado

Exemplo de Filtro de Kalman

Comecemos com um exemplo simples: um radar em uma dimensão que mede alcance e velocidade transmitindo um pulso em direção a uma aeronave e recebendo o eco refletido. O atraso entre a transmissão do pulso e a recepção do eco fornece informação sobre o alcance \(r\) da aeronave, e o desvio de frequência do eco refletido fornece informação sobre a velocidade \(v\) da aeronave (efeito Doppler).

Neste exemplo, o estado do sistema é descrito tanto pelo alcance \(r\) quanto pela velocidade \(v\) da aeronave. Definimos o estado do sistema pelo vetor \(\boldsymbol{x}\), que inclui ambas as grandezas:

\[ \boldsymbol{x}=\left[\begin{matrix}r\\v\\\end{matrix}\right] \]

Denotamos vetores por letras minúsculas em negrito e matrizes por letras maiúsculas em negrito.

Como o estado do sistema inclui mais de uma variável, usamos ferramentas de álgebra linear, como vetores e matrizes, para descrever a matemática do Filtro de Kalman. Se você não estiver confortável com álgebra linear, revise a seção Filtro de Kalman Unidimensional no tutorial online ou no livro. Ela apresenta as equações do Filtro de Kalman e sua derivação usando matemática de nível escolar, juntamente com quatro exemplos totalmente resolvidos.

Iteração 0

Inicialização do filtro

Neste exemplo, usaremos a primeira medição para inicializar o Filtro de Kalman (para mais informações sobre técnicas de inicialização e seu impacto no desempenho do Filtro de Kalman, consulte o Capítulo 21 do livro). No instante \(t_0\), o radar mede um alcance de \(10{,}000m\) e uma velocidade de \(200m/s\). As medições são denotadas pela letra \(\boldsymbol{z}\).
Empilhamos as medições no vetor de medição \(\boldsymbol{z}\):

\[ \boldsymbol{z}_0=\left[\begin{matrix}10{,}000\\200\\\end{matrix}\right] \]

O subscrito \(0\) indica o instante \(t_0\).

A medição não reflete exatamente o estado do sistema. As medições são corrompidas por ruído aleatório; portanto, cada medição é uma variável aleatória (random variable).

Podemos confiar nessa medição? Quão certa ela é? Cada medição é acompanhada por uma incerteza de medição (Measurement Uncertainty) ao quadrado (às vezes chamada de erro de medição). Essa incerteza ao quadrado é a variância da medição. Você pode ler mais sobre variância na seção Fundamentos Essenciais I. Para uma discussão mais detalhada sobre incerteza de medição, veja a seção Filtro de Kalman Unidimensional.

Em sistemas de radar, a incerteza de medição é largamente determinada pela razão entre a potência do sinal recebido e o ruído. Quanto maior a relação sinal-ruído (signal-to-noise ratio, SNR), menor a variância da medição e maior a nossa confiança na medição.

A figura a seguir compara casos de baixo e alto sinal na presença de ruído.

Pulso de radar retornado: comparação da relação sinal-ruído

Suponha que o desvio padrão da medição de alcance seja \( 4m \) e o desvio padrão da medição de velocidade seja \( 0{,}5m/s \). Como a variância é o quadrado do desvio padrão, a incerteza de medição ao quadrado (denotada por \( \boldsymbol{R} \)) é:

\[ \boldsymbol{R}_0=\left[\begin{matrix}16&0\\0&0.25\\\end{matrix}\right] \]

\( \boldsymbol{R} \) é uma matriz de covariância. Os elementos da diagonal principal contêm as variâncias, e os elementos fora da diagonal são as covariâncias entre medições.

\[ \boldsymbol{R}=\left[\begin{matrix}\sigma_r^2&\sigma_{rv}^2\\[0.5em]\sigma_{vr}^2&\sigma_v^2\\\end{matrix}\right] \]

Neste exemplo, assumimos que os erros nas medições de alcance e velocidade não estão relacionados entre si; portanto, os elementos fora da diagonal da matriz de covariância de medição são definidos como zero.

Para revisar variância e desvio padrão, consulte a seção Fundamentos Essenciais I do tutorial online.
Para revisar matrizes de covariância, consulte a seção Fundamentos Essenciais II.

Durante a inicialização, a única informação que temos é uma única medição. Neste exemplo, a medição e o estado do sistema são descritos pelas mesmas grandezas (\(r\) e \(v\)). Por isso, podemos usar a medição como a estimativa inicial do estado do sistema. Isso só pode ser feito durante a etapa de inicialização:

\[ \boldsymbol{\hat{x}}_{0,0}=\boldsymbol{z}_0=\left[\begin{matrix}10{,}000\\200\\\end{matrix}\right] \]

O subscrito \(0,0\) tem o seguinte significado:

  • O primeiro índice refere-se ao tempo do sistema, que neste exemplo é \(t_0\).
  • O segundo índice refere-se ao instante em que a estimativa foi feita, que também é \(t_0\).

Em outras palavras, a estimativa é para o instante \(t_0\), e também foi calculada no instante \(t_0\).

Predição

Agora prevemos o próximo estado. Suponha que o tempo de revisita do alvo seja 5 segundos \((\Delta t=5s)\); portanto, \(t_1=5s\).

Para estimar o estado futuro do sistema, devemos descrever como o sistema evolui ao longo do tempo. Neste exemplo, assumimos um modelo dinâmico de velocidade constante (o modelo de movimento):

\[ v_{1} = v_{0} = v \] \[ r_{1} = r_{0} + v_{0}\Delta t \]

(Para exemplos de modelos dinâmicos com aceleração, consulte o Capítulo 9 do livro.)

Descrevamos o modelo dinâmico em forma matricial:

\[ {\hat{\boldsymbol{x}}}_{1,0}=\boldsymbol{F}{\hat{\boldsymbol{x}}}_{0,0} \]

O subscrito \(1,0\) tem o seguinte significado:

  • O primeiro índice refere-se ao tempo do sistema, que é \(t_1\).
  • O segundo índice refere-se ao instante em que a estimativa foi feita, que é \(t_0\).

Assim, \( \hat{\boldsymbol{x}}_{1,0} \) é nossa estimativa do estado do sistema no instante \(t_1\), calculada usando informações disponíveis em \(t_0\). Em outras palavras, é uma predição do estado futuro.

A matriz \( \boldsymbol{F} \) é chamada de matriz de transição de estado (state transition matrix) e descreve como o estado do sistema evolui ao longo do tempo:

\[ {\hat{\boldsymbol{x}}}_{1,0}=\left[\begin{matrix}{\hat{r}}_{1,0}\\{\hat{v}}_{1,0}\\\end{matrix}\right]=\left[\begin{matrix}1&\Delta t\\0&1\\\end{matrix}\right]\left[\begin{matrix}{\hat{r}}_{0,0}\\{\hat{v}}_{0,0}\\\end{matrix}\right]=\left[\begin{matrix}1&5\\0&1\\\end{matrix}\right]\left[\begin{matrix}10,000\\200\\\end{matrix}\right]=\left[\begin{matrix}11,000\\200\\\end{matrix}\right] \]

O Apêndice C do livro descreve um método para modelar a dinâmica de qualquer sistema linear.

A equação

\[ {\hat{\boldsymbol{x}}}_{n+1,n}=\boldsymbol{F}{\hat{\boldsymbol{x}}}_{n,n} \]

é a Equação de Extrapolação de Estado (State Extrapolation Equation, predição). Ela nos diz como calcular o próximo estado a partir do atual. Ela usa nossa estimativa de estado atual e o modelo de movimento do sistema para prever o estado no próximo passo de tempo.

A forma completa da Equação de Extrapolação de Estado é:

\[ {\hat{\boldsymbol{x}}}_{n+1,n}=\boldsymbol{F}{\hat{\boldsymbol{x}}}_{n,n} + \boldsymbol{G}\boldsymbol{u}_n \]

onde:

  • \(\boldsymbol{u}_{n}\) é uma variável de entrada (input)
  • \(\boldsymbol{G}\) é uma matriz de transição de entrada (input transition matrix)

O vetor de entrada representa informação adicional fornecida ao Filtro de Kalman, como leituras de um acelerômetro embarcado.

Neste exemplo simples, assumimos que não há entrada, então \(\boldsymbol{u}_n=0\).

Para um exemplo que inclui um termo de entrada, veja a página Equação de Extrapolação de Estado do tutorial online ou o Exemplo 10 totalmente resolvido no livro.

Toda medição e toda estimativa no Filtro de Kalman vêm acompanhadas de informação de incerteza. Após prever o próximo estado, também devemos perguntar: quão precisa é essa predição?

A incerteza ao quadrado da estimativa do estado atual é representada pela matriz de covariância:

\[ \boldsymbol{P}_{0,0}=\left[\begin{matrix}16&0\\0&0.25\\\end{matrix}\right] \]

No entanto, a covariância da predição não é calculada como:

\[ \textcolor{red}{\xcancel{\textcolor{black}{ \boldsymbol{P}_{1,0}=\boldsymbol{F}\boldsymbol{P}_{0,0} }}} \]

Isso ocorre porque \(\boldsymbol{P}\) é uma matriz de covariância e variâncias e covariâncias envolvem termos ao quadrado.

A Equação de Extrapolação de Covariância (sem o ruído do processo) é dada por:

\[ \boldsymbol{P}_{n+1,n}=\boldsymbol{F}\boldsymbol{P}_{n,n}\boldsymbol{F}^T \]

Você pode encontrar a derivação completa na seção Equação de Extrapolação de Covariância do tutorial online.

Para o nosso exemplo:

$$ \boldsymbol{P}_{1,0}=\boldsymbol{F}\boldsymbol{P}_{0,0}\boldsymbol{F}^T=\left[\begin{matrix}1&5\\0&1\\\end{matrix}\right]\left[\begin{matrix}16&0\\0&0.25\\\end{matrix}\right]\left[\begin{matrix}1&0\\5&1\\\end{matrix}\right]=\left[\begin{matrix}1&5\\0&1\\\end{matrix}\right]\left[\begin{matrix}16&0\\1.25&0.25\\\end{matrix}\right]=\left[\begin{matrix}\colorbox{yellow}{$22.25$}&1.25\\1.25&\colorbox{yellow}{$0.25$}\\\end{matrix}\right] $$

Observe a diagonal principal da matriz de covariância.

A variância da velocidade \(\sigma_v^2\) ainda é \(0{,}25 \, m^2/s^2\). Ela não mudou porque o modelo dinâmico assume velocidade constante.

Em contraste, a variância do alcance \(\sigma_r^2\) aumentou de \(16m^2\) para \(22{,}25m^2\). Isso reflete o fato de que a incerteza na velocidade leva ao aumento da incerteza no alcance ao longo do tempo.

Como observado anteriormente, a suposição de dinâmica de velocidade constante não é totalmente precisa. Na realidade, a velocidade da aeronave pode ser afetada por fatores externos e desconhecidos, como o vento. Como resultado, a incerteza real da predição é maior do que a prevista pelo modelo simples.

Essas influências imprevisíveis são chamadas de ruído do processo (Process Noise) e são denotadas por \(\boldsymbol{Q}\). Para levar esses efeitos em conta, adicionamos \(\boldsymbol{Q}\) à equação da covariância de predição:

\[ \boldsymbol{P}_{n+1,n}=\boldsymbol{F}\boldsymbol{P}_{n,n}\boldsymbol{F}^T + \boldsymbol{Q}\]

Para ganhar intuição sobre como o ruído do processo afeta o desempenho do Filtro de Kalman, veja o Exemplo 6 no tutorial online.

Suponha que o desvio padrão da aceleração aleatória seja \(\sigma_a=0{,}2m/s^2\). Isso representa incerteza na aceleração aleatória da aeronave causada por influências ambientais imprevisíveis.

Consequentemente, a variância da aceleração aleatória é \(\sigma_a^2=0{,}04m^2/s^4\).

Para o nosso exemplo, a matriz de ruído do processo é dada por:

$$ \boldsymbol{Q} = \left[\begin{matrix} \frac{\Delta t^4}{4} & \frac{\Delta t^3}{2} \\[0.5em] \frac{\Delta t^3}{2} & \Delta t^2 \end{matrix}\right] \sigma_a^2 $$

Com \(\Delta t=5\mathrm{s}\) e \(\sigma_a^2=0{,}04\,\mathrm{m}^2/\mathrm{s}^4\), isso se torna:

$$ \boldsymbol{Q}=\left[\begin{matrix}\frac{625}{4}&\frac{125}{2}\\[0.5em] \frac{125}{2}&25\\\end{matrix}\right]0.04=\left[\begin{matrix}6.25&2.5\\2.5&1\\\end{matrix}\right] $$

A derivação da matriz de ruído do processo é apresentada na Seção 8.2.2 do livro.

Após adicionar o ruído do processo, a incerteza ao quadrado da nossa predição é:

$$ \boldsymbol{P}_{1,0}=\boldsymbol{F}\boldsymbol{P}_{0,0}\boldsymbol{F}^T+\boldsymbol{Q}\ =\left[\begin{matrix}22.25&1.25\\1.25&0.25\\\end{matrix}\right]+\left[\begin{matrix}6.25&2.5\\2.5&1\\\end{matrix}\right]\ =\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right] $$

Resumo da Iteração 0

  • Inicialização
    Inicializamos o Filtro de Kalman usando a primeira medição como a estimativa inicial de estado \( {\hat{\boldsymbol{x}}}_{0,0} \) e a covariância da medição como a covariância inicial do estado \(\boldsymbol{P}_{0,0}\).
    Observe que isso só pode ser feito durante a fase de inicialização.
  • Predição
    Previmos o estado e sua incerteza no próximo passo de tempo, quando o radar revisitar a aeronave. As equações de predição do Filtro de Kalman são:

    Equação de Extrapolação de Estado (State Extrapolation Equation)
    \[ {\hat{\boldsymbol{x}}}_{n+1,n}=\boldsymbol{F}{\hat{\boldsymbol{x}}}_{n,n} + \boldsymbol{G}\boldsymbol{u}_n \]
    Equação de Extrapolação de Covariância (Covariance Extrapolation Equation)
    \[ \boldsymbol{P}_{n+1,n}=\boldsymbol{F}\boldsymbol{P}_{n,n}\boldsymbol{F}^T + \boldsymbol{Q}\]
    onde:
    • \(\hat{\boldsymbol{x}}_{n,n}\): vetor de estado estimado no passo de tempo \(n\)
    • \(\hat{\boldsymbol{x}}_{n+1,n}\): vetor de estado previsto para o passo \(n+1\), calculado usando informações disponíveis em \(n\)
    • \(\boldsymbol{u}_n\): variável de controle/entrada, representando entradas externas conhecidas do sistema
    • \(\boldsymbol{F}\): matriz de transição de estado (state transition matrix)
    • \(\boldsymbol{G}\): matriz de entrada/controle (input/control matrix), que mapeia entradas para variáveis de estado
    • \(\boldsymbol{P}_{n,n}\): matriz de covariância (incerteza ao quadrado) do estado atual
    • \(\boldsymbol{P}_{n+1,n}\): matriz de covariância (incerteza ao quadrado) do estado previsto
    • \(\boldsymbol{Q}\): matriz de ruído do processo (Process Noise)

Iteração 1

Atualização do filtro

Considere a segunda medição em \(t_1\):

\[ \boldsymbol{z}_1=\left[\begin{matrix}11{,}020\\202\\\end{matrix}\right] \]

Devido a um pico de ruído forte durante essa medição, a relação sinal-ruído (signal-to-noise ratio, SNR) é significativamente menor do que na primeira medição. Como resultado, a incerteza da segunda medição é maior.

Suponha que o desvio padrão da medição de alcance seja \(6m\) e o desvio padrão da medição de velocidade seja \(1{,}5m/s\). A correspondente matriz de covariância de medição é:

\[ \boldsymbol{R}_1=\left[\begin{matrix}\colorbox{yellow}{$36$}&0\\0&\colorbox{yellow}{$2.25$}\\\end{matrix}\right] \]

Queremos estimar o estado atual do sistema \(\hat{\boldsymbol{x}}_{1,1}\). No instante \(t_1\), temos duas fontes de informação:

  • O estado previsto \(\hat{\boldsymbol{x}}_{1,0}\) (calculado no passo anterior); e
  • A nova medição \(\boldsymbol{z}_1\)

Em qual devemos confiar?

Intuitivamente, poderíamos preferir usar a medição como a estimativa atual, isto é, \(\hat{\boldsymbol{x}}_{1,1}=\boldsymbol{z}_1\), porque ela é mais recente do que a predição.

Por outro lado, a medição também é mais ruidosa. Se compararmos os elementos da diagonal principal da covariância da predição \(\boldsymbol{P}_{1,0}\) com a covariância da medição \(\boldsymbol{R}_1\), vemos que a incerteza da predição é menor do que a incerteza da medição:

\[ \boldsymbol{P}_{1,0}=\left[\begin{matrix}\colorbox{yellow}{$28.5$}&3.75\\3.75&\colorbox{yellow}{$1.25$}\\\end{matrix}\right] \]

Então, talvez devêssemos ignorar a nova medição e manter a predição, isto é, \(\hat{\boldsymbol{x}}_{1,1}=\hat{\boldsymbol{x}}_{1,0}\)?

Nesse caso, perdemos a informação nova fornecida pela medição atual.

A ideia-chave do Filtro de Kalman é que não fazemos nem uma coisa nem outra. Em vez disso, combinamos a predição e a medição, dando mais peso àquela com menor incerteza.

A solução é uma média ponderada entre a medição e a predição:

\[ \hat{x}_{1,1}=K_1 z_1\ +\ \left({1-\ K}_1\right){\hat{x}}_{1,0}, \quad 0\leq K_1 \leq 1 \]

Aqui, o peso \(K_1\) é o Ganho de Kalman (Kalman Gain). Ele determina quanto peso é dado à medição em relação à predição de modo a minimizar a incerteza da estimativa. É isso que torna o Filtro de Kalman um filtro ótimo (desde que o sistema e os ruídos se comportem de acordo com as suposições do modelo).

Apresentarei a equação do ganho de Kalman em breve, mas primeiro foquemos na Equação de Atualização de Estado (State Update Equation). Em forma matricial, ela é escrita como:

\[ \hat{\boldsymbol{x}}_{1,1}=\boldsymbol{K}_1\boldsymbol{z}_1 + (\boldsymbol{I} - \boldsymbol{K}_1)\hat{\boldsymbol{x}}_{1,0} \]

onde \(\boldsymbol{I}\) é a matriz identidade (identity matrix; matriz quadrada com uns na diagonal principal e zeros no restante).

Reescrevamos essa equação:

\[ \hat{\boldsymbol{x}}_{1,1}=\boldsymbol{K}_1\boldsymbol{z}_1 + \hat{\boldsymbol{x}}_{1,0} - \boldsymbol{K}_1\hat{\boldsymbol{x}}_{1,0}=\hat{\boldsymbol{x}}_{1,0}+\boldsymbol{K}_1(\boldsymbol{z}_1 - \hat{\boldsymbol{x}}_{1,0}) \]

Essa forma mostra que o estado atualizado é a predição \(\hat{\boldsymbol{x}}_{1,0}\) mais um termo de correção \(\boldsymbol{K}_1\left(\boldsymbol{z}_1 - \hat{\boldsymbol{x}}_{1,0}\right)\).

A correção é proporcional à diferença entre a medição e a predição \(\boldsymbol{z}_1 - \hat{\boldsymbol{x}}_{1,0}\), chamada de inovação (innovation) ou residual de medição (measurement residual).

No nosso exemplo, tanto o estado do sistema quanto a medição são vetores que representam as mesmas grandezas físicas (alcance e velocidade). Portanto, podemos subtrair diretamente \(\hat{\boldsymbol{x}}_{1,0}\) de \(\boldsymbol{z}_1\).

No entanto, isso nem sempre ocorre. Em geral, a medição e o estado do sistema podem pertencer a domínios físicos diferentes. Por exemplo, um termômetro digital mede um sinal elétrico, enquanto o estado do sistema é a temperatura.

Por esse motivo, o estado previsto deve primeiro ser transformado para o domínio da medição:

\[ \boldsymbol{H} \hat{\boldsymbol{x}}_{1,0} \]

A matriz \(\boldsymbol{H}\) é chamada de matriz de observação (observation/measurement matrix). Ela mapeia as variáveis de estado para as quantidades efetivamente medidas.

No nosso exemplo, a matriz de observação é simplesmente a matriz identidade:

\[ \boldsymbol{H}=\left[\begin{matrix}1&0\\0&1\\\end{matrix}\right]=\boldsymbol{I} \]

Para mais informações sobre a matriz de observação, veja a seção Equação de Medição do tutorial online e os Exemplos 9 e 10 no livro.

Agora podemos reescrever a equação de atualização de estado como:

\[ \hat{\boldsymbol{x}}_{1,1}=\hat{\boldsymbol{x}}_{1,0}+\boldsymbol{K}_1(\boldsymbol{z}_1 - \boldsymbol{H}\hat{\boldsymbol{x}}_{1,0}) \]

A inovação \(\boldsymbol{z}_1 - \boldsymbol{H}\hat{\boldsymbol{x}}_{1,0}\) representa informação nova.

O ganho de Kalman determina quanto essa nova informação deve alterar o estado previsto, isto é, quão fortemente corrigimos a predição.

Caso unidimensional

No caso unidimensional, o Ganho de Kalman é dado por:

\[ K_n=\frac{p_{n,\ n-1}}{p_{n,\ n-1}+r_n} \]

onde:

  • \(p_{n,\ n-1}\): variância prevista do estado
  • \(r_n\): variância da medição

O ganho de Kalman é escolhido para minimizar a variância da estimativa atualizada \(p_{n,n}\), razão pela qual o Filtro de Kalman é ótimo.

Para construir intuição e ver a derivação completa no caso unidimensional, veja a seção Filtro de Kalman Unidimensional do tutorial online.

Caso multivariado

No Filtro de Kalman multivariado, o ganho de Kalman torna-se uma matriz e é dado por:

\[ \boldsymbol{K}_n=\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T\left(\boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T+\boldsymbol{R}_n\right)^{-1} \]

Para a derivação da Equação do Ganho de Kalman multivariado, veja a seção Ganho de Kalman do tutorial online.

Vamos calcular o Ganho de Kalman para \(t_1\):

\[ \boldsymbol{K}_1=\boldsymbol{P}_{1,0}\boldsymbol{H}^T\left(\boldsymbol{H}\boldsymbol{P}_{1,0}\boldsymbol{H}^T+\boldsymbol{R}_1\right)^{-1} \]

No nosso exemplo, \(\boldsymbol{H}=\boldsymbol{I}\) e \(\boldsymbol{H}^T=\boldsymbol{I}\).

Substitua as matrizes:

\[ \boldsymbol{P}_{1,0}=\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right], \quad \boldsymbol{R}_1=\left[\begin{matrix}36&0\\0&2.25\\\end{matrix}\right] \]

\[ \boldsymbol{K}_1=\boldsymbol{P}_{1,0}\boldsymbol{H}^T\left(\boldsymbol{H}\boldsymbol{P}_{1,0}\boldsymbol{H}^T+\boldsymbol{R}_1\right)^{-1}=\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]\left[\begin{matrix}1&0\\0&1\\\end{matrix}\right]\left(\left[\begin{matrix}1&0\\0&1\\\end{matrix}\right]\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]\left[\begin{matrix}1&0\\0&1\\\end{matrix}\right]+\left[\begin{matrix}36&0\\0&2.25\\\end{matrix}\right]\right)^{-1} \]

\[ =\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]\left(\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]+\left[\begin{matrix}36&0\\0&2.25\\\end{matrix}\right]\right)^{-1} =\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]\left(\left[\begin{matrix}64.5&3.75\\3.75&3.5\\\end{matrix}\right]\right)^{-1} \]

\[ =\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]\left[\begin{matrix}0.0165&-0.0177\\-0.0177&0.3047\\\end{matrix}\right]=\left[\begin{matrix}0.4048&0.6377\\0.0399&0.3144\\\end{matrix}\right] \]

\[ \boldsymbol{K}_1=\left[\begin{matrix}0.4048&0.6377\\0.0399&0.3144\\\end{matrix}\right] \]

A estimativa de estado atualizada é:

\[ \hat{\boldsymbol{x}}_{1,1}=\hat{\boldsymbol{x}}_{1,0}+\boldsymbol{K}_1(\boldsymbol{z}_1 - \boldsymbol{H}\hat{\boldsymbol{x}}_{1,0}) \]

No nosso exemplo, \(\boldsymbol{H}=\boldsymbol{I}\), então a inovação é simplesmente:

\[ \boldsymbol{z}_1 - \boldsymbol{I}\hat{\boldsymbol{x}}_{1,0}=\boldsymbol{z}_1 - \hat{\boldsymbol{x}}_{1,0}=\left[\begin{matrix}11{,}020\\202\\\end{matrix}\right] - \left[\begin{matrix}11{,}000\\200\\\end{matrix}\right]=\left[\begin{matrix}20\\2\\\end{matrix}\right] \]

Agora aplique a correção:

\[ \boldsymbol{K}_1\left[\begin{matrix}20\\2\\\end{matrix}\right]=\left[\begin{matrix}0.4048&0.6377\\0.0399&0.3144\\\end{matrix}\right]\left[\begin{matrix}20\\2\\\end{matrix}\right]=\left[\begin{matrix}9.37\\1.43\\\end{matrix}\right] \]

Finalmente:

\[ \hat{\boldsymbol{x}}_{1,1}=\left[\begin{matrix}11{,}000\\200\\\end{matrix}\right]+\left[\begin{matrix}9.37\\1.43\\\end{matrix}\right]=\left[\begin{matrix}11{,}009.37\\201.43\\\end{matrix}\right] \]

Uma vez estimado o estado atual, também queremos quantificar a incerteza dessa estimativa.

Caso unidimensional

No caso unidimensional, a Equação de Atualização de Covariância é:

\[ p_{n,n}=(1-K_n)p_{n,\ n-1} \]

Para a derivação, veja a seção Filtro de Kalman Unidimensional do tutorial online.

Caso multivariado
Forma de Joseph (Joseph form)

Para o Filtro de Kalman multivariado, a equação de atualização de covariância é comumente escrita em uma forma numericamente estável, conhecida como forma de Joseph (Joseph form), introduzida por Peter 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 \]

onde:

  • \(\boldsymbol{P}_{n,n}\): covariância da estimativa de estado atualizada (posterior)
  • \(\boldsymbol{P}_{n,n-1}\): covariância da estimativa de estado prevista (a priori)
  • \(\boldsymbol{K}_n\): Ganho de Kalman
  • \(\boldsymbol{H}\): matriz de observação (medição)
  • \(\boldsymbol{R}_n\): matriz de covariância do ruído de medição
  • \(\boldsymbol{I}\): matriz identidade (matriz quadrada com uns na diagonal principal e zeros no restante)

Para a derivação, veja a seção Equação de Atualização de Covariância do tutorial online.

Forma simplificada

Na literatura, você também verá com frequência a atualização de covariância na forma simplificada:

\[ \boldsymbol{P}_{n,n}=(\boldsymbol{I} - \boldsymbol{K}_n\boldsymbol{H})\boldsymbol{P}_{n,n-1} \]

Para sua derivação, veja a seção Equação de Atualização de Covariância Simplificada.

Ambas as formas fornecem o mesmo resultado em aritmética exata. Contudo, para implementações computacionais, a forma de Joseph é geralmente preferida por ser mais numericamente estável.

Apenas para este exemplo, usaremos a equação de atualização de covariância simplificada:

\[ \boldsymbol{P}_{1,1}=(\boldsymbol{I} - \boldsymbol{K}_1\boldsymbol{H})\boldsymbol{P}_{1,0} \]

No nosso exemplo, \(\boldsymbol{H}=\boldsymbol{I}\), então:

\[ \boldsymbol{P}_{1,1}=(\boldsymbol{I} - \boldsymbol{K}_1)\boldsymbol{P}_{1,0} \]

Agora substitua as matrizes:

\[ \boldsymbol{P}_{1,1}=\left(\left[\begin{matrix}1&0\\0&1\\\end{matrix}\right] - \left[\begin{matrix}0.4048&0.6377\\0.0399&0.3144\\\end{matrix}\right]\right)\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right] \]

\[ =\left[\begin{matrix}0.5952&-0.6377\\-0.0399&0.6856\\\end{matrix}\right]\left[\begin{matrix}28.5&3.75\\3.75&1.25\\\end{matrix}\right]=\left[\begin{matrix}14.57&1.43\\1.43&0.71\\\end{matrix}\right] \]

Análise do resultado

A incerteza da estimativa atualizada é menor do que a incerteza da predição e a incerteza da medição:

\[ \boldsymbol{P}_{1,1}=\left[\begin{matrix}\colorbox{yellow}{$14.57$}&1.43\\1.43&\colorbox{yellow}{$0.71$}\\\end{matrix}\right]\ \ \ \ \ \ \boldsymbol{P}_{1,0}=\ \left[\begin{matrix}\colorbox{yellow}{$28.5$}&3.75\\3.75&\colorbox{yellow}{$1.25$}\\\end{matrix}\right]\ \ \ \ \ \boldsymbol{R}_\mathbf{1}=\left[\begin{matrix}\colorbox{yellow}{$36$}&0\\0&\colorbox{yellow}{$2.25$}\\\end{matrix}\right] \]

Ao combinar a medição com a predição e ponderá-las usando o ganho de Kalman, obtemos uma estimativa com menor incerteza.

Adicionar informação nova, mesmo quando possui alta incerteza, sempre reduz a incerteza da estimação. Veja o capítulo Fusão de Sensores no livro e os Apêndices G e H para a demonstração matemática. Do ponto de vista teórico, novas medições nunca deveriam ser ignoradas.

Na prática, entretanto, muitas vezes é necessário rejeitar certas medições. Veja o capítulo Tratamento de Outliers no livro para métodos práticos de lidar com medições não confiáveis.

Predição

A etapa de predição da Iteração 1 (de \( t_1 \) para \( t_2 \)) é idêntica à etapa de predição da Iteração 0 (de \( t_0 \) para \( t_1 \)), exceto que agora partimos da estimativa atualizada \(\hat{\boldsymbol{x}}_{1,1}\) e de \(\boldsymbol{P}_{1,1}\).

Predição de estado

\[ \hat{\boldsymbol{x}}_{2,1}=\boldsymbol{F}\hat{\boldsymbol{x}}_{1,1} \]

\[ \hat{\boldsymbol{x}}_{2,1}=\left[\begin{matrix}1&5\\0&1\\\end{matrix}\right]\left[\begin{matrix}11,009.37\\201.43\\\end{matrix}\right]=\left[\begin{matrix}12,016.5\\201.43\\\end{matrix}\right] \]

Predição de covariância

\[ \boldsymbol{P}_{2,1}=\boldsymbol{F}\boldsymbol{P}_{1,1}\boldsymbol{F}^\top + \boldsymbol{Q} \]

\[ \boldsymbol{P}_{2,1}=\ \left[\begin{matrix}1&5\\0&1\\\end{matrix}\right]\left[\begin{matrix}14.57&1.43\\1.43&0.71\\\end{matrix}\right]\left[\begin{matrix}1&0\\5&1\\\end{matrix}\right]+\left[\begin{matrix}6.25&2.5\\2.5&1\\\end{matrix}\right]=\left[\begin{matrix}52.86&7.47\\7.47&1.71\\\end{matrix}\right] \]

Observe que ambas as variâncias aumentam novamente durante a etapa de predição. Isso ocorre porque, com a passagem do tempo sem uma nova medição, a incerteza naturalmente cresce. Em particular, a incerteza na velocidade provoca incerteza adicional no alcance, motivo pelo qual a variância do alcance aumenta mais rapidamente do que a variância da velocidade.

Resumo da Iteração 1

  • Atualização
    • Estimamos o estado atual do sistema \(\hat{\boldsymbol{x}}_{1,1}\) como uma combinação ponderada do estado previsto \(\hat{\boldsymbol{x}}_{1,0}\) e da medição \(\boldsymbol{z}_1\).
      A ponderação é determinada pelo Ganho de Kalman \(K_1\). O Ganho de Kalman é calculado a partir da covariância do estado previsto \(\boldsymbol{P}_{1,0}\) e da covariância da medição \(\boldsymbol{R}_1\), e minimiza a incerteza da estimativa atualizada \(\boldsymbol{P}_{1,1}\).
    • As equações de atualização do Filtro de Kalman são:

      Equação de Atualização de Estado (State Update Equation)
      \[ \hat{\boldsymbol{x}}_{n,n}=\hat{\boldsymbol{x}}_{n,n-1}+\boldsymbol{K}_n\left(\boldsymbol{z}_n\ -\ \boldsymbol{H}\hat{\boldsymbol{x}}_{n,n-1}\right) \]
      Equação de Atualização de Covariância (forma de Joseph)
      \[ \boldsymbol{P}_{n,n}=\left(\boldsymbol{I}-\boldsymbol{K}_n\boldsymbol{H}\right)\boldsymbol{P}_{n,n-1}\left(\boldsymbol{I}-\boldsymbol{K}_n\boldsymbol{H}\right)^T+\boldsymbol{K}_n\boldsymbol{R}_n\boldsymbol{K}_n^T \]
      Ou sua forma simplificada
      \[\boldsymbol{P}_{n,n}=\left(\boldsymbol{I}-\boldsymbol{K}_n\boldsymbol{H}\right)\boldsymbol{P}_{n,n-1}\]
      Equação do Ganho de Kalman (Kalman Gain)
      \[ \boldsymbol{K}_n=\ \boldsymbol{P}_{n,n-1}\boldsymbol{H}^T\left(\boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T+\boldsymbol{R}_n\right)^{-1}\]
    onde:
    • \( \hat{\boldsymbol{x}}_{n,n} \): estimativa de estado atualizada no passo de tempo n
    • \( \hat{\boldsymbol{x}}_{n,n-1} \): estado previsto no passo n, calculado com informação disponível em n-1
    • \( \boldsymbol{z}_n \): vetor de medição
    • \( \boldsymbol{P}_{n,n} \): covariância da estimativa de estado atualizada
    • \( \boldsymbol{P}_{n,n-1} \): covariância da estimativa de estado prevista
    • \( \boldsymbol{K}_n \): Ganho de Kalman
    • \( \boldsymbol{H} \): matriz de observação (medição)
    • \( \boldsymbol{R}_n \): matriz de covariância do ruído de medição
    • \( \boldsymbol{I} \): matriz identidade
  • Predição
    A etapa de predição na Iteração 1 é a mesma da Iteração 0.
    Propagamos a estimativa de estado atual e sua covariância para o próximo passo de tempo, quando o radar revisitar a aeronave, usando o modelo de transição de estado.

Resumo do Exemplo

Este exemplo simples foi usado para ilustrar os principais conceitos do Filtro de Kalman e suas três fases: inicialização (que ocorre apenas no início da operação), predição e atualização.

Após a inicialização, o Filtro de Kalman opera em um ciclo contínuo de predição–atualização, como mostrado na figura abaixo.

Ciclo de predição–atualização do Filtro de Kalman

Este exemplo demonstra as ideias centrais por trás do Filtro de Kalman e do seu ciclo de predição–atualização.

  • Se você quiser aprender mais, convido a explorar o tutorial gratuito online, que explica o Filtro de Kalman passo a passo usando exemplos numéricos, começando pelos casos unidimensionais.
  • Para um guia completo e prático, considere o livro Kalman Filter from the Ground Up, que apresenta filtros lineares e não lineares usando exemplos detalhados, passo a passo, e diretrizes de implementação.
Livro do Filtro de Kalman
Guia do Filtro de Kalman baseado em exemplos
Tutorial Livro