Le filtre de Kalman : une explication interactive

Prédiction d'état, gain optimal, équations clés — avec des simulations interactives pour construire l'intuition.

Pour recruteurs (lecture rapide)

Le filtre de Kalman est un estimateur récursif optimal (au sens MSE) pour les systèmes linéaires bruités. Je l'utilise comme outil de modélisation pour comprendre :

  • Fusion de sources d'information : comment combiner un modèle dynamique avec des capteurs imparfaits.
  • Propagation d'incertitude : matrices de covariance, bruit de processus \(Q\), bruit de mesure \(R\).
  • Optimisation bayésienne : le gain de Kalman est la solution analytique à un problème de pondération par variance.
  • Extensions non-linéaires : EKF (Extended), UKF (Unscented), filtres particulaires.
Estimation bayésienne Systèmes dynamiques Moindres carrés récursifs Fusion de capteurs

Pourquoi le filtre de Kalman ?

Imaginez un radar qui suit un avion. La position mesurée est bruitée — dix radars différents donneraient dix valeurs légèrement différentes. En même temps, vous savez que l'avion vole à vitesse approximativement constante : vous avez un modèle de son comportement.

Le filtre de Kalman répond à une question simple : comment combiner optimalement une mesure bruitée et une prédiction imparfaite ? La réponse est une moyenne pondérée où les poids dépendent des niveaux de confiance respectifs — et c'est exactement le gain de Kalman.

Au-delà du radar, on retrouve le filtre de Kalman dans la navigation GPS/IMU, le contrôle de robots, l'analyse financière (modèles à espace d'états), et même les interfaces cerveau-machine.

Modèle d'état

On décrit le système par un vecteur d'état \(\mathbf{x}_k\) (position, vitesse, température…) qui évolue selon deux équations :

Équation d'évolution (processus)
Modèle dynamique
\[\mathbf{x}_{k} = \mathbf{F}\,\mathbf{x}_{k-1} + \mathbf{B}\,\mathbf{u}_k + \mathbf{w}_k\]
  • \(\mathbf{F}\) — matrice de transition d'état
  • \(\mathbf{B},\mathbf{u}_k\) — entrée de commande
  • \(\mathbf{w}_k \sim \mathcal{N}(0,\mathbf{Q})\) — bruit de processus
Équation de mesure
Modèle capteur
\[\mathbf{z}_k = \mathbf{H}\,\mathbf{x}_k + \mathbf{v}_k\]
  • \(\mathbf{z}_k\) — vecteur de mesures (ce que le capteur observe)
  • \(\mathbf{H}\) — matrice d'observation
  • \(\mathbf{v}_k \sim \mathcal{N}(0,\mathbf{R})\) — bruit de mesure

L'état estimé \(\hat{\mathbf{x}}_{k|k}\) est représenté par une gaussienne paramétrée par sa moyenne et sa matrice de covariance \(\mathbf{P}\) : \(\hat{\mathbf{x}} \sim \mathcal{N}(\hat{\mathbf{x}}, \mathbf{P})\). Cette représentation permet de propager l'incertitude à chaque étape.

Le cycle Prédire – Mettre à jour

Le filtre fonctionne en boucle : à chaque pas de temps, il prédit le prochain état grâce au modèle dynamique, puis corrige cette prédiction avec la mesure courante.

① Initialisation

Fixer \(\hat{\mathbf{x}}_{0|0}\) et \(\mathbf{P}_{0|0}\)

② Prédiction

Propagation via \(\mathbf{F}\), \(\mathbf{B}\), \(\mathbf{Q}\)

③ Mise à jour

Calcul du gain \(\mathbf{K}\), correction par \(\mathbf{z}_k\)

Les étapes ② et ③ se répètent à chaque pas de temps.

Équations complètes

Étape de prédiction

État prédit
\[\hat{\mathbf{x}}_{k|k-1} = \mathbf{F}\,\hat{\mathbf{x}}_{k-1|k-1} + \mathbf{B}\,\mathbf{u}_k\]
Covariance prédite
\[\mathbf{P}_{k|k-1} = \mathbf{F}\,\mathbf{P}_{k-1|k-1}\,\mathbf{F}^\top + \mathbf{Q}\]

Étape de mise à jour

Gain de Kalman
\[\mathbf{K}_k = \mathbf{P}_{k|k-1}\,\mathbf{H}^\top\!\left(\mathbf{H}\,\mathbf{P}_{k|k-1}\,\mathbf{H}^\top + \mathbf{R}\right)^{-1}\]
État mis à jour
\[\hat{\mathbf{x}}_{k|k} = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_k\!\left(\mathbf{z}_k - \mathbf{H}\,\hat{\mathbf{x}}_{k|k-1}\right)\]
Covariance mise à jour (forme de Joseph)
\[\mathbf{P}_{k|k} = \left(\mathbf{I} - \mathbf{K}_k\mathbf{H}\right)\mathbf{P}_{k|k-1}\left(\mathbf{I} - \mathbf{K}_k\mathbf{H}\right)^\top + \mathbf{K}_k\mathbf{R}\,\mathbf{K}_k^\top\]
Résidu (innovation) : \(\tilde{\mathbf{y}}_k = \mathbf{z}_k - \mathbf{H}\,\hat{\mathbf{x}}_{k|k-1}\) — différence entre la mesure observée et la mesure prédite. Le gain \(\mathbf{K}_k\) détermine combien de cette information nouvelle intégrer.

Simulation interactive

La simulation ci-dessous montre un objet se déplaçant à vitesse constante (avec légère accélération aléatoire). Les mesures de position sont bruitées. Ajustez \(Q\) (bruit de processus) et \(R\) (bruit de mesure) pour voir comment le filtre réagit.

Filtre de Kalman 1D — position et vitesse

20
0.50
2.0
État vrai Mesure bruitée Estimation (filtre) Prédiction (avant mesure)

Que remarquer ? Quand \(R\) est grand (capteur peu fiable), le filtre fait davantage confiance au modèle dynamique. Quand \(Q\) est grand (modèle peu fiable), le filtre réagit plus vite aux mesures. Le gain de Kalman équilibre automatiquement ces deux sources.

Intuition du gain de Kalman

En 1D, le gain se simplifie en :

\[K_k = \frac{p_{k|k-1}}{p_{k|k-1} + r}\]

C'est un simple ratio entre l'incertitude prédite et l'incertitude totale. Si \(r \to 0\) (capteur parfait), \(K \to 1\) : on fait entièrement confiance à la mesure. Si \(p \to 0\) (modèle parfait), \(K \to 0\) : on ignore la mesure.

Visualisation du gain \(K\) selon \(p\) et \(r\)

10.0
10.0

Exemple numérique : radar 1D

Reprenons l'exemple classique d'un radar suivant un avion en ligne droite. L'état est \(\mathbf{x} = [r,\, v]^\top\) (portée en m, vitesse en m/s). À \(t_0\) : mesure initiale \(\mathbf{z}_0 = [10\,000,\; 200]^\top\).

Initialisation

\[\hat{\mathbf{x}}_{0|0} = \begin{bmatrix}10\,000\\200\end{bmatrix},\quad \mathbf{P}_{0|0} = \begin{bmatrix}16 & 0\\0 & 0{,}25\end{bmatrix}\]

Prédiction à \(t_1\) (\(\Delta t = 5\,\text{s}\))

\[\mathbf{F} = \begin{bmatrix}1 & 5\\0 & 1\end{bmatrix},\quad \hat{\mathbf{x}}_{1|0} = \mathbf{F}\hat{\mathbf{x}}_{0|0} = \begin{bmatrix}11\,000\\200\end{bmatrix}\]
\[\mathbf{P}_{1|0} = \mathbf{F}\mathbf{P}_{0|0}\mathbf{F}^\top + \mathbf{Q} = \begin{bmatrix}28{,}5 & 3{,}75\\3{,}75 & 1{,}25\end{bmatrix}\]

Mise à jour avec \(\mathbf{z}_1 = [11\,020,\; 202]^\top\)

Avec \(\mathbf{H} = \mathbf{I}\) et \(\mathbf{R}_1 = \text{diag}(36,\; 2{,}25)\) :

\[\mathbf{K}_1 = \begin{bmatrix}0{,}44 & 0{,}64\\0{,}04 & 0{,}31\end{bmatrix}\]
\[\hat{\mathbf{x}}_{1|1} = \hat{\mathbf{x}}_{1|0} + \mathbf{K}_1(\mathbf{z}_1 - \hat{\mathbf{x}}_{1|0}) = \begin{bmatrix}11\,009{,}4\\201{,}4\end{bmatrix}\]
La covariance mise à jour \(\mathbf{P}_{1|1} \approx \text{diag}(14{,}6,\; 0{,}71)\) est inférieure à la fois à \(\mathbf{P}_{1|0}\) et à \(\mathbf{R}_1\). En combinant les deux sources, on obtient une estimation meilleure que chaque source seule.

Limites et extensions

Hypothèse standardSi violée → solution
Système linéaireEKF : linéarisation locale (Jacobien)
Bruit gaussienUKF : transformée sans parfum (sigma-points)
Distributions multimodalesFiltre particulaire : Monte Carlo séquentiel
\(Q\) et \(R\) connusEstimation adaptative (EM, fenêtre glissante)

Pour aller plus loin : kalmanfilter.net (tutoriel complet) • Bzarg — en imagesLabbe — Python