Strategia matematyczna
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