Planowanie próbkowe
PRM, RRT, RRT-Connect, RRT*, Informed RRT*, FMT*, BIT*, ABIT*, AIT*, EIT*, EST, SBL, KPIECE. Strategie samplingu, kinodynamic.
TL;DR
Planery próbkowe nie konstruują jawnie (niemożliwe w wysokich wymiarach — moduł 03). Zamiast tego losują punkty w i sprawdzają zapytaniem collision check. Z czasem budują reprezentację łączności wolnej przestrzeni: drzewo (RRT) lub graf (PRM).
- RRT (LaValle 1998) — drzewo rośnie ku , naturalnie eksploruje całą . Single-query, kompletny probabilistycznie. NIE jest optymalny.
- RRT-Connect(Kuffner & LaValle 2000) — dwa drzewa rosnące ku sobie + greedy connect. ~10× szybsze niż RRT dla typowych pick&place. Domyślny planer MoveIt2.
- RRT*(Karaman & Frazzoli 2011) — RRT + rewire + choose-parent. Asymptotycznie optymalny: gdy .
- PRM (Kavraki 1996) — multi-query: zbuduj roadmap raz, odpowiadaj na wiele zapytań start/goal.
- BIT*, FMT*, AIT*, EIT* — druga generacja: batched sampling + heurystyka + lazy edge evaluation. Najszybsze w benchmarkach OMPL.
Wszystkie warianty łączy ich rdzeń: sample → connect → extract path. Różnią się strategią eksploracji, optymalnością, i tym czy budują drzewo vs graf.
RRT — Rapidly-exploring Random Tree
Algorytm:
T ← {q_start}
for i = 1..N:
q_rand ← sample(Q) # z prob. β: goal, inaczej uniform
q_near ← nearest(T, q_rand)
q_new ← steer(q_near, q_rand, ε) # krok o ε ku q_rand
if collision_free(q_near, q_new):
T ← T ∪ {q_new} with parent q_near
if dist(q_new, q_goal) < r_goal:
return path(q_start → q_new)Voronoi bias: drzewo „chce" eksplorować — większy region T = większe prawdopodobieństwo, że wyląduje w jego komórce Voronoi. dla takiego sampla zwykle leży na brzegu drzewa, więc nowy węzeł rozszerza region. To klucz do dlaczego RRT zbiega do całej .
Goal bias — z prawdopodobieństwem samplem jest . Mała wartość (~5%) wystarcza by drzewo „znalazło" goal w rozsądnym czasie. Za duża (>30%) sprawia że drzewo „rozkłada się" w lokalnym minimum przed dotarciem do celu.
W demo niżej: testuj suwakami (step size — kompromis: krótki = drobny ruch ale wolny progres; długi = częste kolizje) i (goal bias — patrz scenariusz z mapą narrow-passage aby zobaczyć efekty extremalnych wartości).
RRT — iter 1 / 142
Kluczowa właściwość: probabilistic completeness
...pod warunkiem że ścieżka istnieje. To słabsze niż zwykła kompletność (gwarancja w skończonym czasie) — nie ma algorytmu sample-based który byłby kompletny w klasycznym sensie, bo wąski korytarz może wymagać dowolnie wielu sampli.
RRT NIE jest optymalny. Ścieżka zwracana przez RRT jest jakąś ścieżką w drzewie — typowo 30-50% dłuższa od optymalnej. Optymalność wymaga RRT* (poniżej).
RRT-Connect — bidirekcyjne + greedy
Dwa drzewa: od start, od goal. W każdej iteracji:
- rośnie ku losowemu (EXTEND).
- Jeśli sukces — wykonuje CONNECT ku nowemu węzłowi — to extend wielokrotny, dopóki nie dojdzie albo nie zderzy się z przeszkodą.
- Jeśli skleiły się — ścieżka znaleziona.
- Swap — drzewa na zmianę inicjują iterację.
Greedy CONNECT eliminuje większość „bezowocnych" kroków RRT. Empirycznie 5-15× szybciej niż jednostronny RRT na typowych zadaniach manipulacji. To domyślny planer w MoveIt2 i OMPL dla manipulatorów.
RRT-Connect — iter 1 / 1
RRT* — asymptotyczna optymalność
Dwa dodatki do RRT:
- Choose parent: zamiast naivnie dodawać jako dziecko , przeszukaj wszystkich sąsiadów w i wybierz tego, który da najmniejszy koszt ścieżki .
- Rewire: dla każdego węzła w , sprawdź czy przejście przez daje krótszą ścieżkę. Jeśli tak — przepinamy rodzica na .
Promień rewire dla asymptotycznej optymalności:
gdzie = wymiar C-space. Dla 2D maleje , więc dla mamy . W naszej implementacji uproszczono do stałej (suwak rewire r).
Konsekwencja: z każdym rewire ścieżka się poprawia. W demo poniżej obserwuj pomarańczowe krawędzie (świeżo rewired) — ścieżka „prostuje się" w czasie. Dla bardzo długiego biegu () ścieżka zbiega do optymalnej.
RRT* — iter 1 / 168
Praktyczne ulepszenia RRT*
- Informed RRT* (Gammell et al. 2014): po znalezieniu pierwszej ścieżki o koszcie , sample tylko z elipsoidy o ogniskach (start, goal) i długości . Wszelkie punkty poza tym obszarem na pewno nie polepszą ścieżki.
- RRT-X(Otte & Frazzoli 2014): online version — odpowiada na pojawienie się/zniknięcie przeszkód bez restartu.
- Quick-RRT* — ancestor rewire: rewire przez kilka pokoleń w górę, nie tylko bezpośrednich sąsiadów. Szybsza zbieżność.
PRM — Probabilistic Roadmap (multi-query)
Cały odrębny paradygmat: zamiast budować drzewo per zapytanie, raz konstruuj roadmap grafu w (offline), potem odpowiadaj na wiele zapytań start/goal przez Dijkstrę (online).
Faza learning:
- Wylosuj punktów w , odrzuć te w kolizji.
- Dla każdego: znajdź najbliższych (lub w promieniu ), połącz krawędzią jeśli lokalny planer (linia prosta) jest wolny od kolizji.
Faza query: dodaj start/goal do roadmapu, połącz z najbliższymi, uruchom Dijkstrę.
Kiedy ma sens:roboty stacjonarne z fixed sceną (pick&place na linii produkcyjnej), wielokrotne zapytania. Nie ma sensu dla scen dynamicznych (każda zmiana sceny = przeliczenie roadmapu).
Warianty:
- PRM*: promień — asymptotyczna optymalność.
- Lazy PRM: nie sprawdzaj kolizji krawędzi przy budowie roadmapu, tylko przy query. Tańsze gdy lista zapytań jest mała.
- Visibility PRM: agresywne filtrowanie sampli — dodawaj tylko guardy (widzialne tylko z osobliwych regionów) lub connectory (łączące guardów). Ekstremalnie rzadki roadmap, dobry dla wąskich korytarzy.
PRM — iter 10 / 32
Strategie samplingu
Algorytm jest tylko tak dobry jak jego źródło sampli. Pięć popularnych strategii — ta sama liczba sampli (300), ta sama mapa, różne pokrycie:
Strategie samplingu — porównanie pokrycia
Praktyczne reguły
- Uniform — domyślny, sprawdza się dla większości scen.
- Halton — preferowany dla małej liczby sampli () lub gdy wymagane jest deterministyczne pokrycie. Quasi-random ma niższą dyskrepancję niż pseudo-random.
- Gaussian — gdy mamy prior na lokalizację rozwiązania (np. local refinement po global plan).
- Bridge test — gdy scenariusz ma wąskie korytarze. Hsu et al. 2003.
- Obstacle-based — gdy ścieżka prawdopodobnie będzie przebiegała blisko przeszkód (manipulacja, wąskie miejsca).
Druga generacja: BIT*, FMT*, AIT*, EIT*
Drugą falę otworzył FMT* (Janson et al. 2015) i BIT* (Gammell et al. 2015). Wspólne idee:
- Batched sampling: zamiast inkrementalnie dodawać sample, generuj cały „batch" (np. 100 punktów) naraz, pracuj nad nim, dodaj kolejny.
- Heurystyka informowana: używaj (jak A*) do priorytetyzacji krawędzi do ewaluacji.
- Lazy edge evaluation: większość krawędzi roadmapu nigdy nie zostanie użyta w optymalnej ścieżce — nie wartoało ich sprawdzać. Sprawdzaj tylko gdy heurystyka mówi że krawędź jest obiecująca.
BIT* (Batch Informed Trees)
Hybryda PRM* + RRT* + A*. Per batch: sample N punktów w „informed" elipsoidzie (jak Informed RRT*); zbuduj implicit roadmap; uruchom heurystyczne przeszukiwanie (A*-like) by znaleźć nową ścieżkę niższego kosztu; dodaj kolejny batch.
Porównanie w benchmarkach (OMPL, Panda 7D)
- RRT: szybkie znalezienie jakiejś ścieżki, brak optymalności
- RRT*: poprawia jakość ale zbieżność wolna
- BIT*: 2-5× szybsza zbieżność do optymalnego niż RRT*
- AIT* / EIT*: dalsze ulepszenia, najlepsze w OMPL 2024
RRT* → Informed RRT* → BIT* — postęp asymptotycznie optymalnych planerów
Klucz: PHS — prolate hyperspheroid
Po znalezieniu ścieżki o koszcie , dalsze sample mogą poprawić rozwiązanie tylko jeśli leżą w elipsoidzie:
To elipsa o ogniskach , półoś główna , półoś poprzeczna gdzie . W miarę poprawy elipsa zwęża się do odcinka — sampling skupia się na coraz mniejszym obszarze.
Kinodynamic RRT — ograniczenia różniczkowe
Klasyczny RRT zakłada że pomiędzy i można poprowadzić linię prostą (lokalny planer geometryczny). Dla pojazdów nieholonomicznych (samochód, łódź) to nieprawda — nie da się jechać „bokiem".
Kinodynamic RRT sample'uje w przestrzeni stanu i propaguje przez krótki interwał dynamiką:
gdzie losowo wybrane sterowanie. Lokalny planer jest zastąpiony przez forward simulation. Drzewo rośnie faktycznie wykonalnymi trajektoriami.
Warianty: SST (Stable Sparse RRT) — kompresuje drzewo żeby skalować się do długich horyzontów; AO-RRT — asymptotycznie optymalny kinodynamic.
Dla manipulatora Pandy: rzadko używane, bo Panda jest holonomiczna. Pojawia się gdy planujemy też dynamikę (limity przyspieszeń) — wtedy stan to , sterowanie .
Sampling-based na Pandzie (7D C-space)
Wszystkie animacje powyżej operują na 2D — to celowe uproszczenie dla intuicji. Na realnej Pandzie:
- , planer próbkuje .
- Każda iteracja: collision check Pandy w danej konfiguracji ~50 µs (FCL na mesh ogniw + scena).
- RRT-Connect typowo znajduje ścieżkę w 0.05-0.5s na stanowisku pick&place z 2-3 przeszkodami.
- RRT* asymptotycznie optymalny w 7D wymaga iteracji dla zbieżności (sekundy do minut).
- BIT* w 7D: ~1-3 sekundy dla rozwiązania bliskiego optymalnemu.
Wizualizacja drzewa 7D wymaga rzutowania (np. 2D projekcja na wybraną parę joints — najczęściej q1, q4). To zaplanowane na moduł 18 (benchmarki) gdy uruchamiamy wszystkie planery na tym samym zbiorze 50 zadań Pandy.
Ściąga
Pipeline każdego planera próbkowego
while not terminated:
q_rand ← sample()
q_near ← nearest(graph, q_rand)
q_new ← steer(q_near, q_rand, ε)
if collision_free(q_near, q_new):
add(graph, q_new, parent=q_near)Gwarancje teoretyczne
- RRT: probabilistic complete, nie-optymalny.
- RRT*, PRM*: asymptotycznie optymalne (przy r(n) ∝ (log n/n)^(1/d)).
- RRT-Connect: probabilistic complete, najszybszy dla single-query.
- BIT*: asymptotycznie optymalny + szybsza zbieżność niż RRT*.
Kiedy czego użyć (Panda)
- Pick&place w czasie rzeczywistym: RRT-Connect
- Wymagana jakość ścieżki (transport ciężkich): RRT* lub BIT*
- Wąskie korytarze (mocno zacieśniona scena): RRT-Connect z obstacle-based sampling lub Visibility PRM
- Multi-query (te same przeszkody, wiele goalów): PRM*
Implementacje referencyjne
- OMPL — wszystkie warianty + benchmarki
- MoveIt2 — interfejs ROS2, default planer RRT-Connect
- cuRobo — GPU batched RRT-Connect dla Pandy
Referencje
- LaValle, „Rapidly-Exploring Random Trees: A New Tool for Path Planning" (TR 98-11, 1998) — oryginalny paper RRT.
- Kuffner & LaValle, „RRT-Connect: An Efficient Approach to Single-Query Path Planning" (ICRA 2000).
- Kavraki, Švestka, Latombe & Overmars, „Probabilistic Roadmaps for Path Planning in High-Dimensional Configuration Spaces" (IEEE TRA 1996) — PRM.
- Karaman & Frazzoli, „Sampling-Based Algorithms for Optimal Motion Planning" (IJRR 2011) — RRT*, PRM*.
- Gammell, Srinivasa & Barfoot, „Informed RRT*: Optimal Sampling-Based Path Planning Focused via Direct Sampling of an Admissible Ellipsoidal Heuristic" (IROS 2014).
- Gammell et al., „Batch Informed Trees (BIT*)" (ICRA 2015).
- Hsu, Jiang, Reif & Sun, „The Bridge Test for Sampling Narrow Passages with Probabilistic Roadmap Planners" (ICRA 2003).
- OMPL docs: ompl.kavrakilab.org/planners.
- LaValle, Planning Algorithms (CUP 2006) — rozdział 5: full sampling-based planning theory.