Zum Inhalt springen
BetaEN
Lektion 4 von 8Robotik mit LEGO SPIKE

Robotik mit LEGO SPIKE · Lektion 4 · 30 Minuten

Linien folgen mit dem P-Regler

Das lernst du

  • Verstehen, warum Ein/Aus-Steuerung ruckelt
  • Einen P-Regler aus Fehler und Verstärkung bauen
  • KP und Geschwindigkeit sinnvoll einstellen

Der Code in dieser Lektion stammt aus dem Buch „Python für Roboter“, Kapitel 2.8, und läuft hier unverändert im Simulator. Zum Buch bei Amazon ↗

Das Problem mit Ein und Aus

Ein Linienfolger soll an einer schwarzen Linie entlangfahren. Die einfachste Idee: „Sehe ich Schwarz, lenke ich nach links, sonst nach rechts.“ Das funktioniert – aber der Roboter zappelt ständig hin und her.

Besser ist ein Regler: Er lenkt stark, wenn der Roboter weit neben der Linie ist, und wenig, wenn er fast richtig liegt.

Der P-Regler

Der Farbsensor sitzt genau am Rand der Linie. Dort misst er eine mittlere Helligkeit, den Zielwert. Die Abweichung davon heißt Fehler. Der P-Regler rechnet ganz einfach: lenkung = KP * fehler.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait

hub = PrimeHub()

linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
farbsensor = ColorSensor(Port.C)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

ZIEL_HELLIGKEIT = 50          # Sensorwert genau am Linienrand (0-100)
KP = 1.2                      # je groesser, desto staerker die Korrektur
GRUNDGESCHWINDIGKEIT = 120    # mm/s - lieber langsam starten!

while True:
    helligkeit = farbsensor.reflection()
    fehler = helligkeit - ZIEL_HELLIGKEIT     # Abweichung vom Linienrand
    lenkung = KP * fehler                     # nur der P-Anteil
    antrieb.drive(GRUNDGESCHWINDIGKEIT, lenkung)
    wait(10)

Drück auf Ausführen und schau zu, wie sanft der Roboter der Linie folgt. Dann experimentiere:

ÄnderungWas passiert?
KP = 0.3Der Roboter reagiert zu schwach und verliert in der Kurve die Linie.
KP = 6Er korrigiert sehr heftig. Am echten Roboter fängt er dabei oft an zu schlingern.
GRUNDGESCHWINDIGKEIT = 250Schneller – mit KP = 1.2 klappt das gerade noch. Bei 300 nicht mehr (siehe Aufgabe).

Merke: antrieb.drive(geschwindigkeit, drehrate) fährt dauerhaft, bis ein neuer Befehl kommt. Deshalb passt es perfekt in eine Regelschleife.

Messwerte sehen: Schreib im Beispiel oben unter die Zeile mit lenkung (gleich eingerückt) print("fehler:", fehler, "lenkung:", lenkung). Dann zeichnet der Simulator die Werte während der Fahrt als Kurven – so siehst du, wie stark der Roboter bei KP = 6 hin- und herpendelt. Mit 💾 CSV speicherst du die Messwerte für eine Tabellenkalkulation (die Datei bleibt auf deinem Gerät).

Im Buch geht es danach mit dem PID-Regler weiter, der zusätzlich aus der Vergangenheit (I) und der Änderung (D) lernt – damit fährt der Roboter auch schnell und sauber durch enge Kurven.

Deine Aufgabe

Jetzt bist du dran

Der Linienfolger soll schneller werden: Stelle GRUNDGESCHWINDIGKEIT auf 300. Dann reicht das bisherige KP nicht mehr – finde einen Wert, mit dem der Roboter trotzdem auf der Linie bleibt. Die Prüfung lässt ihn eine Minute lang fahren.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait

hub = PrimeHub()

linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
farbsensor = ColorSensor(Port.C)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

ZIEL_HELLIGKEIT = 50          # Sensorwert genau am Linienrand (0-100)
KP = 1.2                      # je groesser, desto staerker die Korrektur
GRUNDGESCHWINDIGKEIT = 120    # mm/s - lieber langsam starten!

while True:
    helligkeit = farbsensor.reflection()
    fehler = helligkeit - ZIEL_HELLIGKEIT     # Abweichung vom Linienrand
    lenkung = KP * fehler                     # nur der P-Anteil
    antrieb.drive(GRUNDGESCHWINDIGKEIT, lenkung)
    wait(10)

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait

hub = PrimeHub()

linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
farbsensor = ColorSensor(Port.C)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

ZIEL_HELLIGKEIT = 50          # Sensorwert genau am Linienrand (0-100)
KP = 3                        # je groesser, desto staerker die Korrektur
GRUNDGESCHWINDIGKEIT = 300    # mm/s - lieber langsam starten!

while True:
    helligkeit = farbsensor.reflection()
    fehler = helligkeit - ZIEL_HELLIGKEIT     # Abweichung vom Linienrand
    lenkung = KP * fehler                     # nur der P-Anteil
    antrieb.drive(GRUNDGESCHWINDIGKEIT, lenkung)
    wait(10)