Forum: PC-Programmierung Quaternionen richtig interpretieren


von Dominik G. (moondryl)


Lesenswert?

Hallo,
ich hoffe, das ist der richtige Bereich.
Nach den ersten kleinen Projekten versuche ich derzeit einen 
Quadrocopter möglichst in Eigenregie zu bauen. Nachdem sowohl die 
Funkübertragung und die Motorsteuerung funktioniert, hänge ich aber an 
einem kleinen Problem.

Ich bekomme durch meine Sensoren bereits vernünftige Quaternionen; 
soweit so gut. Wie übertrage ich das nun auf die Steuerung, sodass der 
Copter sich selbst stabilisiert?
Ich weiß, dass jeder Imaginärteil ja eine Drehung um eine bestimmte 
Achse darstellt.
Steuere ich die Motoren so an, bis meine Quaternionen x+0i+0j+0k 
darstellen?
Also wenn der Controller merkt "Drehung um x-Achse" Motor 2 stärker und 
Motor 3 etwas schwächer, bis keine Drehung um die Achse mehr vorhanden 
ist?

Oder habe ich bei den Quaternionen jetzt etwas falsch verstanden?

Grüße

Dominik :)

von Karl H. (kbuchegg)


Lesenswert?

Dominik Gebhardt schrieb:

> Ich bekomme durch meine Sensoren bereits vernünftige Quaternionen;
> soweit so gut. Wie übertrage ich das nun auf die Steuerung, sodass der
> Copter sich selbst stabilisiert?
> Ich weiß, dass jeder Imaginärteil ja eine Drehung um eine bestimmte
> Achse darstellt.
> Steuere ich die Motoren so an, bis meine Quaternionen x+0i+0j+0k
> darstellen?

Das wäre kontraproduktiv.

Das Quaternion sagt dir ja um welche Achse sich der Copter wie weit aus 
seiner Ruhelage gedreht hat, um in der jetzt festgestellten Orientierung 
zu liegen.

D.h. deine Steuerung muss genau diese Drehung rückgängig machen um 
wieder in die Ruhelage zu kommen.

D.h. du musst einen Weg finden, wie du diese Drehung um irgendeine Achse 
und um irgendeinen Winkel auf deine Motoren zurückführst, wobei du ja 
die Einschränkung hast, dass jedes Motorpärchen nur um eine bestimmte 
Achse drehen kann.

Was du brauchst ist also eine 'Decomposition' (sorry, ich weiß das 
deutsche Wort dafür nicht), deines allgemeinen Quaternions in 2(3) 
Quaternionen, deren Achsen du vorgibst (und die die Drehachsen 
darstellen, die deine Motoren realisieren können).

Das Ergebnis sind also ganz spezielle 'Quaternionen'. Ihre Achsen sind 
festgenagelt aber die WInkel nicht. Und diese Winkel haben einen 
speziellen Namen. Man nennt sie die Euler Winkel.

Was du also suchst ist eine Decomposition eines Quaternions in Euler 
Winkel.

http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles

Mit diesen Winkeln hast du dann die Information um wieviel sich der 
Copter um die fixen Hauptachsen drehen muss und das 'übersetzt' du dann 
wiederrum in die Ansteuerung der Motoren.

von P. M. (o-o)


Lesenswert?

Karl Heinz Buchegger schrieb:
> 'Decomposition' (sorry, ich weiß das
> deutsche Wort dafür nicht)

Was könnte es wohl sein? Zerlegung :-)

von Karl H. (kbuchegg)


Lesenswert?

P. M. schrieb:
> Karl Heinz Buchegger schrieb:
>> 'Decomposition' (sorry, ich weiß das
>> deutsche Wort dafür nicht)
>
> Was könnte es wohl sein? Zerlegung :-)

:-)
Danke.
Das ist halt die Krux, wenn man immer nur englischsprachige Literatur zu 
diesen Themenkreisen liest. Irgendwann fallen einem die deutschen Worte 
nicht mehr ein.

von Dominik G. (moondryl)


Lesenswert?

Vielen Dank schonmal für deine ausführliche Antowrt! :)

Aber jetzt habe ich noch ein paar mehr Fragen als vorher?

1)
Meine Sensoren sind ja auf einer eigenen Platine. Ich dachte, dass das 
Quaternion mir nun angibt, wie sich das Koordinatensystem der Platinen 
(mit seinen festen Achsen) nun im Ausgangskoordinatensystem liegt. Oder 
ist das falsch?

2) Haben Eulerwinkel nicht wieder das Problem des Gimbal Lock?

3) Du sagst, dass ich die Drehung rückgängig machen muss. Muss ich da 
wieder die Reihenfolge beachten, in der die Drehungen aufgetreten sind?

4) Wenn ich den Copter dann steuern möchte, soll z.B. die Drehung im die 
y-Achse ja nicht rückgängig gemacht werden. Wenn so eine manuelle 
Eingabe erfolgt, soll die automatische Stabilisierung dann ignoriert 
werden?

5) Zur Decomposition und Drehachsen:
Meine Achsen, die die Motoren realisieren können, wären dann doch:

a)
y-Achse: Copter steht auf der Stelle und dreht sich nach links und 
rechts.

b)
x-Achse: Wenn der Copter "nach vorne schaut" kippt er sich nach vorne 
und hinten.

c)
z-Achse:
Wenn der Copter "nach vorne schaut" kippt er nach links und rechts.

5) Ich sollte am Ende einen Winkel für jede Achse rausbekommen. Dieser 
sagt mir dann also, um wieviel ich den Copter zurückkippen muss.

Grüße

und viele Dank nochmal!

von Karl H. (kbuchegg)


Lesenswert?

Dominik Gebhardt schrieb:
> Vielen Dank schonmal für deine ausführliche Antowrt! :)
>
> Aber jetzt habe ich noch ein paar mehr Fragen als vorher?
>
> 1)
> Meine Sensoren sind ja auf einer eigenen Platine. Ich dachte, dass das
> Quaternion mir nun angibt, wie sich das Koordinatensystem der Platinen
> (mit seinen festen Achsen) nun im Ausgangskoordinatensystem liegt. Oder
> ist das falsch?

Ich kenn jetzt natürlich dein System nicht.
Aber ein Quaternion gibt an, um welchen Winkel um welche Achse man 
drehen muss, damit man von einer Ausgangslange in eine Endlage kommt.

Ob von deiner Sensorplattform der Winkel jetzt die 'Hinrichtung' oder 
die 'Rückrichtung' angibt weiß ich nicht (ändert aber nur das Vorzeichen 
des Winkels).

> 2) Haben Eulerwinkel nicht wieder das Problem des Gimbal Lock?

Du führst sie ja nicht mit, sondern rechnest sie aus dem Quaternion 
laufend neu aus. D.h. du hast keinen Gimabal-Lock aber es gibt 
Orientierungen, in denen es mehrere verschiedene Lösungen gibt.

> 3) Du sagst, dass ich die Drehung rückgängig machen muss. Muss ich da
> wieder die Reihenfolge beachten, in der die Drehungen aufgetreten sind?

Ist alles schon im Quaternion berücksichtigt, bzw. in welcher 
Reihenfolge die 'zerlegten' Quaternionen in Summe wieder das 
Gesamtquaternion ergeben.

> 4) Wenn ich den Copter dann steuern möchte, soll z.B. die Drehung im die
> y-Achse ja nicht rückgängig gemacht werden. Wenn so eine manuelle
> Eingabe erfolgt, soll die automatische Stabilisierung dann ignoriert
> werden?

Im Prinzip verdrehst du dann mit deiner Fernsteuerung die 
'Euler-Winkel', die als 0 gelten. D.h. du drehst dann nicht solange 
zurück, bis du Euler Winkel 0/0/0 erreichst, sondern eben die Werte, die 
du über die Fernsteuerung einstellst.


> 5) Ich sollte am Ende einen Winkel für jede Achse rausbekommen. Dieser
> sagt mir dann also, um wieviel ich den Copter zurückkippen muss.

Das ist die Idee.


Da ich allerdings auch noch nie einen Copter gebaut habe, sondern das 
alles nur aus äquivalenten Fragestellungen aus der CAD Programmierung 
kenne, klinke ich mich hier aus.
(denn ich hätte das für mich überhaupt nicht über Quaternionen gelöst, 
sondern meine bewährten Matrizen angewendet. Mit denen kenn ich mich 
besser aus, auch wenn sie etwas mehr Rechenaufwand bedeuten und 
mathematisch nicht so elegant sind :-)

Allerdings muss ich mich schon fragen, was das für eine 
Inertial-Plattform ist, von der du einen Quaternion bekommst? Und warum 
kannst du nicht damit umgehen, wenn du einen Quadrocopter bauen willst.

von Dominik G. (moondryl)


Lesenswert?

Wow, vielen vielen Dank!

Alles, was ich mache, sind nur Hobbyprojekte. Habe mit ein paar LEDs 
angefangen, dann versucht die Wordclock in Selbstarbeit nachzubauen dann 
eine Wetterstation und dann habe ich mich mit immer mehr Sachen 
beschäftigt. Auch wenn ich quasi mit jedem Projekt das Rad neu erfinde 
(es gibt ja schließlich z.B. für die Uhr oder auch Quadrocopter 
Anleitung), möchte ich es selbst schaffen. M.M.n. lerne ich so am 
meißten und mir macht es auch mehr Spaß. Meißtens komme ich mit dem 
Internet oder Büchern aus, wenn ich auf Probleme stoße aber manchmal 
muss ich dann auch nachfragen.

Daher kenne ich mich auch noch nicht so gut mit Quaternionen aus. ;)
Due Quaternionen stammen übrigens von dem MPU6050. Der hat einen DMP 
eingebaut, der die Werte vom ACC und Gyro bereits fusioniert und das 
tilten und shiften bereits rausrechnet. Als Ausgabe kann man sich dann 
Quaternionen anzeigen lassen. Das ermöglicht mir den Quadrocopter auf 
einer relativ kleinen Hardware aufzubauen.

Mit deinen letzten Anmerkungen hast du mir auf jeden Fall sehr geholfen. 
Konnte mir jetzt zu den einzelnen Themen die du angesprochen hast wieder 
genug Lesestoff zusammensuchen und ich weiß nun, wo ich weitermachen 
muss. :)

Viele Grüße

Dominik

von Michael F. (startrekmichi)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Steuere ich die Motoren so an, bis meine Quaternionen x+0i+0j+0k
>> darstellen?
>
> Das wäre kontraproduktiv.

Nur teilweise, dann schwebt er nämlich einfach in der Ausgangslage, hat 
aber keinen Folgeregler :)

Man kann die Quaternionen übrigens direkt zurückführen ohne in 
Eulerwinkel umzurechnen. Das wird wohl gerne bei Satelliten gemacht, 
geht aber auch bei anderen Vehikeln (Achtung, 1. englisch 2. 
mathematisch, Formel 20 ist das eigentliche Regelgesetz):
http://flash.lakeheadu.ca/~tayebi/ieee_tcst_2006.pdf

Im Prinzip verwendest du den Vektorteil des Quaternions als 
Solldrehraten. Wenn du nicht nur eine reine Stabilisierung in die 
Nulllage (wird auf Dauer etwas langweilig), sondern einen Folgeregler 
haben willst, musst du noch das Fehlerquaternion (im Prinzip "nur" ne 
Quaternionenmultiplikation) zwischen Soll- und Istlage berechnen. D.h. 
du muss die Sollwinkel von der Fernbedienung in ein Sollquaternion 
umrechnen und dann das Fehlerquaternion bilden. Das Fehlerquaternion 
(also effektiv der Unterschied zwischen Soll- und Istlage) muss dann auf 
(1,0,0,0) geregelt werden.

Die eigentlichen Berechnungen sind relativ einfach, aber die Theorie & 
Mathematik dahinter kann etwas kompliziert werden. Wenn man Eulerwinkel 
nutzt, ist es meist etwas anschaulicher als mit Quaternionen. Wobei man 
sich auch die Quaternionen noch halbwegs vorstellen kann: Der Vektorteil 
(Imaginärteile) beschreibt die Achse, um die gedreht werden soll und der 
Realteil den Drehwinkel um eben diese Achse.

Noch ein Hinweis: Beim Umwandeln zwischen Quaternion und Eulerwinkeln 
braucht man diverse Trigonometrie-Funktionen (sin/cos), je nach 
verwendetem Prozessor kann das etwas eng werden.

Das hier ist übrigens das im Flugzeugbau normalweise verwendete 
körperfeste Koordinatensysteme:
x: positiv nach vorne
y: positiv nach rechts
z: positiv nach unten


Noch was zur MPU6050: Wo kommt da denn ein Quaternion raus? Im 
Datenblatt steht jedenfalls nichts dazu drin. Es wird zwar ein "Digital 
Motion Processor" angepriesen, aber was das genau ist und wie man ihn 
anspricht steht nirgendwo.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

P. M. schrieb:
> Karl Heinz Buchegger schrieb:
>> 'Decomposition' (sorry, ich weiß das
>> deutsche Wort dafür nicht)
>
> Was könnte es wohl sein? Zerlegung :-)

...oder Entwicklung.

von chris (Gast)


Lesenswert?

Hier ein Artikel zu Quadrocopter und Quaternion:
www.rt.mw.tum.de/fileadmin/w00bhf/www/publikationen/2011_Buhl_at.pdf

Gibt es einfachere Artikel zur Einführung in das Thema?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.