Expand description
§kalman-fixed-agnostic
Filtre de Kalman adaptatif en virgule fixe pour systèmes embarqués (no_std).
§Caractéristiques
#![no_std]— aucune dépendance à la bibliothèque standard- Arithmétique entière pure (pas de flottants, pas de
libm) - Compatible RP2040 (Cortex-M0+), RP2350 (Cortex-M33) et architectures RISC-V
- Algorithme : Filtre de Kalman scalaire à modèle constant
- Bruit de mesure R adaptatif via la formule de König :
Var(X) = E[X²] − E[X]² - Temps d’exécution constant (déterministe) — idéal pour les noyaux temps réel
§Représentation interne Q16.16
Toutes les grandeurs internes (x, p, q, r) sont stockées en format
virgule fixe Q16.16 sur i64 :
valeur_réelle = valeur_i64 / 65536.0L’interface publique (entrée/sortie) reste en i32 (entiers bruts de capteur).
§Algorithme
À chaque appel à AgnosticKalman::update, le filtre effectue dans l’ordre :
- Mise à jour du buffer circulaire — la nouvelle mesure remplace la plus ancienne
- Calcul de R dynamique — variance de la fenêtre via la formule de König
- Prédiction —
P ← P + Q - Gain de Kalman —
K = P / (P + R) - Correction de l’état —
x ← x + K·(z − x) - Correction de la covariance —
P ← (1 − K)·P
§Formule de König
La variance est calculée sans passe double grâce à l’identité :
Var(X) = E[X²] − E[X]²Cette formulation est numériquement stable pour des capteurs i32 typiques (ADC 12 bits, capteurs de température, accéléromètres) et s’exécute en O(N) avec N = 10 (taille fixe du buffer).
§Exemple
use kalman_fixed_agnostic::AgnosticKalman;
// Signal bruité autour de 1000 avec Q = 1 (filtre très lisse)
let mut k = AgnosticKalman::new(1000, 1);
// Convergence progressive vers la vraie valeur
let mesures = [1005, 998, 1002, 1010, 995, 1003, 999, 1007, 1001, 1004];
let mut sortie = 0i32;
for &m in &mesures {
sortie = k.update(m);
}
// La sortie doit être proche de 1000
assert!((sortie - 1000).abs() < 15);Structs§
- Agnostic
Kalman - Filtre de Kalman adaptatif en virgule fixe Q16.16.
Constants§
- WINDOW
- Taille de la fenêtre glissante pour le calcul de la variance dynamique.