CleanBug
algoritmus uklízecí cesty pro jednoduché automaty
Hledání uklízecí cesty, někdy nazývané pokrývací cesty, je poměrně častá úloha pro mobilní roboty. Pokusíme se zde rozšířit základní úlohu pro jednoduché deterministické automaty s omezenou pamětí s tím, že o uklízeném prostoru nebudeme mít žádné předběžné informace.
Motivace
Jak již název napovídá, aplikace uklízecí cesty je v první řadě pro
automatické domácí vysavače, vytírací a leštící automaty. Co možná už zřejmé
není, že se vlastné jedná o pokrývací cestu a můžete tímto způsobem např.
hledat miny, sekat zahradu nebo sbírat golfové míčky na tréningovém hřišti.
Robotické vysavače stejně jako
robotické sekačky už nějaký čas na trhu jsou. Jejich
algoritmy typicky využívají náhodné procházky, o
které lze dokázat, že dáte-li robotu dostatek času, bude prostor s vysokou
pravděpodobností uklizen/posekán.
V tomto článku se však s pravděpodotnostním řešením nespokojíme. Chceme
algoritmus, který 100% projde všechny dostupné pozice a nevynechá jedinou.
Pokud zůstane nějaký kout neuklizený, tak vám to asi nebude tak vadit jako
kdyby na poli zůstala zapomenutá mina. To je asi přesvědčivá úloha, kdy se s
pravděpodobností nespokojíte.
Deterministické uklízení
Lze sestavit deterministický algoritmus na dokonalé uklizení místnosti, který
by používal jen pár registrů jako Bug algoritmy? Odpověď je
ano, i když první řešení se vám asi příliš líbit nebude. Na druhou stranu robot
o svém prostředí zatím vůbec nic neví a jak ho bude poznávat, tak si toho moc
nebude pamatovat, takže úloha to rozhodně triviální není.
Definice robota
Pro zjednodušení budeme předpokládat kruhového robota, který se dokáže otočit
na místě a celým svým tělem pokrývá/uklízí prostor. Po překážkách budeme
požadovat, aby byly statické a s konečným obvodem. Náš robot bude vybaven
senzory pro detekci kolize s překážkou a algoritmem objíždění. Konečně, jako u
bug algoritmů, robot bude znát v každém okamžiku svoji absolutní pozici.
Pokrytí prázdného prostoru
Začneme ve velkém prázdném prostoru. Jak ho uklidit, když ještě neznáme ani
jeho hranice? Asi vás napadne nějaké postupné šrafování, nebo vzor orby na
poli, ale oboje se typicky drží nějaké strany a o ní náš robot zatím
nic neví. Pro startovní pozici někde uprostřed místnosti se asi jako nejlepší
jeví spirála, která s každým půlkruhem naroste o velikost robota (viz
obrázek).
Překážky
Co si má robot počnout, pokud při uklízení po spirále z předešlého odstavce
narazí na překážku? Zkusíme upravený algoritmus Bug1:
- vydej se po spirále
- pokud narazíš na překážku označ si tento bod H (hit point) a obcházej překážku
- monitoruj nejbližší další bod na spirále (označ jej L = leave point) a ujetou vzdálenost
- po návratu do H zvol kratší cestu zpět do L
- pokud nebyl nalezen žádný leave point KONEC - místnost je uklizena
- GOTO 1
Nyní se pokusíme odhadnout maximální možnou délku cesty pomocí algoritmu CleanBug1:
P < D + 1.5 ∑i nipi/2
kde D je vzdálenost ujetá po spirále a odpovídá ploše místnosti/průměr
robota, pi jsou obvody jednotlivých překážek a násobící faktor
ni odpovídá počtu průsečíků spirály s i-tou překážkou.
CleanBug2 s pamětí
Pokud budeme analyzovat chovaní CleanBug1, tak zjistíme, že nejvíce času
algoritmus stráví objížděním (znovuzmapováním) překážek, které mají mnoho
průsečíků s naší spirálou. Stačí mu sice pamatovat si dvě souřadnice (hit point
a leave point) a dvě vzdálenosti (aktuální ujetá vzdálenost od hitpointu a
vzdálenost od leave pointu), ale překážku musí vždy 1.5x objíždět. Co kdyby si
robot mohl zapamatovat např. 100 pozic/vzdáleností?
- vydej se po spirále
- pokud narazíš na překážku označ si tento bod H (hit point)
- pokud máš H v poznámkové paměti s odpovídajícím L a směrem, použij je k objetí překážky a vymaž je z poznámkové paměti a GOTO 1
- obcházej překážku a monitoruj průsečíky se spirálou. Podle směru průsečíku si je zapisuj jako další H nebo L = leave point + ujetou vzdálenost do poznámkové paměti
- pokud dojde místo v poznámkové paměti odmaž nejvzdalenější body na spirále
- po návratu do H zvol kratší cestu zpět do L
- pokud nebyl nalezen žádný leave point KONEC - místnost je uklizena
- GOTO 1
Pokud má robot dostatek paměti, tak při prvním objezdu může zmapovat všechny
přejezdy tj. dalši Hitpointy a Leave pointy. Odpovídající páry a doporučený
směr dalšího objíždění pak je třeba analyzovat při dokončení objezdu mapované
překážky.
CleanBug3 se znalostí prostředí
Co kdyby jste CleanBug2 s dostatečnou pamětí znova pustili v úplně stejném
prostředí ze stejného startu? Nešlo by to v druhém průchodu uklidit ještě
„chytřeji”?
Z dat, co nám nasbíral CleanBug2, máme vlastně graf cest (hran) a křižovatek
(vrcholy, průsečíky). Hodilo by se nám projít všechny hrany grafu, tj. hledáme
Eulerův tah (jednotažky, nakreslení domečku jedním tahem). Pro Eulerův tah
bychom ale potřebovali, aby všechny vrcholy měli sudý stupeň. V našem grafu ale
jak na potvoru všechny vrcholy (s vyjímkou startu) mají stupeň 3. Je třeba tedy
některé hrany zdvojit, což můžeme jednoduše udělat pro každou překážku
zvlášť — zdvojíme každou druhou hranu.
Pro vyhledání trasy lze použít algoritmus „lepení uch”. Jede, dokud nedorazí
na křižovatku, kde už jsou všechny hrany použité. Pak vybere libovolný vrchol
na cestě, kde ještě nějaké hrany zbývají a pak přilepí další „ucha”.
Závěr
V tomto článků jsme ukázali příklad deterministického automatu se znalostí své
pozice, který dokáže spolehlivě pokrýt předem neznámé prostředí. Ukázali jsme i
vylepšení, pokud má robot k dispozici větší paměť případně informace z
předešlého uklízení. Příjde vám to příliš jednoduché? Zkuste najít lepší
algoritmus, který např. bude realizovat optimalizaci CleanBug3 ještě před
dokončením prvního mapování …
Pokud se Vám něco z toho článku přišlo špatně nebo Vám některá část přišla méně
srozumitelná, můžete se nám ozvat pomocí našeho
kontaktního formuláře.
Pošlete email redakci.
Všechny materiály, které máme k dispozici, jsou již součástí článku, na který reagujete (tj. pokud tam tedy není např. plánek na stavbu, je to proto, že nic takového nemáme).
Vaši zprávu se bohužel nepodařilo odeslat, ale můžete nám napsat sami na adresu webmaster-at-robotika.cz
Vaše zpráva byla úspěšně odeslána
Pro odeslání formulář je třeba mít zapnutý javascript.