Contents — find the section you need

Change parameters and verify

Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.

Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.

The experiment controls are in English.

Open experiment panel in a new tab

Download reproduction source

Die Kalman-Optimierung drückt die Unsicherheit eines Bewegungsmodells und seiner Beobachtungen aus. Dieses Experiment schätzt Position und Geschwindigkeit und vergleicht anschließend die Vorhersage bei fehlenden Daten, die Reaktion auf Ausreißer und die durch übermäßiges Vertrauen verursachte Ablehnung. Alle Eingangsdaten sind synthetisch; die Zahlenwerte geben keine Hardware-Genauigkeit an.

Modell und Einheiten

Der Zustand enthält Position [m] und Geschwindigkeit [m/s]. Nur die Position wird alle 0,1 s beobachtet:

x_k=F x_{k-1}+w_k,\qquad F=\begin{bmatrix}1&0.1\\0&1\end{bmatrix},\qquad z_k=H x_k+v_k,\quad H=\begin{bmatrix}1&0\end{bmatrix}

Die Standardabweichung der Beobachtungen beträgt 0,7 m, was R = 0,49 m² ergibt. Die Prozesskovarianz ist q ggᵀ mit g = (dt²/2, dt), was eine unabhängige Beschleunigungsstörung pro Schritt darstellt. Hier hat q = 0,4 die Einheit (m/s²)²; es handelt sich nicht um eine kontinuierliche spektrale Dichte von weißem Rauschen. Übertragen Sie diesen Wert nicht ohne Überprüfung seiner Bedeutung auf eine andere Diskretisierung. Die Herleitungen für Vorhersage und Aktualisierung finden Sie in der Einführung zum Kalman-Filter.

Die Theorie ist in Simo Särkkä (2013), Bayesian Filtering and Smoothing, Abschnitt 4.3, beschrieben. Trajektorie, Gate und Vergleichsbedingungen entsprechen unserem eigenen Versuchsaufbau.

Vier Konfigurationen, identische Eingabe

Speichern Sie das Experiment-Skript in einem leeren Ausgabeverzeichnis und führen Sie es aus:

python3 engineering_labs.py

Die Ausführung wurde mit Python 3.12.3, NumPy 1.26.4 und Matplotlib 3.6.3 getestet. Die Datei erzeugt auch die anderen verlinkten technischen Experimente. Sie verwendet den Startwert 42 und 300 Stichproben. Die tatsächliche Geschwindigkeit ändert sich nach 12 s von 1 auf 1,4 m/s. Dreißig Beobachtungen zwischen 7,0 und 9,9 s fehlen, und der Beobachtung bei 16 s werden 12 m hinzugefügt. Die Anfangsposition und -geschwindigkeit betragen 0 m bzw. 1 m/s; die anfängliche Kovarianz hat die Diagonaleinträge 1 m² und 1 (m/s)². Jede Konfiguration erhält exakt dieselben Beobachtungen.

Normalisierung des Residuums

Sei e das Beobachtungsresiduum vor der Korrektur und S seine vorhergesagte Varianz. Das Gate verwirft eine Beobachtung, wenn:

e=z-H\hat{x}^{-},\qquad S=HP^{-}H^T+R,\qquad e^2/S>9

Dieser Schwellenwert gilt für dieses skalare normalisierte Residuum und nicht willkürlich für mehrdimensionale Beobachtungen. Fehlende oder verworfene Messungen lösen eine Vorhersage ohne Korrektur aus. Die Implementierung verwendet die Joseph-Kovarianzaktualisierung und prüft auf positive Semidefinitheit. Die Unsicherheit wächst bei fehlenden Daten, daher unterscheidet sich dies von einer festen Verwerfungsdistanz in Metern.

Ergebnisse zeigen Überschätzung

Konfiguration Positions-RMSE [m] Verworfen
q=0,4, R=0,49, kein Gate 0,262 0
q=0,4, R=0,49, Gate 0,178 2
q=0,002, R=0,49, Gate 0,393 4
q=0,4, R=0,0049, Gate 11,251 237
Diagram 1 · Use the button to switch views
Synthetische KF-Positionsfehler in Metern pro Sekunde, fehlende Messwerte sind schattiert.

Der vertikale Bereich ist zum Vergleich auf −3 bis 4 m begrenzt. Der Ausreißer bei 12 m und große Fehler mit kleinem R reichen darüber hinaus. Prüfen Sie die gated CSV, small-R CSV und complete summary auf nicht abgeschnittene Werte. Fehlende Werte in CSV-Dateien werden als NaN (NaN) behandelt und nicht als Ausschlusskriterien gewertet.

Das Gate verwirft zwei Beobachtungen, obwohl nur ein künstlicher Ausreißer eingefügt wurde. Ein Schwellenwert identifiziert nicht ausschließlich absichtlich verfälschte Stichproben. Eine Unterschätzung der Beobachtungsvarianz um den Faktor 100 führt zu 237 Ausschlusskriterien: Die normale Streuung ist mit der Konfidenz des Filters nicht mehr vereinbar. Fehlende Korrekturen verhindern dann die Verfolgung der Geschwindigkeitsänderung, wodurch die Residuen noch größer werden. Das Hinzufügen eines Gates allein erhöht die Robustheit nicht.

Ihre eigenen Protokolle

Prüfen Sie zuerst Zeitstempel, Einheiten und Frames. Schätzen Sie die Beobachtungsvarianz in stationären Intervallen und untersuchen Sie anschließend die Fehler des Bewegungsmodells und die Residuen während der Bewegung. Führen Sie das Gating zuletzt ein und berichten Sie über die Rate fehlender Daten, die Ausschlussrate und die Unsicherheit zusammen mit dem RMSE. Reale Hardware benötigt eine unabhängige Referenz, um vergleichbare Fehler zu berechnen.

Ein kleiner Q-Wert kann eine Kurve glätten, aber gleichzeitig die Verzögerung erhöhen. Ein höherer Q-Wert ist jedoch nicht generell besser. Diese Rangfolge gilt nur für diese Trajektorie, Initialisierung, dieses Rauschen und dieses Auswertungsfenster.

Folgeprüfung

Die Spalte „sigma_m“ enthält die geschätzte Standardabweichung der Position. Stellen Sie die Schätzung plus/minus das Zweifache von Sigma grafisch dar und vergleichen Sie das Intervall fehlender Daten mit der Geschwindigkeitsänderung. Dadurch lässt sich der tatsächliche Fehler von der Selbsteinschätzung des Schätzers trennen. Fahren Sie mit der Fehlersuche in der Sensorfusion fort (siehe sensor-fusion debugging), um Timing und TF zu diagnostizieren, bevor Sie die Kovarianz ändern.

Führen Sie die gleiche Berechnung lokal durch

Extrahieren Sie die vollständige ausführbare Quellcode-ZIP-Datei oder speichern Sie den Einstiegspunkt des Experiments, die generierten Kernel und den ursprünglichen PID-Quellcode in einem Ordner. PID verwendet die Python-Standardbibliothek; Kalman und ICP benötigen NumPy. Die ursprünglichen Befehle zur Grafikerstellung bleiben verfügbar.

python3 -m pip install numpy==1.26.4
python3 experiment.py kalman --parameters '{"q":0.4,"r":0.49,"gate":false}' > result.json

Schalten Sie das Gate um, um die Ausreißerantwort zu vergleichen. Setzen Sie dann q auf 0,002 oder r auf 0,0049 und vergleichen Sie RMSE und die Anzahl der abgelehnten Daten. Die Beobachtungen sind in allen Durchläufen aus der gespeicherten CSV-Datei unverändert.

Code, data and reproduction

The ZIP contains the same computation code as the browser, synthetic data and comparison cases. These are not physical measurements.

Download reproduction package · Instructions (EN/JA) · Files and experiment conditions (JSON)

Extract the ZIP into a new directory, then run:

python3 reproduce.py --experiment kalman

This Lab compares 4 cases. PID uses Python’s standard library; Kalman/ICP require NumPy. See the instructions for dependencies and tested versions.

Related reading

Check timing, TF and units before tuning.Warum Sensorfusion fehlschlägt – Timing, Frames und extrinsische KalibrierungExplore another aspect of this fieldMPC-Labor – Krümmungsfolge im Horizont und innerhalb der Lenkgrenzen neu lösenExplore another aspect of this fieldPfadverfolgungs-Vergleichs-Labor – PP, APP, RPP, Stanley und MPC unter denselben Bedingungen laufen lassen