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].r
theta
(r, theta)
(left_speed, right_speed)
Hier ist, was ich bis jetzt herausgefunden habe. Für jeden Wert von r
,
Wenn theta = 0
dann left_speed = r, right_speed = -r
(rechts vor Ort abbiegen)
Wenn theta = 90
dann left_speed = r, right_speed = r
(mit Geschwindigkeit r vorwärts fahren)
Wenn theta = 180
dann left_speed = -r, right_speed = r
(auf Punkt links abbiegen)
Wenn theta = 270
dann 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 = 45
dann 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 alpha
und beta
basierend darauf theta
.
Wie kann ich das machen? Gibt es eine Arbeit, auf die ich mich beziehen kann?
quelle
Antworten:
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
Dies erzeugt eine Funktion wie die folgende:
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%
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.±45∘ r r=50% r
Dies erzeugt eine Python-Funktion wie die folgende:
Das Ergebnis ist folgendes:
quelle
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:Vl−VrD D
if und : undθ≥0 θ≤90 Vl←r Vr←rsin(2θ−90)
wenn und : undθ<0 θ≥−90 Vr←−r Vl←rsin(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]
quelle