Tutorial · Einsteiger · 17 Min. Lesezeit
Sensorrauschen, Bias und Filterung in der Robotik
Verstehe verrauschte Robotersensoren: Rauschen, Bias und Drift unterscheiden, einen Filter wählen, seinen Verzug messen und erkennen, wann Fusion hilft.
Jeder Roboter handelt auf Messungen, die verrauscht, verzögert, verzerrt und manchmal fehlend sind. Eine Rohlesung als Wahrheit zu behandeln ist der schnellste Weg zu einem Roboter, der sich unvorhersagbar benimmt. Diese Anleitung deckt Vokabular und Zielkonflikte ab, die du brauchst, bevor du einem Sensor traust. Experimentiere mit jedem Effekt im Roboter-Sensor-Simulator.
Rauschen, Bias und Drift sind verschiedene Probleme
- Rauschen variiert zufällig von Abtastung zu Abtastung. Mitteln oder Filtern reduziert es.
- Bias ist ein fester Offset vom wahren Wert. Filterung entfernt ihn nicht; du musst ihn bei Kalibrierung messen und abziehen.
- Drift ist ein Bias, der sich langsam über Zeit ändert, meist mit Temperatur. Eine Startkalibrierung passt allmählich nicht mehr zur Wirklichkeit — weshalb lange Läufe periodische Nachkalibrierung oder eine Referenz zur Korrektur brauchen.
Sie zu verwechseln führt zum falschen Fix — mehr Filterung heilt nie einen Bias.
Einen Filter wählen
Drei gängige Filter decken die meisten Fälle ab:
- Ein gleitender Mittelwert und ein exponentieller Tiefpass glätten beide Zufallsrauschen und tauschen über Fenster oder Zeitkonstante Ansprechverhalten gegen Glätte.
- Ein Medianfilter entfernt besser gelegentliche Spikes und Aussetzer, weil wenige schlechte Abtastungen den Mittelwert nicht bewegen.
Wähle den leichtesten Filter, der die Anforderung dessen erfüllt, was die Messung verbraucht — nicht den, der den glattesten Plot produziert.
Filterung fügt immer Verzug hinzu
Jeder Glättungsfilter hinkt dem wahren Signal hinterher, und mehr Glätten heißt mehr Verzug. Ein Tiefpass mit langer Zeitkonstante weist mehr Rauschen ab, fällt aber bei schnellen Änderungen weiter zurück. Plotte die gefilterte Schätzung immer gegen Rohabtastungen und Wahrheit, sodass die Verzögerung sichtbar ist, bevor du den Filter in einen Regelkreis steckst, wo Verzug Instabilität verursachen kann.
class LowPass:
def __init__(self, alpha):
self.alpha = alpha # smaller alpha = smoother but more lag
self.value = None
def update(self, sample):
if self.value is None:
self.value = sample
else:
self.value += self.alpha * (sample - self.value)
return self.value
Was Sensorfusion kann und was nicht
Fusion kombiniert mehrere Sensoren zu einer Schätzung und hilft nur, wenn die Sensoren komplementäre Information beitragen und ihre Unsicherheit ehrlich abgebildet ist. Zwei verzerrte Messungen zu kombinieren schafft keine Wahrheit. Ein komplementärer Filter etwa traut einem Sensor bei hohen Frequenzen und einem anderen bei niedrigen; ein Kalman-Filter gewichtet jede Quelle nach ihrer Unsicherheit. So oder so: Beginne mit Kalibrierung, Zeitstempeln und gemeinsamen Koordinatensystemen, bevor du irgendwas fusionierst.
Alles mit Zeitstempel versehen
Abtastungen kommen selten im perfekt festen Intervall, und Filterung wie Fusion nehmen an, dass du weißt, wann jeder Wert gemessen wurde. Zeitstempel lassen dich Jitter erkennen, Daten verschiedener Sensoren ausrichten und alte Lesungen verwerfen. Logge Rohwerte neben verarbeiteten, sodass Fehler wie Clipping und Aussetzer reproduzierbar bleiben.
Miss deinen Sensor, bevor du ihn filterst
Einen Filter zu wählen, bevor du weißt, wie das Rauschen aussieht, ist Raten. Zehn Minuten Loggen entscheiden es, und die Prozedur ist für jeden Sensor gleich:
- Halte den Sensor perfekt still gegen eine bekannte, unveränderliche Eingabe.
- Logge ein paar tausend Rohabtastungen mit Zeitstempeln.
- Berechne Mittelwert und Standardabweichung.
- Plotte die Abtastungen und plotte ein Histogramm davon.
Diese vier Zahlen und zwei Plots sagen dir, welchen der drei Fehler du hast:
| Was du beobachtest | Was es ist | Der Fix |
|---|---|---|
| Mittel trifft Wahrheit, Werte streuen symmetrisch | Rauschen | Filtern |
| Mittel versetzt gegen Wahrheit, Streuung klein | Bias | Im Stillstand messen und abziehen — Filterung hilft nie |
| Mittel wandert über Minuten davon | Drift | Periodisch nachkalibrieren oder gegen Referenz korrigieren |
| Meist eng, mit gelegentlichen wilden Werten | Ausreißer | Median, kein Mittelwert |
| Werte landen auf diskreten Stufen | Quantisierung | Erwartet; sie begrenzt deine Auflösung |
Das Histogramm ist der Teil, den Leute überspringen, und es ist der informativste. Gaußrauschen macht eine Glocke; Ausreißer machen eine Glocke mit wenigen Punkten weit draußen in den Flanken. Die brauchen verschiedene Filter, und kein Starren auf ein Zeitreihendiagramm unterscheidet sie so klar.
Filterwahl, quantifiziert
| Filter | Killt Gaußrauschen | Killt Ausreißer | Verzug | Kosten |
|---|---|---|---|---|
| Gleitender Mittelwert, N Abtastungen | Ja — um √N | Nein — verschmiert einen Spike über N Abtastungen | (N−1)/2 Abtastungen | N-Abtastungs-Puffer |
| Exponentieller Tiefpass (EMA) | Ja | Nein | ≈ (1−α)/α Abtastungen | Ein Float |
| Median aus N | Etwas | Vollständig, bis N/2 Ausreißer | (N−1)/2 Abtastungen | Sortieren, trivial bei kleinem N |
| Median dann EMA | Ja | Ja | Beides | Beides |
Das √N in der ersten Zeile ist die nützliche Zahl: 4 Abtastungen mitteln halbiert das Rauschen; 100 Abtastungen mitteln reduzieren es um zehn — zum Preis von 50 Abtastungen Verzug. Rauschreduktion hat stark abnehmenden Ertrag, Verzug nicht — weshalb sehr lange Mittel fast immer die falsche Antwort sind.
Für einen EMA hängt die Zeitkonstante so mit α zusammen:
tau = dt x (1 - alpha) / alpha
Bei 10-ms-Schleife gibt α = 0,1 also 90 ms Zeitkonstante. α nach Gefühl zu setzen ist, wie Leute mit Filtern enden, die weit langsamer sind, als sie ahnen — rechne es einmal, und du weißt, was du hast.
Der Verzug ist nicht gratis, und hier steht, was er kostet
Jeder Glättungsfilter verzögert das Signal, und in einem Regelkreis ist diese Verzögerung nicht von trägerer Strecke zu unterscheiden. Sie reduziert direkt, wie viel Verstärkung die Schleife verträgt, bevor sie schwingt.
| Filter | Verzug bei 10-ms-Schleife | Fahrtstrecke bei 0,3 m/s |
|---|---|---|
| Median aus 3 | 10 ms | 3 mm |
| Median aus 5 | 20 ms | 6 mm |
| Gleitender Mittel aus 10 | 45 ms | 14 mm |
| EMA, α = 0,1 | 90 ms | 27 mm |
| EMA, α = 0,02 | 490 ms | 147 mm |
Die letzte Zeile lohnt Verweilen. Ein α von 0,02 produziert einen wunderschön glatten Plot und eine halbe Sekunde Verzug — der Roboter lenkt nach dem, wo das Hindernis vor 15 cm war. Das ist die häufigste Art, wie ein gut gemeinter Filter einen Roboter schlechter macht, und sie ist unsichtbar, solange du nicht gefiltert gegen roh mit Wahrheit daneben plottest.
Nimm den leichtesten Filter, der die Anforderung erfüllt, und prüfe immer, was der Verzug in den Einheiten kostet, die den Roboter kümmern — Millimeter oder Grad, nicht Abtastungen.
Ein komplementärer Filter, und wie man seine Konstante wählt
Der komplementäre Filter ist das Arbeitstier der Hobbyrobotik, weil er drei Zeilen ist und das echte Problem löst: zwei Sensoren, die gegensätzlich versagen.
// gyroRate in deg/s, accelAngle in degrees, dt in seconds.
angle = alpha * (angle + gyroRate * dt) + (1.0f - alpha) * accelAngle;
alpha setzt die Übergangsfrequenz — darüber traust du dem Gyro, darunter dem Beschleunigungsmesser:
tau = alpha x dt / (1 - alpha) # the filter's time constant, seconds
f_crossover = 1 / (2 x pi x tau) # Hz
| α bei dt = 5 ms | Zeitkonstante | Übergang | Verhalten |
|---|---|---|---|
| 0,90 | 45 ms | 3,5 Hz | Sehr reaktionsfreudig, sichtbar verrauscht vom Beschleunigungsmesser |
| 0,98 | 245 ms | 0,65 Hz | Die gängige Voreinstellung — gute Balance |
| 0,995 | 1,0 s | 0,16 Hz | Sehr glatt, driftet merklich vor Korrektur |
| 0,999 | 5,0 s | 0,03 Hz | Effektiv gyro-only über jedes kurze Manöver |
Wähle sie aus der Physik statt nach Gefühl: Die Zeitkonstante sollte lang sein gegen die Störungen, die du verwerfen willst, und kurz gegen die Driftrate des Gyros. Ein Gyro mit 1 °/s Bias erreicht 1° Fehler in einer Sekunde, also lässt eine Zeitkonstante von mehreren Sekunden echten Fehler auflaufen, bevor das Beschleunigungsmesser ihn zurückzieht.
Beachte auch, dass α von dt abhängt. Ein α aus einem Projekt mit anderer Schleifenrate zu kopieren gibt dir einen anderen Filter — eine gängige und unsichtbare Quelle von „diese Verstärkungen funktionieren bei mir nicht“.
Was Fusion nicht kann
Fusion ist keine Magie, und drei Grenzen lohnen klares Aussprechen:
Sie kann keinen gemeinsamen Bias entfernen. Zwei Beschleunigungsmesser, die beide 2° zu hoch lesen, geben eine fusionierte Schätzung, die 2° zu hoch liest. Fusion nutzt unabhängige Fehler aus; ein Gleichtaktfehler überlebt unberührt.
Sie kann keine Information schaffen, die nicht da ist. Keine Filterung gibt einer Sechs-Achs-IMU eine absolute Heading-Referenz. Gier hat keine Schwerereferenz, driftet also, und nur ein Magnetometer oder eine externe Referenz fixt das.
Sie kann keine schlechten Zeitstempel fixen. Einen 10-Hz-GPS-Fix mit einem 200-Hz-Gyro zu fusionieren verlangt zu wissen, wann jedes gemessen wurde, auf einen Bruchteil des schnelleren Intervalls. Ein 100 ms alter und als aktuell behandelter Fix korrumpiert aktiv eine Schätzung, die das Gyro allein richtig hatte.
Zeitstempel, konkret
„Alles mit Zeitstempel“ nickt sich leicht ab und überspringt sich leicht. Die praktische Version:
struct Sample {
float value;
unsigned long micros; // when it was MEASURED, not when it was read
};
// Reject anything too old to be useful, rather than fusing it.
bool isFresh(const Sample &s, unsigned long maxAgeUs) {
return (micros() - s.micros) < maxAgeUs;
}
Erfasse den Zeitstempel so nah wie möglich an der Messung — im Interrupt, nicht nach dem Parsen. Ein GPS-Satz, der 80 ms nach dem Fix geparst und zur Parsezeit gestempelt wurde, ist 80 ms falsch, und nichts stromabwärts holt das zurück.
Fehlersuche
| Symptom | Wahrscheinliche Ursache | Fix |
|---|---|---|
| Mehr Filterung, keine Besserung | Es ist Bias, nicht Rauschen | Offset in Ruhe messen und abziehen |
| Schätzung wandert langsam davon | Drift | Periodische Nachkalibrierung oder absolute Referenz |
| Gelegentlicher Spike überlebt den Filter | Mittelwert genutzt | Median weist Ausreißer ab; ein Mittel verschmiert sie |
| Regelkreis schwingt nach Filterhinzufügen | Verzug senkte die stabile Verstärkung | Leichterer Filter oder neu abstimmen |
| Glatter Plot, Roboter reagiert spät | Zeitkonstante weit länger als beabsichtigt | τ aus α berechnen — α nicht nach Gefühl setzen |
| Fusionierte Schätzung schlechter als jeder Sensor | Alte Zeitstempel oder gemeinsamer Bias | Zur Messzeit stempeln; Offsets beider Sensoren prüfen |
| Filter läuft auf dem Tisch, nicht am Roboter | Vibration ist echtes Signal, kein Rauschen | Sensor weich lagern; der Filter kann sie nicht trennen |
| Komplementärer Filter benimmt sich anders als im Tutorial | α hängt von dt ab |
α für deine Schleifenrate berechnen |
Probiere es selbst
Im Roboter-Sensor-Simulator kannst du Rauschen, Bias, Drift und Aussetzer eindrehen und Rohdaten gegen Tiefpass-, Mittelwert- und Medianschätzungen vergleichen. Es ist der schnellste Weg, den Rauschen-gegen-Verzug-Zielkonflikt zu fühlen — denselben, der entscheidet, wie ein Roboter im Hindernisvermeidungs-Simulator reagiert.
Den Graphen erkunden
Teil dieser Bauprojekte
Projekte und Lernpfade, die dieses Tutorial enthalten.
Weiterführende Literatur