Moduł 03 · Podstawy

Reprezentacja problemu i przestrzeni

C-space vs task-space, SDF/TSDF/octree, FCL/Warp/cuRobo, metryki w C-space (L2, ważone, Riemannowskie), formalizacja problemu planowania.

TL;DR

Wszystkie algorytmy planowania operują na czymś, co nazywamy przestrzenią — ale ta przestrzeń ma co najmniej cztery różne sensy, które łatwo pomylić:

  1. Task-space (T\mathcal{T}) — przestrzeń zadania, fizyczna scena 3D w której operuje robot. Przeszkody są tu „naturalne".
  2. C-space (Q\mathcal{Q}) — przestrzeń konfiguracji, gdzie robot jest punktem. Algorytmy grafowe i próbkowe pracują tutaj.
  3. Obstacle representation — jak zakodować przeszkody (SDF, occupancy grid, mesh, point cloud), żeby pytania kolizji / odległości były szybkie.
  4. Metryka — co znaczy „dwa stany są blisko" w C-space. Wybór metryki wpływa na każdy planer.

Ten moduł ustala formalizm i pokazuje wizualnie najważniejszą transformację: task-space ↦ C-space.

C-space vs task-space — klasyczna transformacja

Co znaczy „robot jest punktem w C-space"?

W task-space (świecie fizycznym) robot ma kształt: link0 to walec, link1 to ogniwo z motorem, gripper z palcami. Zajmuje objętość 3D.

W C-space patrzymy inaczej: cała poza robota jest zakodowana w wektorze liczb (kątach przegubów). Dla 2-link arm: dwie liczby (q1,q2)(q_1, q_2). Dla Pandy: siedem liczb (q1,,q7)(q_1, \ldots, q_7). Każda taka konfiguracja to jeden PUNKT w przestrzeni odpowiedniego wymiaru:

  • 2-link arm: punkt w 2D-płaszczyźnie (zielona kropka na prawym panelu demo poniżej)
  • Panda: punkt w 7-wymiarowej przestrzeni R7\mathbb{R}^7
  • Humanoidalny robot z 30 DOF: punkt w R30\mathbb{R}^{30}

Po co ta abstrakcja? Bo wtedy problem planowania ruchu sprowadza się do znalezienia ciągłej krzywej od punktu start do punktu goal w C-space, omijającej przeszkody. To klasyczne zadanie geometryczne, dla którego mamy bogatą teorię (grafowe, próbkowe, optymalizacja — kolejne moduły 05–07).

Pułapka: w task-space „przeszkoda" to fizyczny obiekt. W C-space „C-obstacle" to zbiór tych konfiguracji, w których fizyczna geometria robota przecina się z przeszkodą. Ma zwykle bardziej skomplikowany kształt niż oryginalna przeszkoda — zobacz demo poniżej (prostokąt po lewej → niewypukła czerwona figura po prawej).

Formalnie: konfiguracja robota qQq \in \mathcal{Q} jednoznacznie określa geometrię robota Geom(q)T\mathrm{Geom}(q) \subset \mathcal{T}. Konfiguracja jest „bezpieczna" gdy Geom(q)\mathrm{Geom}(q) nie przecina się z żadną przeszkodą — czyli Geom(q)Tobs=\mathrm{Geom}(q) \cap \mathcal{T}_{\text{obs}} = \emptyset. Zbiór wszystkich bezpiecznych konfiguracji to Qfree\mathcal{Q}_{\text{free}}, a dopełnienie — Qobs\mathcal{Q}_{\text{obs}} (C-obstacle).

Qobs={qQ:Geom(q)Tobs},Qfree=QQobs\mathcal{Q}_{\text{obs}} = \{q \in \mathcal{Q} \,:\, \mathrm{Geom}(q) \cap \mathcal{T}_{\text{obs}} \neq \emptyset\}, \quad \mathcal{Q}_{\text{free}} = \mathcal{Q} \setminus \mathcal{Q}_{\text{obs}}

W demo poniżej: przeciągnij myszą czerwoną przeszkodę w lewym panelu (task-space). W prawym panelu zobaczysz, jak zmienia się Qobs\mathcal{Q}_{\text{obs}} dla 2-link arm — czerwone obszary to konfiguracje powodujące kolizję. Możesz też kliknąć w prawym panelu żeby ustawić bieżącą (q1,q2)(q_1, q_2) — robot z lewej strony przemieści się odpowiednio.

Task-space → C-space (klasyczna ilustracja)

task-space (świat) — przeciągnij prostokąt
C-space (q₁, q₂) — kliknij/przeciągnij by ustawić konfigurację
q₁ →q₂ ↑(-π, -π)(π, π)
Co zauważyć: prosta wypukła przeszkoda po lewej generuje skomplikowaną, niewypukłą figurę po prawej. Mała translacja przeszkody w task-space może drastycznie zmienić topologię C-obstacle. Dlatego klasyczne planowanie (deklaratywna konstrukcja 𝓠_obs) jest niewykonalne w  wysokowymiarowych C-space — Panda ma 𝓠 ⊂ ℝ⁷ i tutaj zaczyna się era planerów próbkowych (moduł 06).

Co z tego wynika dla planowania w wysokich wymiarach

Konstrukcja Qobs\mathcal{Q}_{\text{obs}} w sposób deklaratywny (jak w powyższym demo — siatka, każda komórka, collision check) jest niewykonalna w wysokowymiarowych C-space:

  • Dla 2-link arm (2D C-space, 80×80 grid): 6 400 collision checks.
  • Dla Pandy (7D C-space, 80⁷ grid): 2.1 × 10¹³ checks — 1000 razy więcej niż atomów w komórce.

Dlatego planowanie w wysokowymiarowych C-space (Panda, humanoidy) opiera się na metodach próbkowych (PRM, RRT — moduł 06) lub optymalizacyjnych (CHOMP, TrajOpt — moduł 07) — żadna z nich nie konstruuje Qobs\mathcal{Q}_{\text{obs}} jawnie, tylko zapytuje o kolizję dla konkretnych qq.

Signed Distance Field — kontinuum „jak daleko do kolizji"

Binarna informacja „jest kolizja / nie ma" jest za uboga dla optymalizacji. Planery CHOMP/TrajOpt i kontrolery CBF-QP potrzebują gradientu: kierunku, w którym przesunąć stan żeby oddalić się od przeszkód. SDF tę informację daje natywnie.

Φ(p)=sgn(p)minpTobspp\Phi(p) = \mathrm{sgn}(p) \cdot \min_{p' \in \partial \mathcal{T}_{\text{obs}}} \|p - p'\|

Konwencja znaków: Φ(p)>0\Phi(p) > 0 dla wolnej przestrzeni (im większe, tym dalej od przeszkód), Φ(p)=0\Phi(p) = 0 na brzegu, Φ(p)<0\Phi(p) < 0 wewnątrz przeszkody (im bardziej ujemne, tym głębiej).

Co to jest Φ\nabla \Phi

Symbol \nabla (czytaj „nabla") to operator gradientu. Dla funkcji skalarnej Φ(p)=Φ(x,y)\Phi(p) = \Phi(x, y):

Φ(p)=(Φx,Φy)\nabla \Phi(p) = \left( \frac{\partial \Phi}{\partial x}, \frac{\partial \Phi}{\partial y} \right)

To wektor w każdym punkcie pp, wskazujący kierunek największego wzrostu Φ\Phi. W kontekście SDF: skoro Φ\Phi rośnie gdy oddalamy się od przeszkód, Φ\nabla \Phi wskazuje kierunek „uciekania" od najbliższej przeszkody.

Dlaczego wszystkie strzałki mają mniej-więcej tę samą długość? To kluczowa właściwość SDF:

Φ(p)=1wszędzie, gdzie SDF jest dobrze zdefiniowane\|\nabla \Phi(p)\| = 1 \quad \text{wszędzie, gdzie SDF jest dobrze zdefiniowane}

Intuicja: gdy posunę się o 1 cm w kierunku Φ\nabla \Phi, Φ\Phi wzrasta o 1 cm — bo to właśnie odległość od przeszkody. Stąd „jednostka zmiany pozycji = jednostka zmiany Φ", czyli Φ=1\|\nabla \Phi\| = 1. Gradient SDF niesie informację tylko o kierunku, nie o magnitudzie. W demo strzałki są rysowane ze stałą długością — to odzwierciedla ten fakt.

Wyjątki: gradient nieokreślony na „szkielecie" wolnej przestrzeni (zbiór punktów równo odległych od ≥2 przeszkód) i na brzegu (Φ=0). W praktyce uciszamy te przypadki numerycznie.

Co robi suwak „kontur Φ=c\Phi = c"

Suwak ustawia wartość cc — odległość bezpieczeństwa. Niebieska/fioletowa linia rysowana na heatmapie to level set (zbiór poziomicowy):

{p:Φ(p)=c}\{ p \,:\, \Phi(p) = c \}

czyli wszystkie punkty oddalone od najbliższej przeszkody dokładnie o cc jednostek:

  • c=0c = 0 → kontur pokrywa brzeg przeszkód (czarny)
  • c=0.05c = 0.05 → linia 0.05 (5%) jednostek na zewnątrz przeszkód — taką ścieżkę musi trzymać robot żeby zachować margines bezpieczeństwa 5%
  • c=0.02c = -0.02 → linia 2% jednostek wewnątrz przeszkody (głębokość penetracji)

Planery CBF (moduł 12) używają stałej c=εsafec = \varepsilon_{\text{safe}} jako twardego ograniczenia: trajektoria musi spełniać Φ(q(t))εsafe\Phi(q(t)) \geq \varepsilon_{\text{safe}} w każdej chwili. CHOMP (moduł 07) używa miękkiego kosztu cobs(q)=max(0,εΦ(q))2c_{\text{obs}}(q) = \max(0, \varepsilon - \Phi(q))^2 — kara rośnie kwadratowo gdy trajektoria wpada w pas bezpieczeństwa.

W demo poniżej: przesuwając suwak obserwuj jak linia konturu „pęcznieje" wokół przeszkód (większe cc) lub „obkurcza się" w ich wnętrze (ujemne cc).

Signed Distance Field — heatmap + level set + gradient

margines bezpieczeństwa c0.000
rysuje kontur Φ(p) = c — zbiór punktów oddalonych od przeszkody dokładnie o 0.000 jedn. = brzeg przeszkód
Kolor pikseli koduje wartość Φ(p)\Phi(p) — niebieskie = daleko od przeszkód (wolne), białe = na brzegu (Φ=0\Phi = 0), czerwone = wewnątrz przeszkody (Φ<0\Phi < 0, im głębiej tym ciemniej).
Strzałki wskazują Φ\nabla \Phi — kierunek największego wzrostu Φ\Phi, czyli „w którą stronę uciekać od najbliższej przeszkody". Mają zbliżoną długość bo dla SDF Φ=1\|\nabla \Phi\| = 1 (jednostkowa szybkość wzrostu — ruch o 1 jednostkę zwiększa Φ o 1). Renderujemy tylko w pasie 0 ≤ Φ ≤ 0.18 — daleko od przeszkód strzałki byłyby gęste i nieinformacyjne.
Po co to: CHOMP (moduł 07) używa Φ-\nabla \Phi jako „siły odpychającej" trajektorię od przeszkód. CBF-QP (moduł 12) wymaga Φ(q)c\Phi(q) \geq c jako twardego ograniczenia bezpieczeństwa.

Warianty w praktyce

  • TSDF (Truncated SDF) — KinectFusion / Voxblox: wartości Φ\Phi obcinane do [dmax,dmax][-d_{\max}, d_{\max}] dla oszczędności pamięci.
  • ESDF (Euclidean SDF) — FIESTA: rozszerzenie TSDF z dokładnym gradientem aż do dużych odległości; preferowane dla planowania.
  • Neural SDF — DeepSDF, NeRF-Nav: siećfθ(p)Φ(p)f_\theta(p) \approx \Phi(p); bardzo zwarte, ale inference ~ms.

Reprezentacje sceny — które do czego

Wybór reprezentacji to praktyczna decyzja inżynierska: balans między wiernością geometryczną, kosztem queries i kompatybilnością z algorytmem planującym. Tabela zawiera 7 najczęściej spotykanych opcji.

Reprezentacje sceny — porównanie

ReprezentacjaOpisZaletyWadyTypowe zastosowanie
Primitive shapesSfery, prostopadłościany, walce, kapsuły — analityczne SDF i collision check.
  • O(1) collision query
  • Łatwe analityczne gradienty
  • Małe wymagania pamięciowe
  • Aproksymują złożone obiekty (over-conservative)
  • Wymagają ręcznej dekompozycji sceny
Self-collision Pandy, prosta scena testowa, CHOMP/STOMP gdy potrzebny szybki gradient.
Triangle meshPłaska siatka trójkątów (OBJ/STL/glTF). Najpopularniejsza reprezentacja powierzchniowa.
  • Wysoka wierność geometryczna
  • Wsparcie wszystkich symulatorów
  • BVH przyspiesza queries do O(log n)
  • Brak natywnego SDF — trzeba liczyć (kosztowne)
  • Brak informacji inside/outside bez dodatkowej struktury
URDF visual meshes, FCL/HPP-FCL collision detection, kanoniczny format CAD.
Point cloudZbiór punktów z czujnika (LiDAR, RGB-D). Brak topologii.
  • Bezpośrednie wyjście percepcji
  • Adaptacyjna gęstość
  • Latwe filtrowanie / merging
  • Bez powierzchni — collision wymaga aproksymacji
  • Szum, brakujące fragmenty
  • Trudno o ciągłą reprezentację
On-line mapping (Octomap, Voxblox), planowanie z surowych sensorów.
Occupancy grid / voxelDyskretna siatka 3D z flagą zajętości (lub prawdopodobieństwem). Klasycznie Octomap, voxblox.
  • O(1) lookup pozycji
  • Naturalne dla danych RGB-D
  • Kompresowalne (octree)
  • Aliasing przy niskiej rozdzielczości
  • Pamięć O(N³) bez kompresji
  • Brak gradientu (dyskretne)
ROS Octomap, MoveIt2 collision world dla scen dynamicznych.
Signed Distance Field (SDF/TSDF)Pole skalarne Φ: ℝ³ → ℝ — odległość ze znakiem do najbliższej powierzchni.
  • Naturalny gradient ∇Φ (kierunek odpychający)
  • Ciągła reprezentacja
  • Łatwa kompozycja (min wielu SDF)
  • Kompatybilne z optymalizacją (CHOMP, TrajOpt)
  • Pamięć O(N³)
  • Aktualizacja wymaga przeliczenia regionu
  • Daleko od powierzchni — narastający błąd (truncacja w TSDF)
KinectFusion (TSDF), Voxblox, ESDF (FIESTA), CHOMP. Idealna dla planowania z gradientem.
Octree (rzadka voxel grid)Hierarchiczna kompresja occupancy grid — Octomap.
  • Pamięć O(log N) dla typowych scen
  • Multi-resolution query
  • Łatwe merging z sensora
  • Wciąż dyskretne
  • Cache-unfriendly przy głębokich drzewach
ROS, planowanie mobilnych robotów, mapy pomieszczeń.
Neural SDF (DeepSDF, NeRF-Nav)Sieć neuronowa f_θ(p) ≈ Φ(p) — ciągłe SDF wyuczone z danych.
  • Bardzo kompaktowe (kilka MB na całą scenę)
  • Generalizacja na podobne sceny
  • Auto-różnicowanie gradientu
  • Inference koszt (rzędu ms na query)
  • Trening offline
  • Brak gwarancji optymizmu/pesymizmu
NeRF-Nav, learned planners, planowanie z reprezentacji wizualnej.

Praktyczne kombinacje

W praktyce wybór reprezentacji wynika z typu planera i źródła danych. Pięć typowych kombinacji (skróty rozwijam na bieżąco):

  • Planery próbkowe (np. PRM — Probabilistic Roadmap, RRT* — Rapidly-exploring Random Tree*; pełnio omówione w module 06): pytają tylko „czy konfiguracja koliduje?" — wystarczy siatka trójkątów (mesh) obiektu zorganizowana w BVH (Bounding Volume Hierarchy — drzewo obejmujących prostopadłościanów, patrz moduł 04). Standardowa biblioteka: FCL (Flexible Collision Library, Pan et al. 2012) lub jej C++17 fork HPP-FCL (HPP = Humanoid Path Planner, Pinocchio Lab). Wydajność: ~O(log n) per query.
  • Planery optymalizacyjne (np. CHOMP — Covariant Hamiltonian Optimization for Motion Planning, TrajOpt — Trajectory Optimization; moduł 07): potrzebują gradientu Φ\nabla \Phi w każdym punkcie wzdłuż trajektorii. Preferują ESDF (Euclidean Signed Distance Field — pole SDF z dokładnymi wartościami i gradientem aż do dużych odległości). Implementacje: FIESTA (Fast Incremental ESDF, Han et al. 2019), Voxblox.
  • Online z czujnika (mobilny manipulator z kamerą RGB-D / LiDAR): surowe dane to point cloud (chmura punktów ze współrzędnymi XYZ + kolor). Konwersja do Octomap (Hornung et al. 2013 — octree-based voxel grid; oktanowe drzewo, log-kompresja zajętości przestrzeni), potem standardowe collision queries w czasie planowania.
  • GPU collision dla sterowania predykcyjnego:cuRobo (NVIDIA, Sundaralingam et al. 2023) i Warp (NVIDIA Python ↔ CUDA framework dla symulacji fizyki) używają SDF w voxel grid (siatka wokseli 3D) + batched queries (sprawdzenie tysięcy konfiguracji równolegle). Niezbędne dla planerów takich jak MPPI (Model Predictive Path Integral; moduł 10) czy CEM(Cross-Entropy Method) — sample'ują K = 1000+ trajektorii w pętli sterowania > 50 Hz.
  • Self-collision Pandy (sprawdzanie, czy robot sam się nie ze sobą zderzy — moduł 04): zamiast pełnego mesha (~10 000 trójkątów per ogniwo, kosztowne) używamy aproksymacji prymitywami — każde ogniwo opakowane w kilka sfer i capsules (kapsuły = cylinder zakończony dwiema półsferami; analityczne SDF). Wystarcza ~21 par par sprawdzeń per konfiguracja (Pandy ma 8 ogniw, sąsiednie pary skipped — patrz Allowed Collision Matrix w module 04).

Metryki w C-space — co znaczy „blisko"

Notacja używana niżej — szybkie przypomnienie

  • qa,qbQq_a, q_b \in \mathcal{Q} dwie konfiguracje robota, czyli dwa punkty w przestrzeni C-space. Dla Pandy każde z nich to wektor 7 liczb (kąty 7 przegubów). Pisząc d(qa,qb)d(q_a, q_b) pytamy „jak daleko od siebie są dwie konkretne konfiguracje".
  • qaiq_a^i oznacza i-tą współrzędną konfiguracji qaq_a — czyli kąt i-tego przegubu. W sumie i=1n(qaiqbi)2\sum_{i=1}^n (q_a^i - q_b^i)^2 chodzi o „dla każdego z n przegubów, weź różnicę kątów, podnieś do kwadratu, zsumuj".
  • nn — wymiar C-space (dla Pandy n=7n=7).
  • Manifold (rozmaitość) — przestrzeń, która lokalnie wygląda jak płaski Rn\mathbb{R}^n, ale globalnie może być zakrzywiona. Klasyczny przykład: sfera S2\mathbb{S}^2 wygląda lokalnie jak płaszczyzna (jak mapa świata), ale całość nie jest płaska. Konsekwencja: nie da się jej zmierzyć linijką w linii prostej; trzeba „chodzić po powierzchni" — to właśnie geodezja.
  • SO(3)SO(3)Special Orthogonal Group, zbiór wszystkich rotacji 3D wokół ustalonego punktu. Każdy element to macierz 3×33 \times 3 spełniająca RR=IR^\top R = I i detR=+1\det R = +1. SO(3) jest manifoldem o wymiarze 3 (3 niezależne kąty rotacji).
  • SE(3)SE(3)Special Euclidean Group, zbiór wszystkich sztywnych przemieszczeń w 3D = rotacja + translacja. Każda poza końcówki narzędzia robota to element SE(3)SE(3). Wymiar 6 (3 rotacji + 3 translacji).

Pełniejszy słownik (manifold, Lie group, tangent space, twist) w module 02 — Podstawy matematyczne.

Każdy planer (A*, RRT, CHOMP) korzysta z funkcji odległości d:Q×QR0d: \mathcal{Q} \times \mathcal{Q} \to \mathbb{R}_{\geq 0} — przyjmuje dwa punkty (qa,qb)(q_a, q_b) z C-space i zwraca nieujemną liczbę „jak daleko od siebie są". Wybór tej metryki zmienia charakter rozwiązań — RRT z metryką L2 i RRT z metryką ważoną dadzą różne drzewa na tej samej scenie.

L2 (euklidesowa)

dL2(qa,qb)=i=1n(qaiqbi)2d_{L_2}(q_a, q_b) = \sqrt{\sum_{i=1}^{n} (q_a^i - q_b^i)^2}

Po prostu pitagorasowa odległość między dwoma wektorami w Rn\mathbb{R}^n: dla każdej z n współrzędnych weź różnicę, podnieś do kwadratu, zsumuj, pierwiastek. Najprostsza, domyślna w większości planerów. Problem: traktuje wszystkie joints jednakowo, mimo że joint 1 Pandy rusza całą masą ramienia, a joint 7 tylko gripperem. Mały błąd w joint 1 = duży błąd w pozycji TCP; mały błąd w joint 7 = niewielki.

Ważona

dW(qa,qb)=(qaqb)W(qaqb),W=diag(w1,,wn)d_W(q_a, q_b) = \sqrt{(q_a - q_b)^\top W (q_a - q_b)}, \quad W = \mathrm{diag}(w_1, \ldots, w_n)

To samo co L2, ale każda współrzędna mnożona przez wagę wiw_i. W=diag(w1,,wn)W = \mathrm{diag}(w_1, \ldots, w_n)oznacza macierz diagonalną z wagami na przekątnej; w rozwinięciu po prostu dW2=iwi(qaiqbi)2d_W^2 = \sum_i w_i (q_a^i - q_b^i)^2. Wagi wiw_i typowo odzwierciedlają mass/inertia poszczególnych joints — joint 1 dostaje większą wagę niż joint 7. Dla Pandy popularne wagi (z URDF inertias): mniej-więcej (2,2,1.5,1.5,1,0.5,0.5)(2, 2, 1.5, 1.5, 1, 0.5, 0.5).

Riemannowska / geodezyjna

L2 dobrze działa, gdy C-space „leży na płasko" jak Rn\mathbb{R}^n. Ale gdy C-space jest manifoldem zakrzywionym (np. obejmuje SO(3)SO(3) — rotacje 3D, lub SE(3)SE(3) — pełne pozy), prosta odległość euklidesowa nie ma sensu. Wyobraź sobie pytanie „jak daleko jest z Warszawy do Tokio" — odpowiedź „linia prosta przez wnętrze Ziemi" jest matematycznie poprawna, ale nieużyteczna; chcemy długości po powierzchni. Analogicznie w C-space liczymy długość najkrótszej krzywej (zwanej geodezją) na manifoldzie. Dla rotacji 3D:

dSO(3)(Ra,Rb)=log(RaRb)d_{SO(3)}(R_a, R_b) = \|\log(R_a^\top R_b)\|

Tu Ra,RbSO(3)R_a, R_b \in SO(3) to dwie macierze rotacji (a nie wektory współrzędnych). Operator log:SO(3)so(3)\log: SO(3) \to \mathfrak{so}(3) („logarytm na manifoldzie") jest odwrotnością formuły Rodriguesa — przekształca macierz rotacji w wektor kąta-osi (axis-angle, moduł 02). W praktyce: odległość ta równa się kątowi rotacji, jaki przejść z orientacji RaR_a do RbR_b obracając wokół jednej osi. Tę metrykę wybierają planery operujące na pełnych pozach SE(3)SE(3), np. planowanie zadań manipulacyjnych w operational space (moduł 09, 11).

Task-space metric (w przestrzeni operacyjnej)

dtask(qa,qb)=p(qa)p(qb)SE(3)d_{\text{task}}(q_a, q_b) = \|p(q_a) - p(q_b)\|_{SE(3)}

p(q)p(q) to funkcja forward kinematics (moduł 02) — przyjmuje konfigurację qqi zwraca pozę narzędzia (TCP) w SE(3)SE(3). Ta metryka mierzy „jak daleko jest TCP od TCP", nie „jak daleko są konfiguracje od siebie". Dla 7-DOF redundantnego robota dwie różne qq mogą mieć tę samąTCP — w task-space ich odległość = 0, a w L2/W bywa duża. Używana przy planowaniu zadań geometrycznych (rysowanie konturu, malowanie), gdzie liczy się pozycja narzędzia, a nie konkretne ułożenie ramienia.

Formalizacja problemu planowania

Wszystko poniżej można zapisać jako standardowe zadanie:

znalezˊcˊ:σ:[0,T]Qtakie, z˙e:σ(0)=qstart,  σ(T)=qgoalσ(t)Qfreet[0,T]hi(σ,σ˙,σ¨)0(ograniczenia roˊz˙niczkowe)minimalizujące:J(σ)=0TL(σ,σ˙)dt\begin{aligned}\text{znaleźć:}\quad& \sigma : [0, T] \to \mathcal{Q} \\ \text{takie, że:}\quad& \sigma(0) = q_{\text{start}}, \; \sigma(T) = q_{\text{goal}} \\ & \sigma(t) \in \mathcal{Q}_{\text{free}} \quad \forall t \in [0, T] \\ & h_i(\sigma, \dot\sigma, \ddot\sigma) \leq 0 \quad \text{(ograniczenia różniczkowe)} \\ \text{minimalizujące:}\quad& J(\sigma) = \int_0^T L(\sigma, \dot\sigma) \, dt \end{aligned}

Składniki:

  • Stan qQq \in \mathcal{Q} — konfiguracja (path planning) lub stan dynamiczny (q,q˙)(q, \dot q) (kinodynamic).
  • Akcja / sterowanie uUu \in \mathcal{U} — dla kinodynamic u=q¨u = \ddot q, dla dynamic u=τu = \tau (moment napędowy).
  • Constraints geometryczne: brak kolizji σ(t)Qfree\sigma(t) \in \mathcal{Q}_{\text{free}}.
  • Constraints różniczkowe: limity prędkości/ przyspieszeń/jerk q˙iq˙max,i|\dot q_i| \leq \dot q_{\max,i}, dynamika Mq¨+Cq˙+g=τM\ddot q + C\dot q + g = \tau.
  • Funkcja kosztu JJ — czas (L=1L = 1), energia (L=τ2L = \|\tau\|^2), jerk (L=q...2L = \|\dddot q\|^2), clearance (L=Φ(q)L = -\Phi(q)), albo kombinacja.
  • Solution criterion — kompletność (algorytm zwraca rozwiązanie gdy istnieje), optymalność (zwraca najlepsze), probabilistic-completeness (gwarancja w probabilistycznym sensie — RRT, PRM).

W konkretnych modułach kursu spotkasz różne realizacje:

  • Moduł 05 (grafowe): Q\mathcal{Q} dyskretyzowana, JJ jako suma wag krawędzi.
  • Moduł 06 (próbkowe): Q\mathcal{Q} ciągła, kolizja zapytania (collision query), nie funkcja kosztu.
  • Moduł 07 (optymalizacyjne): pełen NLP z JJ, constraints jako penalty lub równania KKT.
  • Moduł 10 (MPC): skrócony horyzont, online QP / rolloutowanie.

Ściąga

Cztery rodzaje „przestrzeni" w planowaniu

  • Task-space TR3×SO(3)\mathcal{T} \subset \mathbb{R}^3 \times SO(3) — fizyczna scena.
  • C-space Q\mathcal{Q} — konfiguracja robota jako punkt. Pandy: QR7\mathcal{Q} \subset \mathbb{R}^7.
  • State-space (q,q˙)TQ(q, \dot q) \in T\mathcal{Q} — dla kinodynamic.
  • Belief-space — dla planowania pod niepewność (moduł 15).

Reprezentacje obstacle space

  • Primitive — szybkie, mało wierne
  • Mesh — wierne, drogie collision
  • Voxel/Occupancy — z czujnika, kompresowalne
  • SDF/TSDF/ESDF — gradient za darmo, kluczowe dla optymalizacji
  • Neural — kompaktowe, generalizujące

Metryki w C-space

  • dL2d_{L_2} — domyślna, prosta
  • dWd_W — ważona przez bezwładności (lepiej dla manipulatora)
  • dSO(3)d_{SO(3)} — geodezyjna dla rotacji
  • dtaskd_{\text{task}} — dla zadań geometrycznych

Problem planowania (standard form)

minσJ(σ)  s.t.  σ(0)=qs,  σ(T)=qg,  σQfree,  h(σ,σ˙)0\min_\sigma J(\sigma) \;\text{s.t.}\; \sigma(0)=q_s,\; \sigma(T)=q_g,\; \sigma \in \mathcal{Q}_{\text{free}},\; h(\sigma, \dot\sigma) \leq 0

Referencje do dalszej lektury

  • LaValle, Planning Algorithms, Cambridge 2006 — rozdział 4 (Configuration Space), 5 (Sampling-Based). Pełna definicja Qobs\mathcal{Q}_{\text{obs}}, rozkład komórkowy, visibility graph. rozdział 4 PDF.
  • Curless & Levoy, „A Volumetric Method for Building Complex Models from Range Images" (SIGGRAPH 1996) — oryginalny paper TSDF.
  • Hornung, Wurm, Bennewitz, Stachniss & Burgard, „OctoMap: An Efficient Probabilistic 3D Mapping Framework Based on Octrees" (Autonomous Robots 2013). octomap.github.io.
  • Han, Cao, Gao, Yang, Xu, Gao & Yan, „FIESTA: Fast Incremental Euclidean Distance Fields for Online Motion Planning" (IROS 2019).
  • Park, Florence, Straub, Newcombe & Lovegrove, „DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation" (CVPR 2019).
  • Pan, Chitta, Manocha, „FCL: A General Purpose Library for Collision and Proximity Queries" (ICRA 2012).
  • cuRobo — NVIDIA, GPU-accelerated collision checking + trajectory optimization. curobo.org.