Omvandling mellan kvaternioner och Eulervinklar

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