Zum Inhalt springen
BetaEN
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_diameter und axle_track richtig 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

  1. Roboter an eine Markierung stellen, straight(500) fahren, echte Strecke messen.
  2. wheel_diameter = alter Wert × gemessen ÷ soll
  3. turn(360) fahren, echte Drehung mit dem Gyro messen.
  4. axle_track = alter Wert × soll ÷ gemessen
  5. 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")

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, 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")