Hlavní navigace

Jak na inteligentního robota (2) - senzory & lokalizace

11. 3. 2014 14:24 zboj

Minule jsme si ukázali, jak robotem hýbat, a viděli, jak se akumuluje odometrická chyba. Takový robot by byl samozřejmě dost k ničemu, protože i kdyby se snažil jezdit podle předem dané přesné mapy, brzy by se “ztratil” (nebyl by tam, kde si myslí, že je). Nyní se nejprve stručně popíšeme levné a dostupné senzory a následně představíme algoritmus (používaný například i v autech bez řidiče Googlu), jak je použít pro lokalizaci (tj. jak robot pozná, kde přesně je, vzhledem k mapě prostředí).

Kompas zná každý. Vrací hodnotu od 0 do 359, což je úhel natočení robota. Jeho nevýhodou je, že měření může být zkresleno okolním magnetickým polem, jež může být dáno nejen okolním prostředím, ale i robotem samotným, typicky motory. Proto je nutné jej umístit co nejdále do motorů (alespoň 10–15 cm).

Akcelerometr moc užitečný pro lokalizaci není, pokud jezdíme po rovině (např. po podlaze místnosti). V terénu se šikmými plochami ale může významně pomocí s určením pózy (tj. kombinace pozice a úhlu natočení). Navíc pokud robot stojí hodně nakřivo, víme, že máme ignorovat data z kompasu.

Ultrazvukové měření vzdálenosti se používání k detekci překážek. Senzor vyšle zvukové vlny, zachytí jejich odraz a podle doby, který uplynula, určí vzdálenost. U EV3 má dosah cca. 160 centimetrů. Měření ultrazvukem není příliš přesné, protože zvuk se šíří v určitém výseku, a tak případnou detekovanou překážku nelze přesně lokalizovat na mapě.

Optické měření vzdálenosti. Infračervený senzor je poněkud přesnější (cílenější) než ultrazvukový, ale v případě EV3 má kratší dosah (pod jeden metr). Pro profesionální použití se používá laserový “radar” (lidar) s velkou přesností, schopný rychle dodat trojrozměrná data v reálném čase. Níže uvedený algoritmus, jejž lze jednoduše naimplementovat pro EV3, používá například Google pro své auto bez řidiče a díky (drahému) lidaru dosahuje v podstatě absolutní přesnosti při lokalizaci.

Předpokládejme, že máme dánu mapu prostředí a robot chce zjistit, kde na mapě se nachází (a v jakém úhlu natočení), přičemž na začátku o své póze neví nic. Nejvíce se v praxi osvědčil tzv. částicový filtr, neboť jde o metodu výpočetně efektivní (výpočet je rychlý i pro velké a složité mapy) a robustní (bez problémů si poradí s nepřesnými daty ze senzorů).

Odhad pózy se reprezentuje množinou tzv. částic, což je kombinace pozice (2D nebo 3D podle typu prostředí), úhlu natočení a váhy (jež odpovídá pravděpodobnosti, že daná póza odpovídá skutečnosti). Na začátku se náhodně vygeneruje N částic tak, aby rovnoměrně pokrývaly celou mapu, a všem se přiřadí stejná váha. Jinými slovy, robot o své póze neví nic, všechny částice mají stejnou pravděpodobnost. Při pohybu robota se hodnoty všech částic aktualizují (pozice a/nebo úhel natočení), přičemž se náhodně započítá šum (nepřesnost odometrie) vzhledem k nějakému vhodnému normálnímu rozdělení. Následně se získají data ze senzorů a pro každou částici se porovnají s mapou, díky čemuž můžeme částicím přiřadit nově vypočítané výhy. V praxi se už pod dvou až čtyřech cyklech póza robota zjistí poměrně přesně.

Částicový filtr má dvě (naštěstí lehce odstranitelné) nevýhody. Po přepočítání vah částic se téměř vždy stane, že většina částic bude mít zanedbatelnou váhu (protože jen ty ve shodě s mapou a daty ze senzorů získají větší váhu). Proto se používá tzv. převzorkování (resampling), kde se většina částic s téměř nulovou vahou zahodí a ty pravděpodobnější se do množiny částic zařadí několikrát. Takto se kolem pravděpodobných póz vytvoří shluky částic (ideálně jen jeden shluk), jež určí aktuální pózu robota.

Druhou nevýhodou je, že ve své základní podobě částicový filtr není schopen řešit “problém uneseného robota”, tj. pokud někdo lokalizovaného robota vezme a přemístí, data u částic již nebudou aktuální a ani nepůjde nové váhy vypočítat, protože kolem nové pozice žádné částice nebudou (protože byly vyřazeny při převzorkování). Řešení je naštěstí jednoduché. V každém kroku se do množiny přidají rovnoměrně náhodně částice s nízkou vahou, takže po případném “únosu” se robot snadno zotaví z najednou nepřesných dat a rychle se znovu správně zorientuje.