Balance-Roboter-Simulator: Invertiertes Pendel-PID
Balanciere einen Zweirad-Roboter im Browser. Ziehe ihn aus der Vertikalen, stoße ihn an und verstimme die kaskadierten PID-Werte.
- Kategorie
- Regelungstechnik
- Zeitaufwand
- 2–4 Stunden
- Plattform
- Browser · Arduino
01 / Hier starten
Einführung
Ein Balance-Roboter ist ein invertiertes Pendel: Seine Masse sitzt über der Achse, Stillstand ist daher ein instabiles Gleichgewicht, das nur ein aktiver Kreis halten kann. Ziehe den Aufbau zur Seite, stoße ihn an oder setze die D-Verstärkung auf null und beobachte, wie die Schwingung bis zum Boden wächst.
Live lab / Inverted pendulum & cascaded PID
Self-balancing robot simulator
A two-wheeled robot with its centre of mass above the axle — an inverted pendulum that falls the moment the loop stops. Drag the body over and let go, shove it, or detune the gains and watch exactly how it fails.
Drag the robot to lean it over and let go — the loop takes it from wherever you leave it. The dashed line is the tilt target the outer loop is asking for; the bar at the axle is the motor command. The trace above plots tilt against the ±35° fall threshold.
- Measured tilt
- Tilt target (outer loop)
- Motor command
- Fall threshold
- Tilt
- 0.0°
- Tilt target
- 0.0°
- Motor
- 0%
- Position
- 0 cm
- Upright for
- 0.0 s
- Worst tilt
- 0.0°
Keyboard: focus the robot, then use Space to run/pause, S to shove it, L to switch the loop on or off, R to reset, and F for full screen.
Steuerung
Start, Pause und Zurücksetzen steuern die Schleife. Anstoßen gibt einen Impuls wie ein Finger, und Kreis an/aus schaltet beide Regler ab, damit du die ungeregelte Strecke fallen siehst.
Die direkteste Steuerung ist der Roboter selbst: Ziehe den Aufbau auf einen beliebigen Winkel und lasse los. Welche Pose du hinterlässt, dort übernimmt der Regler — ohne Scharfschalten, und die Verstärkungs-Schieber wirken sofort auf die laufende Simulation. Stelle die D-Verstärkung im Balancezustand auf null, und er beginnt noch in derselben Sekunde zu taumeln.
Das Menü Abstimmung lädt vier Voreinstellungen: eine, die funktioniert, und drei, die auf die drei Arten scheitern, wie echte Balancierer scheitern.
Fokussiere die Zeichenfläche und nutze Leertaste, S, L, R und F für dieselben Funktionen per Tastatur.
Theorie
Einen Roboter auf zwei Rädern zu halten heißt, ein invertiertes Pendel aufrecht zu halten. Der Schwerpunkt sitzt über der Achse, die Vertikale ist also ein Gleichgewicht wie ein Bleistift auf der Spitze: mathematisch real, physisch hoffnungslos ohne ständige Korrektur. Jede Neigung erzeugt ein Schwerkraftmoment, das weiter neigt. Je weiter, desto schneller.
Der Roboter hat genau eine Art, diesem Moment zu begegnen — er kann die Achse bewegen. Räder vorwärts zu beschleunigen schiebt die Basis zurück unter den Schwerpunkt und dreht den Aufbau zur Vertikalen zurück. Darum fühlt sich die Korrektur zunächst invertiert an: Um nicht nach vorn zu fallen, musst du vorwärts fahren, so wie du die Hand unter einen Besen bewegst, den du balancierst, statt davon weg.
Das gibt dem Roboter eine harte Grenze. Jenseits von etwa 35° übersteigt die nötige Horizontalbeschleunigung das, was die Räder liefern können, bevor der Aufbau den Boden berührt — keine Verstärkung hilft dann. Die gestrichelten Linien in der Spur markieren diese Grenze.
Algorithmus
Der Regler ist kaskadiert — zwei PID-Kreise, einer speist den anderen.
Der innere Kreis läuft schnell und hält einen Neigungswinkel. Er vergleicht den Messwinkel mit einem Ziel und kommandiert Motormoment:
error = measured_angle − target_angle
motor = Kp·error + Ki·∫error + Kd·d(measured)/dt
Beachte: Der Fehler ist gemessen minus Ziel, nicht lehrbuchmäßig Ziel minus gemessen. Einen Vorwärtsfall zu fangen heißt, die Räder vorwärts zu treiben — positive Neigung muss also positiven Motorbefehl erzeugen. Dieses Vorzeichen ist der häufigste Grund, warum ein erster Balance-Roboter beim Einschalten sofort auf den Boden knallt.
Der äußere Kreis läuft langsamer und hält eine Position. Er kann die Motoren nicht kommandieren — die sind vergeben — und kommandiert stattdessen ein Neigungsziel für den inneren Kreis:
target_angle = Kp_pos·(desired_position − position) − Kd_pos·velocity
Liegt er hinter seiner Wunschposition, fordert er eine kleine Vorwärtsneigung an; der innere Kreis treibt die Räder, um diese Neigung zu halten, und der Roboter fährt vorwärts. Die Neigung ist bewusst auf wenige Grad geklemmt. Ein äußerer Kreis, der große Winkel fordern dürfte, gäbe dem inneren ein unhaltbares Ziel — beide Kreise verlören zugleich.
Der Integral-Anteil zählt hier mehr als in den meisten Kreisen, denn er schluckt die Differenz zwischen der Vertikalen, die die IMU meint, und der echten Vertikalen. Darum muss das Integral aufhören aufzuintegrieren, solange die Motoren sättigen — sonst läuft es während eines Sturzes hoch, den es nicht verhindern kann, und bekämpft danach die Erholung.
Quellcode
// Inner loop: tilt → motors. Runs every 5 ms off a timer, not in loop().
float angleError = angle - tiltTarget; // measured minus target
angleIntegral = constrain(angleIntegral + angleError * dt, -3, 3);
float command = Kp * angleError
+ Ki * angleIntegral
+ Kd * gyroRate; // rate straight from the gyro
command = constrain(command, -255, 255);
if (fabs(angle) > FALL_ANGLE) command = 0; // past saving; cut the motors
driveMotors(command, command);
// Outer loop: position → tilt target. Runs ten times slower, and may only
// ever ask for a small lean.
if (++slowTick >= 10) {
slowTick = 0;
float positionError = 0 - wheelPosition;
tiltTarget = constrain(KpPos * positionError - KdPos * wheelVelocity,
-0.12, 0.12); // radians, about ±7°
}
Zwei Details übertragen sich direkt aus diesem Simulator. Nimm den D-Anteil aus der Gyrorate statt den Winkel zu differenzieren: Das Gyroskop misst diese Rate direkt und ohne das Rauschen, das Differenzierung verstärkt. Und schalte die Motoren jenseits des Rückholwinkels ab, statt den Regler weiter kämpfen zu lassen — das schont die Getriebe und macht den Fehler offensichtlich statt heftig.
Hardware
Der Sensor ist ein MPU6050 mit Beschleunigungssensor und Gyroskop, denn keiner allein taugt. Der Beschleunigungssensor kennt unten, wird aber von der Eigenbewegung überlagert; das Gyroskop verfolgt Drehung sauber, driftet aber binnen Sekunden. Ein Komplementärfilter fusioniert beides zu einem Winkel, der stabil und schnell ist.
Motoren müssen untersetzt genug für Drehmoment und schnell genug zum Fangen sein — N20-Getriebemotoren um 200 U/min sind üblich, getrieben von einem TB6612FNG, dessen geringer Dropout zählt, wenn die Schleife tausendfach pro Sekunde kleine Korrekturen fordert.
Baue es echt im Balance-Roboter-Projekt oder beginne mit dem Neigungs-Tutorial, wenn die IMU neu für dich ist.
Annahmen und Unterschiede zur Hardware
Das Modell ist ein 2D-invertiertes Pendel mit einer Neigungsachse, starren Gliedern, ohne Schlupf und einer IMU, die wahren Winkel und Rate nur mit der eingestellten Drift und dem Rauschen meldet. Ein echter Balance-Roboter spürt Motormoment, das mit der Batteriespannung schwankt, Encoder-Quantisierung, IMU-Montageoffset und Temperaturdrift — und er kann auch seitlich fallen, ein Freiheitsgrad, den dieses Labor ganz entfernt. Kaskadierte PID-Struktur und Gyro-D-Ableitung übertragen sich direkt, doch Montage-Trim, Filterabstimmung und Fallwinkel-Abschaltung müssen am physischen Chassis neu gefunden werden.
Schaltplan
Zwei Verdrahtungsregeln entscheiden, ob dieser Roboter läuft.
Die Motorbatterie erreicht den VM-Pin des Treibers und nichts sonst. Motorstrom darf nie durch den Arduino fließen, und jede Masse — Board, Treiber, IMU, Batterieminus — muss verbunden sein, sonst haben die Steuersignale keine gemeinsame Referenz, und der Fehler bleibt stumm statt offensichtlich.
Der Encoder wird aus der Logik versorgt, nicht aus der Motorschiene. Den Encoder an die Motorversorgung zu hängen zerstört ihn oder füllt die Zählung mit Schaltrauschen. Lege Encoder-Kanal A zudem auf einen interruptfähigen Pin; ihn aus loop() zu pollen verliert Impulse, und verlorene Impulse heißen: Der äußere Kreis verliert langsam die Roboterposition.
Hardware-Checkliste
Bauteile
- Arduino Nano oder Uno
- MPU6050-Beschleunigungssensor und Gyroskop
- TB6612FNG-Dual-Motortreiber
- Zwei N20-Getriebemotoren mit Encoder
- 2S-Lithium-Akkupack
Den Graphen erkunden
Wo dieser Simulator verwendet wird
Die Projekte, Lernpfade und Tutorials, die auf diesem Labor aufbauen.
Weiterbauen
Ressourcen herunterladen
Nutze diese Referenzen auf der Seite, während du das Projekt durcharbeitest. Herunterladbare Projektpakete kommen erst hinzu, wenn ihr Quellcode und ihre Version veröffentlicht sind.
Häufige Fragen
Häufig gestellte Fragen
Warum braucht ein Balance-Roboter zwei PID-Kreise statt einem?
Weil das, was du regeln willst, und das, was du stellen kannst, verschieden sind. Die Motoren ändern die Raddrehzahl, doch am Leben hält den Roboter der Neigungswinkel — und Neigung lässt sich nur ändern, indem die Räder unter den Aufbau fahren. Der innere Kreis hält daher einen Neigungswinkel über die Motoren, der äußere fordert einen kleinen Neigungswinkel an, um den Roboter dorthin zu bringen. Ein Kreis kann nicht beides: Wer die Motoren direkt aus dem Positionsfehler treibt, beschleunigt unter dem eigenen Schwerpunkt weg und fällt sofort.
Warum fährt mein Roboter langsam weg, obwohl er eben aussieht?
Fast immer Montage-Trim. Sitzt die IMU ein, zwei Grad neben der echten Vertikalen, hält der Kreis treu diesen falschen Winkel — und konstante Neigung heißt konstante Beschleunigung in diese Richtung, bis der Platz ausgeht. Stelle den Trim-Schieber in diesem Labor ein und sieh zu. Die Lösung auf echter Hardware: Offset bei wirklich aufrecht gehaltenem Roboter messen und abziehen, den Rest lässt du den Integralanteil schlucken.
Kann ich ohne Integralanteil balancieren?
Ja, und der Simulator zeigt dir, dass es geht — bis etwas die Messung verzerrt. P und D allein können den Roboter halten, denn D liefert die Dämpfung, die das Aufschwingen stoppt. Was sie nicht können: einen dauerhaften Offset entfernen. Bei jedem Trim-Fehler bleibt der Roboter leicht geneigt stehen und kriecht weg. Das Integral treibt diesen letzten Fehleranteil auf null.
Warum fällt der Roboter, wenn ich die D-Verstärkung auf null setze?
Weil nichts mehr dämpft. Die Proportionalverstärkung reagiert darauf, wie weit der Roboter gefallen ist — doch bis sie korrigiert hat, schwingt der Aufbau schon mit Tempo durch die Vertikale. Ohne einen Anteil, der auf die Winkelgeschwindigkeit reagiert, schwingt jede Schwingung weiter aus als die vorige, bis eine den Rückholwinkel überschreitet. Setze D in diesem Labor auf null und zähle die Schwingungen.
Warum fahren die Räder vorwärts, wenn der Roboter nach vorn kippt?
Das ist der ganze Trick, und das Vorzeichen drehen die meisten beim ersten Versuch um. Um einen Besen auf der Handfläche zu balancieren, bewegst du die Hand unter das fallende Ende, nicht davon weg. Der Roboter macht dasselbe: Neigung nach vorn heißt vorwärts fahren, um die Räder zurück unter den Schwerpunkt zu bringen. Drehst du das Vorzeichen um, schiebt der Regler den Roboter aktiv zu Boden — das sieht wie ein sofortiger, heftiger Sturz aus.
Was unterscheidet das vom PID-Regler-Simulator?
Das PID-Labor regelt eine stabile Strecke: Lässt du sie allein, bleibt sie einfach stehen, der Kreis verbessert nur, wie schnell und sauber er ein Ziel erreicht. Diese Strecke ist instabil — lässt du sie allein, fällt sie um, jedes Mal. Das macht aus Abstimmung eine Notwendigkeit statt Optimierung, und darum braucht Balancieren den zweiten, äußeren Kreis, den das Einkreis-Labor nie einführen muss.
Weiterführende Literatur
Quellen
Maßgebliche Quellen, um tiefer einzusteigen als das begrenzte Lernmodell dieses Simulators.