Konwersja między kwaternionami a kątami Eulera

Obroty przestrzenne w trzech wymiarach można parametryzować za pomocą zarówno kątów Eulera , jak i kwaternionów jednostkowych . W tym artykule wyjaśniono, jak przeprowadzić konwersję między dwiema reprezentacjami. W rzeczywistości to proste użycie „kwaternionów” zostało po raz pierwszy przedstawione przez Eulera jakieś siedemdziesiąt lat wcześniej niż Hamilton , aby rozwiązać problem magicznych kwadratów . Z tego powodu społeczność zajmująca się dynamiką powszechnie określa kwaterniony w tej aplikacji jako „parametry Eulera”.

Definicja

W pozostałej części tego artykułu będzie używana konwencja „pasywnego” kwaternionu JPL . Czwartion jednostkowy można opisać jako:

Możemy powiązać kwaterniony z obrotem wokół osi za pomocą następującego wyrażenia

gdzie α to prosty kąt obrotu (wartość w radianach kąta obrotu ) , a cos(β x ), cos(β y ) i cos(β z ) to „ cosinusy kierunku ” kątów między trzema osiami współrzędnych i osi obrotu. (Twierdzenie o rotacji Eulera).

Intuicja

Aby lepiej zrozumieć, jak „ cosinusy kierunkowe ” działają z czwartorzędami:

Jeśli osią obrotu jest oś x :

Jeśli osią obrotu jest oś y :

Jeśli osią obrotu jest oś z :

Jeśli osią obrotu jest wektor położony pod kątem 45° ( π / 4 radiany) między osiami x i y :

W związku z tym osie x i y „współdzielą” wpływ na nową oś obrotu .

Kąty Taita-Bryana

Kąty Taita-Bryana. sekwencja zy′-x″ (obroty wewnętrzne; N pokrywa się z y' ). Sekwencja obrotu kąta to ψ , θ , φ . Zauważ, że w tym przypadku ψ > 90°, a θ jest kątem ujemnym.

Podobnie dla kątów Eulera używamy kątów Taita Bryana (pod względem dynamiki lotu ):

  • Kierunek - : obrót wokół osi Z.
  • - : wokół nowej osi Y
  • Bank - : obrót wokół nowej osi X

gdzie oś X jest skierowana do przodu, oś Y w prawo, a oś Z w dół. W powyższym przykładzie konwersji rotacja występuje w nagłówku zamówienia, skoku, banku.

Macierze rotacji

Macierz ortogonalna (post-mnożenie wektora kolumnowego) odpowiadająca obrotowi zgodnie z ruchem wskazówek zegara / lewoskrętnej (patrząc wzdłuż osi dodatniej do początku) o jednostkę kwaternionu jest określone przez niejednorodne wyrażenie :

lub równoważnie przez jednorodne wyrażenie:

Jeśli nie jest kwaternionem jednostkowym, to forma jednorodna jest nadal skalarem wielokrotność macierzy rotacji, podczas gdy postać niejednorodna na ogół nie jest już macierzą ortogonalną. Dlatego w pracach numerycznych preferowana jest forma jednorodna, aby uniknąć zniekształceń.

Kierunkowa macierz cosinusowa (od obróconych współrzędnych XYZ Ciała do oryginalnych współrzędnych Lab xyz dla obrotu w prawo/w lewo) odpowiadająca sekwencji Ciała 3-2-1 po pomnożeniu z kątami Eulera (ψ, θ, φ) jest dana wzorem :

Kąty Eulera dla sekwencji Body 3-1-3 – System xyz (oryginalne ustalone laboratorium) jest pokazany na niebiesko, system XYZ (obrócony końcowy korpus) jest pokazany na czerwono. Linia węzłów, oznaczona jako N i pokazana na zielono, to pośrednia oś X Ciała, wokół której następuje drugi obrót.

Konwersja kątów Eulera (w sekwencji 3-2-1) na kwaterniony

Łącząc reprezentacje kwaternionów obrotów Eulera, otrzymujemy sekwencję Body 3-2-1 , w której samolot najpierw skręca (Body-Z) podczas kołowania na pas startowy, a następnie pochyla się (Body-Y) podczas startu , a na koniec toczy się (Body-X) w powietrzu. Wynikowa orientacja sekwencji Body 3-2-1 (wokół osi pisanej wielką literą na ilustracji kątów Taita-Bryana) jest równoważna orientacji sekwencji lab 1-2-3 (wokół osi pisanej małymi literami), gdzie samolot jest najpierw obrócony (oś lab-x), a następnie obrócony wokół poziomej osi lab-y i ostatecznie obrócony wokół pionowej osi lab-z ( lB = lab2Body ):

Inne sekwencje rotacji wykorzystują inne konwencje.

Kod źródłowy

Poniższy kod w C++ ilustruje powyższą konwersję:

 

        


       

    

         
         
         
         
         
         

     
                
                
                
                

     
 struct  Quaternion  {  podwójne  w  ,  x  ,  y  ,  z  ;  };  Quaternion  ToQuaternion  (  double  roll  ,  double  pitch  ,  double  yaw  )  // roll (x), pitch (Y), yaw (z)  {  // Skróty różnych funkcji kątowych  double  cr  =  cos  (  roll  *  0.5  );  podwójne  sr  =  grzech  (  rzut  *  0,5  );  podwójne  cp  =  cos  (  skok  *  0,5  );  podwójne  sp  =  grzech  (  skok  *  0,5  );  podwójne  cy  =  cos  (  odchylenie  *  0,5  );  podwójny  sy  =  grzech  (  odchylenie  *  0,5  );  kwaternionu  q  ;  q  .  w  =  kr  *  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  ;  zwróć  q  ;  } 

Konwersja kwaternionów na kąty Eulera (w sekwencji 3-2-1).

Istnieje bezpośredni wzór na konwersję z kwaternionu na kąty Eulera w dowolnej z 12 możliwych sekwencji. W pozostałej części tej sekcji zostanie pokazany wzór na sekwencję Ciało 3-2-1 . Jeśli kwaterniony są odpowiednio znormalizowane , kąty Eulera można otrzymać z kwaternionów za pomocą relacji:

Jednak funkcje arctan zaimplementowane w językach komputerowych dają wyniki tylko między −π/2 a π/2 , aby wygenerować wszystkie orientacje potrzebne do zastąpienia funkcji arctan w kodzie komputerowym przez atan2 :

Co więcej, typowe implementacje arctan mogą również mieć pewne wady liczbowe w pobliżu zera i jeden. Niektóre implementacje używają równoważnego wyrażenia:

Kod źródłowy

Poniższy program C++ ilustruje powyższą konwersję:


 

  
        


  
       




   
     

    
               
                 
       

    
                 
                 
             

    
               
                 
       

     
 #define _USE_MATH_DEFINES  #include  <cmath>  struct  Quaternion  {  double  w  ,  x  ,  y  ,  z  ;  };  struct  EulerAngles  {  podwójny  obrót  ,  skok  ,  odchylenie  ;  };  // ta implementacja zakłada znormalizowany quaternion  // konwertuje na kąty Eulera w sekwencji 3-2-1  EulerAngles  ToEulerAngles  (  Quaternion  q  )  {  EulerAngles  kąty  ;  // roll (obrót w osi x)  double  sinr_cosp  =  2  *  (  q  .  w  *  q  .  x  +  q  .  y  *  q  .  z  );  podwójne  cosr_cosp  =  1  -  2  *  (  q  .  x  *  q  .  x  +  q  .  y  *  q  .  y  );  kąty  .  roll  =  std  ::  atan2  (  sinr_cosp  ,  cosr_cosp  );  // skok (obrót w osi y)  double  sinp  =  std  ::  sqrt  (  1  +  2  *  (  q  .  w  *  q  .  y  -  q  .  x  *  q  .  z  ));  double  cosp  =  std  ::  sqrt  (  1  -  2  *  (  q  .  w  *  q  .  y  -  q  .  x  *  q  .  z  ));  kąty  .  skok  =  2  *  std  ::  atan2  (  sinp  ,  cosp  )  -  M_PI  /  2  ;  // yaw (obrót w osi Z)  double  siny_cosp  =  2  *  (  q  .  w  *  q  .  z  +  q  .  x  *  q  .  y  );  podwójne  cosy_cosp  =  1  -  2  *  (  q  .  y  *  q  .  y  +  q  .  z  *  q  .  z  );  kąty  .  odchylenie  =  std  ::  atan2  (  siny_cosp  ,  cosy_cosp  );  kąty  powrotu  ;  } 

Osobliwości

Należy zdawać sobie sprawę z osobliwości w parametryzacji kąta Eulera, gdy nachylenie zbliża się do ±90° (biegun północny/południowy). Te przypadki muszą być traktowane specjalnie. Popularna nazwa tej sytuacji to gimbal lock .

Kod do obsługi osobliwości pochodzi z tej strony: www.euclideanspace.com

Obrót wektora

Zdefiniujmy skalarny wektor taki, że .

że kanoniczny sposób obracania trójwymiarowego wektora przez kwaternion definiujący Eulera odbywa się za pomocą wzoru

gdzie jest kwaternionem zawierającym osadzony wektor , jest kwaternionem sprzężonym i jest obróconym wektorem . W implementacjach obliczeniowych wymaga to mnożenia dwóch kwaternionów. Alternatywnym podejściem jest zastosowanie pary relacji

gdzie oznacza wektorowy iloczyn krzyżowy Wymaga to mniejszej liczby mnożeń i dlatego jest szybsze obliczeniowo. Testy numeryczne wskazują, że to drugie podejście może być nawet o 30% szybsze niż oryginał w przypadku rotacji wektorów.

Dowód

Ogólna zasada mnożenia kwaternionów obejmująca części skalarne i wektorowe jest podana przez

Korzystając z tej relacji, można stwierdzić, że p

i po podstawieniu na iloczyn potrójny

gdzie antyprzemienność iloczynu krzyżowego i stosowany. Następnie wykorzystując właściwość, że jest kwaternionem jednostkowym , tak że wraz ze standardową tożsamością wektora

jeden uzyskuje

v można zapisać w kategoriach skalarnych i wektorowych części jak

Zobacz też

Linki zewnętrzne