Rodziny shoulder × elbow × wrist — wszystkie rozwiązania zamknięte obok siebie.
Moduł 1 wyprowadzał rozwiązanie zamknięte punkt po punkcie. Tu celem jest operacyjne zapanowanie nad zbiorem rozwiązań: zobaczyć jednocześnie, jak kombinacje znaków gałęzi manifestują się jako osiem różnych poz ramienia osiągających tę samą pozę efektora — i przekonać się, co się dzieje, gdy robot ślizga się po trajektorii między konfiguracjami, w których część gałęzi znika.
Dla niektórych par (shoulder, elbow) dyskryminant łokcia bywa ujemny — cel jest poza osiągalnością tej kombinacji, a w zbiorze znajduje się mniej niż 8 rozwiązań.
Sterownik po lewej generuje pozę docelową (zrzut z kontrolera kopiuje bieżące robota sterowanego ręcznie). Poniżej 8 rozwiązań pokazanych jednocześnie — każde innym kolorem, zgodnie z legendą w selektorze gałęzi. Punkt czerwony = wspólny cel TCP.
| widoczne | gałąź | q₁ | q₂ | q₃ | q₄ | q₅ | q₆ | ‖Δp‖ | ΔR | akcja |
|---|---|---|---|---|---|---|---|---|---|---|
| shoulder R · elbow ↑ · wrist □ | 2.8° | -77.7° | 6.8° | -171.5° | 19.3° | -8.0° | 6.2e-17 | 0.0e+0 | ||
| shoulder R · elbow ↑ · wrist ⟲ | 2.8° | -77.7° | 6.8° | 8.5° | -19.3° | 172.0° | 6.2e-17 | 0.0e+0 | ||
| shoulder R · elbow ↓ · wrist □ | 2.8° | 16.4° | -181.4° | -2.9° | 75.0° | -179.2° | 6.2e-17 | 0.0e+0 | ||
| shoulder R · elbow ↓ · wrist ⟲ | 2.8° | 16.4° | -181.4° | 177.1° | -75.0° | 0.8° | 6.2e-17 | 0.0e+0 | ||
| shoulder L · elbow ↑ · wrist □ | -149.4° | 163.6° | 6.8° | 149.0° | 81.7° | -175.0° | 1.6e-16 | 0.0e+0 | ||
| shoulder L · elbow ↑ · wrist ⟲ | -149.4° | 163.6° | 6.8° | -31.0° | -81.7° | 5.0° | 1.6e-16 | 0.0e+0 | ||
| shoulder L · elbow ↓ · wrist □ | -149.4° | -102.3° | -181.4° | 68.2° | 33.2° | -64.4° | 1.5e-16 | 0.0e+0 | ||
| shoulder L · elbow ↓ · wrist ⟲ | -149.4° | -102.3° | -181.4° | -111.8° | -33.2° | 115.6° | 1.5e-16 | 0.0e+0 |
Kolumny ‖Δp‖ i ΔR to residuum walidacyjne: norma różnicy pozycji [m] oraz kąt obrotu między a [rad]. Dla rozwiązania analitycznego wartości są rzędu — błąd precyzji zmiennoprzecinkowej, nie metody.
Każda gałąź definiuje ciągłą funkcję , ale jej dziedzina — fragment przestrzeni kartezjańskiej, w którym gałąź zachowuje sens — jest ograniczona. Na granicy dziedziny , dwa rozwiązania łokcia zlewają się w jedno, a prędkość przegubowa dąży do nieskończoności (singularność barku/łokcia). Na trajektorii widać to jako „zatrzymanie" niektórych gałęzi i pojawienie się innych.
Gdy solver zwraca zbiór rozwiązań, sterownik robota musi wybraćjedno. Klasyczna heurystyka — minimalizacja przemieszczenia przegubowego względem bieżącej konfiguracji:
gdzie to zbiór 8 (lub mniej) rozwiązań, a — wagi per przegub (często , ale można penalizować duże obroty bazy).
Funkcja to zawinięcie kąta do przedziału . Formalnie:
Dlaczego jej używamy? Kąty i toten sam fizyczny obrót przegubu, ale bez zawinięcia ich różnica wynosiłaby i przykłamała minimalizację. Np. zwykła różnica , ale rzeczywisty „najkrótszy ruch" między tymi położeniami to — i dopiero po zawinięciu do dostajemy poprawną wartość.
Kryteria dodatkowe selekcji rozwiązania:
Żadne z tych kryteriów nie jest częścią właściwego IK — to post-processing, który przenosimy na poziom planowania ruchu.
Kluczowa obserwacja tego modułu: rozwiązanie zamknięte jest dokładne, ale wielokrotne. Sterownik, który ślepo bierze pierwsze rozwiązanie z listy — lub wybiera je przez porównanie z aktualnymi bez zawijania kątów do — wygeneruje skokowe, nieciągłe trajektorie. W modułach 3–4 zobaczymy, jak solvery iteracyjne (Jakobianowe, optymalizacyjne) z zasady generują jedną, ciągłą gałąź — kosztem dokładności i odporności na singularności.