Zum Inhalt springen

State Estimation ​

Ein Roboter misst seinen Zustand nie direkt; er leitet Orientierung, Geschwindigkeit und Position aus verrauschten, mit Bias behafteten Sensoren ab. Diese Seite behandelt IMU-Modelle, Komplementär- und Mahony-Filter, das Kalman-Filter, Bein-Odometrie und LiDAR-SLAM sowie das, was Strido tatsächlich veröffentlicht.

In Strido

Der XIAO ESP32-S3 liest eine LSM6DSOX-IMU aus und führt in seiner Regelschleife mit 200Hz ein Mahony-Filter aus (firmware/strido_esp32s3/src/main.cpp, Periode kControlPeriodUs = 5000 in board_config.h). ros2/strido_control/strido_control/mcu_bridge.py veröffentlicht es erneut als /imu/data; gait_node.py veröffentlicht /odom per Koppelnavigation; ein RPLIDAR C1 veröffentlicht /scan (siehe docs/software.md und Sensoren).

IMU-Messmodelle ​

Eine inertiale Messeinheit enthält ein 3-Achsen-Gyroskop (Winkelgeschwindigkeit) und einen 3-Achsen-Beschleunigungssensor (spezifische Kraft). Beide werden im körperfesten Koordinatensystem des Sensors {b} ausgedrückt.

Gyroskop.

ω~=ω+bg+ng

bg ist ein langsam driftender Bias (temperaturabhängig), ng weißes Rauschen. Die Integration des Gyroskops liefert die Orientierung, die Integration des Bias jedoch einen Winkelfehler, der linear mit der Zeit wächst: Ein Bias von nur 0.5∘/s wird nach einer Minute zu 30∘.

Beschleunigungssensor. Er misst die Beschleunigung minus der Schwerkraft, in den Körper gedreht:

a~=R⊤(p¨−g)+ba+na,g=(0,0,−9.81)⊤m/s2

wobei R vom Körper- ins Weltkoordinatensystem dreht. Im Stillstand (p¨=0) liest er R⊤(0,0,9.81)⊤: den „Oben“-Vektor in Körperkoordinaten. Das legt Rollen und Nicken ohne Drift fest, ist aber verrauscht und verfälscht, sobald der Körper beschleunigt (bei jedem Schritt). Über das Gieren sagt er nichts aus, da eine Drehung um die Schwerkraftachse den Schwerkraftvektor nicht verändert.

Die beiden Sensoren ergänzen sich: Das Gyroskop ist glatt, driftet aber; der Beschleunigungssensor ist verrauscht, aber driftfrei.

Das Komplementärfilter ​

Für einen Neigungswinkel θ wird das integrierte Gyroskop (vertrauenswürdig bei hohen Frequenzen) mit dem Winkel des Beschleunigungssensors (vertrauenswürdig bei niedrigen Frequenzen) gemischt:

θ^k=α(θ^k−1+ω~kΔt)+(1−α)θacc,k,θacc=atan2(a~y,a~z)

Im Frequenzbereich ist das ein Hochpass auf dem Gyroskop plus ein Tiefpass auf dem Beschleunigungssensor mit derselben Grenzfrequenz; die Übergangszeitkonstante ist

τ=αΔt1−α

Rechenbeispiel. Bei Δt=5ms von Strido ergibt die Wahl α=0.98 den Wert τ=0.98×0.005/0.02≈0.25s: länger als die Standphase des Trots von 0.2s, sodass Schrittstöße größtenteils herausgefiltert werden, während die Gyroskopdrift innerhalb von etwa einer Sekunde korrigiert wird.

Das Mahony-Filter (das, was die Firmware ausführt) ​

Mahonys Filter ist ein Komplementärfilter auf der Rotationsgruppe und verwendet statt getrennter Winkel ein Quaternion q^. Jeder Schritt:

  1. Die Schwerkraftrichtung („oben“) aus der aktuellen Schätzung vorhersagen: v^=R^⊤ez.
  2. Den Beschleunigungssensor normieren: a¯=a~/‖a~‖.
  3. Der Fehler ist die Drehung, die nötig ist, um beide auszurichten:
e=a¯×v^
  1. Das Gyroskop mit proportionaler und integraler Rückführung korrigieren (der Integralterm konvergiert gegen den negativen Gyroskop-Bias und hebt ihn auf):
bk=bk−1+KieΔt,ωc=ω~+Kpe+bk
  1. Die Quaternion-Kinematik q˙=12q⊗(0,ωc) integrieren und erneut normieren:
q^k=q^k−1+12q^k−1⊗(0,ωc)Δt‖⋅‖

Kp legt den Übergang fest (ungefähr τ≈1/Kp); Ki entfernt einen konstanten Gyroskop-Bias. Das Gieren ist ohne Magnetometer nicht beobachtbar und driftet daher.

In der Firmware wird Adafruit_Mahony mit 1/Δt=200Hz gestartet und über updateIMU gespeist (nur Gyroskop und Beschleunigungssensor, kein Magnetometer). Vor dem Filtern werden die Platinenachsen auf das Basiskoordinatensystem umgelegt, da die IMU mit ihrer x-Achse nach links und ihrer y-Achse nach hinten montiert ist:

(ωx,ωy,ωz)=(−ω~y,ω~x,ω~z),(ax,ay,az)=(−a~y,a~x,a~z)

Der Sensor ist auf ±8g, ±1000∘/s bei einer Ausgabedatenrate von 416Hz konfiguriert. Das Repository behält die Standardverstärkungen der Bibliothek bei (Adafruit AHRS: Kp=0.5, Ki=0, d. h. keine Bias-Integration).

Das Kalman-Filter ​

Das Kalman-Filter ist der optimale Schätzer für lineare Systeme mit gaußschem Rauschen. Zustand x mit Kovarianz P, Modell

xk=Fxk−1+Buk+wk,w∼N(0,Q);zk=Hxk+vk,v∼N(0,Rn)

Prädiktion (Modell fortschreiben; die Unsicherheit wächst):

x^k∣k−1=Fx^k−1+Buk,Pk∣k−1=FPk−1F⊤+Q

Korrektur (eine Messung fusionieren; die Unsicherheit schrumpft):

Kk=Pk∣k−1H⊤(HPk∣k−1H⊤+Rn)−1x^k=x^k∣k−1+Kk(zk−Hx^k∣k−1),Pk=(I−KkH)Pk∣k−1

Die Verstärkung K gewichtet die Innovation z−Hx^ danach, wie sehr wir der Messung (Rn) gegenüber der Prädiktion (P) vertrauen. Ein Neigungsfilter mit Zustand (θ,bg), Gyroskop als Eingang und Beschleunigungswinkel als Messung konvergiert zu einem Komplementärfilter mit automatisch abgestimmtem α und Bias-Schätzung. Nichtlineare Systeme (Rotationen, Laufroboter) verwenden das erweiterte Kalman-Filter, das F und H um die aktuelle Schätzung linearisiert.

Bein-Odometrie ​

Rutscht ein Standfuß nicht, ist seine Weltposition fest, sodass sich die Körpergeschwindigkeit aus den Gelenkgeschwindigkeiten des Beins über die Vorwärtskinematik ergibt (siehe Kinematik):

vbody=−(J(q)q˙+ω×pfoot)

gemittelt über die Standfüße und für die Position integriert. Fehler entstehen durch Rutschen, Kontakterkennung und Kalibrierung, daher driftet sie; moderne Vierbeiner fusionieren sie in einem EKF mit der IMU.

Die Hobby-Servos von Strido haben keine Positionsrückmeldung: /joint_states meldet die kommandierten Winkel nach der Begrenzung, keine gemessenen. Echte Bein-Odometrie ist daher nicht verfügbar, und gait_node.py macht etwas Einfacheres: Es integriert die kommandierte Körpergeschwindigkeit,

xk=xk−1+(vxcos⁡ψ−vysin⁡ψ)Δt,yk=yk−1+(vxsin⁡ψ+vycos⁡ψ)Δt,ψk=ψk−1+ωzΔt

ohne Rutschmodell. Erreicht der Roboter tatsächlich 80 % eines Kommandos von 0.30m/s, überschätzt /odom die Distanz um 0.06m pro Sekunde.

LiDAR-Scan-Matching und SLAM ​

Ein 2D-LiDAR liefert Entfernungen rj unter Winkeln θj. Scan-Matching findet die starre Transformation (R,t), die einen neuen Scan am besten auf einen vorherigen Scan oder eine Karte ausrichtet, z. B. mit ICP (Iterative Closest Point):

(R⋆,t⋆)=arg⁡minR,t∑j‖Rpj+t−mc(j)‖2

wobei mc(j) der nächstgelegene Kartenpunkt zu pj ist. Das Verketten von Matches ergibt LiDAR-Odometrie, die ebenfalls driftet. SLAM (simultane Lokalisierung und Kartierung) beseitigt die Drift, indem es bereits gesehene Orte wiedererkennt (Loop Closure) und eine Posengraph-Optimierung über alle Posen gleichzeitig löst. Rad-/Bein-Odometrie ist ein nützlicher Startwert für den Matcher – genau die Rolle, die der Code-Kommentar dem /odom von Strido zuweist („ein Startwert für SLAM“).

Was Strido veröffentlicht ​

TopicInhaltQuelle
/imu/data (sensor_msgs/Imu, Frame imu_link, Achsen an base_link ausgerichtet)Orientierungsquaternion aus dem Mahony-Filter, Winkelgeschwindigkeit in rad/s, lineare Beschleunigung in m/s2 (inklusive Schwerkraft); wird nicht veröffentlicht, solange die IMU einen Fehler meldetmcu_bridge.py, Zustandsstrom mit 100Hz (kStatePeriodMs = 10)
/odom + TF odom → base_link (nav_msgs/Odometry)Koppelnavigation der kommandierten Geschwindigkeitnur gait_node.py
/scan (sensor_msgs/LaserScan, lidar_link)RPLIDAR-C1-Entfernungen mit 10Hzsllidar_ros2

Die gelernte Policy verwendet nur /imu/data: das Gyroskop und die aus dem Quaternion abgeleitete Schwerkraftrichtung (siehe Reinforcement Learning).

Selbsttest ​

  1. Warum kann ein Beschleunigungssensor Rollen und Nicken liefern, aber nicht Gieren?

    Antwort

    Er misst die Schwerkraftrichtung im Körperkoordinatensystem; eine Drehung um die Hochachse ändert diese Richtung nicht.

  2. Welches α ergibt bei Δt=5ms eine Zeitkonstante des Komplementärfilters von 0.5s?

    Antwort

    α/(1−α)=100, so α=100/101≈0.990.

  3. Was schätzt die Integralverstärkung Ki im Mahony-Filter, und was passiert bei Ki=0?

    Antwort

    Den Gyroskop-Bias. Bei Ki=0 hinterlässt ein konstanter Bias einen kleinen bleibenden Roll-/Nickversatz von etwa bg/Kp und unkorrigierte Gierdrift.

  4. Was passiert in der Kalman-Korrektur mit K, wenn Rn→∞?

    Antwort

    K→0: Die Messung wird ignoriert und die Schätzung folgt der Prädiktion.

  5. Warum kann Strido keine klassische Bein-Odometrie durchführen?

    Antwort

    Seine Servos liefern keine Rückmeldung der Gelenkposition, daher sind die tatsächlichen q und q˙ unbekannt; nur Kommandos sind verfügbar.

Weiterführende Literatur ​

  • R. Mahony, T. Hamel und J.-M. Pflimlin, „Nonlinear Complementary Filters on the Special Orthogonal Group“, IEEE Transactions on Automatic Control, 2008.
  • S. Thrun, W. Burgard und D. Fox, Probabilistic Robotics, MIT Press, 2005.
  • J. Solà, „Quaternion kinematics for the error-state Kalman filter“, arXiv:1711.02508, 2017.
  • M. Bloesch et al., „State Estimation for Legged Robots — Consistent Fusion of Leg Kinematics and IMU“, Robotics: Science and Systems, 2012.
  • W. Hess, D. Kohler, H. Rapp und D. Andor, „Real-Time Loop Closure in 2D LIDAR SLAM“ (Cartographer), IEEE ICRA, 2016.

MIT-Lizenz. Mechanik abgeleitet von Yertle (Jerome Graves). CAD, Simulation und native Tests sind kein Hardware-Nachweis – siehe Verifikation.