Macierz rotacji, kąty Eulera, axis-angle, wektor rotacji, kwaterniony, konwersje, gimbal lock, kiedy czego używać.
Pozycja w 3D to wektor, trzy liczby, koniec. Z orientacją jest inaczej: jedna i ta sama orientacja może być zapisana co najmniej na pięć różnych sposobów, każdy z innymi zaletami i wadami. Brak „uniwersalnego" zapisu, który byłby najlepszy do wszystkiego, używamy różnych w różnych sytuacjach:
Każda z tych reprezentacji opisuje element grupy , zbioru obrotów w 3D. Sama grupa to obiekt 3-wymiarowy (3 stopnie swobody), ale różne sposoby jej sparametryzowania używają różnej liczby liczb (3, 4 lub 9) z różnymi ograniczeniami.
Cel tego modułu: zrozumieć każdą z reprezentacji na poziomie intuicyjnym i obliczeniowym, znać pułapki (gimbal lock!), umieć sprawnie konwertować między nimi i wybrać właściwą do zadania.
Trzy slidery RPY definiują tę samą orientację w 3D. Po prawej zobacz ją zapisaną w pięciu reprezentacjach jednocześnie. Manipuluj suwakami i obserwuj, które liczby się zmieniają i jak (kwaterniony chodzą gładko zawsze; kąty Eulera mają nieciągłości przy pitch = ±90°; macierz zawsze ortogonalna).
0.3536 -0.5732 0.7392 0.6124 0.7392 0.2803 -0.7071 0.3536 0.6124
Najbardziej bezpośrednia reprezentacja: macierz , której kolumny to obrazy bazowych wektorów osi po rotacji:
Cechy: 9 liczb, ale z 6 ograniczeniami:
Algebraicznie: oraz . Inwersja jest banalnie tania:
Zalety: kompozycja rotacji = zwykłe mnożenie macierzowe (). Transformacja wektora, zwykłe . Forma używana w 99% wzorów kinematyki (FK, jakobian, równania DH).
Wady:
Reprezentujemy rotację jako kompozycję trzech obrotów wokół osi. Najczęściej używane w robotyce: roll, pitch, yaw (przechylenie, pochylenie, odchylenie), kolejność osi ZYX intrinsic:
Słownie: najpierw obracamy wokół osi X (roll), potem wokół nowej osi Y (pitch), na końcu wokół najnowszej osi Z (yaw). Jeśli czytasz macierze od prawej do lewej, to jest właśnie ta kolejność.
Zalety: tylko 3 liczby (minimalna parametryzacja). Łatwo wpisać w panel, łatwo zinterpretować geometrycznie. Standardowy sposób komunikacji człowiek-robot.
Wady, patologie:
„Kąty Eulera" to nie jeden zapis, to cała rodzina. Różnią się kolejnością osi (XYZ, ZYX, ZYZ, ZXZ, …) i tym, czy obroty są intrinsic (wokół osi obracanego ciała) czy extrinsic (wokół osi nieruchomego świata):
Praktyczna porada: zawsze dokumentuj, którą konwencję używasz. „RPY" w robotyce zwykle oznacza ZYX intrinsic (ROS, MoveIt, OpenRAVE), ale w lotnictwie i grafice 3D bywa różnie. Konwersja źle dopasowanych konwencji to klasyczne źródło bugów w integracji z czujnikami i bibliotekami zewnętrznymi.
Każda rotacja w 3 wymiarach to złożenie obrotów wokół trzech osi. Wyobraź sobie żyroskop z trzema obręczami, każda umożliwia obrót wokół innej osi, połączone w łańcuch. Gimbal lock zachodzi, gdy dwie z tych osi się pokrywają:
Spróbuj: ustaw pitch ≈ 90°. Czerwona (yaw) i niebieska (roll) obręcze zaczynają obracać się wokół tej samej osi, tracisz jeden stopień swobody. Zmiana yaw daje teraz to samo co zmiana roll. To jest gimbal lock, nieusuwalna patologia kątów Eulera.
Gimbal lock w fizycznym żyroskopie utrudnia pracę pilotom (znany problem w Apollo 11), a w robotyce destabilizuje regulatory posługujące się kątami Eulera w okolicach pitch ≈ ±90°. Rozwiązanie: używać kwaternionów lub macierzy rotacji jako reprezentacji wewnętrznej (kąty Eulera tylko do wejścia/wyjścia interfejsu użytkownika).
Twierdzenie Eulera o obrotach: każdy obrót w 3D można opisać jako jeden obrót o pewien kąt θ wokół jednej osi k̂. To jest fakt geometryczny, stosuje się również do złożenia 100 wcześniejszych obrotów.
Kierunek rotacjiwokół osi określamy regułą prawej ręki: jeśli kciuk wskazuje wzdłuż osi k̂, palce wskazują kierunek obrotu dla θ > 0. Ta sama konwencja definiuje orientację układu współrzędnych prawoskrętnego (X×Y = Z):
Wzór Rodriguesa (axis-angle → macierz):
gdzie to macierz antysymetryczna z osi k̂:
Połącz oś i kąt w jeden wektor 3-wymiarowy:
Długość wektora = kąt obrotu, kierunek = oś. To jest logarytm SO(3) w sensie algebr Liego, używamy go jako twist error w solverach iteracyjnych (moduł 3) oraz jako standard w OpenCV (cv::Rodrigues) i ROS.
Zalety: 3 liczby, gładkie odwzorowanie w okolicy zera (identyczność). Idealne do reprezentacji małych rotacji (np. w iteracjach IK lub korekcjach dryfu IMU).
Wady: nieciągłe przy θ → 0 (oś staje się nieokreślona, choć produkt θ·k̂ pozostaje gładki) i przy θ → π (dwie antypodalne osie dają tę samą rotację).
Najsubtelniejsza, ale najbardziej praktyczna reprezentacja. Kwaternion to czwórka liczb:
z mnożeniem zdefiniowanym przez Hamiltona (1843). Dla kwaternionów jednostkowych () istnieje piękna tożsamość, każdy obrót w 3D zapisuje się jako:
(, jak w axis-angle). Cztery liczby z jednym ograniczeniem (norma = 1) → 3 stopnie swobody, tyle ile trzeba.
Kompozycja rotacji = mnożenie kwaternionów (po regułach Hamiltona):
Inwersja = sprzężenie (zmień znak części urojonej):
Sferyczna interpolacja liniowa (Spherical Linear Interpolation, Shoemake 1985), gładkie przejście między dwoma orientacjami i :
gdzie = kąt między i w 4D. Wynik: stała prędkość kątowa od początku do końca, krótszą stroną sfery 4D. Spróbuj zinterpolować dwie orientacje suwakami w eksploratorze powyżej, kwaterniony dają zawsze ciągłą interpolację, natomiast kąty Eulera tracą ciągłość przy ±180°.
| Sytuacja | Najlepsza reprezentacja | Dlaczego |
|---|---|---|
| FK, transformacje punktów, jakobian | Macierz | Bezpośrednie mnożenie macierzy z wektorami |
| Wejście/wyjście z user interface | Kąty Eulera (RPY) | Człowiek rozumie „przekręć o 30°" |
| Twist error w solverach iteracyjnych | Wektor rotacji (log SO(3)) | 3 liczby, gładkie w okolicach 0, dodawanie ma sens |
| Interpolacja trajektorii | Kwaternion (SLERP) | Gładkie, stała prędkość kątowa, brak singularności |
| Składanie wielu rotacji w łańcuchu | Kwaternion | Tańsze i numerycznie stabilniejsze niż macierze |
| Komunikacja z OpenCV / ROS / niskopoziomowe sterowanie | Wektor rotacji lub kwaternion | Standardy bibliotek |
| Prezentacja / wizualizacja / GUI | Kąty Eulera (intuicyjnie) lub axis-angle | Czytelne dla człowieka |
| Małe korekcje (np. dryf IMU) | Wektor rotacji | Dodawanie ma sens dla małych , brak nieciągłości |
Wszystkie cztery „minimalne" reprezentacje (Eulera, axis-angle, wektor rotacji, kwaternion) to różne sposoby parametryzowania rozmaitości . Wektor rotacji ma szczególne znaczenie, jest wykładniczą mapą algebry Liego:
Tu i to macierzowe wykładnicze i logarytm. Wzór Rodriguesa to jest po prostu rozwinięcie szeregu Taylora dla exp na macierzach antysymetrycznych. Ten związek pozwala uogólniać metody numeryczne (np. „średnia" rotacji = średnia ich logów + powrót do SO(3) przez exp). Temat dla osobnego wykładu, w robotyce wystarczy wiedzieć, że istnieje i że biblioteki typu scipy.spatial.transform czy Sophus (C++) udostępniają te operacje gotowe.
Po tym module powinno być znacznie jaśniejsze, dlaczego w module 3 (jakobianowych) używamy logarytmu SO(3) jako twist error, a w module 1 (analitycznym), bezpośrednio elementów macierzy R. Każda decyzja o reprezentacji ma swoje uzasadnienie. Praktyczna wskazówka na koniec: jeśli pracujesz nad kontrolerem robota, silnikiem 3D albo systemem AR/VR, zacznij od zaimplementowania klasy Rotation ze wszystkimi pięcioma reprezentacjami (jak scipy.spatial.transform.Rotation albo three.js Quaternion) i konsekwentnie używaj tylko jednej wewnętrznej, konwertując na granicy.