czech english

RoboOrienteering 2025

nová lokace

Soutěž RoboOrienteering se po delší době koná na nové lokaci v lázeňském parku zámku Kynžvart. Úkolem robota je stále navšívit co nejvíce kontrolních bodů označených kužely s tím, že u pěti může odhodit míček a získat extra body. Vzhledem k tomu, že zámek Kynžvart je státní zámek a soutěž bude součástí oficiálního programu, je nutná brzká registrace do 31. května 2025. Samotná soutěž se koná v sobotu 21. června 2025. Update: 26/06/2025 — Freyja / Cogito - Přesnost lokalizace

Obsah


Změna lokace!

Z důvodu revitalizace (?) zámeckého parku se soutěž přesouvá na jíné místo — na dopravní hříště Základní školy Úšovice v Mariánských Lázních!
Doplňující info od organizátora soutěže:
V příloze naleznete mapu s vyznačenými značkami a jejich přesné souřadnice. Vzhledem k menšímu prostoru bude pouze 8 kontrolních bodů. Pokud pojede robot v pořadí číslování kuželů 1 – 8, délka trati je cca 350m. Pořadí a počet navštívených kontrolních bodů si můžete zvolit sami.
Start prvního kola je v 10:30 hod, vzhledem k velkému počtu přihlášených robotů se bude startovat v tří minutových intervalech. Během max. tří minut musí robot opustit startovací pozici.
Pokládání golfových míčků je dobrovolné, ale pokud to robot zvládne, získá body navíc. Body získá i za průjezd, nebo přiblížení se k cíli. Cíl bude umístěn jinde než start, aby nedocházelo ke kolizím se startujícími roboty.
Pokud by mělo během jízdy dojít ke střetu dvou či více robotů, je povoleno robota zastavit ( měl by se sice umět jinému robotovi vyhnout), a opětovně zase zapnout. To platí hlavně u střetu více robotů u kontrolního bodu - kuželu. Tady můžete robota v dostatečné vzdálenosti zastavit a až bude prostor kolem kuželu volný, pokračovat v jízdě.
Start 49°954046 12°709531
Cíl 49°953423 12°709187
1 49°9539450 12°708882
2 49°9537240 12°709185
3 49°9539130 12°709649
4 49°9541606 12°709484
5 49°9543109 12°709360
6 49°9542960 12°708717
7 49°9546010 12°708368
8 49°9536645 12°708831
… celková vzdálenost trasy při průjezdu všemi kontrolními body v pořadí 1 – 8 je cca 350m

Výsledky


Matty M03 - Robotika

Včerejší soutěž byla fajn — vlastně předčila všechna moje očekávání. Na rovinu se přiznám, že jsem se těšil na Kynžvartský zámecký park a že to byla jedna z motivací, proč do toho po delší době jít. Pak Jirka/Cogito zmínil, že je to jedna z mála soutěží letos, kam by mohl dorazit sám ze Švýcar. No a korunu tomu nasadil MartinL, když prohlásil, že se ho žena ptala, zda nebude nějaka soutěž, že by si udělali rodinný výlet. A s robotem (a ženou) do toho šel i PavelS, tak … řekněte v této konstelaci NE! a že máte už robotů po FRE plné zuby?!
Z čeho jsem však nakonec ustoupil byl počet robotů. Původně jsem chtěl „vyvětrat” velkého Pata, který by na rozsáhlý zámecký park pěkně pasoval. A přihlásil jsem i Mattyho M02, hlavího učastníka FRE, kdyby si to studenti náhodou rozmysleli — nerozmysleli. Nakonec jsem zůstal u jednoho robota Matty M03, kterému jsem se ale tady v Mariánkách mohl plně věnovat.
Přiznám se bez mučení, že přípravě jsem věnoval opravdu málo času … a na rovinu nebylo z čeho brát. Schválně otevřu pull request, tam to v těch commitech bude vidět (mimochodem mne tady dostal TomíkK, že vlastně sleduje i změny na GitHubu, což je asi první člověk, kterého znám ) No myslel jsem, že tam bude vidět i časová osa, ale není — ta je lépe vidět zde.
Je tam nějaký commit z 23. května 2025, kdy jsme se asi rozhodli, že do toho jdeme. Naházel jsem tam na hromadu kód z 2018 (???), hrátky s Patem a Cones Challenge. Další příhoz byl 18. června (3 dny do soutěže), kdy jsem tam pro vyhybání se překážkám přidal kus kódu z FREčka. I když to možná ještě byla jen jízda rovně … no raději toho nechám, je to ostuda a takto se přece člověk na soutěž nepřípravuje. Ale opravdu nám šlo o soutěž? Plán byl to pojmout jako společenskou událost a přizvat k tomu i naše roboty.

Testování na hřišti

Asi největší radost jsem měl z toho, že Matty M03 detekoval (resp. jeho neuronka běžící na OAK-D Pro) oranžový kužel bez pruhů! Model jsem převzal na zmiňovanou Cones Challenge (jen interní hecování) někde z internetu a nedotrénovával jsem to. (pozn. teď na ten odkaz koukám a je tam ukázka detekce přímo na oranžových kuželech) To bych tady na místě opravdu nedal. A co více, nejen že kamera kužely detekovala, ona je detekovala velmi dobře i na vzdálenost několika desítek metrů!
Ale klasicky to mělo i vedlejší efekt — při prvních testovacích jízdách vždy hned po startu vyjel a zahnul vlevo?! On tam totiž byl kužel (číslo 2) a tak se na něj vrhnul. Jen to bylo do kopce a ten před sebou krásně po rovince (číslo 1) ignoroval. Svůj starý kód si teď interpretuji tak, že pokud vidíš vícero kuželů, tak si vyber ten největší, tj. nejblíž (z barevného obrazu).

1. kolo

Startoval jsem poměrně na začátku, tak už nebyl čas na další úpravy a „problém” z testování jsem chtěl pořešit vhodným nasměrováním robota na startu. Úplně se to nepovedlo, ale myslím, že na druhý pokus vyjel skoro rozumně. Detaily si teď už přesně nevybavím, ale při náhodné jízdě s algoritmem:
  • když vidíš kužel, tak vyraž tím směrem
  • pokud je před tebou překážka, tak uhni volným směrem, který je blíže středu (levá vs. pravá)
  • jinak jeď rovně
  • a pokud i přesto narazíš (přední nárazník), tak si 1m couvni mírně do zatáčky
  • pokud je kužel méně než 1m před tebou zastav a čekej 3 sekundy
A tak Matty M03 vesele jezdil (rychlost jsem mu zvedl na maximálku 0.5m/s) a když to šlo, tak ze soutěžního prostoru „zdrhnul”. Nechal jsem ho přejet hřiště, silnici a až ke kontejnerům v dalším bloku, ale pak podle GPS (kterou jsem jenom sbíral a nepoužíval) byl více jak 100m od nejbližšího waypointu. Tam jsme robota se sudím o 180 stupňů otočili (to bylo v prvním kole povolené). Body získal někde na začátku (kužel 4?) tak zbytek už byl test, co vše přežije … a bylo to drsné.
První kolo skončilo bouráním do plotu, kdy se navíc připletl do plané růže a ta mu vytrhla kabel od kamery. Zpětně si uvědomuji, že za tu problémovou detekci drátěného plotu si možná můžu sám — místo nejblížší překážky jsem bral np.percentile(data, 5), tj. 5% nejbližších se ignoruje (typicky vyšší stonky trávy a šum) … a možná i ten plot.

2. kolo

Cílem druhého kola bylo se udržet v soutěžní aréně. Jelikož nedošlo k integraci kompasu (ani indicie typu míříš na sever nebo na jih), tak hrubou informaci měl robot pouze z GPS. Musel mezi tím ujet alespoň metr … a ano, byl to důvod tanečků. Algoritmus se změnil na
  • jinak jeď rovně, pokud GPS pozice od nejbližšího waypointu je menší než 20m
  • v opačném případě se otoč na waypoint
A jak to dopadlo? Jel krasně rovně na kužel číslo 1 a po dvaceti metrech se otočil o 180 stupňů zpět na start. A když v té divoké otočce neviděl žádný kužel, který by ho srovnal a nutil do jízdy na kužel tak se na té hranici 20m rád rozhlížel po okolí — viz obrázek odometrie z poslední části (i když to možná byl už test navíc po soutěžní jízdě). Za startovní kužel mi nikdo body dát nechtěl, ale přesto se robotu podařílo zase jeden (?) někde cestou ulovit.

3. kolo

Do posledního kola jsem přídal pár drobných, ale důležitých, změn:
  • ignoruj první waypoint (start)
  • pokud při reportu dosažení kužele jsi blíž jak 10m od nějakého waypointu, tak ho odstraň ze seznamu
  • pokud jsi více jak 20m od nejbližího ze zbývajících waypointu, tak se otáčej pomalým obloukem jeho směrem (ať orientace z GPS pozice dává alespoň trošku smysl).
Na doporučení jsem také přesunul GPS anténu alespoň na krabici — jak jsem tu GPS do té doby moc nepotřeboval, tak byla uvnitř.
A jezdilo to pěkně. Sice některé kužely si dal i 4x (v GPS waypointech je neměl, ale když je viděl, tak „nemohl odolat”), ale s časem a přirozenou randomizací (nature) za 75 minut navštívil všechny kužele. Ono třeba cíli byl cca v první třetině, ale nikde neni v pravidlech řečeno, že cíl musí být poslední. Bylo to úmorné a dalo se na to koukat jenom s tím, že níkdo nevěděl, co teď přesně udělá!
1:07 - cone4, scoring
4:04 - false detection
4:53 - cone1, not reporting, not scoring
8:39 - goal cone, scoring
10:20 - goal cone, not scoring
11:50 - goal cone, not scoring
13:42 - false detection
13:57 - false detection
14:54 - cone8, scoring
15:51 - Odroid, power reset
19:35 - cone6, scoring
21:13 - cone1, scoring
22:41 - cone2, scoring
23:57 - goal cone, not scoring
25:34 - manual intervention (?)
26:57 - false detection
27:53 - cone3, scoring
29:00 - start cone
30:24 - start cone
31:13 - found hole in the fence
31:50 - cone4, not scoring
37:55 - fence hole again
39:04 - cone4, not scoring
42:50 - cone4, not scoring
46:37 - cone5, not reporting, not scoring
50:05 - cone5, not reporting, not scoring
52:09 - start cone
52:25 - start cone
53:26 - cone4, not scoring
55:42 - cone5, scoring
57:48 - cone6, not scoring
59:05 - cone2, not scoring
1:00:07 - cone8, not scoring
1:04:15 - cone7, not reporting, not scoring
1:04:42 - camera restart
1:07:18 - cone7, scoring
TIMEOUT … časem snad doplním nějaké foto a video … a závěr, že díky moc ogranizátorům za super outdoor robotický den!

Freyja - Tým Cogito

Jak kdysi napsal spolužák do protokolu o chemické laboratorní práci: Pokus se mi líbil.
Martin už předestřel, že jsme se letos účastnili podle motta "robotická soutěž jako společenská událost." Jelikož praotce Čecha bolely nohy, jsou Čechy zbytečně daleko od mého současného bydliště. Do Mariánských Lázní ještě jakž takž dojedu jako jeden řidič za jeden den. Tj. v pátek tam, v neděli zpátky. Cokoli dál by mi zabralo div ne týden.
Po loňském nepředstavení na Elrobu bylo mým letošním cílem, aby se Freyja alespoň rozjela. Kód byl v zásadě právě z Elrobu. Jenom fázi 1, Následuj Mě a Pamatuj si Průjezdní Body, nahradily ručně zadané souřadnice průjezdních bodů. Prostě jsem kus kódu smazal.
Týden před soutěží zpochybňovala žena má - bez jejíž podpory by to nešlo! - moji snahu někam jet soutěžit, když robot nejezdí.
V pátek jsem totiž odpálil pojistku, pořád nevím jak. V sobotu nenabíhalo PC a kamery. V tom horku se na některé komponenty v robotovi ani nedalo sáhnout. Odrivům - řadičům motorů - se do akce taky spíš nechtělo. Dobrá zpráva byla, že kamery se mi podařilo "opravit." Nesmím totiž pustit všechny najednou, Jenže jsem při nějakém upgrade kódu vynechal veledůležité synchronizační sleepy. Potíž s Odrivy je podle všeho potíž s USB konektory. Robota jsem stavěl před šesti lety a nečekal jsem, že přežije svou první Subterranean Challenge. Ten věk začíná být znát.
Do předsoutěžní neděle jsem vkročil s nadějí v srdci. Kompas s IMU ji vyrval. Přešel z režimu "občas, velmi zřídka, zamrznu" do režimu "po každém startu za chvilku zamrznu." Ale já se nedám! Konečně ten problém dokážu reprodukovat! A co jde reprodukovat, jde spravit! No věřili byste tomu, že to několikasetmegahertzové dvoujádrové esp32 "arduino" se, když zaplní výstupní buffer sériové linky, totálně zasekne? Pracovní hypotéza je, že v tom horku něco zpomalilo a proto se ten buffer přeplňoval. Jednoduchým řešením je posílat data méně často. Beztak je podvzorkovávám na PC. O tom podivném kódu pro detekci překážek z lidaru, který tam byl už na Elrob 2024, se radši nebudeme bavit, ano? To do slušné společnosti nepatří.
Pondělní rychlý ranní test vypadal nadějně. Pondělní odpolední pohled na již dlouho nepoužitý nafouklý záložní lipoly akumulátor mě natolik vyděsil, že jsem ho ve svém pyrotechnickém obleku okamžitě odvezl do sběrného dvora a objednal jiný.
V úterý večer jsem připrogramoval homologační "když nemáš waypointy, jeď rovně." No jo, zapomněl jsem na homologaci. Ve středu večer jsem to otestoval a opravil, aby robot jel, ale ne na opačnou stranu. Robot se vcelku hýbal, jenom s těmi konektory toho už moc nenadělám.
V pátek jsem přejel do Čech, vybalil u hotelu robota, popojel rovně, senzory fungovaly, robota jsem vypnul a jal se moudře radit konkurenci.
V sobotu jsme se přesunuli do soutěžního prostoru. Homologace se nějak nekonala, tak jsem nastavil trasu podle Plánu A a robota cvičně pustil. Robot na první dobrou projel celou trasu, jen cílové kužely objel bokem a zastavil trochu moc daleko za nimi. Posunul jsem cílový bod v konfiguraci na sever a šel se socializovat do pitstopu na východ.
Do prvního soutěžního kola se nechtělo pustit PC. Viz Těžká Sobota. A už jste to zkusili vypnout a zapnout? Robot vyráží, krásně nachází čtyři kužely a vydává se směrem k úzkým kovovým trubkám kolem fotbalového hřiště. Při testovací jízdě jimi Freyja prokličkovala, zůstávám v klidu. To jsem neměl. Tentokrát se dala s jednou z trubek do boje. Býval jsem měl dělat překážku, to se smělo. Robota vypínám stop tlačítkem. V prvním kole ho smím posunout a pustit znovu. Nicméně odrivy už nenaběhly. V systémovám logu jsem pak našel nějaké divné errory z USB systému. Dobré zprávy jsou dvě: 1. Robot se rozjel, mám splněno. 2. Aniž bych si to uvědomil, můj nezvyklý průjezd v protisměru oproti očekávání vedl nejdříve přes vysoce bodované kužely. Nedojeli jsme jen k plebsovým kuželům. Zůstáváme ve hře.
Do druhého kola jsem posunul jeden z průjezdních bodů, aby měla Freyja více prostoru při objezdu basketbalového koše. Ach ty úzké kovové tyče. Teď už jsem z nich nervózní. S trochou pomoci aktivních překážek kolem tyčí u fotbalového hřistě Freyja objíždí celou trasu kolem všech kuželů. Jenom do cíle opět přijíždí z boku, čímž přichází o pár bodů.
Z mezivýsledků po druhém kole je zřejmé, že:
  • První s Freyjou nebudeme. Vedoucí robot kladoucí golfové míčky, což Freyja nedělá, už má pro nás nedosažitelné množství bodů.
  • Druzí taky nebudeme. To by musel průběžně druhý robot, taky kladoucí míčky, shořet, což se nejspíš nestane, a Freyja by musela předvést perfektní jízdu.
  • Třetí bychom být měli. Pokud neshoří Freyja, což se stát může, ale nemělo by, a neustřelí naprosto nadstandardním výkonem některý z robotů za námi.
V závěrečním kole chce organizátor vidět hodně pohybu a bodů a povoluje týmům roboty ručně zachraňovat z obtížných situací a znovu je pouštět. Tak na tomhle nemůžeme s Freyjou nic získat. Restarty nám zjevně nejdou. Můžeme jenom ztratit :-/ Musí něco předvést!
Do závěrečného kola posouvám průjezdní bod u hřistě dál od těch #@! trubek. Stejně byla ale zase potřeba živá stěna. A předělávám příjezd do cíle. Chci maxim bodů! Moje blbost. Copy paste error a robot se po návštěvě všech kuželů místo nájezdu do cíle vydává do Kazachstánu. A kdo ví, třeba tam jede dodnes.
Vrtá mi hlavou, jestli by se oprava waypointů v soutěžním prostoru považovala za ve třetím kole povolený restart, nebo za stále zakázanou úpravu kódu v poli.
Každopádně, na odražení Martinova závěrečného náporu to stačilo a ani při onom povoleném freestyle jiný robot bodově neustřelil.
Robot Freyja týmu Cogito získává třetí místo celkově a první v nevyhlášené mnou smyšlené kategorii robotů bez golfových míčků! Děkujeme organizátorům za krásné robotické setkání.
Po patřičné sobotní večerní socializaci v místních občerstvovacích zařízeních se v neděli vydávám domů, kde nacházím již připravený vítězný plán na příští ročník.

Freyja / Cogito - Přesnost lokalizace

RoboOrientering nám dává mimořádnou příležitost ověřit lokalizaci robota ve venkovním prostředí. Freyja totiž jede na zadanou souřadnici a dojede-li k ní, podle svého názoru, na méně než jeden metr, nahlásí kužel. Ale je opravdu kužel tam, kde ho očekává?
První indicii vysoké přesnosti Freyjiny lokalizace nám dává průběh soutěže. Všechny kužely, které Freyja hlásila, se vešly do 2,5 metru od ní, což je hranice měřená rozhodčími.
Druhou informaci nám dávají další senzory na robotovi a uložené logy z jízdy. Když robot zastaví u kuželu, měl by kužel být viditelný některým z lidarů nebo některou z hloubkových kamer. Pro účely tohoto článku se budu soustředit na vodorovný lidar. Je nejpřesnější a nejsnáze zpracovatelný.
Lokalizace na Freyje je možná trochu složitější, než je pro Roboorienteering nutné. Fúzuji dvě GPS (Septentrio Mosaic X5 na desce SimpleRTK3B, v RoboOreinteeringu bez RTK korekce), magnetický kompas (LIS3MDL), IMU (LSM6DSL), odometrii z kol a SLAM (simultánní lokalizace a mapování) z lidaru. Kompas z dvouanténových GPS kvůli rušení ze strany USB3 kamer během analyzovaného kola nefungoval a robot se pro určení své orientace musel spoléhat především na magnetický kompas a IMU. Odometrie je na smykově řízeném robotovi poměrně nekvalitní a pokud má lokalizace jinou možnost, odometrii moc nevěří. Kvalita lidarového SLAMu závisí na prostředí, na množství překážek a jejich pohyblivosti. V každém případě IMU, odometrie i SLAM dávají informaci jen o relativním otočení a nikoli o absolutním natočení, např. vůči severu.
Začněme kuželem č. 1, kde se robot podle všeho během svého druhého kola nejvíce ztratil. Na obrázku vidíme, že se očekávaná poloha kuželu, symbolizovaná červenou tečkou, od polohy detekované lidarem, symbolizované shlukem modrých teček, liší o necelého 1.5 metru. I v nejhorším teoretickém případě, což není případ kuželu č. 1, kdyby robot tuto chybu udělal nedojetím ke kuželu přesně před sebou a zastavil by metr od domnělé polohy kuželu, nejbližší část robota by stále byla blíže než 2,5 metru od kuželu.
U dalších kuželů vidíme rozdíl mezi očekávanou a skutečnou polohou kuželu pod půl metru, i když ne o moc.
Ostatní kužely, které neukazuji, na tom byly podobně. Jen zůstaly v zákrytu za částí robota a vodorovný lidar je v okamžiku jejich nahlášení neviděl. Detekce z ostatních senzorů dávají shodný obraz, jen s větším množstvím nepřesnosti ze strany senzorů.
Když se místo na fúzovanou lokalizaci soustředím jen na jednu z GPS a magnetický kompas s IMU, vychází to skoro také tak. U kuželu č. 1 se fúzovaná poloha a poloha s GPS shodují. U kuželu č. 2 je GPS dokonce přesnější. U kuželu č. 3 je fúzovaný odhad o 20 cm přesnější a u kuželu č. 5 o 50 cm.
Závěrem tedy je, že navzdory stromům lze RoboOrienteering zvládnout jen s GPS a kompasem, bez detekce kuželů, a v naprosté většině případů dojet do 2.5 metru od kuželu. Při kombinaci více senzorů to jde i přesněji. Pochopitelně pak s využitím kamery nebo lidaru pro závěrečné přiblížení anebo přidáním RTK či SBAS GPS korekcí je možné jet na dotyk s kuželem, jak předváděl vítězný robot (SBAS korekce).