czech english

Seznámení s Playerem

první krok k softwarové kompatibilitě

Že existuje nějaký Player/Stage je na robotika.cz zmíněno už od roku 2003. Uteklo však více jak pět let a za tu dobu se stal tento software velmi populární. Co je na něm tedy tak „světového”? V tomto článku popíšeme jednu z cest, která k Player/Stage vede.

Úvod

Od skončení soutěže Robotour 2008, kde na společném workshopu tým Short Circuits popisoval svého robota, na Player/Stage narážím na každém kroku. Co se stalo? Co je na tom softwarovém balíku tak úžasného?! Případně co si představit pod „device interface” jak se píše v původním popisu Playeru?
Pokud začínáte s roboty a postupujete od blikání s LEDkou, přes hýbání servem a nakonec si postavíte malého robůtka, který se zúčastní soutěže jízdy podél čáry, tak na Player/Stage možná nikdy nenarazíte. Není třeba, byla by to pro vás pouze překážka.
Pokud ale postoupíte do „vyšší kategorie” a začnete si hrát s roboty, kteří mají už větší výpočetní výkon a na robotu vám běží třeba nějaký linuxový router, dostanete se do fáze, kdy přemýšlíte jak napsat software, aby robot dělal „něco chytrého” nebo „něco užitečného”. K tomu už vám nebude stačit pouze s robotem jezdit, ale pravděpodobně přidáte nějaké senzory, začnete se vyhýbat překážkám, mapovat prostor, plánovat cestu, …
Budete-li se roboty zabývat ať už jako hobby nebo ve škole, určitě dospějete do situace, kdy by se vám hodilo software napsaný na jednoho robota použít na nějakého jiného. Problém je, že ten druhý robot ale má například jinak velká kolečka, místo řízení po sériové lince je napojen na I2C a třeba místo IR senzorů má sonary. Když se vám to stane poprvé, tak v lepším případě upravíte pár konstant a v horším program přepíšete. Věřte nebo ne, časem vás to přestane bavit a budete chtít nějaký společný základ. Bude to chtít nějaký standard, o který se můžete opřít. V té chvíli bych vás seznámil s Player/Stage.

Jízda s robotem

Začněme od toho nejjednoduššího — naučíme se jezdit s „univerzálním robotem”. Nejprve se vrátíme k malému robotu, postavenému na jednočipu, kde rychlost otáčení kola je dána počtem tiků enkodérů za nějaký časový interval (třeba 20ms). Zde vám stačí experimentálně zjistit, že když na PWM motoru nastavíte hodnotu 37, tak se kolo pomalu otáčí. Algoritmus si pak můžete poskládat z jednoduchých funkcí jeď rovně, zatoč doprava, zatoč doleva a stůj. Samozřejmě to samé můžete udělat i na robotovi řízenému z nějakého PC, a bohužel hodně robotiků v této fázi nějaký čas zůstává. Věřte mi, že když někomu řeknete, že váš robot jede rychlosti 420 tiků za jedno přetečení časovače, tak to nikomu nic neřekne, ani jestli robot jede rychle či pomalu.
Tady je ještě pomoc snadná a málo kdo by o ní diskutoval. Prostě převeďte vaše tiky (nemyslím teď cukání oka, které se s touto činností dříve či později dostaví) na nějaké smysluplné jednotky. Čas měřte v sekundách, vzdálenosti v metrech a rychlost tedy v metrech za sekundu. Nevěřili byste kolik účastníků Eurobota raději počítá v centimetrech — hřiště je typicky velké 2.1m x 3m, tj. 210x300 a jde to rovnou nakreslit … nedělejte to. Jednou narazíte.
Pokud se shodneme na jednotkách (ani toto nemusí být samozřejmé, když pracujete v evropsko-americkém týmu), tak vás ještě čeká jedno zásadní rozhodnutí. Volba souřadné soustavy. Určitě budete chtít, aby robot jel na nějaké konkrétní místo, a tak bude třeba popsat jak to cílové místo, tak na kterém místě robot právě je. Nuže špatná zpráva je, že když uděláte anketu: „Pojede-li robot startující z pozice (0,0,0) rovně a mírně vlevo, tak kde skončí?”, odpověď zda y-ová souřadnice poroste nebo bude klesat nebude jednoznačná! Ještě v horším případě budete kombinovat oboje. Aby toho nebylo málo, tak po zobrazení na obrazovku y-souřadnice je dolů a občas je třeba prohodit pravé a levé kolo … no nic. Dokud si to nevyzkoušíte, tak neuvěříte. Předpokládejme tedy xy souřadnou soustavu, kde (0,0) je v levém dolním rohu, x roste vpravo, y nahoru a úhel roste proti směru hodinových ručiček
Ok, máme jednotky, souřadný systém, ale k řízení robota jsme se ještě nedostali. Nechť tedy máme nějakého diferenciálně řízeného robota, kde ovládáte rychlost pravého a levého motoru. Pokud jsem vás předešlým textem trošku přesvědčil, tak možná přejdete z tiků enkodérů na počet otáček za sekundu (pravda standard je počet otáček za minutu), ale z toho se ale ještě nedozvíte, zda robot jede rychle nebo pomalu. To záleží ještě na velikosti kol, případně rychlost změny natočení pak i na jejich vzdálenosti. Nebudu to protahovat, player má interface position2d, kde pro tento typ robota nastavujete dopřednou rychlost v metrech za sekundu a úhlovou rychlost v radiánech za sekundu (jen pozn. ze ještě můžete nastavovat rychlost v ose y, pro roboty co mohou jezdit do strany). Použitý kód/define je PLAYER_POSITION2D_CMD_VEL.
Co nám to přineslo? Máme-li takto jednoznačně definované rozhraní (interface), tak robot na příkaz speedPxPa( 1.0, 0.0 ) pojede rychlosti 1m/s rovně dopředu, speedPxPa( 0.0, PI/2 ) se bude otáčet o 90 stupňů za sekundu proti směru hodinových ručiček a je úplně jedno, jestli je robot malá Khepera nebo velký Pioneer.
I kdyby jste Player nepoužívali, tak nastavování robota pomocí rozhraní podobnému position2d doporučuji. Konečně, rozhodnete-li se pro implementaci driveru pro Player, bude mít práci usnadněnou.

Měření vzdálenosti

Pro měření vzdálenosti platí stejná pravidla jako pro řízení robota. Opět jednočipem převedete např. výstup z IR senzoru Sharp pomocí A/D převodníku a hodnota 23 znamená vzdálená překážka. Převedete-li ji rovnou na metry, tak se vám s ní bude věru snáze pracovat.
Player podporuje několik rozhraní: laser, sonar a ranger. Všechny tři popisují naměřené vzdálenosti a liší se detaily spojenými s daným senzorem.

Laser

Máte-li laserový dálkoměr od německé firmy SICK, tak pomocí rozhraní laser ho můžete rovnou „zaobalit”. Předávaná informace jednak popisuje relativní polohu senzoru vůči robotu a dále scan, pole dat naměřených vzdáleností s pravidelným krokem.

Sonar

Hlavní motivací pro rozhraní sonar byli pravděpodobně roboti Pioneer, kteří mají sadu sonaru umístěných po obvodu robota. Sonary, na rozdíl od laseru, detekují překážku v jistém prostorovém úhlu a tento fakt by měl být zohledněn i v rozhraní. Vedle pole naměřených dat a pole pozic jednotlivých senzorů bych zde čekal popis šířky záběru senzoru, ale teď to v dokumentaci k verzi 2.1.1 nevidím.

Ranger

Ranger je podobný jako laser interface — posílají se kompletní scany a pozice je právě jedna.
Přiznám se, že z rozhraní pro měření vzdáleností jsem teď trošku rozpačitý. Zatímco sjednocení počítání pozice robota a jeho řízení mi přijde bezchybné (resp. netuším, jak by se to dalo udělat lépe), u vzdáleností bych čekal nějaký odhad přesnosti a u sonaru pak šíři záběru. Je i celkem pravděpodobné, že jsem to ne zcela pochopil a v diskuzních fórech bych se dozvěděl více.

Závěr

Máme teď dvě důležitá rozhraní: můžeme robota řídit a dovíme se, jaké vzdálenosti naměřily jednotlivé senzory. První pozorování je, že takto popsaného robota by bylo možné snadno simulovat. V tom okamžiku přichází na scénu Stage, kde si můžete simulovat hned několik robotů současně. Stage je totiž simulátor 2D prostředí.
Dále můžete s robotem jezdit po zadané trase, plánovat ve vektorové mapě, nebo se v ní automaticky lokalizovat. Píšete-li univerzální program, tak se ale musíte vyvarovat řízení typu: „pokud 3. a 4. sonar naměří méně než 0.5m, tak zastav” protože tím se dostáváte zpět na úroveň tiků a váš program poběží už pouze na vašem robotovi. To by ale zase bylo na delší vyprávění, tak někdy příště…
Jakékoliv poznámky/připomínky jsou vítany — použijte k tomu prosím tohoto formuláře.