Reinforcement Learning für die Fortbewegung
Wie sich ein Lauf-Controller in der Simulation durch Versuch und Irrtum lernen lässt: Markov-Entscheidungsprozesse, Returns und Value Functions, das Policy-Gradient-Theorem, GAE, PPO sowie die genaue Observation, Action und Reward für Strido, dazu, wie Domain Randomization die Sim-to-Real-Lücke verkleinert.
In Strido
Die Umgebung ist StridoEnv in packages/strido-sim/src/strido_sim/rl/env.py (Gymnasium + MuJoCo); das Training ist rl/train.py (stable-baselines3 PPO auf der CPU). Gemeinsame Konstanten (CONTROL_DT, ACTION_SCALE, COMMAND_RANGES) liegen in packages/strido-core/src/strido/policy.py, und der Roboter führt das exportierte Netz in ros2/strido_control/strido_control/policy_node.py aus. Arbeitsablauf: Simulation und RL und docs/simulation.md.
Der Markov-Entscheidungsprozess
Ein MDP ist ein Tupel
Returns und Diskontierung
Der Return ab Zeitpunkt
Die Diskontierung hält die Summe endlich und drückt eine Präferenz für früheren Reward aus. Der effektive Horizont beträgt etwa train.py) bei einer Policy-Rate von
Das Ziel ist der erwartete Return
Value Functions
Sie erfüllen die Bellman-Gleichung
Der Advantage
Das Policy-Gradient-Theorem
Wir wollen
In Worten: Erhöhe die Log-Wahrscheinlichkeit von Actions, die sich als besser als der Durchschnitt erwiesen haben, und senke sie für schlechtere. Benötigt werden nur Stichproben aus dem Simulator und der Gradient der eigenen Log-Wahrscheinlichkeit des Netzes. Die Verwendung des Advantage (statt
Generalised Advantage Estimation (GAE)
Der Advantage wird aus einem gelernten Critic
GAE bildet eine exponentiell gewichtete Summe davon:
gae_lambda in train.py). Bei Abbruch (einem Sturz) ist der Bootstrap
PPO: Proximal Policy Optimisation
Der einfache Policy Gradient macht einen Schritt pro Batch, und ein zu großer Schritt kann die Policy ruinieren. PPO verwendet jeden Batch für mehrere Epochen wieder und verhindert dabei, dass sich die neue Policy weit von derjenigen entfernt, die die Daten gesammelt hat. Mit dem Wahrscheinlichkeitsverhältnis
lautet das geclippte Surrogat-Ziel
Für eine gute Action (
Für kontinuierliche Actions ist die Policy eine diagonale Gaußverteilung
Einstellungen von Strido (train.py): ent_coef=0.0: Exploration kommt nur aus der eigenen Streuung der Gaußverteilung, log_std_init=-1.0), standardmäßig insgesamt VecNormalize, Observations bei
Rechenbeispiel. Angenommen, eine Action hatte
Die Strido-Umgebung
Timing. Policy mit CONTROL_DT = 0.02), Physik mit
Observation (OBSERVATION_SIZE):
: Winkelgeschwindigkeit des Körpers vom IMU-Gyroskop; : die Richtung der Schwerkraft als Einheitsvektor im Basis-Frame, aus der IMU-Quaternion (kodiert Rollen und Nicken, nicht Gieren); : das Geschwindigkeitskommando, pro Episode gezogen aus , , , und mit Wahrscheinlichkeit null; : die vorherige Action; - ein Gait-Takt
mit ( GAIT_PERIOD_S), passend zum geskripteten Trot.
Jede Eingabe ist auf dem realen Roboter aus /imu/data und /cmd_vel verfügbar; es gibt keine Basisgeschwindigkeit und keine Gelenkrückmeldung (die Servos haben keine).
Action.
ACTION_SCALE slew_limit begrenzt die Gelenkgeschwindigkeit auf clamp_targets wendet die Gelenk- und Kniekurbelgrenzen in derselben Reihenfolge wie die Firmware an, sodass die Policy nie lernt, sich auf Bewegungen zu verlassen, die der Roboter verweigern würde.
Reward. Mit der linearen Geschwindigkeit im Basis-Frame
Die beiden Exponentialterme belohnen das Verfolgen des Kommandos (höchstens CONTROL_DT * 50, was bei
Abbruch. Die Episode endet mit einer Strafe von
Rechenbeispiel. Kommandiert
Domain Randomization und die Sim-to-Real-Lücke
Eine Policy, die Eigenheiten des Simulators ausnutzt, versagt auf der Hardware: die Sim-to-Real-Lücke. Ursachen sind unter anderem nicht modellierte Servodynamik und Spiel, Reibung, Fehler bei Masse und Trägheit, Sensorrauschen und Latenz. Domain Randomization trainiert auf einer Verteilung von Simulatoren, sodass der reale Roboter hoffentlich nur eine weitere Stichprobe ist:
wobei StridoEnv._randomise zieht pro Episode:
| Parameter | Bereich |
|---|---|
| Servosteifigkeit | |
| Basismasse | |
| Boden- und Fußreibung | |
| Gyroskoprauschen | |
| Rauschen des Schwerkraftvektors | |
| anfängliche Gelenkwinkel |
Da die Policy aus einer einzelnen Observation nicht erkennen kann, in welchem
Prüfen Sie sich selbst
Wie groß ist der effektive Horizont in Sekunden für
bei , und wie, wenn die Policy mit demselben bei liefe? Antwort
Etwa
Schritte ; bei halbiert er sich auf , daher sollte auf etwa steigen, um denselben Horizont zu behalten. Warum verzerrt das Abziehen von
den Policy Gradient nicht? Antwort
, daher hat jede nur vom Zustand abhängige Baseline einen erwarteten Beitrag von null. Bei
und : Für welche liefert der PPO-Term keinen Gradienten mehr? Antwort
Für
: Die Wahrscheinlichkeit der Action wurde bereits genug verringert. Warum enthält die Observation die Schwerkraftrichtung statt Euler-Winkeln einschließlich Gieren?
Antwort
Gehen hängt nicht von der Blickrichtung ab, und das Gieren aus einer IMU ohne Magnetometer driftet; der Schwerkraftvektor ist driftfrei und stetig.
Nennen Sie zwei Sim-to-Real-Effekte, die die Randomisierung von Strido nicht abdeckt.
Antwort
Zum Beispiel Sensor- und Aktuatorlatenz, Servospiel oder Totzone, äußere Stöße, unebenes Gelände.
Weiterführende Literatur
- R. S. Sutton und A. G. Barto, Reinforcement Learning: An Introduction, 2. Aufl., MIT Press, 2018.
- J. Schulman, F. Wolski, P. Dhariwal, A. Radford und O. Klimov, „Proximal Policy Optimization Algorithms“, arXiv:1707.06347, 2017.
- J. Schulman, P. Moritz, S. Levine, M. Jordan und P. Abbeel, „High-Dimensional Continuous Control Using Generalized Advantage Estimation“, ICLR, 2016.
- J. Tobin et al., „Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World“, IROS, 2017.
- J. Hwangbo et al., „Learning agile and dynamic motor skills for legged robots“, Science Robotics, 2019.