Interaktiver SimulatorMittelstufe

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
Technisches Schema: Balance-Roboter-Simulator: Invertiertes Pendel-PIDθTILT → PID → DRIVE UNDER IT

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.

Browser native
A self-balancing robot lab. A two-wheeled robot stands on a floor with its mass above the axle. The control loop reads the tilt angle and drives the wheels to stay under the body. A rolling chart above the robot plots tilt over the last few seconds against the fall threshold. Use the controls below to shove it, drag it off balance, change the PID gains, or switch the loop off and watch it fall.

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
Simulation

Ready. Press Start, then drag the robot over and let go.

Inner loop — tilt to motors
Outer loop & hardware
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.

Diagramm mit zwei Panels. Links lehnt ein Zweirad-Roboter um den Winkel Theta nach vorn, ein Pfeil zeigt, wie die Schwerkraft ihn weiter kippt. Rechts fährt derselbe Roboter mit den Rädern in Neigungsrichtung vorwärts, ein gebogener Pfeil zeigt den Aufbau zurück in die Senkrechte schwingen.
Fallen ist die Eingangsgröße, nicht der Fehler: θ liest der Regler, und die Räder unter die Neigung zu fahren ist die einzige Art, sie zu tilgen. SVG herunterladen

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.

Blockdiagramm. Ein äußerer PID-Block Position-zu-Neigung speist ein Neigungsziel in einen inneren PID-Block Neigung-zu-Motoren, der PWM an den Roboter-Block sendet. Gemessene Neigung kehrt mit 200 Hertz zum inneren Kreis zurück, Radposition mit 20 Hertz zum äußeren Kreis.
Zwei Kreise, nicht einer. Der äußere entscheidet, wie weit zu neigen ist; der innere setzt diese Neigung um. Erst den inneren abzustimmen ist die einzige Reihenfolge, die funktioniert. SVG herunterladen

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

Verdrahtungs-Blockdiagramm. Ein Arduino Nano verbindet sich per I2C auf SDA A4 und SCL A5 mit einer MPU6050-IMU und rechts mit einem dualen TB6612FNG-Treiber per PWM- und Richtungssignalen. Der Treiber verbindet einen N20-Motor mit Encoder. Encoder-Kanal A kehrt an Interrupt-Pin D2 des Arduino zurück, eine nur für Motoren beschriftete Batterie speist den VM-Pin des Treibers.
Ein I²C-Bus hoch zur IMU, vier Signale quer zum Treiber und eine Motorversorgung abseits der Logikschiene. SVG herunterladen

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.