Fahren und Drehen

Geradeaus Fahren

Um geradeaus zu Fahren, wird die Funktion gyro_drive() verwendet.

Die einfachste Verwendung sieht so aus:

#          Zielgradzahl
#          .   Geschwindigkeit in %
#          .   .    Ziel (Endingcondition)
#          .   .    .
gyro_drive(0, 75, cm(5))

Hier fährt der Roboter also 5 cm geradeaus mit 75% Geschwindigkeit.

Geschwindigkeit

Um Ungleichheiten der Motoren und Probleme mit schwächerer Batterieladung zu umgehen, sollte die Geschwindigkeit nicht zu niedrig gewählt werden. Unter 20-25 zu gehen, sollte vermieden werden.

Wichtig ist auch, die Geschwindigkeit nicht zu hoch einzustellen: Wenn der Roboter z.B. mit 100%iger Geschwindigkeit fährt, können die Korrekturwerte nur noch auf einem Rad effektiv angewandt werden; die Korrektur wird praktisch halbiert. Siehe PID-Korrektur für weitere Details. Dieser Effekt tritt, wenn auch nicht so stark, bereits bei Geschwindigkeiten von 90+ auf. Generell kannd er Roboter bei Geschwindigkeiten über 80-85 nicht mehr so genau fahren (Motoren unterschiedlich, weitere Faktoren), allein deshalb sollten zu hohe Geschwindigkeiten gemieden werden.

Auf die sog. Endingcondition gehen wir weiter unten genauer ein. Wichtig sind hier erstmal die anderen Werte.

Be- und Entschleunigung

Die Be- und Entschleunigung kann über die Parameter accelerate und deccelerate eingestellt werden. Standartmäßig ist sie ausgeschaltet.

Wenn ein Wert angegeben wird, wird er als Prozentsatz der angegeben Endingcondition verstanden.

Im folgenden Codeblock wird also für 5 cm be- und für 10 cm entschleunigt:

gyro_drive(0, 75, cm(20), accelerate=25, deccelerate=50)

Es ist wichtig, die Be- und Entschleunigungsstrecken nicht zu hoch einzustellen, da der Roboter bei schwächerer Batterieladung sonst verzieht, oder sogar nur mit einem Rad losfährt.

Die Strecken sollten, auch aus diesem Grund, jeweils nicht mehr als 7-10 cm betragen, je nach Geschwindigkeit.

„Bremsen“

Mit brake=False hat man die Möglichkeit, zu deaktivieren, das der Roboter nach der Bewegung anhält. Das kann sinnvoll sein, wenn man mehere Bewegungen direkt hintereinander ausführen will, ohne dass der Roboter kurz stehenbleibt.

Beispiel:

gyro_drive(0, 75, cm(10), brake=False)

PID-Korrektur

Der Roboter korrieiert mithilfe eines PID-Controllers zu der angegebenen Gradzahl hin. Das funktioniert, indem er regelmäßig die aktuelle Drehung des Roboters ausließt und entsprechend die Geschwindigkeit der Räder anpasst, sodass er sich wieder „von selbst“ in die richtige Richtung dreht.

Der Roboter berechnet die Differenz zwischen der aktuellen und der gewünschten Gradzahl. Dieser Wert heißt Fehler.

\[\Delta Fehler = \alpha_{aktuell} - \alpha_{Ziel}\]

Dann kommen die PID-Werte ins Spiel. P steht für Proportional, I für Integral und D für Ableitung (engl. derivative).

Der proportionale Korrekturwert \(p\) gibt an, wie stark auf basis des aktuellen Fehlers korrigiert werden soll.

\[Korrektur_P = \Delta Fehler * p\]

Der integrale Korrekturwert \(i\) bezieht sich auf die Summe aller bisherigen Fehler. Er hilft, wenn

\[Korrektur_I = \int_{t_{start}}^{t_{jetzt}} Fehler(t) dx * i\]

(oder in einfach, hatte gerade Spaß)

\[Korrektur_I = Fehlersumme * i\]

Der letzte Korrekturwert \(p\) wird auf die Veränderung angewandt:

\[Korrektur_D = (Fehler_{jetzt} - Fehler_{gerade \space eben}) * d\]

Das soll einer zu starken Korrektur vorauswirken, daher wird hier auch ein negativer Korrekturwert \(d\) verwendet.

Daraus wird dann die Summe berechnet:

\[Korrektur = Korrektur_P + Korrektur_I + Korrektur_D\]

Dann wird diese auf beide Radgeschwindigkeiten angewandt:

\[v_{links}=v_{links} + \frac{Korrektur}{2}\]
\[v_{rechts}=v_{rechts} - \frac{Korrektur}{2}\]

Dadurch dreht das eine Rad dann langsamer und das andere schneller, wodurch sich der Roboter wieder zuer Wunschrichtung ausrichtet.

Für weitere Details zum wählen der richtigen Korrekturwerte, siehe auch Fahrprobleme

Endingconditions

Die Endingconditions sind die Bedingungen, unter denen der Roboter anhalten soll. Sie sind in der Regel die Distanz, die der Roboter fahren soll, oder die Zeit, die er fahren soll.

Die folgenden Endingconditions sind verfügbar:

  • cm(x) - Der Roboter fährt x cm.

  • sec(x) - Der Roboter fährt x Sekunden.

  • deg(x) - Der Roboter dreht sich x, bis er die Gradzahl im Verhältnis zum Startpunkt erreicht hat.

Diese Endingconditions können auch kombiniert werden, z.B. mit:

  • AND(a, b) - Der Roboter fährt, bis die Bedingung a und b erfüllt sind.

  • OR(a, b) - Der Roboter fährt, bis die Bedingung a oder b erfüllt ist.

  • NOT(a) - Der Roboter fährt, bis die Bedingung a nicht mehr erfüllt ist.

  • THEN(a, b) - Der Roboter fährt, bis die Bedingung a erfüllt ist und dann die Bedingung b erfüllt ist.

Es gibt weiterhin noch die folgenden Endingconditions:

  • impact(a) - Der Roboter fährt, bis die Bedingung a erfüllt ist. Wenn er währenddessen auf eine Kollision erkennt, wird die Bewegung vorzeitig abgebrochen.

  • pickup(a) - Der Roboter fährt, bis die Bedingung a erfüllt ist. Wenn er währenddessenerkennt, dass er hochgehoben wird, wird die Bewegung vorzeitig abgebrochen.

Drehen

Zum Drehen wird die Funktion gyro_turn() verwendet.

Die einfachste Verwendung sieht so aus:

#          Zielgradzahl
#          .   Geschwindigkeit in %
#          .   .   Ziel (Endingcondition)
#          .   .   .
gyro_turn(90, 75, Pivot.LEFT_WHEEL)

Hierbei dreht der Roboter um 90° mit der Geschwindigkeit 75. Dabei dreht er sich um das linke Rad. Das linke Rad bleibt also stehen, während das rechte Rad sich bewegt, bis die gewünschte Gradzahl erreicht ist.

Geschwindigkeit

Die Geschwindigkeit gibt hier an, wie schnell der Roboter sich drehen soll. Die Geschwindigkeit wird hier nicht in Prozent angegeben, sondern in \(\frac{100 * \Delta_{yaw}}{s * E_{yaw}}\).