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:
| Änderung | Was passiert? |
|---|---|
KP = 0.3 | Der Roboter reagiert zu schwach und verliert in der Kurve die Linie. |
KP = 6 | Er korrigiert sehr heftig. Am echten Roboter fängt er dabei oft an zu schlingern. |
GRUNDGESCHWINDIGKEIT = 250 | Schneller – 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 beiKP = 6hin- 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)- Denkanstoß
Ändere die Zeile GRUNDGESCHWINDIGKEIT
=120 in GRUNDGESCHWINDIGKEIT=300. - Welcher Befehl hilft?
Der Roboter ist steckengeblieben oder zu langsam. Ist die Geschwindigkeit wirklich 300?
Der Roboter hat die Linie verloren. Probiere ein größeres KP, z. B. 2 oder 3 – aber nicht zu groß, sonst schlingert er.
- Lückencode – ergänze die ___
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 = ___ GRUNDGESCHWINDIGKEIT = ___ 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🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
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)