Berechnen Sie die Position des Differentialantriebsroboters

14

Wie berechnet oder aktualisiert man die Position eines Differentialantriebsroboters mit Inkrementalsensoren?

An jedem der beiden Differenzialräder ist ein Inkrementalsensor angebracht. Beide Sensoren ermitteln den Abstand Δleft resp. ihr Rad hat während einer bekannten Zeit gerollt .Δ tΔrightΔt

Nehmen wir zunächst an, dass die Mitte zwischen beiden Rädern die Position des Roboters markiert. In diesem Fall könnte man die Position berechnen als:

x=xleft+xright2y=yleft+yright2

"Ableiten" dieser Gleichungen unter der Annahme, dass beide Räder in einer geraden Linie rollten (was für kleine Entfernungen ungefähr korrekt sein sollte), erhalte ich:

ΔxΔt=12(ΔleftΔt+ΔrightΔt)cos(θ)ΔyΔt=12(ΔleftΔt+ΔrightΔt)sin(θ)

Wobei der Orientierungswinkel des Roboters ist. Für die Änderung dieses Winkels habe ich die Gleichung gefundenθ

ΔθΔt=1w(ΔleftΔtΔrightΔt)

Wobei der Abstand zwischen beiden Rädern ist.w

Da und von abhängen , frage ich mich, ob ich zuerst das neue durch Hinzufügen von berechnen oder lieber das "alte" . Gibt es einen Grund, eins übereinander zu verwenden?ΔxΔyθθΔθθ

Nehmen wir nun an, dass die Mitte zwischen beiden Rädern nicht die Position des Roboters markiert. Stattdessen möchte ich einen Punkt verwenden, der die geometrische Mitte des Begrenzungsrahmens des Roboters markiert. Dann ändern sich und zu:xy

x=xleft+xright2+lcos(θ)y=yleft+yright2+lsin(θ)

"Ableiten" des ersten gibt:

ΔxΔt=12(ΔleftΔt+ΔrightΔt)cos(θ)lsin(θ)ΔθΔt

Jetzt besteht eine Abhängigkeit von . Ist dies ein Grund, das "neue" ?Δθθ

Gibt es eine bessere Methode zur gleichzeitigen Aktualisierung von Position und Orientierung? Verwenden Sie möglicherweise komplexe Zahlen (der gleiche Ansatz wie bei Quaternionen in 3D?) Oder homogene Koordinaten?

Daniel Jour
quelle

Antworten:

8

Zur Beantwortung Ihrer ersten Frage: Wenn Sie wirklich die wahren kinematischen Gleichungen für den Differentialantrieb finden möchten, würde ich nicht annähernd davon ausgehen, dass sich jedes Rad in einer geraden Linie bewegt hat. Ermitteln Sie stattdessen den Wendekreis, berechnen Sie den Mittelpunkt des Bogens und berechnen Sie dann den nächsten Punkt des Roboters. Der Wenderadius wäre unendlich, wenn sich der Roboter gerade bewegt, aber im geraden Fall ist die Mathematik einfach.

Stellen Sie sich also vor, dass der Roboter über jeden Zeitschritt oder jedes Mal, wenn Sie die Änderung der inkrementellen Sensoren berechnen, auf einem Bogen wie folgt von Punkt A zu Punkt B fährt: Bildbeschreibung hier eingeben Hier ein Beispielcode mit vereinfachter Mathematik:

// leftDelta and rightDelta = distance that the left and right wheel have moved along
//  the ground

if (fabs(leftDelta - rightDelta) < 1.0e-6) { // basically going straight
    new_x = x + leftDelta * cos(heading);
    new_y = y + rightDelta * sin(heading);
    new_heading = heading;
} else {
    float R = unitsAxisWidth * (leftDelta + rightDelta) / (2 * (rightDelta - leftDelta)),
          wd = (rightDelta - leftDelta) / unitsAxisWidth;

    new_x = x + R * sin(wd + heading) - R * sin(heading);
    new_y = y - R * cos(wd + heading) + R * cos(heading);
    new_heading = boundAngle(heading + wd);
}

Ich habe ähnliche Berechnungen in einem Simulator verwendet, um verschiedene Arten der Steuerung zu demonstrieren: http://www.cs.utexas.edu/~rjnevels/RobotSimulator4/demos/SteeringDemo/

Robz
quelle
1
Die im obigen Codeausschnitt
kamek
Tolle Erklärung! Die Simulator-Verbindung ist unterbrochen
Smirkingman
2

ΔθθΔx,Δy

ΔθΔx,Δyθ

Δt0

Ian
quelle
Die Suche nach "Vorwärtskinematik von Fahrzeugen mit Differentialantrieb" sollte eine Reihe von Artikeln mit einer mathematischeren Herangehensweise an diese Frage liefern.
Ian