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ů: