czech english

Robotem rovně 2017

Short Circuits (reloaded)

Devátý ročník soutěže autonomních robotů a autíček pořádaný Radioklubem Písek rozhodně nezklamal. Počasí nám přálo a to se projevilo i na divácké návštěvnosti. Roboti se tedy vedle schopnosti jet rovně musí ještě naučit prodrat se davem, např. jevištěm rockového koncertu mezi stánky … Update: 15/6 — Istrobotics video

Soutěž Robotem rovně mám rád. Sice je rok od roku těžší doma vysvětlovat, proč někde musíme dokazovat, že náš robot neumí ani jezdit rovně, ale když k tomu vyjde počasí, jako letos, tak je to radost.
V první řadě se na jednom místě sejdou všichni, kdo si s mobilními outdoor roboty hrají. Letos mi přišlo, že ani nezáleží jak daleko je jejich robotická základna od Písku vzdálena: přijelo několik týmů z německého Deggendorfu, loňský vítěz Robotour z Bratislavy, ND Team… Troufl bych si říci, že většina soutěžících v Písku byla opakovaně (i když to nemám statisticky podložené). Proč? Je to jedinečná (nebo dokonce jediná?) šance se probudit ze „zimního spánku”, oprášit stroje a připomenout si, o čem ten reálný svět je. A samozřejmě spousty dalších důvodů.

John Deere X300R (CZU/TF + robotika.cz)

Zahradní traktůrek John Deere X300R už účastníci viděli loni. Mojí motivaci bylo ukázat, že jsme se od cihly na pedálu za ten rok trošku posunuli. Hydraulické řízeni má zpětnou vazbu z měření na levém předním kole, odometrie se počítá z enkoderů na obou předních kolech, jsou zapojena čtyři bezpečnostní STOP tlačítka (o kterých se i řídící program dozví, tj. nejenom zastaví motor, ale pošlou i signály po CANu), funguje dvojitý nárazník, integrován je laserový dálkoměr LMS100, kamera.
CAN modul si teď lépe filtruje měření polohy pedálu a v kombinaci s daty z enkodérů je již možnost regulace rychlosti (letos jsme jeli 0.5m/s). Tolerance zatáčení kol byla ale 2.5 stupně, což by ale v soutěži znamenalo, že robot sjede z cesty cca po 10m max. Dodělávali jsme tedy integrační složku, kdy pro akumulovanou chybu v natočení kol jsme jednorázově do nich „kopli” (otevření hydraulických ventilu na jeden cyklus = 1/20s = 50ms). Toto řádově pomohlo a hodí se to i do dalších, nesoutěžních, úkolů.
Jaká byla AIQ robota v sobotu 13. května 2017 ráno? Řekl bych nízká — robot uměl reagovat na tlačítka a zastavovat na překážky detekované laserem. Jak už to pokaždé bývá, tak robot nechtěl v prvním kole vůbec odstartovat. Myslím, resp. logy to pak potvrdily, že byl moc paranoidní a bál se vyrazit. Dav po obou stranách byl blíže než 1.3m (asi o 2cm) a tak nechtěl jet (přesněji, pokud je překážka blíže jak 1m, tak přejde do STOP stavu a rozjede se až při zmiňovaných 1.3m volného místa … a někdo před robotem při startu přeběhl). No nic, eXtrémní programování to sice nebylo, ale v tom dvou, možná tří, minutovém okně jsem tam po dvou neúspěšných startech na vhodné místo zasekl:
dist = 10.0
vše je v pohodě, všemi směry je 10m volného místa. A pak bylo dobře, že na traktůrku seděl Zbyněk. Nic by ho nezastavilo (tedy až na STOP tlačítka a nárazníky). 44m
Do druhého kola jsme toto trošku poladili. 270 stupňů jsme rozdělili na tři sekce, kdy v levé a pravé byl limit snížen na 60cm a rozjezdová vzdálenost 70cm. Vpředu to zůstalo na původním 1m a rozjezd 1.3m. Sice jsme nedojeli tak daleko jako v prvním kole, ale jen o pár metrů. 38m
Pro třetí kolo jsme již měli nasbírána reálná data a vymýšleli chytrost. Konkrétně byl v Parku krásně zelený trávník, tak se od něj „odrážet” (i když to bylo proti vnitřnímu přesvědčení sekačky). Nejjednodušší to bylo zapojit do hlavní řídící smyčky, což ale zároveň je špatné místo … a i se to v třetím kole trošku projevilo. Traktůrek občas „pozastavil” protože systém vyhodnotil, že laserová data jsou opožděna o více jak 0.3s a je tedy nebezpečné pokračovat. Ale byli jsme svědkem dvoustupňové korekce a to nám stačilo. 74m
Do čtvrtého kola jsme kód trošku optimalizovali a pak robot stíhal zpracovávat obrázky v hlavní smyčce. Skončili jsme na hnědé zadupané zemi u stolu štamgastů, který přijíždějící traktůrek nijak nevyděsil — možná to bylo tím, že byl tiší než právě hrající kapela. 84m
Proč mám rád Python a jeho pomocné knihovny pochopíte z výsledného kódu:
#
                img = cv2.imread(filename)
                if img is not None:
                    img = img[2*768/3:,:,:]
                    r = img[:,:,0]
                    g = img[:,:,1]
                    b = img[:,:,2]
                    mask = np.logical_and(g > b, g > r)
                    left = mask[:, :512].sum()
                    right = mask[:, 512:].sum()
                    if left > GREEN_LIMIT or right > GREEN_LIMIT:
                        if left < right:
                            global_offset = math.radians(2.5)
                        else:
                            global_offset = math.radians(-2.5)
                    else:
                        global_offset = 0.0
                robot.set_desired_steering(0.0 + global_offset)
… tak s ním jsme to letos dotáhli na 11. místo.

Bebop2 (CZU/INFO)


Výsledky


Odkazy

P.S. Omlouvám se za zveřejněný rozdělaný článek, ale nevím kdy dostanu odstavečky od vítězů ani zda je stihnu v rozumném čase zveřejnit, tj. plánuji ješte update

24. květen 2017 — vítězné týmy

Short Circuits Prague (Pavel Jiroutek)

Robotem Rovně byla naše první soutěž po tříleté pauze způsobené mým pobytem v zahraničí, kde průměrná strmost domovního schodiště téměř neumožňuje chůzi, natož přenášení těžkého robota (NL). Plán byl využít soutěž jako pevný milník pro znovuzprovoznění původně funkčního HW a SW. Jak to ale bývá, plán byl až příliš optimistický.
Největší ranou pro hladkou přípravu na soutěž bylo rozhodnutí (cca 2 měsíce před soutěží) zmigrovat ze starého Pythonu 2.7 na 3.5. Důvodem byl plán začít zkoumat DNN sítě ve frameworku, který novější python vyžaduje. Po hladké základní migraci kódu se robotický SW úspěšně otestoval na přehrávači historických dat a v simulátoru (používám V-REP). S optimismem a nákladem jiných pracovních i nepracovních povinností jsem odložil další přípravu na soutěž na čtvrtek před odjezdem do Písku. Bohužel se po prvním spuštění HW ukázalo, že nefunguje vůbec nic. Nový python pracuje jinak s daty a jejich kódováním, takže veškerou low-level komunikaci bylo nutné znovu odladit (po mnoha letech bez zásahu už jsem na to nebyl psychicky připraven).
Z pohledu HW došlo před soutěží k několika drobným změnám. Podařilo se mi rozbít USB konektor u kamery, pořídil jsem tedy novou, outdoorovou, 170 stupňů FOV. Také se mi nepodařilo najít IMU (našel jsem ji náhodně teprve včera pod stolem v troskách jiného robota), tak jsem na robota umístil starý kompas. Baterie naštěstí dlouhou odstávku přežily v pořádku (kromě baterie v řídícím notebooku, kterou bylo nutné vyměnit a projít si neočekávaným kolečkem kalibrace).
Jinak robot zůstal beze změn takto: Robot je na platformě podvozku modelu monster trucku velikosti 1:5. Hlavní výpočetní jednotku tvoří standardní notebook s Windows 10. Hardware je monitorován deskou Arduino Duemilanove. Senzorické vybavení robota tvoří magnetický kvadraturní enkodér, kompas, zadní sonary (pro tuto soutěž neaktivní), lidar (mířící šikmo na zem cca 3m před robota), GPS (pro tuto soutěž neaktivní) a kamera. Software je psaný v jazyce Python. Program získává aktuální informace o stavu HW prostřednictvím USB. Informace o stavu HW získává Arduino, které je v pravidelných intervalech posílá dále do hlavního programu. Hlavní program zajišťuje transformace stavu HW do jednotek a struktur nezávislých na HW platformě, PID kontrolér rychlosti, lokalizaci z odometrie a kompasu, detekci překážek a strmosti cesty (z lidaru) a také hlavní funkční logiku řídící chování robota - navigaci po zadané trase. Robot využívá strukturu Occupancy Grid Map pro fúzi vstupů z jednotlivých senzorů a metodu Vector Field Histogram pro navigaci v grid mapě.
Soutěž samotná proběhla až překvapivě hladce (na to, že jsem před soutěží nestihl robota ani jednou otestovat jako celek). První kolo bylo trochu kostrbaté, ale dojeli jsme až do konce a využili nasbíraných dat pro přesné nakalibrování směru robota pro další kola. Cestovní rychlost byla 0.3 m/s, takže jsme trať urazili za klidných cca 1200 sekund. Druhé kolo bylo o mnoho lepší, asi hlavně kvůli provedené kalibraci. Také jsme dojeli až do cíle a to v podobném čase.
Před třetím kolem nám kolega z jiného týmu prozradil, že se před několika lety změnila pravidla a že se roboti, kteří urazili celou trať alespoň jednou, celkově rozřadí podle nejrychlejšího kola. Nemělo tedy cenu pokračovat v hlemýždím tempu (viz první video), které jsme měli před třemi lety otestované. Abychom překonali nejrychlejšího robota, nastavil jsem rychlost na 1.5 m/s. Tuto hodnotu jsem použil spíše ve významu "maximální rychlost", protože jsem se domníval, že robot této rychlosti nedokáže dosáhnout. Ani jsem neočekával, že by dojel nějak daleko, protože veškerá konstanty (např. pro statistický update grid mapy) byly laděny pro velmi nízkou rychlost, aby se nemusel příliš optimalizovat kód. K mému velkému překvapení se této rychlosti robot skutečně celou cestu držel a navíc se mu podařilo celou trať opět projet. Tentokrát v čase 3:34 m (214 sekund). V cíli nám někdo řekl, že to na vítězství stejně není, protože to někdo před námi projel za 3:05. I tak jsem měl vítězný pocit, že jsme z daného HW a situace dostali maximum. Když jsme se vrátili na start, z výsledkové listiny jsem zjistil, že ARBot neměl 3:05 minut, ale 305 sekund, takže náš čas bohatě na první místo stačí (když to vidím teď zpětně, tak i těch 305 sekund mi přijde jako neskutečná rychlost).
Poslední kolo bylo už spíše exhibiční. Nechal jsem na robotovi nastavenou vysokou rychlost, protože jsem si chtěl tentokrát udělat pěkné video (odkaz níže) a potvrdit obecenstvu, že jsme si vítězství zasloužili. Tentokrát byl ale dojezd do cíle mnohem více vydřený. Přibylo hodně lidí a náš týmový rozrážeč davů (moje maminka běžící na videu před robotem) na to už sama nestačila. Robot proto musel řešit i několik skoro-kolizí (viz další video níže). Do cíle se ale dostal i tentokrát (za cca 288s). Tímto bych chtěl na cenu fair play nominovat Aleše z ARBotu, který skončil druhý. Zásadně nám pomohl v druhé půlce tratě udělat prostor pro dojezd opět až do cíle.
Závěrem bych chtěl zdůraznit, že Robotem Rovně je výborná vstupní soutěž do robotické sezóny, ale i do outdoorové robotiky celkově. Díky zdánlivě jendoduchému zadání se v ní lze dobře zúčastnit jak se začátečnickým tak i s pokročilým robotem. Příště určitě pojedeme znovu. Mezi tím si ale dáme ještě Roboorienteering a samozřejmě Robotour.

ARBot (Aleš Ruda)

Pro letošní sezónu jsem opustil technologii FPGA se stereoskopickou kamerou vlastní konstrukce, ale ve 3D vnímání světa vidím mnoho výhod a tak jsem se rozhodl použit komerční RGBD kameru Intel RealSense R200 a SBC UP2, který jsem podpořil na Kistarteru. SW jsem upravil z linuxu pro windows. Nakódoval jsem algoritmy pro detekci překážek z 3D kamery. Sonary jsem vyměnil za lidar Slamtec RPLIDAR A2. Algoritmus VFH jsem nahradil navigací na gridu. No pak jsem už jen čekal až mi dorazí UP2. Jenže SBC mi do závodu nedorazil a tak jsem ho narychlo nahrazoval notebookem Acer Aspire ES13. A ejhle, notes lidar neutáhne. Nu což, pojedu bez lidaru. A takhle jsem dorazil do Písku

1. Kolo

Po startovním hvizdu robot vyrazí kupředu, ale něco je špatně. Jede mírně doleva a po cca 30 metrech vyjíždí do trávy. Krátká analýza problému, vypnutí všech neklíčových algoritmů, vlastně zbyl jediný – jízda podle kompasu a posunul jsem požadovaný směr jízdy o 5 stupňů doprava.

2. Kolo

Tentokrát byl výsledek mnohem lepší. 108 metrů bylo výrazné zlepšení, ale zase to táhlo doleva. Do třetího kola bylo spousta času a tak jsem se pustil do testování. Z logů vyplynulo, že do levého motoru je nutné posílat o cca 6% vyšší akční zásah, aby robot jel rovně. V několika iteracích jsem zvýšil zesílení regulátoru, upravil požadovaný směr jízdy a vše důkladně přetestoval na závodní dráze.

3. Kolo

Již první metry naznačily, co bude následovat. Robot jel krásně středem. Minul značku 100m, 150m, 200m, 250m a 314m v čase 305 sekund. Hurááááá. V tu chvíli to byl nejlepší výsledek závodu. Jenže dlouho nevydržel. Famózních 214 sekund týmu Short Circuits je nepřekonatelných. Zvýšil jsem tedy rychlost na maximum.

4. Kolo

Vyšší rychlost se projevila jemným kmitáním robotu a opět táhnul doleva. Závodní dráhu opustil u značky 120m.

Co se pokazilo?

Tak to bych taky rád věděl. Robot jel po cestičce, ale modrá čára v následujícím obrázku ukazuje kudy si robot „myslel“, že jede. Velmi dobře to souhlasí se zadaným směrem. Zelená čára reprezentuje údaje z GPS. Domníval jsem se, že problém by mohl být v motorové jednotce, ale její testování neukázalo žádný problém. Že by magnetická deklinace? Ta je v ČR cca 3.5 stupně východně, ale já mám odchylku 7.5 stupně západně. Záhada.

ND Team (Pavel Skoták)

Na letošní (2017) Robotem Rovně jsem se vyloženě těšil, a to hned z několika důvodů: Loni na podzim se mi podařilo integrovat na robota Speedyho homemade 360° skenující lidar, konečně jsem přišel na to, jak pořešit pthreads a tedy vícevláknové programování v linuxu na mém oblíbeném Odroidu U3 a nakonec se podařilo připravit i integraci kamery.
Účast v soutěži tedy měla být především ostrým testem nových senzorů a algoritmu vyhýbání překážkám včetně detekce cesty kamerou. Samozřejmě se podělalo co mohlo, počínaje odřeknutím účasti mého kolegy a konče generální stávkou napájení celého robota, která, jak se záhy ukázalo, byla pouze iluzí způsobenou drobným opomenutím zásadního významu (blbě nastavená proudová pojistka na laboratorním zdroji). V každém případě další cenný čas v háji v důsledku lokálního zatmění mysli. Nefunkční budík v sobotu ráno a tím způsobený hodinový lag byl už jenom ponurou třešničkou na dortu podrazů ze strany škodolibého osudu.
Nicméně, přijel jsem relativně včas, homologoval se, pokecal s kolegy a při první soutěžní jízdě ujel celých 50m! Tak špatný výsledek jsem na této soutěži ještě neměl. Takže plánované testy kamery šly stranou a začalo se upravovat nastavení regulátoru azimutu, který zůstal od podzimu rozvrtaný, na což jsem úspěšně zapomněl. Druhá soutěžní jízda ukázala, že je to téměř ono, pouze robot trochu táhl doprava.
Během přestávky na oběd byl čas obejít depo a ukázalo se, že valná většina kolegů přes zimu rozhodně nezahálela a poměrně zásadním způsobem upravila hardware i software svých strojů nezanedbatelným směrem vpřed, což potvrzuje výsledková listina, kde šest robotů dojelo do cíle. V každém případě bylo na co koukat a o čem diskutovat.
Třetí jízda se zdála být jízdou jistoty - Speedy se držel uprostřed cesty a dělal čest svému jménu. Na 290. metru mě kolemjdoucí jemně upozornil, že robotovi odpadlo kolo. Nepublikovatelné výrazy jsem naštěstí udržel za zuby, ale dojezd do cíle po nasazení kola mi paní rozhodčí stejně neuznala Letos poprvé jsem před soutěží zapomněl dotáhnout kola a hned se mi to vymstilo.
Čtvrtá jízda byla spíše jízdou v korytě kolemstojících a v cestě překážejících diváků. Algoritmus vyhýbání překážkám naštěstí fungoval spolehlivě, takže jízda skončila až u pomníku na konci cesty.
Nakonec se ukázalo, že poslední výkon stačil na třetí místo, což bylo sice nečekané ale milé překvapení.
Letošní soutěž se opravdu vydařila, panovala družná atmosféra, bylo k vidění několik zajímavých novinek a především nám nezvykle přálo počasí, takže roboti letos nemuseli být vodotěsní. Doufám, že příští, již desátý ročník, bude podobně hojně obsazen a bude to ještě větší zábava.

15. červen 2017 — Istrobotics video

Doplňuji ještě video slovenského týmu Istrobotics, vítěze loňské Robotour:
a ještě krátké video s ukázkou různých týmů: