Moduł 0.5 · wprowadzenie

Kompendium matematyczne

Skrót matematyki i mechaniki niezbędnej w pozostałych modułach: wektory, macierze, SO(3), SE(3), bryła sztywna — referencja, do której wracasz w razie potrzeby.

Jak korzystać z tego modułu

Ten moduł to skrót matematyki i mechaniki potrzebnej w pozostałych modułach aplikacji. Nie jest to pełny wykład — to referencja do której wracasz, gdy w którymś z modułów pojawi się wzór, który Cię zaskoczy.

Inspirację stanowi pierwszy rozdział „Modelowania i sterowania robotów" Kozłowskiego — taki sam mini-słownik narzędzi matematycznych przed wejściem w robotykę właściwą. Każda sekcja kończy się pointą „gdzie tego używasz dalej" z linkami do konkretnych modułów.

Wskazówka praktyczna

Przy pierwszym czytaniu możesz przejrzeć cały moduł raz pobieżnie, żeby zorientować się w jego zawartości. Potem wracaj wybiórczo — np. gdy w M9 zobaczysz ω×(Iω)\boldsymbol\omega\times(I\boldsymbol\omega) i chcesz przypomnieć sobie iloczyn wektorowy, wracaj do sekcji „Wektory 3D". Każdy krok jest klikalny w nagłówku — zwiniesz/rozwiniesz osobno.

Krok 1

Wektory 3D — iloczyn skalarny, wektorowy, norma

Podstawowe operacje

Dla wektorów a,bR3\mathbf{a}, \mathbf{b} \in \mathbb{R}^3:

  • Iloczyn skalarny (dot product) — daje liczbę: ab=axbx+ayby+azbz=abcosθ\mathbf{a}\cdot\mathbf{b} = a_x b_x + a_y b_y + a_z b_z = |\mathbf{a}||\mathbf{b}|\cos\theta. Mierzy „jak bardzo dwa wektory wskazują w tę samą stronę". Zero ⟺ prostopadłe.
  • Iloczyn wektorowy (cross product) — daje wektor prostopadły do obu, o długości równej polu równoległoboku rozpiętego przez nie: a×b=absinθ|\mathbf{a}\times\mathbf{b}| = |\mathbf{a}||\mathbf{b}|\sin\theta.
  • Norma (długość): a=ax2+ay2+az2=aa|\mathbf{a}| = \sqrt{a_x^2 + a_y^2 + a_z^2} = \sqrt{\mathbf{a}\cdot\mathbf{a}}.
|a×b| = poleaba × b0Iloczyn wektorowy• prostopadły do a i b• długość = pole• kierunek: prawa dłoń|a×b| = |a||b| sin θ(θ — kąt między)a × b = -b × a(antysymetryczne)a × a = 0(zerowy kąt → pole 0)

Wzór jawny dla iloczynu wektorowego:

a×b=[aybzazbyazbxaxbzaxbyaybx]\mathbf{a}\times\mathbf{b} = \begin{bmatrix} a_y b_z - a_z b_y \\ a_z b_x - a_x b_z \\ a_x b_y - a_y b_x \end{bmatrix}
▸ Mnemonik: rozwinięcie wyznacznika 3×3

Łatwy do zapamiętania zapis przez wyznacznik formalny:

a×b=det[x^y^z^axayazbxbybz]\mathbf{a}\times\mathbf{b} = \det\begin{bmatrix} \hat{x} & \hat{y} & \hat{z} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \end{bmatrix}

Rozwijając wzdłuż pierwszego wiersza dostajesz dokładnie 3 składowe z wzoru wyżej. To trick dydaktyczny — formalnie macierz nie jest „liczbowa" (zawiera wektory bazy), ale operacja rozwinięcia daje poprawny wynik.

Gdzie tego używasz dalej: iloczyn wektorowy w M3 (Jakobiany) — kolumna jakobianu dla przegubu obrotowego ma postać z^i×(pnpi)\hat z_i \times (\mathbf{p}_n - \mathbf{p}_i); w M9 (Newton-Euler) człon żyroskopowy ω×(Iω)\boldsymbol\omega\times(I\boldsymbol\omega) i prawie każdy człon propagacji prędkości.

Krok 2

Macierze — mnożenie, transpozycja, wyznacznik

Mnożenie

Dla ARm×nA \in \mathbb{R}^{m\times n} i BRn×pB \in \mathbb{R}^{n\times p} wynik C=ABC = AB ma wymiar m×pm \times p, a element:

Cij=k=1nAikBkjC_{ij} = \sum_{k=1}^{n} A_{ik}\,B_{kj}

Czyli element (i, j) wyniku to iloczyn skalarny i-tego wiersza A z j-tą kolumną B. Kolejność ma znaczenie: ABBAAB \neq BA w ogólności. To podstawowa przyczyna trudności DH (kolejność transformacji ważna).

Transpozycja

(A)ij=Aji(A^\top)_{ij} = A_{ji} — odbicie względem przekątnej. Ważna tożsamość: (AB)=BA(AB)^\top = B^\top A^\top (kolejność się odwraca!).

Wyznacznik — geometrycznie

Dla macierzy kwadratowej ARn×nA \in \mathbb{R}^{n\times n} wyznacznik detA\det A to czynnik skalujący objętość: jeśli jednostkowy n-sześcian zostanie odwzorowany przez A, to powstaje równoległoboczy obiekt o objętości detA|\det A|. Znak mówi czy orientacja została zachowana (+) czy odwrócona (−).

Konsekwencja praktyczna: detA=0\det A = 0 ⟺ A jest osobliwa (singular) — odwzorowuje przestrzeń do mniejszego wymiaru, nie jest odwracalna. To dokładnie definicja singularności kinematycznej w robotyce (jakobian J ma detJ=0\det J = 0).

Odwrotność i ortogonalność

A1A^{-1} spełnia AA1=A1A=IA A^{-1} = A^{-1} A = I. Istnieje tylko gdy detA0\det A \neq 0.

Macierz ortogonalna: QQ=IQ^\top Q = I, czyli Q1=QQ^{-1} = Q^\top. Ogromnie tanie odwracanie — zamiast wywoływać numeryczną inwersję (eliminacja Gaussa, koszt O(n3)O(n^3)), wystarczy przepisać współrzędne. Wszystkie macierze rotacji są ortogonalne — stąd w kodzie zawsze widzisz R^T a nie inv(R).

Gdzie tego używasz dalej: mnożenie macierzy w każdej FK (T_0^n = T_0^1 · T_1^2 · …); transpozycja zamiast inwersji w wszystkich modułach kinematyki (R^T = R⁻¹); wyznacznik J w M7 (singularności).

Krok 3

SO(3) — macierze rotacji

Grupa SO(3)SO(3) (Special Orthogonal Group w 3D) to zbiór macierzy 3×3 spełniających dwa warunki:

RR=I(ortogonalnosˊcˊ),detR=+1(zachowuje orientację)R^\top R = I \quad \text{(ortogonalność)}, \qquad \det R = +1 \quad \text{(zachowuje orientację)}

To dokładnie 3 stopnie swobody (np. 3 kąty Eulera albo oś + kąt). Pomimo że R ma 9 elementów, tylko 3 są niezależne — pozostałe 6 jest wymuszonych przez ograniczenia ortogonalności.

Trzy elementarne rotacje

Rotacja wokół osi x o kąt α:

Rx(α)=[1000cosαsinα0sinαcosα]R_x(\alpha) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\alpha & -\sin\alpha \\ 0 & \sin\alpha & \cos\alpha \end{bmatrix}

Wokół y o β:

Ry(β)=[cosβ0sinβ010sinβ0cosβ]R_y(\beta) = \begin{bmatrix} \cos\beta & 0 & \sin\beta \\ 0 & 1 & 0 \\ -\sin\beta & 0 & \cos\beta \end{bmatrix}

Wokół z o γ:

Rz(γ)=[cosγsinγ0sinγcosγ0001]R_z(\gamma) = \begin{bmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \end{bmatrix}

Składanie: rotacja „najpierw wokół z o γ, potem wokół y o β, potem wokół x o α" to mnożenie macierzy w kolejności od prawej do lewej:

R=Rx(α)Ry(β)Rz(γ)R = R_x(\alpha) \, R_y(\beta) \, R_z(\gamma)

Ta kolejność (xyz „intrinsic" vs „extrinsic", zyx itd.) to klasyczna pułapka — dlatego w aplikacji konsekwentnie używamy kwaternionów jako reprezentacji wewnętrznej, a kątów Eulera tylko do UI.

Gdzie tego używasz dalej: M8 (Reprezentacje orientacji) — pełne porównanie macierzy rotacji, kątów Eulera, axis-angle i kwaternionów, z interaktywnym demo gimbal-locka.

Krok 4

Macierz skew-symmetric — iloczyn wektorowy jako mnożenie

Dla wektora a=(ax,ay,az)\mathbf{a} = (a_x, a_y, a_z)^\top definiujemy macierz skew-symmetric (antysymetryczną) [a]×[\mathbf{a}]_\times:

[a]×  =  [0azayaz0axayax0][\mathbf{a}]_\times \;=\; \begin{bmatrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \end{bmatrix}

Kluczowa własność: iloczyn wektorowy zapisuje się jako mnożenie macierzy:

  a×b  =  [a]×b  \boxed{\;\mathbf{a}\times\mathbf{b} \;=\; [\mathbf{a}]_\times\,\mathbf{b}\;}

Dlaczego to istotne? Bo pozwala traktować iloczyn wektorowy jako operację liniową, co odblokowuje cały aparat algebry liniowej (diagonalizacja, wartości własne, gradient). W jakobianach manipulatora kolumny zawierają [z^i]×r[\hat{z}_i]_\times \mathbf{r} — dzięki temu sam jakobian J jest macierzą, którą można odwracać/pseudoinwertować.

▸ Dlaczego nazwa „skew-symmetric"?

Macierz symetryczna spełnia A=AA = A^\top. Macierz skew-symmetric (antysymetryczna) spełnia A=AA = -A^\top. Tu rzeczywiście — sprawdź transponując [a]×[\mathbf{a}]_\times wyżej, każdy element zamienia znak.

Konsekwencja: skew-symmetric matrix ma zerową przekątną i tylko 3 niezależne elementy (powyżej przekątnej), co dokładnie odpowiada 3 składowym wektora a\mathbf{a}. Stąd bijekcja:

R3    so(3)(algebra Liego SO(3))\mathbb{R}^3 \;\cong\; \mathfrak{so}(3) \quad \text{(algebra Liego SO(3))}

Gdzie tego używasz dalej: M3 — kolumny jakobianu jako Ji=[[z^i]×r;  z^i]J_i = [\,[\hat z_i]_\times \mathbf{r};\;\hat z_i]; M9 — propagacja momentu pędu i implementacja iloczynów wektorowych w kodzie (Newton-Euler korzysta wprost z [w]× v).

Krok 5

SE(3) — macierze jednorodne 4×4

Grupa SE(3)SE(3) (Special Euclidean Group w 3D) opisuje transformacje sztywne — rotacje + translacje. Naturalna reprezentacja: para (R,t)(R, \mathbf{t}) gdzie RSO(3)R \in SO(3), tR3\mathbf{t} \in \mathbb{R}^3. Razem 6 stopni swobody (3 rotacji + 3 translacje).

Po co macierz 4×4 zamiast pary (R, t)?

Pojedyncza transformacja punktu p\mathbf{p}:

p=Rp+t\mathbf{p}' = R\,\mathbf{p} + \mathbf{t}

To nie jest mnożenie macierzowe, bo dochodzi addytywne +t+\mathbf{t}. Składanie dwóch transformacji wymaga wtedy osobnej formuły:

(R2,t2)(R1,t1)=(R2R1,  R2t1+t2)(R_2, \mathbf{t}_2) \circ (R_1, \mathbf{t}_1) = (R_2 R_1,\; R_2 \mathbf{t}_1 + \mathbf{t}_2)

Sztuczka: dodajemy „wirtualną" czwartą współrzędną równą 1 i pakujemy R i t w jedną macierz 4×4. Wtedy zarówno transformacja punktu, jak i składanie transformacji sprowadzają się do zwykłego mnożenia macierzy:

T ∈ SE(3)R3 × 3t3 × 10  0  0  1macierz 4 × 4Składowe T:R— macierz rotacji R ∈ SO(3), RᵀR = It— wektor translacji t ∈ ℝ³[0 0 0 1] „padding" dla mnożeniaT = R + t złożone w jedenobiekt → T₁·T₂ = składanie

Punkt zapisujemy jako wektor 4-elementowy p~=(px,py,pz,1)\tilde{\mathbf{p}} = (p_x, p_y, p_z, 1)^\top (wektor jednorodny):

p~=Tp~[p1]=[Rt01][p1]\tilde{\mathbf{p}}' = T\,\tilde{\mathbf{p}} \quad\Leftrightarrow\quad \begin{bmatrix} \mathbf{p}' \\ 1 \end{bmatrix} = \begin{bmatrix} R & \mathbf{t} \\ \mathbf{0}^\top & 1 \end{bmatrix} \begin{bmatrix} \mathbf{p} \\ 1 \end{bmatrix}

Składanie wielu transformacji to teraz po prostu iloczyn macierzy: T0n=T01T12Tn1nT_0^n = T_0^1 \cdot T_1^2 \cdots T_{n-1}^n — i o to chodziło. Dlatego cała kinematyka manipulatora opiera się na tej reprezentacji (DH zwraca macierze 4×4).

Gdzie tego używasz dalej: M0, M1 i każdy moduł kinematyki — wszystko czego dotyka FK manipulatora jest mnożeniem macierzy 4×4.

Krok 6

Bryła sztywna — prędkość punktu

Bryła sztywna to ciało, w którym odległości między dowolnymi dwoma punktami są niezmienne w czasie. Może się obracać i poruszać (translacja+rotacja jako całość), ale nie deformować.

Kluczowy wzór: jeśli środek bryły O porusza się z prędkością vO\mathbf{v}_O, a bryła obraca się z prędkością kątową ω\boldsymbol\omega, to prędkość dowolnego punktu P położonego względem O w odległości r\mathbf{r} wynosi:

  vP  =  vO+ω×r  \boxed{\;\mathbf{v}_P \;=\; \mathbf{v}_O + \boldsymbol\omega\times\mathbf{r}\;}
rv_OωOPω×rv_PBryła sztywna:v_P = v_O + ω × r

Pierwsza składowa (vO\mathbf{v}_O) — wspólna dla wszystkich punktów bryły (translacja jako sztywne ciało). Druga (ω×r\boldsymbol\omega\times\mathbf{r}) — dodatkowy ruch z powodu obrotu wokół O, prostopadły do r i do osi obrotu.

Przyspieszenie — analogicznie ale z dwoma członami

Różniczkując wzór na prędkość po czasie dostajemy:

aP  =  aO+ε×r+ω×(ω×r)\mathbf{a}_P \;=\; \mathbf{a}_O + \boldsymbol\varepsilon\times\mathbf{r} + \boldsymbol\omega\times(\boldsymbol\omega\times\mathbf{r})

Trzy składowe: dziedziczone aO\mathbf{a}_O, tangencjalne (od ε\boldsymbol\varepsilon — przyspieszenia kątowego), dośrodkowe (od ω2\boldsymbol\omega^2 — zawsze skierowane do osi obrotu).

Gdzie tego używasz dalej: M9 (Dynamika Newton-Euler) dokładnie te dwa wzory są stosowane do propagacji ω, ε, v, a od jednego ogniwa do następnego w forward sweep. Wzór na prędkość punktu wraca w każdym kroku 2–3 algorytmu. Bez niego dynamika manipulatora nie ma sensu.

Ściąga formuł — minimum minimorum

Najczęściej powracające wzory, zebrane w jednym miejscu:

OperacjaWzór
Iloczyn skalarnyab=abcosθ\mathbf{a}\cdot\mathbf{b} = |\mathbf{a}||\mathbf{b}|\cos\theta
Iloczyn wektorowy (norma)a×b=absinθ|\mathbf{a}\times\mathbf{b}| = |\mathbf{a}||\mathbf{b}|\sin\theta
Iloczyn wektorowy (macierz)a×b=[a]×b\mathbf{a}\times\mathbf{b} = [\mathbf{a}]_\times\,\mathbf{b}
Macierz ortogonalnaQQ=I,  Q1=QQ^\top Q = I,\; Q^{-1} = Q^\top
Transpozycja iloczynu(AB)=BA(AB)^\top = B^\top A^\top
SE(3) — punkt jednorodnyp~=Tp~\tilde{\mathbf{p}}' = T\,\tilde{\mathbf{p}}
Prędkość punktu na brylevP=vO+ω×r\mathbf{v}_P = \mathbf{v}_O + \boldsymbol\omega\times\mathbf{r}
Przyspieszenie punktu na bryleaP=aO+ε×r+ω×(ω×r)\mathbf{a}_P = \mathbf{a}_O + \boldsymbol\varepsilon\times\mathbf{r} + \boldsymbol\omega\times(\boldsymbol\omega\times\mathbf{r})

Co dalej

Mając te narzędzia, jesteś gotów na pozostałe moduły: