PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Joystick Fernsteuerung für Differentialantireb ("Panzer")



HaWe
23.02.2016, 10:28
hallo,
ich wollte mich an die Programmierung einer Joystick Fernsteuerung für einen Differentialantireb ("Panzer") machen, stoße aber auf ein Programmierproblem:

Der Joystick hat ein Sattelgelenk, d.h. zwei Potentiometer übereinander, die im rechten Winkel zueinander stehen.
Die Schrägstellung ist also die Resultierende aus den Einzelauslenkungen (wenn ich mich nicht irre):

(1) Winkel: tan(alpha) = Gegenkathete/Ankathete <=> alpha = atan2(Gegenkathete, Ankathete)
(2) Auslenkung = 1/2 (SQRT (Ankathete² + Gegenkathete²) )

Gedacht ist die Funktion so, dass natürlich bei schräger Joystickstellung die Innenkette langsamer dreht als die andere: soweit logisch.
Aber:
bei voller 90° Seitenbewegung des Joysticks soll nicht die Innenkette still stehen, sondern mir gleicher Geschwindigkeit aber gegenläufig, so dass der Roboter nicht "über die Innenkette schiebt", sondern auf der Stelle wie ein Kreisel um seinen Mittelpunkt dreht ("spinning").
Bei schräg nach vorn mit 45° soll dann der Stillstand der Innenkette erreicht sein, ab 45-90° ihr Rückwärtslauf beginnen.

Bei Drücken des Joysticks nach hinten ist das ganze dann spiegelverkehrt.

Wie fasst man jetzt die ganze Sache trigonometrisch an?
Ich kenne Winkel und Auslenkungsweite, und daher den Ausschlag nach Stärke und Richtung (s. (1)+(2) ),
aber wie kriegt man jetzt daraus die gegenläufige Kettenbewegung zwischen 45-90° ?

Hat das schon mal wer gemacht oder kennt einen Link?

(wenns per Formel nicht klappt muss notfalls eine Lookup-Tabelle her, das finde ich aber SEHR hässlich!)

Holomino
23.02.2016, 11:24
Keine Ahnung, ob das hilft, probiers einfach aus:


// Calculate joystick data to tank mixed control
private void CalculateTankCoordinates()
{
double d = 0;
int A = 0, B = 0;
d = ((MaxY - System.Math.Abs(ValueY)) * (System.Math.Abs(ValueX) / MaxX));
if (ValueX >= 0)
{
A = (int)(ValueY + d);
B = (int)(ValueY - d);
}
else
{
A = (int)(ValueY - d);
B = (int)(ValueY + d);
}
ValueLeft = A;
ValueRight = B;

}

Mit ValueX/Y: Eingangswerte
MaxX/MaxY: Maximalausschläge
ValueLeft/Right: Ausgangswerte als int konvertiert (so ne PWM kann ja mit doubles nix anfangen)

HaWe
23.02.2016, 11:51
hallo,
ganz vielen Dank! Das muss ich wirklich mal ausprobieren und gucken was rauskommt, vielleicht sogar mal mit Excel simulieren.
Überraschend ist, dass A und B nur aus ValueY abgeleitet werden, und ValueX gar nicht dabei vorkommt, aber mal gucken...

danke nochmal! 8-)

- - - Aktualisiert - - -

ps,

deine Stichwörter waren aber gar nicht schlecht - klar, nach "tank" muss man suchen....
habe damit nochmal gesucht und jetzt zusätzlich gefunden:

http://home.kendra.com/mauser/Joystick.html

Get X and Y from the Joystick, do whatever scaling and calibrating you need to do based on your hardware.
Invert X
Calculate R+L (Call it V): V =(100-ABS(X)) * (Y/100) + Y
Calculate R-L (Call it W): W= (100-ABS(Y)) * (X/100) + X
Calculate R: R = (V+W) /2
Calculate L: L= (V-W)/2
Do any scaling on R and L your hardware may require.
Send those values to your Robot.
Go back to 1.


und der noch:

http://electronics.stackexchange.com/questions/19669/algorithm-for-mixing-2-axis-analog-input-to-control-a-differential-motor-drive


muss ich beide auch mal durchprobieren! :-)

Holomino
23.02.2016, 11:59
Überraschend ist, dass A und B nur aus ValueY abgeleitet werden, und ValueX gar nicht dabei vorkommt, aber mal gucken...


Das ist nicht richtig. ValueY gibt hier die Vorwärts/Rückwärts-Geschwindigkeit (auf dem Bildschirm ist das Vorwärts/Rückwärts in Y-Richtung) für beide Ketten an. Je nach Seitenausschlag wird dann auf die eine Kette d aufgeschlagen und auf der anderen Seite d von dieser Geschwindigkeit subtrahiert. d ist sehr wohl von ValueX abhängig.

HaWe
24.02.2016, 15:36
hallo,
da ich den Code für einen Arduino brauche und der Arduino-Link
http://electronics.stackexchange.com/questions/19669/algorithm-for-mixing-2-axis-analog-input-to-control-a-differential-motor-drive
bereits auch alle Skalierungen für analogRead und pwm-out hatte, und er wirklich gut funktioniert, habe ich mich für diesen entschieden.

In jedem Fall aber vielen Dank nochmals für deinen Tipp!

Holomino
24.02.2016, 15:42
Keine Ursache.

Als ich damals 'nen virtuellen Joystick für C# programmieren wollte, hab ich allerdings auch erst mal ne Stunde blöde geguckt.
Erst dann fiel mir auf, dass ich einfach den Seitwärtsausschlag auf die Vorwärts-/Rückwärts-Geschwindigkeit auf der einen Seite subtrahieren muss und auf der anderen Seite addieren.

Manchmal hilft nur festes Nachdenken, auch wenn's weh tut.:p

HaWe
24.02.2016, 16:19
Manchmal hilft nur festes Nachdenken, auch wenn's weh tut.

ja, und manchmal helfen auch kluge Vordenker 8-)

PICture
24.02.2016, 16:33
Hallo!

Ich würde beide Potis getrennt mit PWM auswerten: ersten fürs Lenken (links bzw. rechts) und zweiten für Fahrrichtung (votwärts bzw. rückwerts).

HaWe
24.02.2016, 17:18
nein, nicht nötig was zu ändern, so wie es ist, ist es ideal!

es ist ja schließlich für einen Differential-Antrieb!

HaWe
28.02.2016, 22:34
also ich kapiers nicht.
Ich kriege bei dem C# code überhaupt keine brauchbaren Ergebnisse, und beim Arduino-Code habe ich einen ganz hässlichen offset drin von
L +100 R -35
(in Nullstellung, bei Auslenkung verschiebt sich der Fehler leider sogar).
...und seltsamerweise besonders schlimm dann, wenn gleichzeitig ein UART-Übertragungsprotokoll für die Fernsteuerung läuft, wofür es ja gebraucht wird!

Ob nicht jemand doch einen funktionierenden, getesteten Code hat?

Holomino
29.02.2016, 02:54
ja, und manchmal helfen auch kluge Vordenker 8-)
Unter dem Aspekt "Hilfe zur Selbsthilfe" bist Du echt 'ne Katastrophe:p

HaWe
02.03.2016, 21:21
update:

hat sich auf unerklärliche Weise gelöst...
nochmal neu den Joystick-Code in das UART comm Programm reinkopiert - plötzlich gehts.


schon seltsam, aber Hauptsache alles gut 8-)

- - - Aktualisiert - - -

ps,

hier sind die source codes - share and enjoy!

http://www.mindstormsforum.de/viewtopic.php?f=78&t=8851&p=69043#p69042

HaWe
03.03.2016, 22:50
zu früh gefreut.
gestern liefs noch perfekt, heute nicht neu hochgeladen, einfach neu gestartet: wieder derselbe Fehler mit X/Y = 100/-35 offset in Nullstellung bei UART Betrieb, im reinen Joystickbetrieb im Rahmen der Ablesegenauigkeit dagegen völlig ok (0/4).

Auch nach zig mal rüberkopieren: immer derselbe Fehler bei UART.
Sieht wohl so aus, als wär der Due defekt, ich habe sonst keine Erklärung... :-/

HaWe
04.03.2016, 19:06
Fehler hat sich gefunden - ein UTFT-Display, das gar nicht angeschlossen war, aber pins auf A0 und A1 konfiguriert hatte ](*,)