PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Robo mit Knicklenkung: Radgeschwindigkeiten berechnen



-schumi-
27.12.2013, 00:51
Hallo,

ich bin gerade an der Programmierung der Motorsteuerplatine meines Roboters dran:
2701727018
(Morgen kann ich bei Tageslicht bessere Bilder machen)
Wie man auf den Bildern sehen kann besitzt er eine Knicklenkung. Dabei wird jedes Rad einzeln angetrieben und der Knickwinkel mithilfe eines Potis gemessen. Die Motorregelung funktioniert auch schon sehr gut: Für jedes Rad kann eine Geschwindigkeit festgelegt werden, die dann via PWM gehalten wird.

Was jetzt tatsächlich schwieriger ist als ich gedacht habe, ist:
Wenn der Roboter fährt soll als "Hauptpunkt" der Mittelpunkt zwischen den beiden Vorderrädern genommen werden, d.h. die Motorsteuerplatine bekommt den Befehl den Hauptpunkt zu einer bestimmten relativen Koordinate unter einem bestimmten Winkel heranzufahren. Davon lässt sich dann ableiten, wie sich die Vorderräder zu drehen haben. Was sich jetzt ableiten lassen sollte ist, wie sich die Hinterräder zu drehen haben; nämlich so, als würde sie sich frei drehen können.

Geradeaus ist einfach: Alle gleich schnell
Im Kreis ist auch einfach, da kann man die einzelnen "Bahngeschwindigkeiten" herausrechnen:
27019

Aber das schwierige sind alle anderen Möglichkeiten:

Vom Geradeausfahren in eine Kurve übergehen
Die Vorderräder können sich in unterschiedliche Richtungen drehen


Im Endeffekt braucht man also eine Funktion, der man Übergibt:

Geschwindigkeit linkes Vorderrad
Geschwindigkeit rechtes Vorderrad
Knickwinkel

und die errechnet

Geschwindigkeit linkes Hinterrad
Geschwindigkeit rechtes Hinterrad


Aber daran scheitert es bei mir :( Zwar habe ich es hinbekommen, dass es ungefähr passt, aber eben nicht genau -> Die Konstruktion schiebt sich teilweise über den Boden, reifen Quitschen und die Motoren freuts auch nicht...

Hätte den jemand von euch eine Idee wie man da dran gehen könnte? Oder einen Link der irgendwie weiterhelfen könnte?

Viele Grüße und vielen Dank im vorraus
schumi

hbquax
27.12.2013, 01:33
Poste doch bitte mal die Funktion, die du bisher gefunden hast und die nur ungefähr passt. Sonst fangen wir hier ja völlig bei Null an.

Die einfache Lösung wäre, alle vier Motoren in Reihe zu schalten, dann regelt sich das von selbst, Stichwort "elektrisches Differential", ist dann nur nicht so geländegängig, und das ist ja vermutlich das Ziel.

Du sagst für stationäre Kurvenfahrt hast du das Problem schon gelöst.
Für die Transitionsfälle musst du jetzt noch berechnen, um wieviel sich jedes Rad dreht, wenn das Fahrzeug nicht fährt, sondern nur lenkt. Dazu hältst du wie gehabt deinen Referenzpunkt fest, knicktst im Geiste dein Fahrzeug und berechnest die Bewegung jedes Radaufstandspunktes. Dann kommt z.B. raus 1° Lenkwinkel = 3 mm vorwärts rechts vorne usw., und das bedeutet dann auch Lenkgeschwindigkeit 1°/s = 3 mm/s zusätzliche Geschwindigkeit für rechts vorne.
Die Zusatzgeschwindigkeite infolge Lenkbewegung musst du dann den stationären Geschwindigkeiten hinzufügen. d.h. du überlagerst einfach die beiden Geschwindigkeiten. Dann sollte es klappen.

Viel Erfolg!

Nils

oberallgeier
27.12.2013, 08:38
... Programmierung ... Knicklenkung ... wie sich die Hinterräder zu drehen haben ...Hallo schumi, das Stichwort heißt Traktrix. Siehe z.B. Wikipedia (http://de.wikipedia.org/wiki/Traktrix) und andere Quellen.

-schumi-
27.12.2013, 21:12
Poste doch bitte mal die Funktion, die du bisher gefunden hast und die nur ungefähr passt. Sonst fangen wir hier ja völlig bei Null an.
Also ich hab jetzt nochmal richtig aufgeräumt, bzw. mehr oder weniger von vorne angefangen. Ich berechne das ganze über Vektoren und eigentlich sieht es jetzt ganz gut aus, d.h. die ausgegebenen Werte scheinen über den Daumen gepeilt richtig zu sein. Habe meinen Test-Code mal angehangen (Ich habe das ganze erst am PC programmiert und über Printf auch die ganzen Zwischenergebnisse ausgegeben. Wer das also testen möchte kanns einfach so kompilieren)



Die einfache Lösung wäre, alle vier Motoren in Reihe zu schalten, dann regelt sich das von selbst, Stichwort "elektrisches Differential", ist dann nur nicht so geländegängig, und das ist ja vermutlich das Ziel.
Richtig, zudem habe ich meine Motorsteuerplatine schon (4 einzelne H-Brücken mit BackEMF-Messung)



Für die Transitionsfälle musst du jetzt noch berechnen, um wieviel sich jedes Rad dreht, wenn das Fahrzeug nicht fährt, sondern nur lenkt. Dazu hältst du wie gehabt deinen Referenzpunkt fest, knicktst im Geiste dein Fahrzeug und berechnest die Bewegung jedes Radaufstandspunktes. Dann kommt z.B. raus 1° Lenkwinkel = 3 mm vorwärts rechts vorne usw., und das bedeutet dann auch Lenkgeschwindigkeit 1°/s = 3 mm/s zusätzliche Geschwindigkeit für rechts vorne.
Die Zusatzgeschwindigkeite infolge Lenkbewegung musst du dann den stationären Geschwindigkeiten hinzufügen. d.h. du überlagerst einfach die beiden Geschwindigkeiten. Dann sollte es klappen.
Das war auch mein erster Ansatz, allerdings hatte ich da noch Fehler drin ist mir aufgefallen. Jetzt mache ich es etwas anders:

Bekannt sind Knickwinkel und die Geschwindigkeiten der beiden Vorderräder
Berechnung, wohin und unter welchem Winkel sich der vordere Teil bewegt
Berechnung, wohin sich das Gelenk hinbewegt
Daraus schließen, wie sich der hintere Teil bewegt (ohne Traktrix [Aber in diesem Moment fällt mir ein, dass es damit noch besser sein könnte])
Und dann die Bewegung der Hinterräder herleiten




Viel Erfolg!
Danke :)


Hallo schumi, das Stichwort heißt Traktrix.
Vielen Dank für den Tipp, kannte ich noch nicht :)


Ich werde jetzt erst mal meinen "Mastercontroller" (kleiner Router mit OpenWRT) auf den Robo bauen, damit ich an ein paar Debug-Ausgaben komme. Denn ganz flüssig läuft es noch immer nicht (Ich habe das Gefühl, dass die Geschwindigkeitsmessung der Räder nicht nur von der tatsächlichen Geschwindigkeit abhängt, sondern auch die PWM-Regelung da reinfunkt)

PICture
27.12.2013, 21:21
Hallo!

Bei 4WD Autos ist angeblich alles rein mechanisch per drei Differs gelöst. :confused:

oberallgeier
28.12.2013, 11:00
... Tipp, kannte ich noch nicht ...Kennt man als Segler (Boot), Kiter, Flieger und so als Hundekurve. Selbst manche Mathefreaks kennen die *ggg*.


... Geschwindigkeitsmessung ... von der tatsächlichen Geschwindigkeit abhängt ... die PWM-Regelung da reinfunkt)Uuuups! Hast Du schon beschrieben wie Du die Geschwindigkeit misst (oder hab ich den Thread nicht ordentlich gelesen?) Könnte da etwas im Argen liegen ?


... Die Motorregelung funktioniert auch schon sehr gut: Für jedes Rad kann eine Geschwindigkeit festgelegt werden, die dann via PWM gehalten wird. ... Wenn der Roboter fährt soll als "Hauptpunkt" der Mittelpunkt zwischen den beiden Vorderrädern genommen werden, d.h. die Motorsteuerplatine bekommt den Befehl den Hauptpunkt zu einer bestimmten relativen Koordinate unter einem bestimmten Winkel heranzufahren ...Und da verstehe ich es so, dass Du einmal den Regelungskreis "Sollwert Motor" zu Stellgröße PWM hast - und dann drüber noch einen Offset (+/-) für unterschiedliche Kurvengeschwindigkeitsunterschiede legst. Ist das nicht etwas problematisch - oder ? Wie ist das denn gelöst?

Geistesblitz
29.12.2013, 00:54
Wird eigentlich der Winkel im Knickgelenk gemessen? Würde ich zumindest zum Nachprüfen der Plausibilität der Rechenergebnisse einbauen, Stichwort Redundanz. Vielleicht ließe sich der Gelenkwinkel sogar über die Antriebe regeln. Ich nehme mal an, dass es nicht direkt angetrieben wird?
Ansonsten denke ich, dass es bei solchen Konzepten ganz praktisch wäre, mit flachheitsbasierter Regelung zu arbeiten, allerdings wird es da wirklich komplex.

Ryoken
29.12.2013, 02:09
Hallo!

Bei 4WD Autos ist angeblich alles rein mechanisch per drei Differs gelöst. :confused:
Bei mechanisch angetriebenen Autos funktioniert auch ein mechanisches Differential.
Und wenn der "Antriebsstrang" elektrisch ist...

Geistesblitz
29.12.2013, 02:54
Das mit den Differentialen bringt übrigens nur was, wenn die Lenkung auch aktiv ist. So, wie ich das jetzt aber mitbekommen habe, wird die Knickachse nicht gelenkt, sondern bewegt sich indirekt dadurch, dass sich die Räder unterschiedlich schnell drehen. Wäre der Antrieb dann über Differentiale gelöst, würde sich das Fahrzeug zwar vorwärts bewegen, die Lenkrichtung wäre aber völlig willkürlich.

Bei indirekter Lenkung bin ich mir eigentlich schon sicher, dass man da irgendwie die Gelenkstellung der Achse messen muss, sonst driftet einem der Roboter extrem umher, wenn man diese nur irgendwie abschätzt, vor allem, weil es sonst auch schon schwierig wird, eine definierte Ausgangsstellung zu schaffen.

ranke
29.12.2013, 09:11
Bei indirekter Lenkung bin ich mir eigentlich schon sicher, dass man da irgendwie die Gelenkstellung der Achse messen muss, sonst driftet einem der Roboter extrem umher, wenn man diese nur irgendwie abschätzt, vor allem, weil es sonst auch schon schwierig wird, eine definierte Ausgangsstellung zu schaffen.

Schon im Eingangspost steht es:


Dabei wird jedes Rad einzeln angetrieben und der Knickwinkel mithilfe eines Potis gemessen.

Dabei ist offenbar kein extra Stellglied für die Lenkachse vorhanden. Trotzdem hat man immer noch zuviele Freiheitsgrade für die Eingabe, nämlich 4 Raddrehwinkel, die unabhängig angesteuert werden können. Das gesamte Fahrzeug hat aber nur 2 Freiheitsgrade, Geschwindigkeit und Lenkwinkel. Damit ist es schon irgendwie klar, dass nicht jede mögliche Eingabekombination schlupffrei möglich ist. In diesem Sinne ist es durchaus sinnvoll nicht an allen Rädern Wege (Raddrehwinkel) sondern statt dessen Antriebsmoment (Motorstrom) vorzugeben. Die Vorschläge zu Differenzialgetrieben gehen genau in diese Richtung.
Vorstellbar wäre ein Konzept in dem man nur die beiden Vorderräder nach Radenkodern steuert (damit sind Geschwindigkeit und Lenkwinkel des Fahrzeugs bereits eindeutig definiert). Die hinteren Motoren steuert man über den Motorstrom so, dass sie etwa das selbe Antriebsmoment wie die vorderen erbringen (gleiche Radlast für alle 4 Räder angenommen). Damit bekommt man die gewünschte Traktion, ohne zusätzliche Freiheitsgrade in die Ansteuerung zu bringen. Die Radencoder an der Hinterachse kann man trotzdem brauchen um zu prüfen ob die Winkelgeschwindigkeiten plausibel sind für schlupffreie Fahrt.

-schumi-
29.12.2013, 19:18
ranke, du bist ein Genie!! :pray:


Die hinteren Motoren steuert man über den Motorstrom so, dass sie etwa das selbe Antriebsmoment wie die vorderen erbringen (gleiche Radlast für alle 4 Räder angenommen). Damit bekommt man die gewünschte Traktion, ohne zusätzliche Freiheitsgrade in die Ansteuerung zu bringen. Die Radencoder an der Hinterachse kann man trotzdem brauchen um zu prüfen ob die Winkelgeschwindigkeiten plausibel sind für schlupffreie Fahrt.
Und damit das nicht nur für Geradeausfahrt funktioniert, sondern auch für Kurven, steckt man die Motorstromwerte für die vorderen Räder in die Umrechnungsfunktion für die hinteren Räder!

Theoretisch würde es auch mit den Geschwindigkeiten gehen, aber da meine Messung bei kleinen Geschwindigkeiten nicht allzu genau ist (BackEMF -> jeweiliger Motor wird in den Generatormodus gschalten und nach 1ms die erzeugte Spannung gemessen) funktioniert das auf glatten Böden nicht zu 100%, weil die Regelung immer mit aller Kraft versucht die Geschwindigkeit für alle Räder genau zu halten. Ich glaube ich mache 2 Modi:
- Glatter Boden/wenig natürlich Schlupf: Wie von ranke vorgeschlagen über Motorströme
- Teppich/Sand/Gras: Über die Geschwindigkeiten (dort macht es nicht viel aus wenn die Radgeschwindigkeiten nicht ganz genau zueinander passen, dafür werden Räder die im Leerlauf sind oder fast blockieren besser ausgeglichen)

Ansonsten, wie ihr schon richtig bemerkt habt, wird nur passiv geknickt. Genaugenommen besteht das Knickgelenk nur aus einem Scharnier aus dem Baumarkt an dem ein Poti für die Winkelmessung befestigt ist :-b

Vielen vielen Dank
schumi

PS: Weil warscheinlich gleich jemand fragt warum ich BackEMF und keine Encoder nehme: Ich habe quasi einfach drauflosgebaut und hatte noch welche von den Motoren da: http://www.pollin.de/shop/dt/Nzc1OTg2OTk-/Motoren/DC_Getriebemotoren/Gleichstrom_Getriebemotor_CHM_2435_1.html
In Sachen Drehmoment (bei 15V) eine gute Wahl, dummerweise lässt sich dort aber nirgends eine Encodescheibe anbringen, da alles ein Block ist den ich nicht vermocht habe auseinanderzubauen...