Matematisk strategi
Rumsliga rotationer i tre dimensioner kan parametriseras med hjälp av både Euler-vinklar och enhetskvaternioner . Den här artikeln förklarar hur du konverterar mellan de två representationerna. Egentligen presenterades denna enkla användning av "quaternions" först av Euler några sjuttio år tidigare än Hamilton för att lösa problemet med magiska rutor . Av denna anledning hänvisar dynamikgemenskapen vanligtvis till kvaternioner i denna applikation som "Euler-parametrar".
Definition
För resten av denna artikel ska den "passiva" JPL quaternion -konventionen användas. En enhetskvarternion kan beskrivas som:
Vi kan associera en quaternion med en rotation runt en axel genom följande uttryck
där α är en enkel rotationsvinkel (värdet i radianer för rotationsvinkeln ) och cos(β x ), cos(β y ) och cos(β z ) är " riktningscosinus " för vinklarna mellan de tre koordinataxlarna och rotationsaxeln. (Eulers rotationssats).
Intuition
För att bättre förstå hur " direction cosines " fungerar med quaternions:
Om rotationsaxeln är x -axeln:
Om rotationsaxeln är y -axeln:
Om rotationsaxeln är z -axeln:
Om rotationsaxeln är en vektor placerad 45° ( π / 4 radianer) mellan x- och y -axlarna:
Därför "delar" x- och y -axlarna inflytande över den nya rotationsaxeln .
Tait–Bryan vinklar
Tait–Bryan vinklar.
zy′-x″ -sekvens (inneboende rotationer;
N sammanfaller med
y' ). Vinkelrotationssekvensen är
ψ ,
θ ,
φ . Observera att i detta fall
ψ > 90° och
θ en negativ vinkel.
På liknande sätt för Euler-vinklar använder vi Tait Bryan-vinklarna (när det gäller flygdynamik) :
- Rubrik – : rotation kring Z-axeln
- Pitch – : rotation kring den nya Y-axeln
- Bank – : rotation kring den nya X-axeln
där X-axeln pekar framåt, Y-axeln till höger och Z-axeln nedåt. I konverteringsexemplet ovan sker rotationen i orderrubrik, pitch, bank.
Rotationsmatriser
Den ortogonala matrisen (efter multiplicering av en kolumnvektor) som motsvarar en rotation medurs/ vänsterhänt (som ser längs positiv axel till origo) med enheten quaternion ges av det inhomogena uttrycket :
eller motsvarande, genom det homogena uttrycket:
Om inte är en enhetskvarternion så är den homogena formen fortfarande en skalär multipel av en rotationsmatris, medan den inhomogena formen i allmänhet inte längre är en ortogonal matris. Det är därför i numeriskt arbete den homogena formen är att föredra om förvrängning ska undvikas.
Riktningscosinusmatrisen (från den roterade kroppen XYZ-koordinaterna till de ursprungliga Lab-xyz-koordinaterna för en medurs/vänster rotation) motsvarande en eftermultiplikatorkropp 3-2-1-sekvens med Euler -vinklar (ψ, θ, φ) ges av :
Euler-vinklar för kropp 3-1-3 Sekvens – xyz-systemet (original fix Lab) visas i blått, XYZ-systemet (roterad slutlig kropp) visas i rött. Linjen med noder, märkt N och visad i grönt, är den mellanliggande X-axeln för kroppen runt vilken den andra rotationen sker.
Euler vinklar (i 3-2-1 sekvens) till kvartjonomvandling
Genom att kombinera quaternion-representationerna av Euler-rotationerna får vi för Body 3-2-1 -sekvensen, där flygplanet först svänger (Body-Z) under taxning in på banan, sedan lutar (Body-Y) under start , och rullar slutligen (Body-X) i luften. Den resulterande orienteringen av Body 3-2-1-sekvensen (runt axeln med versaler i illustrationen av Tait-Bryan-vinklarna) är likvärdig med den för labb 1-2-3-sekvensen (runt axeln med små bokstäver), där flygplanet är rullade först (lab-x-axeln), och sedan nosade upp runt den horisontella labb-y-axeln och roterade slutligen runt den vertikala lab-z-axeln ( lB = lab2Body ):
Andra rotationssekvenser använder andra konventioner.
Källkod
Nedanstående kod i C++ illustrerar ovanstående konvertering:
struct Quaternion { dubbel w , x , y , z ; }; Quaternion ToQuaternion ( double roll , double pitch , double yaw ) // roll (x), pitch (Y), yaw (z) { // Förkortningar för de olika vinkelfunktionerna double cr = cos ( roll * 0,5 ); dubbel sr = sin ( rulle * 0,5 ); dubbel cp = cos ( tonhöjd * 0,5 ); dubbel sp = sin ( tonhöjd * 0,5 ); dubbel cy = cos ( gir * 0,5 ); dubbel sy = sin ( yaw * 0,5 ); Quaternion q ; q . w = cr * cp * cy + sr * sp * sy ; q . x = sr * cp * cy - cr * sp * sy ; q . y = cr * sp * cy + sr * cp * sy ; q . z = cr * cp * sy - sr * sp * cy ; returnera q ; }
Kvaternion till Euler-vinklar (i 3-2-1 sekvens) konvertering
En direkt formel för omvandlingen från en quaternion till Euler-vinklar i någon av de 12 möjliga sekvenserna finns. För resten av detta avsnitt kommer formeln för sekvensen Kropp 3-2-1 att visas. Om quaternion är korrekt normaliserad , kan Euler-vinklarna erhållas från quaternionerna via relationerna:
Emellertid ger arktanfunktionerna implementerade i datorspråk endast resultat mellan −π/2 och π/2 , för att generera alla orienteringar man behöver för att ersätta arktanfunktionerna i datorkod med atan2 :
Dessutom kan typiska implementeringar av arctan också ha några numeriska nackdelar nära noll och ett. Vissa implementeringar använder motsvarande uttryck:
Källkod
Följande C++-program illustrerar konverteringen ovan:
#define _USE_MATH_DEFINES #include <cmath> struct Quaternion { double w , x , y , z ; }; struktur EulerAngles { double roll , pitch , yaw ; }; // denna implementering antar normaliserad quaternion // omvandlas till Euler-vinklar i 3-2-1 sekvens EulerAngles ToEulerAngles ( Quaternion q ) { EulerAngles angles ; // roll (x-axelrotation) dubbel sinr_cosp = 2 * ( q . w * q . x + q . y * q . z ); dubbel cosr_cosp = 1 - 2 * ( q . x * q . x + q . y * q . y ); vinklar . roll = std :: atan2 ( sinr_cosp , cosr_cosp ); // pitch (y-axelrotation) dubbel sinp = std :: sqrt ( 1 + 2 * ( q . w * q . y - q . x * q . z )); dubbel cosp = std :: sqrt ( 1 - 2 * ( q . w * q . y - q . x * q . z )); vinklar . tonhöjd = 2 * std :: atan2 ( sinp , cosp ) - M_PI / 2 ; // gir (z-axelrotation) dubbel siny_cosp = 2 * ( q . w * q . z + q . x * q . y ); dubbel cosy_cosp = 1-2 * ( q.y * q.y + q.z * q.z ) ; _ _ _ _ _ _ _ _ _ vinklar . yaw = std :: atan2 ( siny_cosp , cosy_cosp ); returvinklar ; _ }
Singulariteter
Man måste vara medveten om singulariteter i Euler-vinkelparametriseringen när stigningen närmar sig ±90° (nord/sydpol). Dessa ärenden måste hanteras särskilt. Det vanliga namnet för denna situation är kardanlås .
Koden för att hantera singulariteterna härleds på denna sida: www.euclideanspace.com
Vektor rotation
Låt oss definiera skalär och vektor så att .
Observera att det kanoniska sättet att rotera en tredimensionell vektor med en kvaternion som definierar en Euler-rotation är via formeln
där är en kvaternion som innehåller den inbäddade vektorn , är en konjugerad kvartärnion och är den roterade vektorn . I beräkningsimplementeringar kräver detta två kvaternionmultiplikationer. Ett alternativt tillvägagångssätt är att tillämpa paret av relationer
där indikerar en tredimensionell vektorkorsprodukt. Detta innebär färre multiplikationer och är därför beräkningsmässigt snabbare. Numeriska tester indikerar att detta senare tillvägagångssätt kan vara upp till 30 % snabbare än originalet för vektorrotation.
Bevis
Den allmänna regeln för kvaternionmultiplikation som involverar skalära och vektordelar ges av
Med denna relation finner man för att
och vid substitution av trippelprodukten
där anti-kommutivitet för korsprodukt och varit applicerad. Genom att sedan utnyttja egenskapen att är en enhetskvarternion så att , tillsammans med standardvektoridentiteten
man får
som vid definiering av kan skrivas i termer av skalär och vektor delar som
Se även
externa länkar