Fortbewegung

Linien-/Kantenfolger

Der Roboter soll sich auf der Linie beziehungsweise Kante eines Pfades bewegen.
Ein solcher Linien-/Kantenfolger, im Englischen oft beides als line follower bezeichnet, wird üblicherweise mithilfe eines PID-Reglers (PID controller) implementiert.

Ein Regler im Allgemeinen wird verwendet um gezielte Steuerung physikalische Prozesse in Abhängigkeit der aktuellen und vergangenen Zustände zu realisieren. In dem Beispiel des Linienfolgers wird der Zustand des Systems durch die Helligkeit am Farbsensor bestimmt. Die Regelabweichung berechnet sich nun aus der Differenz des Zustandes (Istwert) zu einem Zielwert (Sollwert). Um die Stellgröße (also die Gegensteuerung der Motoren) zu berechnen, kommt nun ein Regler zum Einsatz.
Im Falle des PID-Reglers wird die Stellgröße über die Summe dreier Stellglieder errechnet:

  • P (proportional) : Der Summand ist proportional zur aktuellen Regelabweichung

  • I (integral) : Der Summand ist proportional zum Integral aller vergangenen Regelabweichungen

  • D (differential) : Der Summand ist proportional zur Differenz zur letzten Regelabweichung

Für weitere Informationen bzw. Beispiele siehe:
"PID Controller" YouTube search oder PID Controller for LEGO MINDSTROMS

Das Integralglied ist mit Vorsicht zu genießen, da es bei Verlust der Linie über längere Zeit dazu neigt zu eskalieren!
Für einfaches line following reicht meist ein PD-Regler.

line follower
Figure 1. Kantenfolger / line follower

Richtungsbestimmung

An jeder Kreuzung muss der Roboter das Verfolgen der Linie unterbrechen und einen Scan der abgehenden Pfade durchführen.

Geschwindigkeit

Der Roboter muss nicht innerhalb einer bestimmten Zeit eine gewisse Strecke zurücklegen oder einen Planeten vollständig erkunden. Allerdings gelten in der Prüfung Grenzen von 7 beziehungsweise 15 Minuten, bei deren Überschreitung nicht mehr die bestmögliche Note erreicht werden kann. Genauere Details zum Prüfungsablauf und der Bewertung finden sich im Kapitel Prüfung.

Es gibt im Spring RoboLab kein “strenges” Zeitlimit.

Odometrie

Unter Odometrie (odometry) versteht man die Bestimmung der Position und Orientierung unter Zuhilfenahme des Antriebes. Man nutzt also das Wissen über den Radabstand, Radumfänge und Motorumdrehungen um zu berechnen, um wie viel Grad sich der Roboter seit der letzten Bewegungsänderung gedreht hat und welche Strecke er dabei gefahren ist. Ihr könnt hier gern euer mathematisches Wissen anwenden und euch ein eigenes Modell erarbeiten. Ansonsten stehen euch hier ein paar Denkansätze bereit.

Grundkonzept

Während der PID-Controller die Steuerung der Motoren übernimmt, bewegt sich der Roboter in kurzen Intervallen auf Kreisbögen. Wenn man die Winkel und Strecken der einzelnen Intervalle korrekt aufsummiert, kann man seine Position ziemlich präzise bestimmen. Da die Berechnung während des Fahrens aber unnötig Leistung verbrauchen würde, ist es sinnvoller, während des Fahrens die Motorpositionen für jedes Intervall zu speichern und diese Liste auszuwerten, wenn der Roboter einen Punkt erreicht hat.

Mathematisches Modell

maths

Die Länge $s$ und der Winkel $\alpha$ des Kreisbogens lassen sich aus den Strecken $d_{l}$ und $d_{r}$, die die Räder seit der letzten Richtungsänderung zurückgelegt haben, und dem Radabstand $a$ berechnen.

Über den Strahlensatz lässt sich folgende Formel aufstellen:
$\large{\frac{r_l}{d_l} = \frac{a}{d_r - d_l}}$

Für die Berechnung des Winkels im Bogenmaß ergibt sich die Formel:
$\large{\alpha = \frac{d_r}{a+r_l}}$

Setzt man die beiden Formeln zusammen, erhält man:
$\large{\alpha = \frac{d_r-d_l}{a} = 2 \cdot \beta}$

Um jetzt die Strecke $s$ zu berechnen, nimmt man die Formel:
$\large{s = 2 \cdot r_x \cdot \sin \beta = \ldots = \frac{d_r+d_l}{\alpha} \cdot \sin \beta}$

Hat der Roboter die Blickrichtung $\gamma$, so kann man nun die Streckendifferenzen $\varDelta x$ und $\varDelta y$ sowie die neue Blickrichtung berechnen:
$\large{\varDelta x = -\sin (\gamma_{alt} + \beta) \cdot {s}}$
$\large{\varDelta y = \cos (\gamma_{alt} + \beta) \cdot {s}}$
$\large{\gamma_{neu} = \gamma_{alt} + \alpha}$

Summiert man das für alle Intervalle einer Strecke auf, kann man die Koordinaten runden und erhält die Koordinaten des Punktes.

Hinweise

  • Wenn man beachtet, dass die Punkte auf der Karte im Raster immer abwechselnd rot und blau sind, kann man die Koordinaten genauer runden.

  • Da alle Formeln mit Winkeln im Bogenmaß arbeiten, empfiehlt es sich, Winkel im gesamten Programm im Bogenmaß zu speichern und sie nur zur Ausgabe ins Gradmaß umzurechnen.

  • Die Formeln funktionieren auch für Rechtskurven. Es muss nichts umgestellt, werden. Der Winkel $\alpha$ wird automatisch negativ.

  • Für die Bestimmung des Winkels $\alpha$ kann man auch versuchen, den Gyrosensor zu verwenden. Allerdings ist dieser Sensor nicht besonders präzise, was zu größeren Abweichungen führen kann als die Berechnung über die Motorpositionen.

Kalibrierung

Damit die Odometrie reibungslos funktioniert, müssen zwei Werte kalibriert werden. Zum einen braucht man die distance_per_tick, eine Konstante, mit der man Motorpositionen in zurückgelegte Entfernung umrechnen kann, zum anderen braucht man den Radabstand $a$. Es erwies sich in der Vergangenheit als sinnvoller, die distance_per_tick zuerst zu messen, da sich der Wert nie verändern sollte, und danach den Radabstand zu kalibrieren. Sollten die Werte einen leichten Fehler enthalten, muss im Normalfall der Radabstand neu kalibriert werden.