Lektion 7 von 8Robotik mit LEGO SPIKE
Robotik mit LEGO SPIKE · Lektion 7 · 30 Minuten
Kalibrieren
Das lernst du
- Verstehen, warum echte Roboter nie ganz genau fahren
- Strecke mit dem Abstandssensor und Drehung mit dem Gyro nachmessen
wheel_diameterundaxle_trackrichtig nachrechnen
Der Code in dieser Lektion stammt aus dem Buch „Python für Roboter“, Kapitel 2.5, und läuft hier unverändert im Simulator. Zum Buch bei Amazon ↗
Kein Roboter ist perfekt
Im Programm steht wheel_diameter=56 – aber ist dein Rad wirklich genau 56 mm groß? Reifen werden zusammengedrückt, nutzen sich ab, und jedes Modell ist ein bisschen anders gebaut. Schon 2 mm Unterschied machen auf einem Meter mehrere Zentimeter aus. Beim Wettbewerb entscheidet das über Sieg oder Niederlage.
Deshalb kalibrieren gute Teams ihren Roboter: Sie messen, wie er sich wirklich bewegt, und passen die Zahlen im Programm an.
Im Simulator: Auf dem Spielfeld Werkstatt verhält sich der Roboter wie ein echter – seine Räder sind anders, als das Programm denkt. Auf allen anderen Feldern fährt er perfekt.
Die Strecke messen
Auf dem echten Tisch nimmst du ein Lineal. Hier – und auch in echt, wenn vor dem Roboter eine Wand ist – geht es eleganter mit dem Abstandssensor: Abstand vorher minus Abstand nachher = gefahrene Strecke.
from pybricks.pupdevices import Motor, UltrasonicSensor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
abstandssensor = UltrasonicSensor(Port.C)
antrieb = DriveBase(linker_motor, rechter_motor, wheel_diameter=56, axle_track=114)
vorher = abstandssensor.distance()
antrieb.straight(500)
nachher = abstandssensor.distance()
print("Soll: 500 mm")
print("Ist:", vorher - nachher, "mm")
print("Der Roboter selbst glaubt:", antrieb.distance(), "mm")Spannend: Der Roboter selbst glaubt, er sei 500 mm gefahren – er zählt ja nur, wie oft sich seine Räder gedreht haben. Erst der Sensor zeigt die Wahrheit.
Den Raddurchmesser ausrechnen
Fährt der Roboter zu kurz, sind die Räder in Wahrheit kleiner als im Programm. Die Formel:
alter_durchmesser = 56
soll = 500
gemessen = 464
neuer_durchmesser = alter_durchmesser * gemessen / soll
print("Neuer wheel_diameter:", round(neuer_durchmesser, 1))Die Drehung messen
Für Drehungen hilft der Gyrosensor – er misst die echte Drehung, egal wie die Räder sind:
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)
hub.imu.reset_heading(0)
for _ in range(4):
antrieb.turn(90)
print("Nach 4 × 90 Grad:", round(hub.imu.heading()), "Grad")Viermal 90 Grad sollten genau eine Runde ergeben – aber der Roboter schafft es nicht.
Den Radabstand ausrechnen – Achtung, andersherum!
Bei axle_track ist die Rechnung umgekehrt. Denk an den Roboter: Glaubt er, seine Räder stünden weiter auseinander, als sie wirklich sind, dann lässt er sie für eine Drehung länger laufen – und dreht sich zu weit. Ein kleinerer Wert bedeutet also eine schwächere Drehung.
alter_abstand = 114
soll = 360
gemessen = 342
neuer_abstand = alter_abstand * soll / gemessen
print("Neuer axle_track:", round(neuer_abstand, 1))Reihenfolge: Stell zuerst den Raddurchmesser richtig ein und miss die Drehung danach neu. Der Raddurchmesser beeinflusst nämlich auch die Drehung.
Kalibrier-Kochrezept
- Roboter an eine Markierung stellen,
straight(500)fahren, echte Strecke messen. wheel_diameter = alter Wert × gemessen ÷ sollturn(360)fahren, echte Drehung mit dem Gyro messen.axle_track = alter Wert × soll ÷ gemessen- Zur Kontrolle alles noch einmal fahren. Mehrere Runden (z. B.
turn(1080)) machen kleine Fehler besser sichtbar.
Tipp: Mit
antrieb.use_gyro(True)korrigiert der Roboter Drehungen sogar selbst mit dem Gyrosensor. Die Strecke musst du trotzdem kalibrieren – der Gyro misst nur Drehungen.
Deine Aufgabe
Jetzt bist du dran
Dieser Roboter in der Werkstatt ist wie ein echter: Seine Räder sind nicht genau so, wie im Programm steht. Miss nach, wie weit er bei antrieb.straight(500) wirklich fährt und wie weit er sich bei antrieb.turn(360) wirklich dreht. Rechne dann wheel_diameter und axle_track neu aus und trag sie ein, bis er genau 500 mm fährt (von Klebestreifen zu Klebestreifen) und sich genau einmal im Kreis dreht. Tipp: erst das Rad, dann neu messen, dann die Achse.
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, UltrasonicSensor
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)
abstandssensor = UltrasonicSensor(Port.C)
# Diese beiden Werte musst du kalibrieren:
antrieb = DriveBase(linker_motor, rechter_motor, wheel_diameter=56, axle_track=114)
# Messung 1: Wie weit fährt er wirklich?
vorher = abstandssensor.distance()
antrieb.straight(500)
gefahren = vorher - abstandssensor.distance()
print("Gefahren:", gefahren, "mm")
# Messung 2: Wie weit dreht er sich wirklich?
hub.imu.reset_heading(0)
antrieb.turn(360)
print("Gedreht:", round(hub.imu.heading()), "Grad")- Denkanstoß
Neuer Raddurchmesser
=alter Wert × gemessene Strecke ÷ 500. Beispiel: Fährt er nur 464 mm, dann 56 × 464 ÷ 500 ≈ 52. - Welcher Befehl hilft?
Erst das Rad richtig einstellen, dann neu messen. Neue Achse
=alter Wert × 360 ÷ gemessene Drehung (andersherum als beim Rad!). - Lückencode – ergänze die ___
from pybricks.hubs import PrimeHub from pybricks.pupdevices import Motor, UltrasonicSensor 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) abstandssensor = UltrasonicSensor(Port.C) # Diese beiden Werte musst du kalibrieren: antrieb = ___ # Messung 1: Wie weit fährt er wirklich? vorher = abstandssensor.distance() antrieb.straight(500) gefahren = vorher - abstandssensor.distance() print("Gefahren:", gefahren, "mm") # Messung 2: Wie weit dreht er sich wirklich? hub.imu.reset_heading(0) antrieb.turn(360) print("Gedreht:", round(hub.imu.heading()), "Grad")
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, UltrasonicSensor
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)
abstandssensor = UltrasonicSensor(Port.C)
# Diese beiden Werte musst du kalibrieren:
antrieb = DriveBase(linker_motor, rechter_motor, wheel_diameter=52, axle_track=120)
# Messung 1: Wie weit fährt er wirklich?
vorher = abstandssensor.distance()
antrieb.straight(500)
gefahren = vorher - abstandssensor.distance()
print("Gefahren:", gefahren, "mm")
# Messung 2: Wie weit dreht er sich wirklich?
hub.imu.reset_heading(0)
antrieb.turn(360)
print("Gedreht:", round(hub.imu.heading()), "Grad")