Lektion 2 von 8Robotik mit LEGO SPIKE
Robotik mit LEGO SPIKE · Lektion 2 · 30 Minuten
Fahren mit der DriveBase
Das lernst du
- Zwei Motoren zu einer DriveBase verbinden
- Mit
straight(),turn()undarc()genau fahren - Bewegungen mit wait=
Falsenebenbei überwachen
Der Code in dieser Lektion stammt aus dem Buch „Python für Roboter“, Kapitel 2.4 und 2.5, und läuft hier unverändert im Simulator. Zum Buch bei Amazon ↗
Zwei Motoren als Team
Ein fahrender Roboter hat meist zwei Antriebsmotoren, einen links und einen rechts. Damit du nicht jeden Motor einzeln steuern musst, gibt es die DriveBase: Du sagst ihr nur „fahr 20 cm geradeaus“ oder „dreh dich um 90 Grad“, und sie rechnet aus, wie sich jedes Rad drehen muss.
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
hub = PrimeHub()
# Ein Motor pro Rad, jeweils am eigenen Port
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
# DriveBase braucht den Rad-Durchmesser und den Radabstand in Millimetern
# (beides an deinem Roboter nachmessen und hier eintragen!)
antrieb = DriveBase(linker_motor, rechter_motor,
wheel_diameter=56, axle_track=114)
# Geradeaus fahren: 200 Millimeter (20 cm)
antrieb.straight(200)
# Auf der Stelle drehen: 90 Grad nach rechts
antrieb.turn(90)
# Rueckwaerts fahren
antrieb.straight(-100)Die DriveBase braucht zwei Maße in Millimetern: den Raddurchmesser (wheel_diameter) und den Radabstand (axle_track). Am echten Roboter misst du sie nach – im Simulator passen 56 und 114 genau.
Merke: Die beiden Motoren sind spiegelverkehrt eingebaut. Deshalb bekommt der linke Motor
Direction.COUNTERCLOCKWISEund der rechteDirection.CLOCKWISE.
Schleifen machen Figuren
Mit einer for-Schleife wird aus vier Fahrbefehlen ein Quadrat. Mit settings() stellst du Tempo und Drehgeschwindigkeit ein:
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor,
wheel_diameter=56, axle_track=114)
# Geschwindigkeit und Beschleunigung individuell einstellen:
# (Geschwindigkeit mm/s, Drehrate Grad/s, Beschleunigung, Drehbeschleunigung)
antrieb.settings(straight_speed=150, straight_acceleration=200,
turn_rate=100, turn_acceleration=200)
# Ein kleines Quadrat abfahren
for seite in range(4):
antrieb.straight(150)
antrieb.turn(90)Probier im Simulator auch das Tempo 2× oder 4× aus, wenn dir der Roboter zu langsam ist.
Kurven fahren
arc() fährt einen Bogen: zuerst der Radius in Millimetern, dann der Winkel.
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor,
wheel_diameter=56, axle_track=114)
# arc(radius_mm, winkel_grad): faehrt einen Bogen mit 200mm Radius, 90 Grad.
# Positiver Radius = Bogen nach rechts, positiver Winkel = vorwaerts.
antrieb.arc(200, 90)Nebenbei etwas tun: wait=False
Normalerweise wartet dein Programm, bis eine Bewegung fertig ist. Mit wait=False startet die Bewegung nur – und dein Programm läuft sofort weiter. So kannst du während der Fahrt etwas messen:
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
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)
antrieb = DriveBase(linker_motor, rechter_motor,
wheel_diameter=56, axle_track=114)
# wait=False: Der Befehl startet die Bewegung, blockiert aber NICHT.
antrieb.straight(500, wait=False)
# Waehrend der Roboter faehrt, koennen wir parallel etwas ueberwachen
while not antrieb.done():
strecke_bisher = antrieb.distance()
print(f"Bereits gefahren: {strecke_bisher} mm")
wait(100)
print("Bewegung abgeschlossen!")antrieb.done() ist True, sobald die Fahrt beendet ist, und antrieb.distance() liefert die bisher gefahrene Strecke.
Deine Aufgabe
Jetzt bist du dran
Übung 2.4 aus dem Buch: Fahre mit einer for-Schleife ein gleichseitiges Dreieck mit 200 mm Seitenlänge ab. Tipp: An jeder Ecke muss sich der Roboter um 120 Grad drehen (360 Grad geteilt durch 3 Ecken). Am Ende soll er wieder an seinem Startpunkt stehen.
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
hub = PrimeHub()
# Ein Motor pro Rad, jeweils am eigenen Port
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
# DriveBase braucht den Rad-Durchmesser und den Radabstand in Millimetern
# (beides an deinem Roboter nachmessen und hier eintragen!)
antrieb = DriveBase(linker_motor, rechter_motor,
wheel_diameter=56, axle_track=114)
# Geradeaus fahren: 200 Millimeter (20 cm)
antrieb.straight(200)
# Auf der Stelle drehen: 90 Grad nach rechts
antrieb.turn(90)
# Rueckwaerts fahren
antrieb.straight(-100)- Denkanstoß
Drei Ecken mit je 120 Grad ergeben zusammen 360 Grad.
- Welcher Befehl hilft?
Fahre dreimal dieselbe Strecke mit
antrieb.straight(200)und drehe jedes Mal um 120 Grad.Jede Seite ist 200 mm lang – also dreimal
antrieb.straight(200), ohne Rückwärtsfahrt.Schreib
straight()undturn()nur einmal in einefor-Schleife mitrange(3). - Lückencode – ergänze die ___
from pybricks.hubs import PrimeHub from pybricks.pupdevices import Motor from pybricks.parameters import Port, Direction from pybricks.robotics import DriveBase hub = PrimeHub() linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE) rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE) antrieb = ___ for seite in ___: antrieb.straight(200) antrieb.turn(___)
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
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor, wheel_diameter=56, axle_track=114)
for seite in range(3):
antrieb.straight(200)
antrieb.turn(120)