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ć:
- Task-space () — przestrzeń zadania, fizyczna scena 3D w której operuje robot. Przeszkody są tu „naturalne".
- C-space () — przestrzeń konfiguracji, gdzie robot jest punktem. Algorytmy grafowe i próbkowe pracują tutaj.
- Obstacle representation — jak zakodować przeszkody (SDF, occupancy grid, mesh, point cloud), żeby pytania kolizji / odległości były szybkie.
- 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 . Dla Pandy: siedem liczb . 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
- Humanoidalny robot z 30 DOF: punkt w
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 jednoznacznie określa geometrię robota . Konfiguracja jest „bezpieczna" gdy nie przecina się z żadną przeszkodą — czyli . Zbiór wszystkich bezpiecznych konfiguracji to , a dopełnienie — (C-obstacle).
W demo poniżej: przeciągnij myszą czerwoną przeszkodę w lewym panelu (task-space). W prawym panelu zobaczysz, jak zmienia się dla 2-link arm — czerwone obszary to konfiguracje powodujące kolizję. Możesz też kliknąć w prawym panelu żeby ustawić bieżącą — robot z lewej strony przemieści się odpowiednio.
Task-space → C-space (klasyczna ilustracja)
Co z tego wynika dla planowania w wysokich wymiarach
Konstrukcja 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 jawnie, tylko zapytuje o kolizję dla konkretnych .
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.
Konwencja znaków: dla wolnej przestrzeni (im większe, tym dalej od przeszkód), na brzegu, wewnątrz przeszkody (im bardziej ujemne, tym głębiej).
Co to jest
Symbol (czytaj „nabla") to operator gradientu. Dla funkcji skalarnej :
To wektor w każdym punkcie , wskazujący kierunek największego wzrostu . W kontekście SDF: skoro rośnie gdy oddalamy się od przeszkód, 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:
Intuicja: gdy posunę się o 1 cm w kierunku , wzrasta o 1 cm — bo to właśnie odległość od przeszkody. Stąd „jednostka zmiany pozycji = jednostka zmiany Φ", czyli . 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 "
Suwak ustawia wartość — odległość bezpieczeństwa. Niebieska/fioletowa linia rysowana na heatmapie to level set (zbiór poziomicowy):
czyli wszystkie punkty oddalone od najbliższej przeszkody dokładnie o jednostek:
- → kontur pokrywa brzeg przeszkód (czarny)
- → linia 0.05 (5%) jednostek na zewnątrz przeszkód — taką ścieżkę musi trzymać robot żeby zachować margines bezpieczeństwa 5%
- → linia 2% jednostek wewnątrz przeszkody (głębokość penetracji)
Planery CBF (moduł 12) używają stałej jako twardego ograniczenia: trajektoria musi spełniać w każdej chwili. CHOMP (moduł 07) używa miękkiego kosztu — 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 ) lub „obkurcza się" w ich wnętrze (ujemne ).
Signed Distance Field — heatmap + level set + gradient
Warianty w praktyce
- TSDF (Truncated SDF) — KinectFusion / Voxblox: wartości obcinane do 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ć; 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
| Reprezentacja | Opis | Zalety | Wady | Typowe zastosowanie |
|---|---|---|---|---|
| Primitive shapes | Sfery, prostopadłościany, walce, kapsuły — analityczne SDF i collision check. |
|
| Self-collision Pandy, prosta scena testowa, CHOMP/STOMP gdy potrzebny szybki gradient. |
| Triangle mesh | Płaska siatka trójkątów (OBJ/STL/glTF). Najpopularniejsza reprezentacja powierzchniowa. |
|
| URDF visual meshes, FCL/HPP-FCL collision detection, kanoniczny format CAD. |
| Point cloud | Zbiór punktów z czujnika (LiDAR, RGB-D). Brak topologii. |
|
| On-line mapping (Octomap, Voxblox), planowanie z surowych sensorów. |
| Occupancy grid / voxel | Dyskretna siatka 3D z flagą zajętości (lub prawdopodobieństwem). Klasycznie Octomap, voxblox. |
|
| ROS Octomap, MoveIt2 collision world dla scen dynamicznych. |
| Signed Distance Field (SDF/TSDF) | Pole skalarne Φ: ℝ³ → ℝ — odległość ze znakiem do najbliższej powierzchni. |
|
| KinectFusion (TSDF), Voxblox, ESDF (FIESTA), CHOMP. Idealna dla planowania z gradientem. |
| Octree (rzadka voxel grid) | Hierarchiczna kompresja occupancy grid — Octomap. |
|
| ROS, planowanie mobilnych robotów, mapy pomieszczeń. |
| Neural SDF (DeepSDF, NeRF-Nav) | Sieć neuronowa f_θ(p) ≈ Φ(p) — ciągłe SDF wyuczone z danych. |
|
| 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 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
- — 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 pytamy „jak daleko od siebie są dwie konkretne konfiguracje".
- oznacza i-tą współrzędną konfiguracji — czyli kąt i-tego przegubu. W sumie chodzi o „dla każdego z n przegubów, weź różnicę kątów, podnieś do kwadratu, zsumuj".
- — wymiar C-space (dla Pandy ).
- Manifold (rozmaitość) — przestrzeń, która lokalnie wygląda jak płaski , ale globalnie może być zakrzywiona. Klasyczny przykład: sfera 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.
- — Special Orthogonal Group, zbiór wszystkich rotacji 3D wokół ustalonego punktu. Każdy element to macierz spełniająca i . SO(3) jest manifoldem o wymiarze 3 (3 niezależne kąty rotacji).
- — Special Euclidean Group, zbiór wszystkich sztywnych przemieszczeń w 3D = rotacja + translacja. Każda poza końcówki narzędzia robota to element . 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 — przyjmuje dwa punkty 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)
Po prostu pitagorasowa odległość między dwoma wektorami w : 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
To samo co L2, ale każda współrzędna mnożona przez wagę . oznacza macierz diagonalną z wagami na przekątnej; w rozwinięciu po prostu . Wagi 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 .
Riemannowska / geodezyjna
L2 dobrze działa, gdy C-space „leży na płasko" jak . Ale gdy C-space jest manifoldem zakrzywionym (np. obejmuje — rotacje 3D, lub — 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:
Tu to dwie macierze rotacji (a nie wektory współrzędnych). Operator („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 do obracając wokół jednej osi. Tę metrykę wybierają planery operujące na pełnych pozach , np. planowanie zadań manipulacyjnych w operational space (moduł 09, 11).
Task-space metric (w przestrzeni operacyjnej)
to funkcja forward kinematics (moduł 02) — przyjmuje konfigurację i zwraca pozę narzędzia (TCP) w . Ta metryka mierzy „jak daleko jest TCP od TCP", nie „jak daleko są konfiguracje od siebie". Dla 7-DOF redundantnego robota dwie różne 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:
Składniki:
- Stan — konfiguracja (path planning) lub stan dynamiczny (kinodynamic).
- Akcja / sterowanie — dla kinodynamic , dla dynamic (moment napędowy).
- Constraints geometryczne: brak kolizji .
- Constraints różniczkowe: limity prędkości/ przyspieszeń/jerk , dynamika .
- Funkcja kosztu — czas (), energia (), jerk (), clearance (), 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): dyskretyzowana, jako suma wag krawędzi.
- Moduł 06 (próbkowe): ciągła, kolizja zapytania (collision query), nie funkcja kosztu.
- Moduł 07 (optymalizacyjne): pełen NLP z , 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 — fizyczna scena.
- C-space — konfiguracja robota jako punkt. Pandy: .
- State-space — 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
- — domyślna, prosta
- — ważona przez bezwładności (lepiej dla manipulatora)
- — geodezyjna dla rotacji
- — dla zadań geometrycznych
Problem planowania (standard form)
Referencje do dalszej lektury
- LaValle, Planning Algorithms, Cambridge 2006 — rozdział 4 (Configuration Space), 5 (Sampling-Based). Pełna definicja , 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.