Wie berechnet man die rechte und linke Geschwindigkeit für einen panzerartigen Rover?


7

Ich versuche, den Rover 5-Roboter mithilfe einer Android-App mit einer berührungsbasierten Joystick-Steuerung in der App-Benutzeroberfläche zu steuern. Ich möchte die Geschwindigkeit des linken und rechten Motors im Rover berechnen, wenn der Joystick bewegt wird.

Vom Joystick erhalte ich zwei Werte: Schwenken und Neigen. Ich konvertiere sie mit und in das Polarkoordinatensystem . Wobei r von 0 bis 100 und Theta von 0 bis 360 reicht. Ich möchte eine Gleichung ableiten, die das in für Rover umwandeln kann . Die Geschwindigkeitswerte liegen ebenfalls im Bereich [0; 100].rtheta(r, theta)(left_speed, right_speed)

Hier ist, was ich bis jetzt herausgefunden habe. Für jeden Wert von r,

Wenn theta = 0dann left_speed = r, right_speed = -r(rechts vor Ort abbiegen)
Wenn theta = 90dann left_speed = r, right_speed = r(mit Geschwindigkeit r vorwärts fahren)
Wenn theta = 180dann left_speed = -r, right_speed = r(auf Punkt links abbiegen)
Wenn theta = 270dann left_speed = -r, right_speed = -r(mit Geschwindigkeit r rückwärts fahren)

Für andere Werte möchte ich, dass es sich gleichzeitig bewegt und dreht. Zum Beispiel,

Wenn theta = 45dann left_speed = alpha*r, right_speed = beta*r(vorwärts bewegen, während Sie nach rechts abbiegen)

Grundsätzlich kann (r, theta)ich für jeden folgende Geschwindigkeiten einstellen:

(left_speed, right_speed) = (alpha*r, beta*r)

Ich muss eine Gleichung formulieren, in der ich all diese Fälle verallgemeinern kann, indem ich finde alphaund betabasierend darauf theta.

Wie kann ich das machen? Gibt es eine Arbeit, auf die ich mich beziehen kann?


Ich nehme an, Sie meinen "Wenn Theta = 180, dann left_speed = -r ..."
John Wiseman

Ja, danke für den Hinweis. Bearbeitet die Frage
Punit Soni

Antworten:


8

Sie versuchen, eine Formel zu finden, um einen bestimmten in linken und rechten Schubprozentsatz umzuwandeln , wobei Ihren Drosselprozentsatz darstellt. Die naive Implementierung besteht darin, Ihre Funktion auf 100% Gas zu stützen:(r,θ)r

  • Bei sind der linke und der rechte Schub gleich0r
  • Bei ist der Schub einer Seite gleich und der der anderen Seite gleich 0±45r
  • Bei ist der Schub einer Seite gleich und der der anderen Seite gleich±90rr
  • Bei sind der linke und der rechte Schub gleich180r

Dies erzeugt eine Funktion wie die folgende:

Schubverhältnisse für 100% Gas

Das Problem bei dieser Implementierung ist, dass Sie das gewünschte nur dann bereitstellen, wenn ein genaues Vielfaches vonrθ90 . An allen anderen Punkten opfern Sie die Gesamtgeschwindigkeit für die Kontrolle. Sie können dies in der Grafik sehen: "Absoluter Schub", die von beiden Motoren gelieferte Schubmenge, ist in diesem Regime nicht konstant (und kann es auch nicht sein). Eine einfache Skalierung dieser Funktion ist nicht optimal.

Der maximale absolute Schub, der über den gesamten Bereich von aufrechterhalten werden kann, tritt auf, wenn - darauf sollte Ihre Funktion basieren . θr=50%

Schubverhältnisse für 100% Gas

In dieser Implementierung bleibt der Gesamtschub zwischen konstant, und der absolute Schub ist unabhängig von der gewählten Richtung konstant - die Motoren ihren Schub aus, um das gewünschte aufrechtzuerhalten . Oberhalb von beginnt der Winkelbereich, in dem Ihr Gesamtschub erfüllen kann, zu schrumpfen - Sie beginnen, die Kontrolle für die Geschwindigkeit zu opfern.±45rr=50%r

Dies erzeugt eine Python-Funktion wie die folgende:

# assumes theta in degrees and r = 0 to 100 %
# returns a tuple of percentages: (left_thrust, right_thrust)
def throttle_angle_to_thrust(r, theta):
    theta = ((theta + 180) % 360) - 180  # normalize value to [-180, 180)
    r = min(max(0, r), 100)              # normalize value to [0, 100]
    v_a = r * (45 - theta % 90) / 45          # falloff of main motor
    v_b = min(100, 2 * r + v_a, 2 * r - v_a)  # compensation of other motor
    if theta < -90: return -v_b, -v_a
    if theta < 0:   return -v_a, v_b
    if theta < 90:  return v_b, v_a
    return v_a, -v_b

Das Ergebnis ist folgendes: animierte Rechts / Links-Funktion


Danke Ian. Soweit ich verstanden habe, versuchen Sie, die Lasten beider Motoren auszugleichen, oder?
Punit Soni

Nicht ganz. Sie versuchen, , anstatt es von abhängig zu machen . Beachten Sie, dass bei die gepunktete violette Linie in Bezug auf nicht mehr konstant ist . Sie möchten diesen Effekt minimieren. (left_speed+right_speed)/2=rθr>50%θ
Ian

2
Wie hast du diese ausgefallenen Pläne gemacht?
Josh Vander Hook

Ich habe die Plots in Microsoft Excel erstellt und die Animation in Gimp erstellt.
Ian

Hervorragende Antwort, danke. Es gibt einen kleinen Tippfehler, der lauten sollte, wenn Theta <0: v_a, -v_b zurückgeben und nicht, wenn Theta <0: -v_a, v_b zurückgeben (die Vorzeichen sind umgekehrt)
grinsender

1

Was Sie wollen, ist eine Winkelgeschwindigkeit, die proportional zum Kosinus des Winkels ist, mit positiv nach rechts und negativ nach links.

Da wir also wissen, dass die Winkelgeschwindigkeit durch wobei der Durchmesser des Roboters ist, sind wir alle eingestellt. Versuche dies:VlVrDD

if und : undθ0θ90VlrVrrsin(2θ90)

wenn und : undθ<0θ90VrrVlrsin(2θ+90)

Tauschen Sie die Geschwindigkeiten gegen die anderen Quadranten aus. Beachten Sie, dass dies kein "Autofahren" ist, da sich der Steuerknüppel nach rechts unten rückwärts und rechts dreht, während sich ein Auto mit dem rechten Rad rückwärts und links dreht. Nur eine Verrücktheit von Differentialantrieben ... Sie können dies anpassen, indem Sie einfach die Regeln des vierten Quadranten auf den dritten Quadranten anwenden und umgekehrt.θ

Ich habe , was Sie erhalten können:θ[180,+180]

θatan2(sinθ,cosθ) (achten Sie jedoch auf Ihre Einheiten, atan2 ist normalerweise Bogenmaß.


Das sieht ziemlich gut aus. Ich bin zu dieser Lösung gekommen und habe intuitiv gedacht. Ich werde es versuchen und sehen, wie es sich beim Fahren tatsächlich anfühlt. Vielen Dank.
Punit Soni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.