Geradeaus fahren mit einem P-Regler
Mit den Rad-Encodern kann der Roboter nicht nur messen, wie weit sich jedes einzelne Rad gedreht hat, sondern es ist auch möglich den Roboter damit geradeaus fahren zu lassen. Hierfür reicht es aus, dass sich beide Räder immer gleich schnell drehen. Ein einfacher Ansatz wäre dafür ein P-Regler, welcher versucht die Differenz zwischen den Encoder-Impulsen auf null zu reduzieren.
error = impulseEncoderLinks - impulseEncoderRechts // Regelabweichung
Allerdings ist es sehr wahrscheinlich, dass der Roboter, obwohl sich beide Räder gleich schnell drehen, nicht ganz gerade fährt. Ursache hierfür sind systematische und nicht-systematische Fehler.
Systematische Odometry-Fehler
Systematische Fehler werden durch physikalische Abweichung des realen Roboters von dem theoretischem Bewegungs-Modell verursacht. Ein Beispiel sind unterschiedliche Durchmesser der beiden Räder oder auch Räder, welche nicht genau parallel zueinander ausgerichtet sind. Systematische Fehler sind über einen längeren Zeitraum konstant und können daher bis zu einem gewissen Grad kompensiert werden.
Auf ebenen Untergründen dominieren die systematischen Odometry-Fehler.
Nicht-Systematische Odometry-Fehler
Im Gegensatz dazu ist das Auftreten von nicht-systematisch Fehler nicht exakt vorherzubestimmen. Nicht-systematische Fehler werden zum Beispiel durch Bodenunebenheiten oder auch durch unpräzise gefertigte Achsen der Räder, welche ein zu großes Spiel aufweisen, verursacht.
Kalibrierung des Geradeauslaufs
Der einfachste Ansatz den Geradeauslauf zu verbessern, ist die Verwendung eines Faktors welcher zum Beispiel Unterschiede in den Raddurchmessern berücksichtigt. Dabei wird zum Berechnen des Fehler für den Regler einer der beiden Rad-Encoder mit einem Faktor (geradeFaktor
) multipliziert. Der richtige Faktor zum möglichst geraden Fahren muss experimentell bestimmt werden.
geradeFaktor = 0.95 // Werte zwischen 0.9 und 1.1
error = impulseEncoderLinks - geradeFaktor*impulseEncoderRechts //
Ein deutlich komplexerer Ansatz zur Kompensation verschiedener systematischer Fehler wird von Borenstein und Feng beschrieben.
Aufgaben
- Lassen Sie den Roboter eine Strecke von ca. 1 Meter mit gleichen Motorgeschwindigkeiten für beide Seiten (z.B.
setSpeeds(200,200)
) fahren. Geben Sie den Unterschied der Encoder-Impulse zwischen den Rädern auf dem Display aus. Bestimmen Sie auch die mittlere Differenz zwischen den Encodern in Millimetern pro gefahrenen Meter. - Schreiben Sie eine Funktion
void fahreGerade()
welche den Roboter mit Hilfe der Rad-Encoder und eines P-Reglers geradeaus fahren lässt. - Optimieren Sie den P-Regler zum Geradeausfahren mit einem Kalibrierungsfaktor, welcher mögliche Abweichungen vom Geradeausfahren korrigiert.