3 — Filtro de Kalman: estimação de estados, incerteza e predição

Se o Filtro de Wiener pode ser visto como um estimador ótimo estático, o Filtro de Kalman é a sua evolução natural para sistemas dinâmicos. Ele responde a uma pergunta ainda mais poderosa:
Qual é o estado mais provável do sistema agora — e qual será o próximo — considerando medições ruidosas e um modelo físico?
Aqui entramos em um território onde filtro, estimador e decisor se tornam praticamente a mesma coisa.
3.1 Intuição antes da matemática
A ideia central do Kalman é simples quando vista corretamente:
- Toda medição é incerta
- Todo modelo é imperfeito
- A melhor estimativa surge do equilíbrio entre os dois
O filtro de Kalman faz isso explicitamente, mantendo:
- Uma estimativa do estado
- Uma estimativa da incerteza dessa estimativa
Isso é algo que nem a EMA nem o Wiener fazem de forma explícita.
3.2 Modelo de estado (caso 1D)
Para sistemas embarcados simples, um Kalman 1D já resolve muitos problemas.
Modelo:
\[
x_k = x_{k-1} + w_k
\]
\[
z_k = x_k + v_k
\]
Onde:
- \(x_k\): estado verdadeiro (desconhecido)
- \(z_k\): medição
- \(w_k\): ruído do processo (modelo)
- \(v_k\): ruído da medição (sensor)
Variâncias:
- \(Q = \mathrm{Var}(w)\) → confiança no modelo
- \(R = \mathrm{Var}(v)\) → confiança no sensor
3.3 Ciclo do Kalman: previsão e correção
O Kalman funciona em dois passos repetidos a cada amostra.
1️⃣ Previsão
\[
\hat{x}^- = \hat{x}
\]
\[
P^- = P + Q
\]
2️⃣ Correção
\[
K = \frac{P^-}{P^- + R}
\]
\[
\hat{x} = \hat{x}^- + K(z – \hat{x}^-)
\]
\[
P = (1 – K) P^-
\]
Onde:
- \(\hat{x}\): estimativa
- \(P\): incerteza
- \(K\): ganho de Kalman (adaptativo!)
Observe algo importante:
O ganho K não é escolhido arbitrariamente — ele emerge do balanço entre Q e R.
3.4 Comparação conceitual com EMA e Wiener
Há uma razão pela qual o Kalman aparece como “complexo” em livros: ele generaliza os outros filtros.
- EMA ≈ Kalman com Q e R fixos e implícitos
- Wiener ≈ Kalman sem dinâmica (estado constante)
- Kalman → Wiener + tempo + incerteza explícita
Isso explica por que:
Todo engenheiro usa Kalman, mesmo sem perceber.
3.5 Implementação Kalman 1D em C (viável em MCU)
Estrutura mínima:
typedef struct {
float x; // estimativa do estado
float P; // incerteza
float Q; // ruído do processo
float R; // ruído da medição
} kalman1d_t;
Inicialização:
static inline void kalman_init(kalman1d_t *k,
float x0,
float P0,
float Q,
float R)
{
k->x = x0;
k->P = P0;
k->Q = Q;
k->R = R;
}
Passo completo:
static inline float kalman_step(kalman1d_t *k, float z)
{
// Previsão
k->P += k->Q;
// Ganho
float K = k->P / (k->P + k->R);
// Correção
k->x += K * (z - k->x);
k->P *= (1.0f - K);
return k->x;
}
Custo:
- Algumas somas e multiplicações
- Nenhuma matriz
- Ideal para loop rápido
3.6 Escolhendo Q e R (engenharia prática)
Essa é a parte onde Kalman “ganha fama de difícil”, mas na prática:
- R → quanto você confia no sensor
- Q → quanto você confia no modelo
Regras práticas:
| Situação | Q | R |
|---|---|---|
| Sensor ruidoso | baixo | alto |
| Modelo fraco | alto | baixo |
| Resposta rápida | maior | — |
| Estabilidade | — | maior |
Não existe valor “correto” universal — existe valor adequado ao sistema.
3.7 Quando Kalman é a escolha certa
Use Kalman quando:
- O sistema tem dinâmica (movimento, variação)
- O estado não é diretamente observável
- Você precisa prever
- A incerteza importa
Exemplos típicos:
- Fusão de sensores
- Estimativa de posição/velocidade
- Filtragem de sinais lentos com ruído
- Controle e navegação
3.8 Onde Kalman não compensa
Não use Kalman quando:
- O sinal é puramente aleatório
- Não há modelo físico
- Uma EMA resolve
- O custo cognitivo não se justifica
Usar Kalman sem modelo é apenas EMA complicada.