Robotika.czhttps://robotika.cz/cs2024-01-25T00:00:00ZPat (a Mat)https://robotika.cz/robots/pat-a-mat/cs2023-09-08T00:00:00ZMartin Dlouhý
Vím, že písmeno <b>P</b> už bylo použité, ale pro (potenciální) dvojici pomocných robotů
mne automaticky asociovala dvojice kutilů z oblíbeného DIY seriálu. <span class='smile'></span>
<b>Blog update:</b>
24/3/2024 — <a href='/robots/pat-a-mat/cs#240324'>Navigace na kužel</a>
<hr/>
<div class='p'>Podvozek pro donáškového robota jsem poptával již léta. Začalo to s <a href='/competitions/eurobot/cs'>Eurobotem</a>
a robotem <a href='/robots/daisy/cs'>Daisy</a> (vlastně už s <a href='/robots/berta/cs'>Bertou</a>). Jedna z vizí byl pizzabot,
který by rozvážel ještě horkou pizzu na pokoje na internátě v Praze Troji.
No na realizaci nikdy nedošlo.</div>
<div class='p'>Další „donáškovou ligou” je soutěž <a href='/competitions/robotour/cs'>Robotour</a>. Zde je náklad <i>pouze</i> 5 litrový
soudek, ale i pro běžné RC modely je to už moc.</div>
<div class='p'>Nějakou větší platformu jsem plánoval poskládat ze stavebnice <a href='/articles/infento/cs'>Infento</a>, ale zatím jsem
tam nerozchodil ani ovládání motoru a o nějakých enkodérech ani nemluvě.</div>
<div class='p'>Na <a href='/competitions/subtchallenge/cs'>SubT Challenge</a>
se mi líbil <a href='/robots/kloubak/cs'>Kloubák K2 a K3</a>, ale přestože má dobrou prostupnost terénu, chybí nějaké vhodné
místo, kam by se připevnil náklad. Navíc je tam problém výroby — netuším, zda někdy studenti poskládají
K4, ale „letos to nebude”.</div>
<div class='p'>Co se komerčně dostupných platforem týče, tak si pamatuji noční šestikolovou můru z Francie, kterou Jirka testoval
na <a href='/competitions/fieldrobot/2010/cs'>Field Robot 2010</a>. Pak jsem si nějaký čas hrál s <a href='/robots/husky/cs'>Husky</a> od
<a href='https://clearpathrobotics.com' class='external'>Clearpath Robotics</a>. Nebyla to úplně levná sranda a když si vzpomenu na stopy jak na trávníku tak
na podlaze v obyváku, tak bych raději podvozek s možností zatáčení.</div>
<div class='p'>A konečně by bylo dobré pořídit již nějakou existující platformu a ne experimentální prototyp.</div>
<div class='p'>A když jsme nedávno znovu hledali platformu, co by byla schopna unést 100kg nákladu, tak jsme narazili na firmu
<a href='https://www.yuhesen.com/' class='external'>Yuhesen</a>:
<i>Founded in 2013, Yuhesen Technology is an industrial leading modular intelligent mobile robot provider building the easy-to-operate and high control precision robot platforms to support robotics research in the field of manufacturing, agriculture, educational, logistics, military and aerospace. YUHESEN has established a robotics product system covering all-terrain UGV and ROS based autonomous robotics solutions.</i></div>
<div class='p'>Robotických platforem nabízí hned několik s tím, že na současnou úlohu nejlépe pasoval
<a href='https://www.yuhesen.com/en/productcenter/info.aspx?itemid=372' class='external'>FR-07 Pro</a>:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/fr07pro.jpg'><img src='/robots/pat-a-mat/fr07pro_t.jpg' alt='FR-07 Pro (foto převzato z webu výrobce)' title='FR-07 Pro (foto převzato z webu výrobce)' class='border' width='320' height='204'/></a><br/>
<a href='/robots/pat-a-mat/fr07pro.jpg'>FR-07 Pro (foto převzato z webu výrobce)</a>
</td></tr></table></div>
<ul>
<li>Rozměry: 132 x 76 x 49cm</li>
<li>Váha: 125kg</li>
<li>Náklad: 100kg</li>
<li>Rychlost: 8km/h</li>
<li>Max stoupání: 10 stupňů</li>
</ul>
<h2>Obsah</h2>
<ul>
<li><a href='/robots/pat-a-mat/cs#230908'>230908 - Nalodění</a></li>
<li><a href='/robots/pat-a-mat/cs#230927'>230927 - Prověření transakce, beneficiary name a EVER GLOBE</a></li>
<li><a href='/robots/pat-a-mat/cs#231103'>231103 - Čínský agent v Praze</a></li>
<li><a href='/robots/pat-a-mat/cs#231110'>231110 - První dojmy</a></li>
<li><a href='/robots/pat-a-mat/cs#231113'>231113 - Baterka a brzda</a></li>
<li><a href='/robots/pat-a-mat/cs#231115'>231115 - ZERO battery voltage</a></li>
<li><a href='/robots/pat-a-mat/cs#231116'>231116 - PCAN</a></li>
<li><a href='/robots/pat-a-mat/cs#231118'>231118 - Remote Control</a></li>
<li><a href='/robots/pat-a-mat/cs#231119'>231119 - První ujeté centimetry a User manual V2.2.0</a></li>
<li><a href='/robots/pat-a-mat/cs#231123'>231123 - Nabíječka a dálkový ovladač</a></li>
<li><a href='/robots/pat-a-mat/cs#231127'>231127 - Zbyňkovy hračky a Anderson konektory</a></li>
<li><a href='/robots/pat-a-mat/cs#231221'>231221 - Stará baterka</a></li>
<li><a href='/robots/pat-a-mat/cs#240102'>240102 - Odložené uspokojení</a></li>
<li><a href='/robots/pat-a-mat/cs#240103'>240103 - Konec srandy - baterka je zpátky v Německu!</a></li>
<li><a href='/robots/pat-a-mat/cs#240111'>240111 - Vzkříšení</a></li>
<li><a href='/robots/pat-a-mat/cs#240119'>240119 - Nová baterka!</a></li>
<li><a href='/robots/pat-a-mat/cs#240120'>240120 - Pat nemá rád sníh</a></li>
<li><a href='/robots/pat-a-mat/cs#240210'>240210 - Odyssey a 3x USB</a></li>
<li><a href='/robots/pat-a-mat/cs#240302'>240302 - Pat follows Path</a></li>
<li><a href='/robots/pat-a-mat/cs#240324'>240324 - Navigace na kužel</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog / Pat (a Mat)</h1>
<div class='p'><a id="230908"></a></div>
<h2>8. září 2023 — Nalodění</h2>
<div class='p'>Dnes rano jsem dostal tyto fotky, které mne celkem potěšily, tak jsem se rozhodl odstartovat Pat-ovský blog. <span class='smile'></span></div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/pat-to-go.jpg'><img src='/robots/pat-a-mat/pat-to-go_t.jpg' alt='Obsah balení' title='Obsah balení' class='border' width='320' height='312'/></a><br/>
<a href='/robots/pat-a-mat/pat-to-go.jpg'>Obsah balení</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/pat-in-box.jpg'><img src='/robots/pat-a-mat/pat-in-box_t.jpg' alt='Pat ve futrále' title='Pat ve futrále' class='border' width='320' height='323'/></a><br/>
<a href='/robots/pat-a-mat/pat-in-box.jpg'>Pat ve futrále</a>
</td></tr></table>
<table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/crate.jpg'><img src='/robots/pat-a-mat/crate_t.jpg' alt='Přepravní box' title='Přepravní box' class='border' width='320' height='226'/></a><br/>
<a href='/robots/pat-a-mat/crate.jpg'>Přepravní box</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230927"></a></div>
<h2>27. září 2023 — Prověření transakce, beneficiary name a EVER GLOBE</h2>
<div class='p'>Tak jo, drobný posun. Omlouvám se, že jsem článek na chvili „schoval” (on ho stejně Google snadno našel i když byl <i>hidden</i>),
protože situace nebyla úplně příznivá. Začalo to bankou, která chtěla „prověřit transakci”:
<i>... banky dle zákona č. 253/2008 Sb., § 9 odst. 1 mají mimo jiné povinnost provádět kontrolu transakcí na účtu a mají právo klienta požádat o vysvětlení případně doložení transakcí, které probíhají na jeho účtech vedených u dané finanční instituce...</i></div>
<div class='p'>Pak to trvalo skoro 10 dní než se peníze dostaly z evropské banky do te čínské … přečetl jsem si <a href='https://www.banky.cz/poradna/3255-do-ciny/' class='external'>dotaz na platbu do Číny</a>, 14 dní žádná doba a nehrotil to (jméno <i>Pavel Strašák</i> mi také přišlo tématické <span class='wink'></span>). Zabalený robůtek mezitím čekal ve skladu …</div>
<div class='p'>Pak to pokračovalo z čínské strany: <i>The bank notified us they just received the payment. However it's incorrect beneficiary name so they can't released the remittance to us. It should be SHENZHEN YUHESEN TECHNOLOGY CO., LTD.</i></div>
<div class='p'>Kupodivu i toto se dá vzdáleně opravit, něco to stojí (prý až dalších 80 USD), ale … <i>Good news. The bank just notified us they received the modify request and confirmed the payment is transfer to us.</i></div>
<div class='p'>A dnes přišlo info, že robot už je na cestě na <a href='https://www.vesselfinder.com/vessels/details/9786841' class='external'>EVER GLOBE</a> (obrázek EVERGREEN je snad jen ilustrativní). <i>ETA could be the middle of November.</i> Uvidíme, co robota na cestě ještě potká.</div>
<hr/>
<div class='p'><a id="231103"></a></div>
<h2>3. listopadu 2023 — Čínský agent v Praze</h2>
<div class='p'>Jestli myslíte, že se za titulkem skrývá informace, že už je PatAMat (<a href='/competitions/elrob/2024/cs#231005'>jak mu říká Jirka</a>) v Praze, tak vás zklamu.
Toto navazuje na mailovou konverzaci ze začátku října, která se ke mne náhodou dostala.
Tam jsem se dozvěděl, že <b>já jsem ten agent!!!</b>
<i>... their company has a product agent in Prague, ...</i></div>
<pre>The contact persion in PRAGUE for Yuhesen product:
Name: Martin DLOUHY
E-mail: Robotika.czmdXXX
Tel: +420 XXX</pre>
<div class='p'>… nejprve mne to vytočilo do běla, pak mi to přišlo k smíchu … a po měsící už skoro i ke zveřejnění <span class='wink'></span></div>
<div class='p'>Sledoval jsem, jak lodička (chápejte kontejnerová loď) pluje a kde asi robot touto dobou je a když nám posledně přišlo, že už jede loď zpět do Číny,
tak jsem se raději zeptal. Odpověď byla šita na míru čínského agenta:</div>
<div class='p'><table class='image_panel center' style='width: 542px;'><tr><td>
<a href='/robots/pat-a-mat/pat-delivery.png'><img src='/robots/pat-a-mat/pat-delivery_t.png' alt='zboží na cestě' title='zboží na cestě' class='border' width='536' height='272'/></a><br/>
<a href='/robots/pat-a-mat/pat-delivery.png'>zboží na cestě</a>
</td></tr></table></div>
<div class='p'>tak ještě že máme ty imperiální translátory … no tak tentokrát se moc nevytáhly :-(. Tak jen indicie, že Pat asi přestoupil na jinou loď a 5-7 asi odpovídá
větě v mailu: <i>The cargo has transfer to Germany warehouse now and will be delivered to your address in 5-7 days.</i> Nechci být hnidopich, ale 27 + 7 je dnes.
Jako jsem rád, že dnes dorazily ty lidary, ale to bude jiný blog …</div>
<div class='p'>p.s. jenom doufám, že jak překladač přeložil pravou část jako <i>destination Republic of China</i>, tak se pletl …
„Matka vyhodnotila signál jako varování” (z filmu <a href='https://www.csfd.cz/film/8265-vetrelec/prehled/' class='external'>Vetřelec</a>).</div>
<div class='p'>p.s.2 beru zpět tu poznámku o imperiálních překladačích … ona tam byla autodetekce jazyka a nějak přišel na Češtinu … když jsem mu vybral vhodnější, tak:</div>
<pre>Dotaz na nákladní list
Číslo nákladního listu
Číslo převodního příkazu
čas schůzky
destinace
ilustrovat
fungovat
HX80054767
2023-10-27 0
Česká republika
Odhadovaný počet položek převedených do německého skladu je 5-
Znovu zkontrolujte stopu
1:06:41
Rozbalte podrobnosti
Zadejte prosím číslo objednávky (až 10), oddělené
klávesou Enter
HX80054767
【HX80054767】Podrobnosti
čas schůzky
plocha
podrobnosti
27. 10. 2023 01:06:41
Bire
Byl převezen do německého skladu a očekává se, že dorazí za 5-7 dní.
24. 10. 2023 16:40:58
Bire
Dorazil do přístavu
Zeptejte se
22. 10. 2023 00:00:00
Bire
|Předpokládaný čas příjezdu
2023-10-03 00:00:00
Shenzhen
|Odhadovaný čas plavby
27.09.2023 22:53:45
Shenzhen
| Jméno a číslo lodi: EVER GIFTED 0675-020w
27.09.2023 18:53:45
Shenzhen
|Protože inspekce nedodržela plán plaveb této lodi, je třeba ji odložit na další loď
26.09.2023 10:10:43
Shenzhen
|Odhadovaný čas plavby
22.09.2023 10:09:00
Shenzhen
Skříň nainstalovaná
22.09.2023 10:09:00
Shenzhen
| Název lodi a plavba: EVER GLOBE 0674-017W
25.09.2023 10:08:44
Opusťte distribuční centrum
2023-09-09 09:31:27
|Vstupte do distribučního centra</pre>
<hr/>
<div class='p'><a id="231110"></a></div>
<h2>10. listopadu 2023 — První dojmy</h2>
<div class='p'>A je to tady! Už dlouho jsem se na něco tak netěšil a zároveň z toho měl tak velké obavy. <span class='smile'></span>
A oboje bylo naplněno. Balíčk dorazil. Bylo třeba tomu jít naproti, sehnat si dvakrát delší
<b>evropské</b> trackovací číslo, provolat se k člověku co to má na starosti a možná jako v tomto
případě řekne: „Jo, jo, včera to dorazilo, ale nebyl tam žádný telefón, takže je to zatím u nás
ve skladu.” Den na to to ale expedovali, takže OK.</div>
<div class='p'>Pro začátek je třeba dodávka/nákladák s paletovou plošinou. Ta hračka, podle papírů, váží 125kg
ale s krabicí a paletou už to hodí 180kg. Prostě ve dvou to neodnesete. Ale on je i problém s tím
kousek popojet. Co si budeme povídat, Pat s domečkem skončil uprostřed zahrady. Dál to s paletovým
vozíkem nešlo.</div>
<div class='p'>První dojem byl … že je Pat <b>obrovský</b>. <span class='smile'></span> Žena to později komentovala, že <i>je to velké jak kráva</i>!
Ale ono je to asi ve srovnání s robůtky, co si člověk sám zvedne a odnese do auta, rozhodně pravda. Minimálně tak
velká kola snad nemá ani <a href='/robots/spider/cs'>Spider3 Rider</a>. Ale neměřil jsem to, zatím.
Co jsem ale změřil jsou rozměry krabičky: <b>145cm x 90cm x 60cm</b> (s paletou 72cm).</div>
<div class='p'>Vedle toho, že Pat už je <i>doma</i>, mne potěšilo příslušenství — je tam i PCAN-USB převodník.
Případnému hraní tedy nic nebrání.</div>
<div class='p'>A teď ty špatné zprávy — brání. Nejde to zapnout. Tipoval bych, že je tam někde schovaná pojistka, ale …
robota jsem hned v poledne dal na nabíječku a psal Lambertovi, že platforma dorazila. Rovnou mne znova
varoval (skleróza je hrozná věc), že vzhledem k tomu jak dlouho pojede robot lodí, je baterka úmyslně
odpojena. Je třeba rozebrat levý kryt a baterii tlačítkem zapojit. Nepomohlo to.</div>
<div class='p'>Status? Pat spí uprostřed zahrady — snad divoká prasata nebudou zkoumat, co je to za nový přírustek.</div>
<div class='p'><center>
<table border="1">
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/box.jpg'><img src='/robots/pat-a-mat/box_t.jpg' alt='Krabice na zahradě' title='Krabice na zahradě' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/box.jpg'>Krabice na zahradě</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/charging.jpg'><img src='/robots/pat-a-mat/charging_t.jpg' alt='První nabíjení' title='První nabíjení' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/charging.jpg'>První nabíjení</a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/side-view.jpg'><img src='/robots/pat-a-mat/side-view_t.jpg' alt='Pohled z boku' title='Pohled z boku' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/side-view.jpg'>Pohled z boku</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/open-side.jpg'><img src='/robots/pat-a-mat/open-side_t.jpg' alt='Otevřený levý bok' title='Otevřený levý bok' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/open-side.jpg'>Otevřený levý bok</a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/battery.jpg'><img src='/robots/pat-a-mat/battery_t.jpg' alt='Baterka s čínským popisem' title='Baterka s čínským popisem' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/battery.jpg'>Baterka s čínským popisem</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control.jpg'><img src='/robots/pat-a-mat/remote-control_t.jpg' alt='Remore Control' title='Remore Control' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control.jpg'>Remore Control</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>p.s. zapomněl jsem zmínit, že robot je defaultně zabrzděný, tj. je třeba ho napájet, aby se odbrzdil</div>
<hr/>
<div class='p'><a id="231113"></a></div>
<h2>13. listopadu 2023 — Baterka a brzda</h2>
<div class='p'>Neveselo, truchlivo … hned se pozná první den dovolené. <span class='wink'></span> Dnes bylo nevlídno celý den. Ráno jsem byl domluvený s
<a href='https://yuhesen.en.alibaba.com/' class='external'>Lambertem</a> (řekl bych, že obrázek na Alibabě je čistě ilustrativní <span class='smile'></span>, ale je tam více
o Yuhesenu, je zvláštní, že cena je skoro dvojnásobná … že by už vánoce?!)
na videohovoru ještě s technikem. Chtěli vidět robota „naživo”, což samozřejmě dává smysl, ale s tím deštěm
uprostřed zahrady nic moc. Hodil jsem přes otevřenou krabici velkou plachtu a <i>streamoval</i> jak zapínám baterku
a nabíječka nereaguje. Pak říkali ať platformu zapnu i když je na nabíječce (v manuálu to myslím doporučené není)
a začalo to svítit a blikat jak vánoční stromeček. Tak už vím na co se mám tešit, až „baterka naběhne”, naběhne-li.</div>
<div class='p'>Teorie je taková, že venku je příliš chladno a tak se ochranný systém brání nabíjení. Lambert říkal 10 stupňů C a
venku dnes přes den bylo 5.5C. A v noci nejspíše i mrzlo — rozhodně to není ideální pro baterku po X dnech cestování lodí.</div>
<div class='p'>Druhou novinkou je <b>brzda</b>. Defaultně se „zamkne”, když je robot bez napájení, ale páčkou lze odblokovat:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/pat-brake.jpg'><img src='/robots/pat-a-mat/pat-brake_t.jpg' alt='brzda' title='brzda' class='border' width='320' height='426'/></a><br/>
<a href='/robots/pat-a-mat/pat-brake.jpg'>brzda</a>
</td></tr></table></div>
<div class='p'>Milé překvapení bylo, že po odblokování brzdy bylo s robotem možné relativně snadno manipulovat (i když má těch 125kg).
Tak jsem ho přesunul pod střechu a na vozíku přesunul i „ulitu”:</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/home-on-wheels.jpg'><img src='/robots/pat-a-mat/home-on-wheels_t.jpg' alt='domeček na kolečkách' title='domeček na kolečkách' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/home-on-wheels.jpg'>domeček na kolečkách</a>
</td></tr></table></div>
<div class='p'>Další dobrá zpráva byla, že se Pat vejde do auta … dost mi to připomnělo <a href='/competitions/subtchallenge/finals/cs#210624'>výlet na Býčí skálu</a>
s K2. Sedačky je třeba sklopit a i jedno místo vzadu zůstane. <span class='wink'></span></div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/loading1.jpg'><img src='/robots/pat-a-mat/loading1_t.jpg' alt='nakládka (1/3)' title='nakládka (1/3)' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/loading1.jpg'>nakládka (1/3)</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/loading2.jpg'><img src='/robots/pat-a-mat/loading2_t.jpg' alt='nakládka (2/3)' title='nakládka (2/3)' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/loading2.jpg'>nakládka (2/3)</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/loading3.jpg'><img src='/robots/pat-a-mat/loading3_t.jpg' alt='nakládka (3/3)' title='nakládka (3/3)' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/loading3.jpg'>nakládka (3/3)</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>Zapnul jsem <i>naftová kamínka</i>, vytopil auto na 23C a … nic, nepomohlo to.</div>
<div class='p'>Další pokus bylo vytažení baterie. Lambert psal: <i>It's better to label the cables before you remove the battery.
The red and black are not interchangeable.</i></div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/car-temperature.jpg'><img src='/robots/pat-a-mat/car-temperature_t.jpg' alt='teplota v autě' title='teplota v autě' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/car-temperature.jpg'>teplota v autě</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/labeling.jpg'><img src='/robots/pat-a-mat/labeling_t.jpg' alt='označení kabelů' title='označení kabelů' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/labeling.jpg'>označení kabelů</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>Řekl bych, že to byl jeho první zásek … no to je tak, když programátor hrabe do HW. Až po chvíli mi došlo, že to jsou
<b>jenom průchodky!</b> … ty jen tak neodpojím. <span class='wink'></span> Když se ale povolí 4 šrouby (2 vlevo a 2 vpravo), tak lze s baterií snadno
posouvat a …</div>
<div class='p'><table class='image_panel center' style='width: 186px;'><tr><td>
<a href='/robots/pat-a-mat/power-connectors.jpg'><img src='/robots/pat-a-mat/power-connectors_t.jpg' alt='napájecí konektory' title='napájecí konektory' class='border' width='180' height='320'/></a><br/>
<a href='/robots/pat-a-mat/power-connectors.jpg'>napájecí konektory</a>
</td></tr></table></div>
<div class='p'>… tak to bych možná ani já nepopletl.</div>
<div class='p'>Ještě drobná lekce čínštiny … jako opravdu díky za ty přkladače. <span class='smile'></span></div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/warning.jpg'><img src='/robots/pat-a-mat/warning_t.jpg' alt='Čínské varování' title='Čínské varování' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/warning.jpg'>Čínské varování</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/warning-cs.jpg'><img src='/robots/pat-a-mat/warning-cs_t.jpg' alt='CS překlad' title='CS překlad' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/warning-cs.jpg'>CS překlad</a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/battery-label.jpg'><img src='/robots/pat-a-mat/battery-label_t.jpg' alt='Štítek baterky' title='Štítek baterky' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/battery-label.jpg'>Štítek baterky</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/battery-label-cs.jpg'><img src='/robots/pat-a-mat/battery-label-cs_t.jpg' alt='Modelka' title='Modelka' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/battery-label-cs.jpg'>Modelka</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<hr/>
<div class='p'><a id="231115"></a></div>
<h2>15. listopadu 2023 — ZERO battery voltage</h2>
<div class='p'>Zatím žádné dobré zprávy. Původně jsem včerejší titulek chtěl nazvat <a href='https://cs.wikipedia.org/wiki/No_pasar%C3%A1n' class='external'>No pasarán</a>
s touto fotkou:</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/no-pasaran.jpg'><img src='/robots/pat-a-mat/no-pasaran_t.jpg' alt='No pasarán' title='No pasarán' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/no-pasaran.jpg'>No pasarán</a>
</td></tr></table></div>
<div class='p'>Aneb poučení, že pokud máte někde schovaná „zadní vrátka”, tak někdy zkuste, zda jimi opravdu projdete. <span class='smile'></span> Matfyzácké řešení by
bylo, že když měla krabice s robotem na výšku 60cm, tak <i>při změně souřadného systému</i> by robot měl projít, není-liž pravda? <span class='wink'></span> Asi lepší řešení
navrhla žena a to vysadit branku a pak se tam Pat vešel.</div>
<div class='p'>Jak to pak vypadalo v chatě raději komentovat nebudu — prostě co měl Harry Potter pod schody byl luxus! Pat to dal jen do
předsíně — vyndavat kvůli němu kamna v obýváku jsem fakt nechtěl. No nic, je v teple.</div>
<div class='p'>Druhý titulek co mne napadl byl „židovský vtip” o malém bytě, kdy rabín doporučí tazateli si pořídit kozu … ale nemůžu ho najít :-(
Tak s <b>FR-07 Pro</b> je to podobobné. Pokud máte moc malý byt, poříďte si velkého robota …</div>
<div class='p'><table class='image_panel center' style='width: 186px;'><tr><td>
<a href='/robots/pat-a-mat/yennie-and-pat.jpg'><img src='/robots/pat-a-mat/yennie-and-pat_t.jpg' alt='Yennie hlídá Pata' title='Yennie hlídá Pata' class='border' width='180' height='320'/></a><br/>
<a href='/robots/pat-a-mat/yennie-and-pat.jpg'>Yennie hlídá Pata</a>
</td></tr></table></div>
<div class='p'>A dnes jsem si koupil nový voltmetr, abych mohl proměřit tu <i>zatracenou</i> baterku:</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/zero-voltage.jpg'><img src='/robots/pat-a-mat/zero-voltage_t.jpg' alt='ZERO voltage' title='ZERO voltage' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/zero-voltage.jpg'>ZERO voltage</a>
</td></tr></table></div>
<div class='p'>Prostě je to nula ať propojíte cokoliv nebo vypnete/zapnete, napříč konektory … prostě nic. Je na čase otevřít zaplombovanou „černou skříňku”?
Čekám na autorizaci z Číny.</div>
<hr/>
<div class='p'><a id="231116"></a></div>
<h2>16. listopadu 2023 — PCAN</h2>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.record -duration 10 config/test-pcan.json
-note "Ubuntu Yuhesen PCAN2/USB, 10s"
2023-11-16 00:13:36,761 root WARNING Environment variable OSGAR_LOGS is not set
- using working directory
2023-11-16 00:13:36,761 __main__ INFO /home/md/git/osgar/test-pcan-231115_231336.log
2023-11-16 00:13:36,896 can DEBUG can config: {'bitrate': 500000, 'interface':
'pcan', 'channel': 'PCAN_USBBUS1'}
2023-11-16 00:13:36,898 can.pcan WARNING uptime library not available, timestamps are relative
to boot time and not to Epoch UTC
2023-11-16 00:13:37,460 __main__ INFO SIGINT handler installed
2023-11-16 00:13:47,471 can.bus WARNING PcanBus was not properly shut down
(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.logger /home/md/git/osgar/test-pcan-231115_231336.log
k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>
0 sys 269 | 3 | 0.3Hz
1 can.can 109072 | 6416 | 599.1Hz
Total time 0:00:10.709735
(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.logger /home/md/git/osgar/test-pcan-231115_231336.log
-stream can.can -format '{hex(data[0])}' | sort | uniq -c
1002 0x18c4d2ef - Chassis control feedback command
1003 0x18c4d7ef - Left rear wheel information feedback
1003 0x18c4d8ef - Right rear wheel information feedback
200 0x18c4daef - Chassis I/O status feedback
1002 0x18c4dcef
1003 0x18c4deef - Chassis speedometer feedback
100 0x18c4e1ef - Battery BMS information feedback
100 0x18c4e2ef - Battery BMS mark status feedback
1003 0x18c4eaef - Vehicle fault status feedback</pre>
<div class='p'>… tj. jedna nezdokumentovaná zpráva?</div>
<pre>0x18c4e1ef 0000000000007070
0x18c4e1ef 0000000000008080
0x18c4e1ef 0000000000009090
0x18c4e1ef 000000000000a0a0
0x18c4e1ef 000000000000b0b0
0x18c4e1ef 000000000000c0c0</pre>
<div class='p'>… tj. až na poslední <i>counter</i> je vše nula.</div>
<pre>0x18c4e2ef 0000000000007070
0x18c4e2ef 0000000000008080
0x18c4e2ef 0000000000009090
0x18c4e2ef 000000000000a0a0
0x18c4e2ef 000000000000b0b0</pre>
<div class='p'>… 0% zbývající baterie, min/max teplota 0C = nesmysl.</div>
<hr/>
<div class='p'><a id="231118"></a></div>
<h2>18. listopadu 2023 — Remote Control</h2>
<div class='p'>Uznávám, ze poslední <a href='/robots/pat-a-mat/cs#231116'>záznam o PCANu</a> jsem „lehce ošidil” o nějakou omáčku. Bylo to až po půlnoci,
kdy mne ostatní vyhecovali <a href='/articles/reviews/pcan/cs'>rozchodit si převodník</a> a pak bylo tedy možné už rovnou v <a href='https://github.com/robotika/osgar/' class='external'>OSGARu</a>
nahrát si nějaká CAN bus data. A další den jsem začal psát <a href='https://github.com/robotika/osgar/compare/feature/yuhesen' class='external'>OSGAR driver pro Yuhesen FR07 platform</a>.</div>
<div class='p'>Pár pozorování:</div>
<ul>
<li>CAN zprávy z BMS (Battery Management System) jsou vždy samé nuly ať už je baterka zapnutá, vypnutá nebo je kabel úplně vypojený!
Z toho bych soudil, že pětipinový konektor není CAN</li>
<li>Většina zpráv jede na 100Hz</li>
<li>CAN zprávy pro řízení maji i <i>echo</i>, které vrací podle jakých příkazu se jede (hodí se v kombinaci s <i>Remote Control</i>)</li>
</ul>
<div class='p'>Zapnout dálkové ovládání, když je Pat puštěný na nabíječce vypsal toto:</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control-start.jpg'><img src='/robots/pat-a-mat/remote-control-start_t.jpg' alt='Úvodní obrazovka' title='Úvodní obrazovka' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control-start.jpg'>Úvodní obrazovka</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control-start-cs.jpg'><img src='/robots/pat-a-mat/remote-control-start-cs_t.jpg' alt='překlad' title='překlad' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control-start-cs.jpg'>překlad</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>(fakt nevěřím, že by někdo někdy mohl navázat komunikaci s mimozemskou civilizaci)</div>
<div class='p'>Včera jsem to zkoušel znova, přepnul druhou levou do max polohy a dostal další obrázek:</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control-running.jpg'><img src='/robots/pat-a-mat/remote-control-running_t.jpg' alt='Pracovní obrazovka' title='Pracovní obrazovka' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control-running.jpg'>Pracovní obrazovka</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control-running-cs.jpg'><img src='/robots/pat-a-mat/remote-control-running-cs_t.jpg' alt='překlad' title='překlad' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control-running-cs.jpg'>překlad</a>
</td></tr></table></td>
</tr>
</table>
</center>
(omlouvám se za mizerné foto, ale překladač to stejně nějak dal — zajímavé bylo, že když jsem špatně vybral zdrojový jazyk, tak pouze texty zvýraznil
… další potenciálně užitečná vlastnost)</div>
<div class='p'>Pak jsem zkoušel zatáčet, houkat, couvat … no fungovalo jenom to zatáčení. Z logu jsem pak vyčetl, že robot byl celou dobu v <i>parked</i> režimu
tak možná ta brzda je opravdu ruční? A houkačka nic i když byl požadovaný bit nastavený.</div>
<div class='p'>A když jsem to chtěl celé vypnout, tak to nešlo:
<center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control-end.jpg'><img src='/robots/pat-a-mat/remote-control-end_t.jpg' alt='Závěrečná obrazovka' title='Závěrečná obrazovka' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control-end.jpg'>Závěrečná obrazovka</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/remote-control-end-cs.jpg'><img src='/robots/pat-a-mat/remote-control-end-cs_t.jpg' alt='překlad' title='překlad' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/remote-control-end-cs.jpg'>překlad</a>
</td></tr></table></td>
</tr>
</table>
</center>
… ale po vypnutí robota se vypnul i dálkový ovladač.</div>
<hr/>
<div class='p'>p.s. zkusil jsem to znova a „hele, ten display je dotykovy!”</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/display1.jpg'><img src='/robots/pat-a-mat/display1_t.jpg' alt='Display1' title='Display1' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/display1.jpg'>Display1</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/display2.jpg'><img src='/robots/pat-a-mat/display2_t.jpg' alt='Display2' title='Display2' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/display2.jpg'>Display2</a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/display3.jpg'><img src='/robots/pat-a-mat/display3_t.jpg' alt='Display3' title='Display3' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/display3.jpg'>Display3</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/heslo.jpg'><img src='/robots/pat-a-mat/heslo_t.jpg' alt='heslo?!' title='heslo?!' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/heslo.jpg'>heslo?!</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>S tou číňštinou je spousta zábavy. <span class='smile'></span> Heslo?! What?! No o tom se manual nezmiňuje. Asi je na čase si ho znova přečíst.</div>
<div class='p'>p.s.2 tentokrát jsem se koukal i zepředu a opravdu při zatáčení dává blinkry, <span class='wink'></span></div>
<div class='p'>p.s.3 tuto obrazovku vám nechám jako „domácí úkol”:</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/display4.jpg'><img src='/robots/pat-a-mat/display4_t.jpg' alt='Display4' title='Display4' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/display4.jpg'>Display4</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/pat-a-mat/display5.jpg'><img src='/robots/pat-a-mat/display5_t.jpg' alt='Display5' title='Display5' class='border' width='320' height='180'/></a><br/>
<a href='/robots/pat-a-mat/display5.jpg'>Display5</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<hr/>
<div class='p'><a id="231119"></a></div>
<h2>19. listopadu 2023 — První ujeté centimetry a User manual V2.2.0</h2>
<div class='p'>Pat má za sebou první ujetý půlmetr! Konkretně 562mm … já vím, bída, ani celý metr … ale ono v té předsíni je cca 20cm prostoru, než nabourá.
A ano, ten půlmetr je akumulovaný (CAN message 0x18C4DEEF <i>Accumulated mileage</i>). <span class='wink'></span> Vtipné mi přišlo, že v příkladu uvádějí jak nastavit rychlost
5 m/s … kdybych to udělal, tak asi místo předsíně máme verandu. No nic, pohnul se a to je hlavní, tj. i když se mi nepodařilo s ním pohnout přes
dálkový ovladač, tak po CANu jede.</div>
<div class='p'>Asi bych vypíchnul, že ta CAN zpráva na řízení je <i>fakt ošklivá</i>, aneb <i>proč probůh?!</i> Jsou tam první 4 bity na řazení (P, R, N, D), pak 16 bitů
na požadovanou rychlost v milimetrech za sekundu a dále 16 bitů na úhel zatočení v setinách stupně. Jednotky se mi líbí, ale … oni to vše narvali za
sebe, takže v prvním bajtu je zkombinovaná rychlost s typem řazení a ve třetím bajtu je mix rychlosti a zatáčení. A aby to bylo zábavnější, tak je to
<i>Intel</i> tj. pozpátku. Vůbec se nedivím, že jsem v tom <a href='https://github.com/robotika/osgar/commit/b2693d06e05530139e19a6479e322118552a685e' class='external'>udělal chybu</a>.
Pak snadno pošlete místo příkazu jeď pomalu dopředu něco jako „pedál až na podlahu”. Jako plus hodnotím pár vzorových příkazů v manuálu, ale … proč?
Odpověd znám … prostě to tam ty nástroje <i>nahází za sebe</i>, ale pěkné to není.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/pat-a-mat/can-speed-5ms.png'><img src='/robots/pat-a-mat/can-speed-5ms_t.png' alt='Příklad, jak jet 5m/s' title='Příklad, jak jet 5m/s' class='border' width='640' height='235'/></a><br/>
<a href='/robots/pat-a-mat/can-speed-5ms.png'>Příklad, jak jet 5m/s</a>
</td></tr></table></div>
<div class='p'>Druhé téma je <b>User manual</b>. RTFM, tak jsem si ho už také pročetl … a dnes jsem koukal na ten vytištěný, co dorazil s platformou a <b>on byl jiný!!!</b>
Tiskovinu jsem lehce ignoroval, protože k tomu už potřebuji brýle a tak jsem byl spokojenější s PDFkem. Ale chyba lávky! PDFko, co mi posílali někdy koncem
května, je verze 1.0 a ta tištěná varianta je <b>V2.2.0</b>. A ten dálkový ovladač má stejné páčky jako na obrázku i je tam zmínka o <i>touch screen</i>. Tak už vím, že
houkačka je tlačítko zespodu vlevo … ale stejně nehouká, tak nic.</div>
<hr/>
<div class='p'><a id="231123"></a></div>
<h2>23. listopadu 2023 — Nabíječka a dálkový ovladač</h2>
<div class='p'>Asi bych začal upřesněním, jak je to s tím ježděním a baterkou? Dva lidé to nezávisle z mého textu nepochopili, takže jsem to asi (jako obyčejně) zmátl:</div>
<ul>
<li>baterka je stále mrtvá</li>
<li>robot je schopen popojet pár centimetrů, ale <b>pouze na připojenou nabíječku!</b></li>
</ul>
<div class='p'>Dnes bych si sem přihodil odkazy na datasheety:</div>
<ul>
<li><a href='https://www.flyingtech.co.uk/sites/default/files/product_files/FS-i6S-MANUAL-EN-20161001.pdf' class='external'>dálkový ovladač FS-i6S</a></li>
<li><a href='https://ohrija.com/products/54.75v-5a-charger' class='external'>nabíječka 54.75V/5A</a></li>
</ul>
<div class='p'>Díky tomu PDFku k dálkovému ovladači nejen s předním ale i zadním pohledem je teď už jasné, že <b>VRB</b> není „pravé spodní tlačítko”, ale trimovací
kolečko v rohu. A když s tím otočíte doprava a nezapomenete zamáčknuté <i>Emergency STOP</i> tlačítko, tak najednou robot jede (stále je zdrojem nabíječka).
Tak alespoň nějaký posun. <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 647px;'><tr><td>
<a href='/robots/pat-a-mat/operating-panel.png'><img src='/robots/pat-a-mat/operating-panel_t.png' alt='Popis tlačítek' title='Popis tlačítek' class='border' width='641' height='281'/></a><br/>
<a href='/robots/pat-a-mat/operating-panel.png'>Popis tlačítek</a>
</td></tr></table></div>
<div class='p'>p.s. jo ještě jeden detail s houkačkou: <i>The horn is optional part not including in standard platform.
We reserve the key and interface for it, they won't work if the platform don't equip with horn hardware.</i></div>
<hr/>
<div class='p'><a id="231127"></a></div>
<h2>27. listopadu 2023 — Zbyňkovy hračky a Anderson konektory</h2>
<div class='p'>V sobotu se stavil Zbyněk a vzal s sebou i svoje „hračky”: bezkontaktní měřák proudu, regulovaný zdroj do 60V s nastavitelným proudovým omezením,
krimpovací kleště a pod. První měření bylo trojpinový konektor z nabíječky vs. obří <a href='https://www.laskakit.cz/anderson-konektor-sj-50a-600v--sedy/' class='external'>Anderson konektory</a>.
Nabíječka tedy používá <b>červené</b> konektory a <i>šedivé</i> jsou pak pro napájení celé platformy. Jeden z pinu (no měl jsem si udělat foto počmáraného Pata)
pak není zapojen vůbec, ani na kostru.</div>
<div class='p'>Druhé pozorování bylo, že při zapojené nabíječce a zapnuté platformě teklo kabelama cca 400mA (zase jsem si to měl zdokumentovat) protože to vypadalo, že se
nějakých 100mA „ztrácí” v černé krabíčce baterky. Proudy se ale nijak nelišily ať už tlačítko baterky bylo zapnuté nebo vypnuté.</div>
<div class='p'>Další test byl se zdrojem a postupném zvyšování napětí … ani ťuk, nic si to nechtělo vzít. Při té příležitosti si Zbyněk všiml, že ty červené a šedé
Anderson konektory jsou různé typy! Šedivý měl přepážku mezi + a - a červený nikoliv, takže i kdybych se to snažil pospojovat poslepu (nekoukal na barvy)
tak by se mi to nepodařílo … za to mají u mne autoři FR07 plus (chtěl jsem řící <i>malé bezvýznamné plus</i>, ale to by asi neurazilo jen mé spolužáky z gymplu,
protože to bylo oblíbené rčení naší třídní).</div>
<div class='p'>Do rozdělání krabice s černě označenými šroubky (buď <i>plomby</i> nebo prý že to bylo utahováno klíčem s měřeným momentem) jsme se zatím nepustili.</div>
<div class='p'>Zavěr — baterie je stále mrtvá.</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 226px;'><tr><td>
<a href='/robots/pat-a-mat/anderson-bottom.jpg'><img src='/robots/pat-a-mat/anderson-bottom_t.jpg' alt='Anderson konektory' title='Anderson konektory' class='border' width='220' height='124'/></a><br/>
<a href='/robots/pat-a-mat/anderson-bottom.jpg'>Anderson konektory</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 226px;'><tr><td>
<a href='/robots/pat-a-mat/anderson-front.jpg'><img src='/robots/pat-a-mat/anderson-front_t.jpg' alt='Rozdílné přepážky' title='Rozdílné přepážky' class='border' width='220' height='124'/></a><br/>
<a href='/robots/pat-a-mat/anderson-front.jpg'>Rozdílné přepážky</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 226px;'><tr><td>
<a href='/robots/pat-a-mat/charger-plug.jpg'><img src='/robots/pat-a-mat/charger-plug_t.jpg' alt='Kabel nabíječky' title='Kabel nabíječky' class='border' width='220' height='124'/></a><br/>
<a href='/robots/pat-a-mat/charger-plug.jpg'>Kabel nabíječky</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<hr/>
<div class='p'><a id="231221"></a></div>
<h2>21. prosince 2023 — Stará baterka</h2>
<div class='p'>Koukám, že jsem skoro měsíc nic nezveřejnil na téma <i>Pat a Mat</i>. Nějaké zprávy by byly, ale moc veřejné
nikoliv. Ale čas utíká, takže doplním <i>archlív</i>.</div>
<div class='p'>Asi to vezmu od konce, tedy dnešního mailu, že náhradní nová baterka by už měla být na nějakém evropském
letišti a čeká na proclení. Mám i DPD číslo zásilky, ale dnes se mi dokonce podařilo při dotazu dostat 502
(Bad Gateway) … zkrátka chybu na serveru … prostě vánoce. A minulých X dní tam nebylo nic zajímavého,
jen potvrzení, že to číslo je pro mne. Trošku marnost.</div>
<div class='p'>Na druhou stranu mne včera potěšil TomášR, který došel k závěru, že není nač čekat a pustil se do nabíjecích
experimentů „autorizované otevřené baterky” (aneb výrobce o tom ví a souhlasí a zajímá ho, na co přijdeme).</div>
<div class='p'>Nejprve již pár týdnů staré fotky:</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/inside.jpg'><img src='/robots/pat-a-mat/inside_t.jpg' alt='Otevřený box baterky' title='Otevřený box baterky' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/inside.jpg'>Otevřený box baterky</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/bms.jpg'><img src='/robots/pat-a-mat/bms_t.jpg' alt='BMS' title='BMS' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/bms.jpg'>BMS</a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/not-formated.jpg'><img src='/robots/pat-a-mat/not-formated_t.jpg' alt='1.8V = nenaformátované články' title='1.8V = nenaformátované články' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/not-formated.jpg'>1.8V = nenaformátované články</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/bms2.jpg'><img src='/robots/pat-a-mat/bms2_t.jpg' alt='BMS' title='BMS' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/bms2.jpg'>BMS</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>Asi nejdrsnější je ta vlevo dole - všech 75 článků dohromady mělo 1.8V!</div>
<div class='p'>Tento týden Tomáš poslal update: <i>Před nabíjením měla baterka 1,819 V a na jednotlivých článcích bylo:
0,1725; 0,1277; 0,1342; 0,1176; 0,1006; 0,1203; 0,0953; 0,1289; 0,0856; 0,1371; 0,1526; 0,0895; 0,0854; 0,1474; 0,1246 V.
Po pár hodinách nabíjení jsem ji dostal až na 20V, ale po odpojení zdroje to začlo hodně rychle padat. Buď je špatná BMS, nebo to číňan odfláknul.
Naměřil jsem spotřebu přes 10 mA, což je úlet. Ráno měla baterka jen 4,37 V. Vypínač na spotřebu nemá vliv.</i></div>
<div class='p'>A včerejší zprává byla ještě nadějnější: <i>... tak už se mi povedlo probrat BMS :-) Při cca 38V na baterii BMS obživla a začla nabíjet (pulzy 1:1) a jede i CAN.
Na CANu (500kb/s) chodí 3 zprávy:</i></div>
<pre>0x200 0E CA 00 00 09 34 0A 8B
0x201 00 00 0A 64 00 03 00 00
0x202 C0 0A 00 01 0B B9 0B AF</pre>
<div class='p'>p.s. <i>ok, poslední report v tomto roce. V příloze máš tabulku s naměřenými napětími na jednotlivých člancích. Dnes už jsem se dostal, po dalších cca 7h nabíjení, prakticky na nominální napětí.
Baterka už šla zapnout, ale kde je ta hranice přesně nevím. BMS povolila nabíjení někde mezi 38-39V, vybíjení myslím až tak kolem 42V. Články se už trošku srovnaly, ale zda tomu nějak pomohla BMS,
nebo to je jen tím, že už se to dostalo do ploché části charakteristiky, nevím. To se uvidí až ke konci nabíjení.</i></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/pat-a-mat/pat-battery-tab.jpg'><img src='/robots/pat-a-mat/pat-battery-tab_t.jpg' alt='Tabulka napětí jednotlivých článků' title='Tabulka napětí jednotlivých článků' class='border' width='640' height='223'/></a><br/>
<a href='/robots/pat-a-mat/pat-battery-tab.jpg'>Tabulka napětí jednotlivých článků</a>
</td></tr></table></div>
<div class='p'><i>Jinak jsem koukal ještě na CAN zprávy a v 0x200 jsou první 2 byty napětí baterie a pak tam jsou asi 2 hodnoty (4 byty), ktere by mohly odpovídat stavu nabití. Nějak systematicky jsem to ale nezkoumal. U 0x201 jsem žádné změny nepozoroval. V 0x202 je asi nějaký status, jeden bit odpovídá stavu vypínače, a pak tam jsou asi zas 2 hodnoty, ale ty se moc nemění.</i></div>
<hr/>
<div class='p'><a id="240102"></a></div>
<h2>2. ledna 2024 — Odložené uspokojení</h2>
<div class='p'>Potřebuji se uklidnit, tak to hodím „na papír” resp. na web. <span class='wink'></span></div>
<div class='p'>Žena si přála pod stromeček knížku Cyrila Höschla
<a href='https://www.databazeknih.cz/knihy/tak-o-co-jde-525760' class='external'>Tak o co jde?</a> a tak jsem v ní také <i>listoval</i>. Jedno téma bylo
<a href='https://dbterapie.cz/encyklopedie/odlozene-uspokojeni/' class='external'>odložené uspokojení</a>, což je asi teď už něco, co pomalu nedávám.
Nová baterka byla odeslána 11. prosince 2023, letecky. Ano v nejnevhodnější čas. Mezi svátky mi to přišlo už pomalu divné,
tak jsem volal na DPD. Zase zajímavá zkušenost s telefoními automaty … jediná cesta k operátorovi vede přes ignorování
všech nabízených voleb. Tehdy (27/12) jsem se konečně provolal a dozvěděl se, že to je někde v Německu na letišti a dosud to
není v systému. O dovolene (29/12) mi přišla SMS, že 2/1/2024 mi doručí balíček a že ho můžu přesměrovat (což by se fakt
hodilo protože v cílovém místě 2. ledna nikdo nebude). Pár kliku, přesměrováno do Alza boxu za rohem a datum doručení se dokonce
změnilo na Nový Rok! Mimochodem všem vám přeji vše nejlepší v novém roce. <span class='smile'></span> Už jsem viděl ten titulek
<b>Happy New Year/Pat's Battery 2024</b>, ale chyba lávky. Včera nic … to jsem tak trošku očekával, bylo to podezřelé. Ale dnes
také nic?! Navíc to převezli z Říčan do Uhnoště (na druhou, vzdálenější, část Prahy). A co mne už uplně vyřadilo byla hláška
<b>Your parcel was returned as you refused to take delivery</b>. F* … to už se opravdu neovládám. Zítra bych Prahu opustil
a přesunul se na místo, kam měli dodat balíček původně … no hlavně klid, je třeba trénovat <i>odložené uspokojení</i>.
Tak alespoň vzpomínka na poslední západ slunce nad jezerem v roce 2023 — fakt to stoji za to se zbytečně rozčilovat?</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/pat-a-mat/sunset-20231231-161435.jpg'><img src='/robots/pat-a-mat/sunset-20231231-161435_t.jpg' alt='poslední západ slunce v roce 2023' title='poslední západ slunce v roce 2023' class='border' width='640' height='360'/></a><br/>
<a href='/robots/pat-a-mat/sunset-20231231-161435.jpg'>poslední západ slunce v roce 2023</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="240103"></a></div>
<h2>3. ledna 2024 — Konec srandy - baterka je zpátky v Německu!</h2>
<div class='p'>No dnes bych to nazval spíše jako <i>deprivací</i>. Ráno jsem volal na DPD a paní mi v klidu řekla, že balíček poslali zpět
odesílateli?! Dokonce se musela zeptat, jestli tam ještě jsem, protože jsem fakt nevěřil tomu co jsem slyšel. F*, musel jsem
do práce a pak tam volal znova a dozvěděl se, že je tam poznámka, že se to má prošetřit. Chudáka bráchu jsem poprosil,
ať se staví v Unhošti, protože bych to tam do 18h nestihl … a balíčk byl fakt pryč. V českém trackovacím systému už je jen
info, že se vrací, ale alternativní německé mi ukázalo tento obrázek:</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/robots/pat-a-mat/back-in-germany.jpg'><img src='/robots/pat-a-mat/back-in-germany_t.jpg' alt='Zpátky v Německu' title='Zpátky v Německu' class='border' width='400' height='266'/></a><br/>
<a href='/robots/pat-a-mat/back-in-germany.jpg'>Zpátky v Německu</a>
</td></tr></table></div>
<div class='p'>Nějaké dotazy? Mimochodem Alzabox je v tom nevinně — nějaký nováček prý místo přesměrování na Prahu 10 kliknul na
vrátit odesílateli … také by vás zajímalo, proč to tedy neřeší?! Možná je čas vypsat kurzy jestli ti borci to pošlou
až zpátky do Číny … jó, pěkně ten 2024 začíná.</div>
<div class='p'>p.s. <b>04.01.2024 10:22</b> <i>Your parcel has been delivered successfully</i> <b>Kelsterbach, DE</b></div>
<hr/>
<div class='p'><a id="240111"></a></div>
<h2>11. ledna 2024 — Vzkříšení</h2>
<div class='p'>Nevím proč, ale první asociace se <i>vzkříšením</i> je <a href='https://www.csfd.cz/film/12177-vetrelec-vzkriseni/prehled/' class='external'>zase Vetřelec</a>.
Dnes to bude „pro změnu” kryptické, aneb viz <a href='https://github.com/robotika/osgar/commit/7e368ea48ebe0630d0540b6c2eb11bbeaae46c63' class='external'>github</a>. <span class='wink'></span>
Nechci mluvit o nové baterce (ta je ztracená někde v Německu a když jsem dnes znova volal DPD, tak řekli ať zavolám za týden, že
to začnou prošetřovat jako ztrátu), ale o staré baterce, kterou TomášR několik týdnů křisil. A ano, dnes jsem poprvé po dvou měsícíh,
co Pat dorazil, popojel na baterku! Musel jsem si zase otevřít čínský manuál (ano anglický, ale asi automaticky překádaný), protože
robot popojet nechtěl (zatočit to ano). Brzda, vypnout automatiku, zařadit D, odblokovat STOP tlačítko … a pak jel. Po pravdě
mne přepínání jízdy dopředu D a dozadu R trošku rozčilovalo, ale to bude tím prostorem (na diagonále jsem v předsíni získal cca 0.5m).</div>
<div class='p'>Na konektorech nic nenaměříte, pokud není baterka <i>puštěná</i>, tj. stiské tlačítko. Po zapnutí na obou vyskočilo 49V. <span class='smile'></span> A ukazuje
to jak dálkový ovladač tak CAN (mimochodem zprávy, co posílal CAN baterky/BMS na robotovi dostupné nejsou). Nechal jsem to běžet cca
15 minut (v přesíni byla kosa a v kuchyni zamrzala voda, pokud jste jí tam chvíli nechali ležet, tj. úplně ideální podmínky to na testování
nejsou).</div>
<pre>Voltage 49.63 0.0 26.3
Temperature 15.0 16.0
…
Voltage 49.41 0.0 26.3
Temperature 13.0 15.0</pre>
<div class='p'>To napětí kleslo cca o 200mV a baterka si myslela, že teplota je nějakých 14 stupňů (reportuje min a max, ale nevím, zda to mezi jednotlivými
reporty resetuje). Ano, zase bych šťoural do toho kódování teploty s rozlišením 0.1 stupně Celsia/bit uložených v 12ti bitech. V realitě
to je zase s rozlišením ve stupních, takže kdyby to hodili do bajtu, tak +/- 120 stupňů C by snad stačit mohlo … no nic, aspoň trošku rébus.
Když je v jednom měření nybble <b>A</b> a zbytek nuly a v jiném <b>9</b> a <b>6</b>, jak to může jít po sobě? Moc skočit to nemůže a maximum 1 stupeň
je nějak málo a tak 0xA0 = 160 a 0x96 = 150. Vyřešeno.</div>
<div class='p'>p.s. <b>Tomáši, díky moc!</b> <span class='smile'></span></div>
<hr/>
<div class='p'><a id="240119"></a></div>
<h2>19. ledna 2024 — Nová baterka!</h2>
<div class='p'>Dnes v 15 hodin CET dorazila nová baterka! Byl jsem z toho <i>trošku</i> na nervy, když <a href='/robots/pat-a-mat/cs#240103'>zmizela v Německu</a> a po pravdě nevím, jestli jí nakonec
odchytli tam, nebo to šla až do té Číny. Skoro si říkám <i>nemusím vědět všechno</i> (aneb snad to ani nechci vědět).</div>
<div class='p'>První pozorování — při vypnuté baterce naměřím <b>11.3V</b>?! Stará baterka (po renovaci) tam má 0V, ale asi to za chvíli znova prověřím.
Dobrá zpráva ale je, že při <i>zapnuté baterce</i> (ono je to snad pouze informativní tlačítko pro BMS) naměřím <b>49.3V</b>. <span class='smile'></span></div>
<div class='p'>Jinak je ještě několik zpráv, ale ty asi nechám až po víkendu. Minulý víkend jsem si rozchodil
<a href='https://github.com/robotika/osgar/commit/7e368ea48ebe0630d0540b6c2eb11bbeaae46c63' class='external'>popojíždění přes CAN</a> od X metrů (v mém případě
centimetrů) tam a zpět, ale nevyhecoval jsem se k vyklizení cesty z předsíně, sezení na verandě a v kombinaci s nájezdy abych v lehkém
mrazu vyjel tuto <i>feature</i> demonstrovat na zahrádku. Ona priorita byla trošku jinde (aby neuletěla střecha na přístřešku, časem snad i pro
Pata) a … lenost.</div>
<div class='p'>Dále jsem se snažil zprovoznit <a href='https://www.pcengines.ch/alix3d2.htm' class='external'>prastarého ALIXe</a>. Ano, je to "vykopávka", ale stejně jsem přesvědčený,
že sběr dat a jednoduché <i>follow me</i> by to dát mohlo/mělo. No byl tam ještě <i>Python 2.6</i> a ani se to
<a href='https://unix.stackexchange.com/questions/479823/can-not-download-from-an-https-site-ssl-with-wget' class='external'>nechtělo bavit s GitHubem</a>, kvůli
starému <i>ssh</i> (jestli jsem to pochopil dobře). Od Jakuba mám půjčenou novou "hračku", ale o tom asi více až <i>uřídí</i> popojetí 1 metr.</div>
<div class='p'><details>
<summary><b>Komentáře (1)</b></summary>
<i>1/19/24, 18:38</i>
Ahoj.
<i>Když to ale je vypnuté, tak tam naměřím 11.3V?</i>
To bude jen svod MOSFETu. Pokud jsi to měřil digitálním multimetrem, tak ten má velký vstupní odpor, takže i malý svod vyvolá měřitelné napětí. Většinou mají multimetry vstupní odpor 10 MOhm, což by odpovídalo proudu 1,1uA a to je akceptovatelná / očekávatelná hodnota.
T.
</details></div>
<hr/>
<div class='p'><a id="240120"></a></div>
<h2>20. ledna 2024 — Pat nemá rád sníh</h2>
<div class='p'>Dnes vystoupila teplota až na 0 stupňů Celsia, svítilo sluníčko a tak jsem se vehecoval (odsunout záchod, přestěhovat betonovou lavičku, přerovnat
dřevo u baráku, vybalit nájezdy) a vyzkoušel Pata venku. A rovnou mne udeřila mezi oči <a href='http://www.extremeprogramming.org/rules/testfirst.html' class='external'>stará hláška</a>:
<b>Test First!</b> Aneb nemá velký smysl
připravovat něco komplikovaného, když i „ujetí jednoho metru” může selhat. Ano, tento výsledek jsem úplně nečekal, takže test byl úspěšný,
míněno užitečný, a možná jsem se k tomu měl opravdu rozhoupat už před týdnem.</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 226px;'><tr><td>
<a href='/robots/pat-a-mat/pat-going-out.jpg'><img src='/robots/pat-a-mat/pat-going-out_t.jpg' alt='Nájezdy a výjezd z chaty' title='Nájezdy a výjezd z chaty' class='border' width='220' height='124'/></a><br/>
<a href='/robots/pat-a-mat/pat-going-out.jpg'>Nájezdy a výjezd z chaty</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/pat-snow-side.jpg'><img src='/robots/pat-a-mat/pat-snow-side_t.jpg' alt='Poprvé na sněhu' title='Poprvé na sněhu' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/pat-snow-side.jpg'>Poprvé na sněhu</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/robots/pat-a-mat/pat-snow-rear.jpg'><img src='/robots/pat-a-mat/pat-snow-rear_t.jpg' alt='Pohled zezadu' title='Pohled zezadu' class='border' width='-1' height='-1'/></a><br/>
<a href='/robots/pat-a-mat/pat-snow-rear.jpg'>Pohled zezadu</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>Pat neujel ani ten metr, ani na dálkové ovládání. Pociťoval jsem marnost, jako když jsem cca před měsícem zapadl na louce se Sharanem a
nemohl vyjet.
Holt 4x4 to není a to samé platí i pro Pata. Pokud jedno kolo bylo ve vzduchu, tak to bylo to co se točilo. A pokud podkluzovalo,
tak to samé. Zvláštní bylo, že při couvání podkluzovalo zase to druhé kolo. <span class='smile'></span> A chvílema jsem měl pocit, že změnou zatáčení se roztočilo
druhé kolo?! Jako by tam byly dva motory … ale nejsou. Nevím, jak přesně funguje ten diferenciál, ale tady nepomáhá. A ano, jak na začátku
mi říkal HonzaR, ty hladká kola kloužou fakt hodně.</div>
<div class='p'>Další (vtipné) pozorování bylo, že jsem špatně pochopil manuál:</div>
<div class='p'><i>SWC for S4 rocker high school low-speed control mode, to forward gear, for example:
SWC is at the top of the S4 rocker control the vehicle's highest speed for the low-speed mode
driving; SWC is in the middle of the position when the S4 rocker control the vehicle for the
medium-speed mode driving; SWC is in the bottom of the position of the S4 rocker control
the vehicle for the high-speed mode driving.</i></div>
<div class='p'>Asi jediná zřejmá poloha je <i>in the middle</i>. Ale co je nahoře a co dole? Jako tak jak se to chová
mi to dává smysl. Řekl bych, že mne zmátla věta:
<i>If the SWA/SWB/SWC/SWD toggle switches are not in the default position when powering
on, an alarm interface will appear, prompting you to toggle all switches to up, and enter the
main interface normally when all switches are in the default position.</i>
Tj. <i>up</i> je … mají to dobře, jen se naučit číst! Tak jak jsem popojížděl v předsíni s 20cm
místa vpřed a vzad, tak jsem to měl samozřejmě na <i>high-speed driving</i>. Hmm, tak ta maximálka
je (pro autonomního robota) celkem rozumná a na startu musí být páčky s nejmenší
povolenou rychlostí.</div>
<div class='p'><center>
<iframe width="640" height="360" src="https://www.youtube.com/embed/SWIGgTsJ2BQ" title="Robot Pat on snow" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a id="240210"></a></div>
<h2>10. února 2024 — Odyssey a 3x USB</h2>
<div class='p'>Uznávám, že tu dokumentaci nějak flákam. Jsou to sice převážně drobnosti, ale z čeho jiného se skládá život (robota)? <span class='smile'></span>
Dnes jsem s Patem chvíli jezdil venku „autonomně”. Bylo to jednoduché <i>osgar.go</i> s opakováním 10x na jízdu 1m tam a zpět.
Nejprve jsem jezdil rychlostí 0.1m/s (jako v předsíni) a pak to zvedl na 0.5m/s (při pomalé jízdě měl na chodníku občas
problém a zastavil se). Snažil jsem se to i nahrávat, ale úplně chápu Jirku, že natáčet na mobil, mít v ruce notebook
a bezpečnostní dálkové ovládání nějak dohromady nejde. Ale jako důkaz viz <a href='https://youtu.be/TMdxi0-ZbWs' class='external'>video</a>. Pokud si pustíte
i zvuk, tak poznáte, že náš pes moc robota rád nemá. <span class='wink'></span></div>
<div class='p'>A teď tedy k názvu dnešního příspěvku. Odyssey je malý počítač, který mám zapůjčený od Jakuba. Jedná se o
<a href='https://www.seeedstudio.com/ODYSSEY-X86J4125800-p-4915.html' class='external'>ODYSSEY-X86J4125800</a>. Studenti tam předinstalovali <b>Ubuntu 22.04</b>
a výkonově je na tom asi 10x lépe, než starý Alix, kterého jsem chtěl použít na logování dat. Od TomášeR mám napájecí
kabel, takže jede na 12V z robota (k dispozici je ještě 24V, což plánuji pro <a href='/articles/vanjee-lidar/cs'>VanJee lidar</a>, a 48V).</div>
<div class='p'>Odyssey má 3 USB porty, které jsem velmi rychle zaplnil — pro řízení robota potřebuji USB-CAN převodník (PeakCAN),
na detekci překážek jsem tam dal <a href='/articles/oak-d-pro/cs#240210'>OAK-D kameru</a> a do zbylého portu zapojil starou USB GPS. Hodilo by
se mít ještě couvací kameru, 2x <a href='/articles/pozyx/cs'>Pozyx</a> majáčky a možná i SSD disk na ukládání dat … prostě brzy dojde na USB hub.</div>
<div class='p'>S ovladačem na PeakCAN jsem <i>trošku</i> zápasil a když už to fungovalo, tak jsem přidal OAK-D kameru a „rozbilo se to”.
Ale nebylo to kamerou, ale (za tento <i>hint</i> díky moc týmu Robotika <span class='smile'></span>) kvůli automatickému upgrade kernelu na pozadí! No kdybych
mohl, tak bych ten vychytralý SW nejraději do toho <i>pozadí</i> nakopal. Jakub to komentoval: <i>xubuntu by nemělo být tak arogantní
jako ubuntu</i> <span class='smile'></span> … tj. na Odyssey je asi to <i>xubuntu</i>, ale stejně. Prostě je to připojené na wifinu a dále na internet,
tak co by si to nestáhlo nejnovější aktualizace?</div>
<div class='p'>Z náhodných kopii textů z terminálu je změna vidět:</div>
<pre>2024-01-27
Leaving directory '/usr/src/linux-headers-6.5.0-14-generic'
vs.
2024-02-02
- manually installing pcan under /lib/modules/6.5.0-15-generic/misc…</pre>
<div class='p'>… ono vlastně přeinstalování pomohlo — znova se ten samý driver nakopíroval, ale do jiného adresáře.</div>
<hr/>
<div class='p'><a id="240302"></a></div>
<h2>2. března 2024 — Pat follows Path</h2>
<div class='p'>Je to bída! Dnes jsem si raději <i>prohodil priority</i>, abych se ke hraní s robotem vůbec dostal. :-( Ostatní
<a href='https://kosmonautix.cz/2024/02/odysseus-pristal-na-mesici-bez-udaju-o-vysce/' class='external'>přistávají na Měsící</a> a já ještě ani pořádně nepopojel.
Ale postupně — dnes už robot „sledoval cestu” (čistě z odometrie) a sbíral data. Stále jsem nepřimontoval ten <a href='/articles/vanjee-lidar/cs'>VanJee lidar</a>
takže získaná data nejsou úplná. Také mám už cukání „slanit” ze svahu a pohybovat se dole na louce na řádově větším prostoru. Snad brzy.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='https://youtu.be/vRph9u822yk'><img src='/robots/pat-a-mat/cones.jpg' alt='' title='' class='border' width='640' height='360'/></a><br/>
<a href='https://youtu.be/vRph9u822yk'></a>
</td></tr></table></div>
<div class='p'>Nahrávky byly pouze z robota, takže co mám je např. <a href='https://youtu.be/vRph9u822yk' class='external'>unlisted video</a>, kdy robot projíždí mezi kuželama. No styděl jsem se to dát
<i>public</i>, tak snad na to nemusíte ani klikat. <span class='wink'></span> … ale reálná data na detekci kužele to jsou.</div>
<div class='p'>p.s. přidal bych i nějaké pohledy z <a href='https://github.com/robotika/osgar/blob/master/osgar/tools/lidarview.py' class='external'>lidarview</a> (alespoň trajektorii),
ale zase se mi tu něco updateovalo a <i>pygame</i> nejede bez restartu … někdy přístě …</div>
<hr/>
<div class='p'><a id="240324"></a></div>
<h2>24. března 2024 — Navigace na kužel</h2>
<div class='p'>MartinL se nechce veřejně pochlubit, jak s <a href='/robots/rocker/cs'>Rocker</a> robotem jezdil před 14ti dny U-čko a během 15minut jízdy ujel cca 200m, a já tady mám vytahovat, jak
se Pat <i>horko těžko</i> 20 sekund navigoval ke kuželu?! <span class='wink'></span> Ale nechť, za mne nějaký postup je:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/pat-a-mat/cone-detection-plus-lidar.jpg'><img src='/robots/pat-a-mat/cone-detection-plus-lidar_t.jpg' alt='Detekce kuželu a integrace VanJee lidaru' title='Detekce kuželu a integrace VanJee lidaru' class='border' width='640' height='360'/></a><br/>
<a href='/robots/pat-a-mat/cone-detection-plus-lidar.jpg'>Detekce kuželu a integrace VanJee lidaru</a>
</td></tr></table></div>
<div class='p'>Obrázek je z <a href='https://github.com/robotika/osgar/blob/feature/pat-wanjee-oak/osgar/tools/lidarview.py' class='external'>lidarview.py</a>, který jsem hackoval, aby zobrazoval i nové <a href='/articles/oak-d-pro/cs#240304'>detekce
z OAK kamery</a>. Zobrazen je i <a href='/articles/vanjee-lidar/cs#240310'>VanJee lidar</a> pro úhly 0 a -10 stupňů a je například vidět, že vodorovně (světle zelené body)
kužel detekován vůbec není!</div>
<div class='p'>Mezi nové poznatky patří:</div>
<ul>
<li>nutnost odolnosti vůči dešti (když jsem měl konečně chvíli na testování, tak každych 10 minut pršelo a to jsem pořádně ani nestihl vyjet z předsíně)</li>
<li>externí WiFi anténa — ona tam nějaká je, ale když je robot už 10m od chaty, tak se spojení ztrácí (jedu přes společné AP s přístupem na internet).
Asi nejzábavnější bylo, že robot klidně vyjel (má se rozjet až když detekuje kužely), ale na obrazovku žádné detekce nevypisoval … protože výstup na konzoli
byl výrazně opožděn</li>
<li>chtělo by to něco jako rozvodovou skříň, tj. když zapnu robota, abych s ním kousek na dálkové ovládání popojel, tak nepotřebuji rovnou pouštět lidar a počítač</li>
</ul>
<div class='p'>Pak ještě jeden „staronový” aneb, že ta OAK-D Pro varianta hrozně žere místo (došlo mi i místo na notebooku, takže půlku logů jsem si ještě nestáhl):</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar-apps$ python -m osgar.logger
/data/pat/2024_03_24/cones-challenge-240324_161328.log
k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>—-
0 sys 762653 | 9159 | 159.4Hz
1 app.desired_steering 6220 | 1428 | 24.8Hz
2 platform.can 116909 | 6877 | 119.7Hz
3 platform.emergency_stop 1 | 1 | 0.0Hz
4 platform.pose2d 12561 | 1428 | 24.8Hz
5 can.can 622914 | 36642 | 637.6Hz
6 oak.depth 274503824 | 536 | 9.3Hz
7 oak.color 514189468 | 536 | 9.3Hz
8 oak.orientation_list 294234 | 534 | 9.3Hz
9 oak.detections 28147 | 535 | 9.3Hz
10 oak.depth_seq 4440 | 536 | 9.3Hz
11 oak.color_seq 4440 | 536 | 9.3Hz
12 oak.detections_seq 4431 | 535 | 9.3Hz
13 gps.position 638 | 58 | 1.0Hz
14 gps_serial.raw 19687 | 2894 | 50.4Hz
15 vanjee.raw 36 | 1 | 0.0Hz
16 vanjee.xyz 0 | 0 | 0.0Hz
17 vanjee.scan 2339649 | 573 | 10.0Hz
18 vanjee.scan10 2601617 | 573 | 10.0Hz
19 vanjee.scanup 2316595 | 573 | 10.0Hz
20 vanjee_udp.raw 12716052 | 9169 | 159.6Hz
21 obstdet3d.obstacle 4815 | 535 | 9.3Hz
Total time 0:00:57.466885</pre>
<div class='p'>… 774M za necelou minutu, a to je ta kamera uměle omezovaná na 10Hz.</div>
<div class='p'>Teď koukám, že i ten <i>sys</i> je nějaký velký …</div>
<pre>…
0:00:57.430776 0 b"{'name': 'vanjee_udp', 'delay': 57.111811, 'channel': 'raw', 'caller': 'run_input'}"
0:00:57.430979 0 b"{'name': 'vanjee_udp', 'delay': 57.113248, 'channel': 'raw', 'caller': 'run_input'}"
0:00:57.431503 0 b"{'name': 'vanjee_udp', 'delay': 57.113418, 'channel': 'raw', 'caller': 'run_input'}"</pre>
<div class='p'>… no je to report zpoždění, ale <i>VanJee</i> se jenom v úvodu zapne a pak už mu není třeba nic dalšího
posílat. <i>TODO fix report</i></div>
<div class='p'>A divnosti, resp. „nedodělky”? Když už kužel nevidí, tak stejně jede vesele dál. Zastaví ho pouze překážka
do 1 metru. Už to <a href='https://github.com/robotika/osgar-apps/commit/a4f9a81baaea0002c0be978ab8a66b9c8070f5ed' class='external'>vidím</a>:</div>
<pre>speed, steering_angle = self.max_speed, 0
if self.last_detections is not None and len(self.last_detections) == 1:
x1, y1, x2, y2 = self.last_detections[0][2]
steering_angle = (self.field_of_view/2) * (0.5 - (x1 + x2)/2) # steering left is positive</pre>
<div class='p'>… no evidentně jsem se s tím moc nepáral a i je teď jasné, proč na dva kužely moc nereagoval. Do další verze
jsem chtěl před kuželem zatáčet vlevo dokud kužel nezmizí a pak dokud se zase neobjeví. Pak už by mohl
vesele jezdit mezi dvěma kužely tam a zpět. Ale to už asi do velikonoc nestihnu. :-(</div>
<hr/>
<div class='p'><a href='/robots/pat-a-mat/cs#email'>kontaktní formulář</a></div>
OAK-D Prohttps://robotika.cz/articles/oak-d-pro/cs2022-03-22T00:00:00ZMartin Dlouhý
Co když zkombinujete stereo-kameru s malým počítačem s podporou pro výpočet
neuronek? Přidáte-li možnost nasvícení scény a vše to zabalíte do malé krabičky
tak dostanete OAK-D od firmy Luxonis. <span class='smile'></span> Ale to rozhodně není vše …
<b>Blog update:</b> 18/3/2024 — <a href='/articles/oak-d-pro/cs#240318'>Debugging DepthAI pipeline</a>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/oak-d-pro.jpg'><img src='/articles/oak-d-pro/oak-d-pro_t.jpg' alt='OAK-D Pro (převzato z webu Luxonis)' title='OAK-D Pro (převzato z webu Luxonis)' class='border' width='320' height='208'/></a><br/>
<a href='/articles/oak-d-pro/oak-d-pro.jpg'>OAK-D Pro (převzato z webu Luxonis)</a>
</td></tr></table></div>
<ul>
<li><a href='https://shop.luxonis.com/products/oak-d-pro' class='external'>https://shop.luxonis.com/products/oak-d-pro</a></li>
<li><a href='https://docs.luxonis.com/projects/hardware/en/latest/' class='external'>DepthAI Hardware Documentation</a></li>
<li><a href='https://docs.luxonis.com/projects/hardware/en/latest/pages/DM9098pro.html' class='external'>OAK-D Pro doc</a></li>
<li><a href='https://docs.luxonis.com/en/latest/' class='external'>DepthAI’s Documentation</a></li>
<li><a href='https://docs.luxonis.com/en/latest/pages/tutorials/first_steps/#first-steps-with-depthai' class='external'>First steps with DepthAI</a></li>
<li><a href='https://github.com/luxonis' class='external'>GitHub Luxonis</a></li>
</ul>
<h2>Obsah</h2>
<ul>
<li><a href='/articles/oak-d-pro/cs#220322'>220322 - Měsíc čekání</a></li>
<li><a href='/articles/oak-d-pro/cs#220325'>220325 - Druhý krok</a></li>
<li><a href='/articles/oak-d-pro/cs#220328'>220328 - Standalone mode</a></li>
<li><a href='/articles/oak-d-pro/cs#220329'>220329 - IMU a SLAM</a></li>
<li><a href='/articles/oak-d-pro/cs#220907'>220907 - FollowMe a USB kabel (Jirka)</a></li>
<li><a href='/articles/oak-d-pro/cs#221008'>221008 - SLAM na 6 řádek</a></li>
<li><a href='/articles/oak-d-pro/cs#240122'>240122 - OSGAR driver</a></li>
<li><a href='/articles/oak-d-pro/cs#240210'>240210 - Two Towers</a></li>
<li><a href='/articles/oak-d-pro/cs#240226'>240226 - Staronoví manažeři a přehrávání videa</a></li>
<li><a href='/articles/oak-d-pro/cs#240304'>240304 - Detekce kuželu pomocí YoloV7</a></li>
<li><a href='/articles/oak-d-pro/cs#240316'>240316 - Software syncing</a></li>
<li><a href='/articles/oak-d-pro/cs#240318'>240318 - Debugging DepthAI pipeline</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog</h1>
<div class='p'><a id="220322"></a></div>
<h2>22. březen 2022 — Měsíc čekání</h2>
<div class='p'>Jak začít? O <b>OAK-D</b> jsem poprvé slyšel od týmu <a href='https://youtu.be/GmdJeHWqzmc?t=5450' class='external'>Sĺňava (Robotour 2021)</a>.
Pak jsem se cca před měsícem dozvěděl o existenci firmy <a href='https://www.luxonis.com/' class='external'>Luxonis</a> a rozhodl si udělat představu
„z první ruky”. Doporučení jsem dostal na novou kameru <a href='https://shop.luxonis.com/products/oak-d-pro' class='external'>OAK-D Pro</a>, která
je zatím zařazena v <a href='https://shop.luxonis.com/collections/beta-store' class='external'>beta programu</a>. Byl jsem i varován, že doručení bude
nějaký čas trvat (expeduje se z Hong Kongu).</div>
<div class='p'>Vlastně mne velmi potešilo, když objednávka byla ještě ten den potvrzena a druhý den expedována … tak to třeba nebude
tak dlouho trvat? Ale trvalo. Přes týden to viselo v Belgii na celnici (to je ta „výhoda” <i>online sledování</i> — člověk
se může permanentně nervovat, místo aby počítal s <i>dlouhou dobou</i> a pak byl překvapen) a vrchol byl pak v Čechách. Z adresy
vypadly všechny znaky s diakritikou (na rovinu bych jí nepoužíval, ale mám pocit, že tam byla nějaká nápověda pro dohledání
adresy, ale už je to dlouho, takže ani tím si nejsem jist). V každém případě „tracking number” není to samé v ČR a pokud
ho nemáte, tak se dohledává podle adresy. Zkrátím to, skončilo to v koši „nedoručitelné”, ale po dvou dnech telefonování
a „intervencí” se balíček na depu v Praze našel. Doporučení: odmažte diakritiku. <span class='wink'></span></div>
<div class='p'>A když už jsem měl krabičku doma, tak jsem se zase nemohl rozhoupat jí vůbec otevřít. Začal jsem totiž pořádně „listovat”
<a href='https://docs.luxonis.com/projects/hardware/en/latest/pages/DM9098pro.html' class='external'>dokumentací</a> a narazil jsem na:
<i>Due to the large power consumption of dot projector/illumination LED, a Y-adapter is required when using these functions!</i>
F-slovo. Znamená to, že teď budu muset objednávat nějaky <i>Y-adaptér</i>, abych si mohl kameru vůbec pustit?!
To mi asi vzalo trošku vítr z plachet. Pak jsem alespoň otevřel krabičku a našel jsem tam toto:
<table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/unboxing.jpg'><img src='/articles/oak-d-pro/unboxing_t.jpg' alt='Obsah krabičky' title='Obsah krabičky' class='border' width='320' height='180'/></a><br/>
<a href='/articles/oak-d-pro/unboxing.jpg'>Obsah krabičky</a>
</td></tr></table></div>
<div class='p'>Vlastně tedy dobrá a špatná zpráva:</div>
<ul>
<li>Y-adaptér je součástí balení</li>
<li>trošku to vypadá, že tam něco chybí, třeba kabel?</li>
</ul>
<div class='p'>Kabel tam byl — pod krabičkou. Ale jestli tam má být takto poloprázdná krabička úplně nevím. Na druhou stranu i druhý
kus vypadal stejně.</div>
<div class='p'>A teď dobré zprávy — <a href='https://docs.luxonis.com/en/latest/pages/tutorials/first_steps/#first-steps-with-depthai' class='external'>First steps with DepthAI</a>
… prostě návod co udělat od zapojení nové kamery do USB konektoru. A fungovalo to bezchybně! <span class='smile'></span></div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/depthai-md.jpg'><img src='/articles/oak-d-pro/depthai-md_t.jpg' alt='DepthAI selfie' title='DepthAI selfie' class='border' width='320' height='170'/></a><br/>
<a href='/articles/oak-d-pro/depthai-md.jpg'>DepthAI selfie</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/depthai-mikky.jpg'><img src='/articles/oak-d-pro/depthai-mikky_t.jpg' alt='Myšák' title='Myšák' class='border' width='320' height='170'/></a><br/>
<a href='/articles/oak-d-pro/depthai-mikky.jpg'>Myšák</a>
</td></tr></table></div>
<div class='p'>p.s. a ano, na extra přísvit a extra zdroj dojde někdy později … tj. na první pokusy nebyl nutný.</div>
<hr/>
<div class='p'><a id="220325"></a></div>
<h2>25. březen 2022 — Druhý krok</h2>
<div class='p'><a href='https://docs.luxonis.com/en/latest/pages/tutorials/first_steps/#first-steps-with-depthai' class='external'>První krok</a> byl snadný, ale co
bude druhý krok? Napsal bych si nějaky mini-prográmek, ale jaký? Konečně jsem začal více koukat do
<a href='https://docs.luxonis.com/projects/api/en/latest/' class='external'>dokumentace API</a> a užitečný mi přijde tento obrázek:</div>
<div class='p'><table class='image_panel center' style='width: 652px;'><tr><td>
<a href='https://docs.luxonis.com/projects/api/en/latest/'><img src='/articles/oak-d-pro/api-diagram.png' alt='' title='' class='border' width='646' height='311'/></a><br/>
<a href='https://docs.luxonis.com/projects/api/en/latest/'></a>
</td></tr></table></div>
<div class='p'><i>Host</i> je váš počítač a <i>OAK Device</i> je „chytrá kamera” … stále nevím, co OAK (v překladu <i>dub</i>)
znamená? <i>Node</i>, <i>connection</i> a <i>pipeline</i> připomíná klasický robotický systém, jenom to vše běží
přímo na „kameře” a nejspíše se to musí připravit předem. <i>XLink</i> pak zajišťuje komunikaci tam a zpět.</div>
<div class='p'>Kameru mám zatím zapojenou přímo do notebooku a tak její chytrost úplně nevyužiji. Co by mi ale přišlo zajímavé vyzkoušet je,
co když se <i>XLink</i> přeruší? Jede <i>pipeline</i> vesele dál? Pak by paradoxně <a href='https://docs.luxonis.com/projects/hardware/en/latest/pages/DM6010.html' class='external'>Y-adaptér</a>,
na který jsem ještě nedávno „nadával”, byl přesně ten kousek HW, který by mi průběžné odpojování od počítače umožnil. Možná.</div>
<div class='p'>Koukal jsem tedy na <a href='https://docs.luxonis.com/projects/api/en/latest/tutorials/standalone_mode/' class='external'>standalone mode</a> a
chyba lávky: <i>Standalone mode is only possible on OAKs that have on-board flash memory, which are currently OAK IOT
and OAK POE camera models.</i> Je tady asi na místě zdůraznit, že <a href='https://docs.luxonis.com/projects/hardware/en/latest/' class='external'>Luxonis nabízí několik řad zařízení</a>
a tak bych doporučil si to předem nastudovat a volit podle plánované aplikace.</div>
<div class='p'>A co by to „offline” resp. „nezávisle” dělalo? Může si kamera po začátek pamatovat několik obrázků nebo
dokonce video? Podle příkladu <a href='https://docs.luxonis.com/projects/api/en/latest/tutorials/ram_usage/' class='external'>RAM usage</a>:
<i>All OAK devices have 512 MiB (4 Gbit) on-board RAM, which is used for firmware (about 15MB), assets (a few KB up to 100MB+, eg. NN models),
and other resources, such as message pools where messages are stored.</i> … teď jsem si říkal, co je ten <i>4 Gbit</i>? Rychlost?
Jiný model? Well … 8x 512MB = 4G bitu … asi. <span class='wink'></span></div>
<div class='p'>Vypadá to, že můžu rovnou použít demo <a href='https://github.com/luxonis/depthai-python/blob/main/examples/SystemLogger/system_information.py' class='external'>system_information.py</a>:</div>
<pre>Ddr used / total - 0.13 / 339.99 MiB
Cmx used / total - 2.06 / 2.50 MiB
LeonCss heap used / total - 7.54 / 78.28 MiB
LeonMss heap used / total - 2.95 / 41.54 MiB
Chip temperature - average: 24.12, css: 25.67, mss: 23.69, upa: 23.44, dss: 23.69
Cpu usage - Leon CSS: 10.64%, Leon MSS: 1.98 %</pre>
<div class='p'>Kód je kratký, jen si teď neumím představit, jak otevřít <i>dai.Device</i> bez <i>pipeline</i>,
která pro nastartování obsahuje dva uzly: <i>dai.node.SystemLogger</i> a <i>dai.node.XLinkOut</i>.
I to prolinkování <i>sysLog.out.link(linkOut.input)</i> vypadá přímočaře. <span class='smile'></span></div>
<div class='p'>p.s. tak schválně, jestli mi někdo poradí: <a href='https://discuss.luxonis.com/d/594-reconnection-to-running-oak-device' class='external'>Reconnection to running OAK device?</a></div>
<hr/>
<div class='p'><a id="220328"></a></div>
<h2>28. březen 2022 — Standalone mode</h2>
<div class='p'>Na odpověď jsem nemusel dlouho čekat — Hussain psal: <i>What I understood is that you want to run the OAK in standalone mode.
If that was the case, check</i> <a href='https://docs.luxonis.com/projects/api/en/latest/tutorials/standalone_mode/#standalone-mod)e' class='external'>this documentation</a>.</div>
<div class='p'>A pak se ještě ozval Erik: <i>... that's not possible, after you terminate the connection with the device, the device will remove the pipeline/assets to be ready for the next connection.
As Hussain mentioned, if you would like to run pipeline in standalone mode, check the docs page he linked. This still wouldn't allow you to do exactly what you want, but you could eg. stream results via WiFi (OAK IoT) or ethernet (OAK PoE) to the server.</i></div>
<div class='p'>Nešlo by to nějak obejít, když OAK IoT ani PoE nemám? Mimochodem „test komunity” bych považoval za úspěšný. <span class='smile'></span> Mám v plánu někdy revidovat úvodní
odstavec a doplnit tam, např. že Luxonis má za sebou úspěšnou Kickstarterovou kampaň <a href='https://www.indiegogo.com/projects/opencv-ai-kit-lite#/' class='external'>opencv-ai-kit-lite</a>
(<i>$1,136,926 USD by 8,640 backers</i>) [je tam takové množství projektů, až na mne zase padá depka a jestli se mám vůbec o něco snažit <span class='wink'></span>]
Také přemýšlím, jestli O=OpenCV, A=Ai, K=Kit??</div>
<div class='p'>No nic, zpět k <i>Standalone mode</i> … <i>you first need to remove all XLinkOut and XLinkIn nodes</i>. No jo, ale co dál? <i>SPIOut</i> nepoužiji, protože nemám SPI,
a <a href='https://docs.luxonis.com/projects/api/en/latest/components/nodes/script/' class='external'>script node</a> jede přes ten Ethernet.</div>
<div class='p'>Koukám, že OAK-D Pro má přímo <a href='https://github.com/luxonis/depthai-hardware/issues/114' class='external'>dedikované issue</a> … hledal jsem, jak se vypíná/zapíná
podsvícení. Asi vyjímečně nemá cenu hledat přes Google, a je rychlejší proklikat <a href='https://docs.luxonis.com/projects/api/en/latest/components/device/#reference' class='external'>dokumentaci</a>,
tj. v <i>Device</i> jsou funkce <i>setIrFloodLightBrightness()</i> a <i>setIrLaserDotProjectorBrightness()</i>.</div>
<div class='p'>Ale to jsem se „trošku” odchýlil od tématu, ke kterému vlastně nemám více jak „tudy ne”.</div>
<hr/>
<div class='p'><a id="220329"></a></div>
<h2>29. březen 2022 — IMU a SLAM</h2>
<div class='p'>Teď je ráno, na rozdíl od včerejšího zápisu, tak je naděje, že budu mít více optimismu než po práci. Navíc téma je snad přímočaré
a měly by k tomu být rovnou funkční příklady. Motivace je náhrada <a href='https://www.intelrealsense.com/tracking-camera-t265/' class='external'>Realsense T264 tracking kamery</a> (<a href='https://www.intelrealsense.com/message-to-customers/' class='external'>Limited Lifetime Product</a>) za OAK-D.</div>
<div class='p'>Ještě co jsem o víkendu (?) tak narychlo procházel, tak IMU do SLAMu zatím integrovaná není, tak to může být takový <i>self-test</i>, jak jsou oba výstupy
konzistentní. No asi jsem zase naivní, ale uvidíme.</div>
<div class='p'>Nejprve tedy IMU (<i>Inertial Measurement Unit</i>). K dispozici jsou hned dva příklady:</div>
<ul>
<li><a href='https://docs.luxonis.com/projects/api/en/latest/samples/IMU/imu_accelerometer_gyroscope/' class='external'>IMU Accelerometer & Gyroscope</a> — GitHub <a href='https://github.com/luxonis/depthai-python/blob/main/examples/IMU/imu_gyroscope_accelerometer.py' class='external'>imu_gyroscope_accelerometer.py</a></li>
<li><a href='https://docs.luxonis.com/projects/api/en/latest/samples/IMU/imu_rotation_vector/' class='external'>IMU Rotation Vector</a> — GitHub <a href='https://github.com/luxonis/depthai-python/blob/main/examples/IMU/imu_rotation_vector.py' class='external'>imu_rotation_vector.py</a></li>
</ul>
<div class='p'>První bych viděl na <i>raw data</i> a druhý jako integraci. Píšou tam nějaké „nezdravé” Herzy (500Hz a 400Hz), ale to se může
časem hodit. <span class='smile'></span></div>
<div class='p'>Tak jo, první příklad fungoval bez problémů:</div>
<pre>Accelerometer timestamp: 5613.242 ms
Accelerometer [m/s^2]: x: 5.200206 y: 0.019154 z: -8.820239
Gyroscope timestamp: 5613.925 ms
Gyroscope [rad/s]: x: 0.014914 y: 0.003196 z: -0.008522
Accelerometer timestamp: 5615.379 ms
Accelerometer [m/s^2]: x: 5.190629 y: 0.000000 z: -8.820239
Gyroscope timestamp: 5616.424 ms
Gyroscope [rad/s]: x: 0.009587 y: 0.001065 z: -0.005326</pre>
<div class='p'>a druhý stejně tak:</div>
<pre>Rotation vector timestamp: 2707.787 ms
Quaternion: i: 0.000305 j: -0.964600 k: -0.001465 real: 0.263672
Accuracy (rad): 3.141602
Rotation vector timestamp: 2709.946 ms
Quaternion: i: 0.000305 j: -0.964600 k: -0.001465 real: 0.263672
Accuracy (rad): 3.141602</pre>
<div class='p'>SLAM (<i>Simultaneous Localization And Mapping</i>) jsem na stejné stránce mezi příklady nenašel, ale byl „hned vedle” na
stránce věnované <a href='https://docs.luxonis.com/en/latest/pages/spatial-ai/#spatialai' class='external'>Spatial AI</a>:</div>
<ul>
<li><a href='https://docs.luxonis.com/en/latest/pages/slam_oak/' class='external'>SLAM with OAK</a>
… tak to asi nebude jen „copy and paste”: <i>We plan on creating our own visual-inertial SLAM project that would use on-device feature tracking (using FeatureTracker node) and intertial data (using IMU node), if the device has an IMU sensor onboard.</i></li>
</ul>
<div class='p'>Jsou tam ale odkazy na <i>community projects</i>: <a href='https://github.com/duncanrhamill/oakd_orbslam3' class='external'>OAK-D ORB_SLAM3 Experiment</a> a <a href='https://github.com/bharath5673/depthai-slam' class='external'>deptha-slam</a> … (ještě tam byl <a href='https://www.arducam.com/docs/opencv-ai-kit-oak/performing-location-with-visual-slam/' class='external'>ArduCam SLAM</a>). Hmm, tak asi zatím nic. Nevýhoda „ranního hraní” spočívá v tom, že v tom nejlepším toho člověk musí nechat a „jít do práce”. V tomto experimentu alespoň vidím jistou naději. <i>To be continued</i></div>
<hr/>
<div class='p'><a id="220907"></a></div>
<h2>7. září 2022 — FollowMe a USB kabel (Jirka)</h2>
<div class='p'>Tentokrát blog posunul Jirka …</div>
<div class='p'><center>
<iframe width="652" height="428" src="https://www.youtube.com/embed/ny79sCuUqBM" title="Kid takes the lead, robot follows, daddy gets transported around" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<div class='p'>Jirka si koupil <a href='https://docs.luxonis.com/projects/hardware/en/latest/pages/DM9098w.html' class='external'>OAK-D W</a> (Wide), tedy verzi s širokým záběrem a jako demo aplikaci
si vymyslel <i>starý dobrý</i> <b>FollowMe</b> co před 10+ lety vylepšil (resp. udělal použitelný) na Eduru (viz <a href='https://youtu.be/c-SXdDgbi0s' class='external'>staré video z Floriade</a>
… takže tady to bylo 10 let). Je sranda jak ty děti dokážou poměrně rychle dostat robota do neřešitelné situace. <span class='smile'></span></div>
<div class='p'>Jinak v tomto demo je OAK-D kamera použita pouze jako zdroj hloubkových dat (podobně jako dřive byl <i>RealSense</i>) a veškerý processing probíhá na hlavním počítači.
Bude-li ver2, tak možná zkombinuje i detekci osob a alternativní výběr objektu pro sledování, uvidíme … Jirka si určítě něco vymyslí. <span class='wink'></span></div>
<div class='p'>Další info od Jirky bylo o GPS (možná dodá i extra článk o stereo-GPS pro získání absolutního směru robota). Vše prý fungovalo krásně až do okamžiku, kdy k robotovi
připojil kameru. A ano, problém byl „klasicky” USB 3, tentokrát ale řešitelný kabelem:</div>
<div class='p'><i>Zdar, kdybyste potřebovali k OAK-D kabel, kolem kterého může fungovat GPS, mám teď dobrou zkušenost s:</i> <a href='https://www.delock.com/produkt/84007/merkmale.html' class='external'>https://www.delock.com/produkt/84007/merkmale.html</a>
<i>Koukám, že má i další sourozence:</i> <a href='https://www.delock.com/produkt/83718/merkmale.html' class='external'>83718</a>, <a href='https://www.delock.com/produkt/84017/merkmale.html' class='external'>84017</a>,
<a href='https://www.delock.com/produkt/84019/merkmale.html' class='external'>84019</a>]. <i>Ty ale vyzkoušené nemám.</i>
<i>Myšlenkový pochod byl: Vysoká přenosová rychlost nejspíš potřebuje lepší stínění, šrouby lépe utáhnou kontakt, s kratším kabelem bude méně potíží.
Pořád bych pak nedával GPS přímo ke kameře, ale v mém případě, kdy je anténa necelý metr od kamery, výměna kabelu, se kterou kamera přišla, za tenhle, převedla
GPS ze stavu "při puštěné kameře vůbec nefunguje" do "funguje perfektně, bez výpadků".</i></div>
<div class='p'>… třeba se to bude někomu hodit např. na <a href='/competitions/robotour/2022/cs'>Robotour</a>. <span class='wink'></span></div>
<hr/>
<div class='p'><a id="221008"></a></div>
<h2>8. října 2022 — SLAM na 6 řádek</h2>
<div class='p'>Na posledním <i>robotickém callu</i> Jirka zmínil, že jen tak mimochodem se mu podařilo pustit SLAM na OAK-D kameře bez velkých problémů … cože?! <span class='smile'></span></div>
<div class='p'>Tak nejprve oprava, že „obrázek je pouze ilustrativní” a „reklama je zavádějící” … není to úplně SLAM (Simultaneous Localization and Mapping,
tj. současná lokalizace a mapování), ale <i>visual odometry</i>, tj. odometrie z kamery. Jirka to asi říkal, ale já si zapamatoval SLAM, pardón.
A těch řádků je o něco více, ale to by se dalo okecat:</div>
<pre>import depthai
import spectacularAI
import time
pipeline = depthai.Pipeline()
vio_pipeline = spectacularAI.depthai.Pipeline(pipeline)
# optional config args: vio_pipeline = spectacularAI.depthai.Pipeline(pipeline, config, useStereo=False)
with depthai.Device(pipeline) as device, \
vio_pipeline.startSession(device) as vio_session:
while True:
out = vio_session.waitForOutput()
print(out.asJson())</pre>
<div class='p'>Zdroj: <a href='https://github.com/SpectacularAI/sdk-examples/blob/main/python/oak/vio_jsonl.py' class='external'>https://github.com/SpectacularAI/sdk-examples/blob/main/python/oak/vio_jsonl.py</a></div>
<div class='p'>Rozchození bylo přímočaré, ještě než mi vystydlo kafe:</div>
<pre>mkvirtualenv slam
workon slam
pip install depthai
pip install spectacularAI</pre>
<div class='p'>a pak už puštění skriptu výše:</div>
<pre>(slam) md@md-ThinkPad-P50:~/git/slam$ python vio_slam.py
Traceback (most recent call last):
File "vio_slam.py", line 10, in <module>
with depthai.Device(pipeline) as device, \
RuntimeError: No available devices</pre>
<div class='p'>Já vlastně nevím, proč to dělám … prostě zvyk, aneb co se stane, když tam žádná kamera není? BTW kam jsem jí sakra dal?! Ano, už je lehce „zaprášená”…</div>
<div class='p'>Na druhý pokus (s připojenou OAK-D PRO kamerou přes USB) už to vypadalo lépe:</div>
<pre>(slam) md@md-ThinkPad-P50:~/git/slam$ python vio_slam.py
Spectacular AI SDK: WARN: unrecoginzed OAK board name 'OAK-D-PRO'
you may need to manually set IMU-to-camera extrinsics (configuration.imuToCameraLeft)
{
"acceleration":{"x":3.1929334554640985e-06,"y":-1.8542926966551022e-06,"z":-4.7221780476648234e-07},
"angularVelocity":{"x":0.0015828333562240005,"y":0.012700891122221947,"z":0.00035301301977597177},
"orientation":{"w":0.20955791688410802,"x":0.6385671367191919,"y":-0.7166392482573564,"z":-0.18640114051633144},
"position":{"x":0.006880179754191055,"y":-0.02585324999779014,"z":-0.0037064156909441524},
"status":"TRACKING","time":343134.285796941,
"velocity":{"x":-0.1518426175218836,"y":0.050841540677380274,"z":0.0363924090447811}
}
…</pre>
<div class='p'>Pak jsem si nechal vypisovat jen pozice a trošku mával kamerou nad stolem:</div>
<pre>{'x': -9.319226940036552, 'y': 1.5651737606558058, 'z': -5.689111896116633}
{'x': -9.724962378082667, 'y': 1.683750553335214, 'z': -5.987711949231651}
{'x': -10.173431395097694, 'y': 1.8181065640771044, 'z': -6.323567343157043}
{'x': -10.596265664774739, 'y': 1.947684970617886, 'z': -6.645771182786724}
{'x': -11.028292374467366, 'y': 2.0827255306275148, 'z': -6.980379856466121}
{'x': -11.50425102807769, 'y': 2.2345457195224334, 'z': -7.355377866839724}
{'x': -11.956292577500529, 'y': 2.3815888137119883, 'z': -7.717576736330567}</pre>
<div class='p'>hmm, to moc nevypadá jako v metrech?! No asi je třeba udělat ten první krok pořádně a nastudovat si
<a href='https://github.com/SpectacularAI/sdk-examples/tree/main/python/oak' class='external'>readme</a>.
Jak znám Jirku, tak u tohoto povrchního pokusu rozhodně nezůstal a více to prozkoumal.
Konkrétně ještě posílal link na <a href='https://github.com/SpectacularAI/sdk-examples/blob/main/python/oak/vio_gnss.py' class='external'>vio_gnss.py</a>,
což by měla být kombinace GPS s vizuální odometrii a to má to blízko k jeho <a href='/articles/ardusimple-rtk3b/cs'>článku o Ardusimple RTK3B</a>.</div>
<hr/>
<div class='p'><a id="240122"></a></div>
<h2>22. ledna 2024 — OSGAR driver</h2>
<div class='p'>V rámci vytahování „kostlivců ze skříně”, aneb co vše by se hodilo na <a href='/robots/pat-a-mat/cs'>nového robota</a>, došlo znova na OAK-D
kamery. Chěl jsem si napsat <i>driver</i> pro <a href='/guide/osgar/cs'>OSGARa</a>, ale Jakub mne minulý týden dostal, že už přece dávno existuje!
<span class='smile'></span></div>
<div class='p'>Ano, je tam nějaký <i>config/test-oak-camera.json</i>, ale uvnitř jsem viděl IP adresu, tak jsem předpokládal, že bude fungovat
pouze na PoE kamery, co Jakub na ČZU používá. A není tomu tak.</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ cat config/test-oak-camera.json
{
"version": 2,
"robot": {
"modules": {
"app": {
"driver": "osgar.drivers.oak_camera:OakCamera",
"init": {
"fps": 10,
"is_color": true,
"is_depth": true,
"laser_projector_current": 1200,
"is_imu_enabled": true,
"number_imu_records": 10,
"disable_magnetometer_fusion": false,
"cam_ip": "169.254.1.222",
"mono_resolution": "THE_400_P",
"color_resolution": "THE_1080_P",
"color_manual_focus": 130,
"stereo_median_filter": "KERNEL_3x3",
"stereo_mode": "HIGH_ACCURACY",
"stereo_extended_disparity": false,
"stereo_subpixel": false,
"stereo_left_right_check": true
}
}
},
"links": []
}
}</pre>
<div class='p'>po spuštění:</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.record –duration 10 config/test-oak-camera.json
2024-01-17 23:10:13,192 __main__ INFO /home/md/git/osgar/test-oak-camera-240117_221013.log
2024-01-17 23:10:13,230 __main__ INFO SIGINT handler installed
2024-01-17 23:10:13,752 osgar.drivers.oak_camera WARNING IP 169.254.1.222 was not found!
2024-01-17 23:10:13,752 osgar.drivers.oak_camera INFO Found devices: 1.6
2024-01-17 23:10:13,752 osgar.drivers.oak_camera INFO Used the first available device.</pre>
<div class='p'>a následně:</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.logger test-oak-camera-240117_221013.log
k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>
0 sys 803 | 5 | 0.5Hz
1 app.depth 36361514 | 71 | 6.7Hz
2 app.color 25732424 | 71 | 6.7Hz
3 app.orientation_list 38570 | 70 | 6.6Hz
Total time 0:00:10.574191</pre>
<div class='p'>Na první pohled to vypadá, že je tam vše … tak asi není co dělat. <span class='wink'></span></div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/osgar-color.jpg'><img src='/articles/oak-d-pro/osgar-color_t.jpg' alt='RGB obrázek přes OSGAR driver' title='RGB obrázek přes OSGAR driver' class='border' width='320' height='180'/></a><br/>
<a href='/articles/oak-d-pro/osgar-color.jpg'>RGB obrázek přes OSGAR driver</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/osgar-depth.jpg'><img src='/articles/oak-d-pro/osgar-depth_t.jpg' alt='hloubková data' title='hloubková data' class='border' width='320' height='200'/></a><br/>
<a href='/articles/oak-d-pro/osgar-depth.jpg'>hloubková data</a>
</td></tr></table></div>
<div class='p'>p.s. přidám si sem ještě poznámku, že na druhém počítači to tak snadné nebylo:</div>
<pre>[2024-01-26 16:19:36.660] [depthai] [warning] Insufficient permissions to communicate with X_LINK_UNBOOTED
device having name "1.3". Make sure udev rules are set
RuntimeError: No available devices</pre>
<div class='p'>a hodí se použít <a href='https://docs.luxonis.com/install_dependencies.sh' class='external'>instalační skript</a>, který obsahuje:</div>
<pre># Allow all users to read and write to Myriad X devices
echo "Installing udev rules…"
echo 'SUBSYSTEM<tt>"usb", ATTRS{idVendor}</tt>"03e7", MODE="0666"' |
sudo tee /etc/udev/rules.d/80-movidius.rules > /dev/null
sudo udevadm control –reload-rules && sudo udevadm trigger</pre>
<div class='p'>… případně viz <a href='https://docs.luxonis.com/projects/api/en/latest/install/#ubuntu' class='external'>instalační návod</a></div>
<div class='p'>p.s.2 ještě úplně výhra to není, protože na <a href='/robots/pat-a-mat/cs'>Patovi</a> to teď funguje, jen když nejprve
připojím kameru a pak PCAN</div>
<hr/>
<div class='p'><a id="240210"></a></div>
<h2>10. února 2024 — Two Towers</h2>
<div class='p'>Dnes jsem si konečně chvíli hrál s <a href='/robots/pat-a-mat/cs'>Patem</a>, jenom jízda 1 metr tam a zpět. Vpředu má
teď namontovanou OAK-D kameru s úhlem 20 stupňů dolů (viz <a href='/articles/infento/cs#240128'>Multi Angle Joint</a>).
Další úloha je vcelku triviální: jezdi tam a zpět, ale pokud bude v cestě překážka, tak zastav. A to, že
je cesta blokovaná překážkou má program zjistit z hloubkových OAK-D dat.</div>
<div class='p'>A teď se už pomalu dostáváme k zápletce o „Dvou věžích”. Do cesty jsem si dal dopravní kužel (to je zase
jiná <i>hra</i>, který z robotů <a href='/robots/pat-a-mat/cs'>Pat</a> nebo <a href='/robots/rocker/cs'>Rocker</a> první dokáže 30 minut
jezdit od kuželu ke kuželu, přímá viditelnost). A když se koukám na nasbíraná data, tak vidím toto:</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/two-towers-rgb.jpg'><img src='/articles/oak-d-pro/two-towers-rgb_t.jpg' alt='RGB obrázek' title='RGB obrázek' class='border' width='320' height='180'/></a><br/>
<a href='/articles/oak-d-pro/two-towers-rgb.jpg'>RGB obrázek</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/two-towers-depth.jpg'><img src='/articles/oak-d-pro/two-towers-depth_t.jpg' alt='hloubkový obrázek' title='hloubkový obrázek' class='border' width='320' height='200'/></a><br/>
<a href='/articles/oak-d-pro/two-towers-depth.jpg'>hloubkový obrázek</a>
</td></tr></table></div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/two-towers2-rgb.jpg'><img src='/articles/oak-d-pro/two-towers2-rgb_t.jpg' alt='RGB obrázek' title='RGB obrázek' class='border' width='320' height='180'/></a><br/>
<a href='/articles/oak-d-pro/two-towers2-rgb.jpg'>RGB obrázek</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/oak-d-pro/two-towers2-depth.jpg'><img src='/articles/oak-d-pro/two-towers2-depth_t.jpg' alt='hloubkový obrázek' title='hloubkový obrázek' class='border' width='320' height='200'/></a><br/>
<a href='/articles/oak-d-pro/two-towers2-depth.jpg'>hloubkový obrázek</a>
</td></tr></table></div>
<div class='p'>Hmm, je to očekávané?? Možná ano, ale mne to minimálně překvapilo.</div>
<hr/>
<div class='p'><a id="240226"></a></div>
<h2>26. února 2024 — Staronoví manažeři a přehrávání videa</h2>
<div class='p'>Bude to už pomalu 14 dní, co jsem zkoušel následující kód z
<a href='https://docs.luxonis.com/projects/sdk/en/latest/samples/replay/SDK_looped_replay/?highlight=replay#looped-replay' class='external'>luxonis webu</a>:</div>
<pre>from depthai_sdk import OakCamera
with OakCamera(replay='https://www.youtube.com/watch?v=Y1jTEyb3wiI') as oak:
oak.replay.set_loop(True) # <— Enable looping of the video, so it will never end
color = oak.create_camera('color')
nn = oak.create_nn('vehicle-detection-0202', color)
oak.visualize(nn, fps=True)
oak.start(blocking=True)</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/oak-d-pro/replay-youtube.jpg'><img src='/articles/oak-d-pro/replay-youtube_t.jpg' alt='Realtime anotování YouTube videa' title='Realtime anotování YouTube videa' class='border' width='640' height='365'/></a><br/>
<a href='/articles/oak-d-pro/replay-youtube.jpg'>Realtime anotování YouTube videa</a>
</td></tr></table></div>
<div class='p'>Tenkrát mi to padalo na <i>oak.replay.set_loop(True)</i>, ale když jsem tento řádek zakomentoval, tak to
na připojené OAK-D kameře v reálném čase detekovalo autíčka z <a href='https://www.youtube.com/watch?v=Y1jTEyb3wiI' class='external'>YouTube videa</a>. <span class='smile'></span></div>
<div class='p'>A dnes jsem řešil <a href='https://github.com/mkrupczak3/Coneslayer' class='external'>detekci kuželu</a> (na PC fungovala, na OAK-D zatím stále nikoliv)
a narazil v dokumentaci na <i>výměnu manažerů</i>:</div>
<ul>
<li><a href='https://docs.luxonis.com/projects/sdk/en/old_sdk_managers/getting-started/' class='external'>https://docs.luxonis.com/projects/sdk/en/old_sdk_managers/getting-started/</a> (<b>BlobManager</b>, <b>NNetManager</b>, atd.)</li>
</ul>
<div class='p'>vs.</div>
<ul>
<li><a href='https://docs.luxonis.com/projects/sdk/en/latest/oak-camera/' class='external'>https://docs.luxonis.com/projects/sdk/en/latest/oak-camera/</a> (<b>OakCamera</b> <i>vládne všem</i>)</li>
</ul>
<div class='p'>Stará detekce kuželů dále odkazovala na <a href='https://gitlab.com/KSU_EVT/autonomous-software/yolov7-luxonis-detection' class='external'>Yolov7 Luxonis Detection</a> (asi fork)
a tam v <a href='https://gitlab.com/KSU_EVT/autonomous-software/yolov7-luxonis-detection/-/blob/master/main.py?ref_type=heads' class='external'>main.py</a> půlka importů
nefungovala. Vysvětlení je částečně na <a href='https://discuss.luxonis.com/d/1050-broken-link-for-sdk-documentation' class='external'>diskusním fóru</a> cca před rokem.</div>
<div class='p'>A co bylo tedy špatně na mém kódu? Verze <a href='https://pypi.org/project/depthai-sdk/' class='external'>depthai-sdk</a>. Používal jsem
<a href='https://github.com/luxonis/depthai/tree/main' class='external'>github DepthAI</a>, ale fakticky jsem měl i balíček nainstalovaný (verze 1.9.4).
Po upgrade na nejnovější (verze 1.13.1) už <i>set_loop()</i> funguje a stejně tak třeba nastavení konfigurace kamery … ale to snad příště.</div>
<hr/>
<div class='p'><a id="240304"></a></div>
<h2>4. března 2024 — Detekce kuželu pomocí YoloV7</h2>
<div class='p'>Trošku se děsím, že se dostávám do vývojové fáze mých studentů před dvaceti lety, kteří, když dostali úkol, tak místo aby se nad ním
zamysleli, rovnou hledali řešení na webu. S tou „moji” detekcí kuželů je to stejné! Vycházel jsem z modelu <a href='https://github.com/mkrupczak3/Coneslayer' class='external'>Coneslayer</a>,
který mi fungoval na PC, ale <a href='https://gitlab.com/KSU_EVT/autonomous-software/yolov7-luxonis-detection' class='external'>odkazovaná OAK-D</a> varianta už ne (viz
<a href='/articles/oak-d-pro/cs#240226'>Staronoví manažeři ...</a>).</div>
<div class='p'>Možná bych ještě udělal jednu odbočku pro ty, kdo jsou na tom jako já — nazval bych to <i>Slon zahradníkem</i>, aneb kříženec <i>Slona v porcelanu</i> s <i>Kozlem zahradníkem</i>. <span class='smile'></span>
NNeurotickému světu dominuje několik firmem a z toho vyplývají nejrůznější důsledky. Vycházím s „vtipného” popisu, kterak <i>snadno a rychle</i> konvertovat <i>pytorch model</i>
na <i>Movidius</i>/OAK-D. To je skoro na tabulku:</div>
<div class='p'><center>
<table border="1">
<tr>
<td>Firma</td>
<td>Nástroj</td>
<td>Fromát souborů</td>
</tr>
<tr>
<td>Facebook</td>
<td><a href='https://pytorch.org/' class='external'>Pytorch</a></td>
<td>*.pt a *.pth</td>
</tr>
<tr>
<td>Microsoft</td>
<td><a href='https://onnx.ai/' class='external'>ONNX</a></td>
<td>*.onnx</td>
</tr>
<tr>
<td>Intel</td>
<td><a href='https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/overview.html' class='external'>OpenVino</a></td>
<td>*.bin, *.xml, *.blob</td>
</tr>
<tr>
<td>Google</td>
<td><a href='https://www.tensorflow.org/' class='external'>Tensorflow</a></td>
<td>*.tf, *.tflite, …</td>
</tr>
<tr>
<td>NVidia</td>
<td><a href='https://developer.nvidia.com/tensorrt' class='external'>TensorRT</a></td>
<td>??</td>
</tr>
</table>
</center></div>
<div class='p'>Jako ve správném kapitalistickém světě se ty firmy nemají rády a tak přechod od jednoho k druhému je dost kostrbatý, pokud vůbec jde (jsou tam i technické
rozdíly, ale o nich zatím nejsem schopen nic říci). Typicky to vyžaduje nějakou obskurní verzi, nejlépe v <i>dockeru</i>, která ale zase funguje pouze
pro některé verze modelů (?).</div>
<div class='p'>Co jsem to chtěl? Jo pointa této <i>předehry</i> je v tom, že <a href='https://www.v7labs.com/blog/yolo-object-detection' class='external'>YOLO</a> je postaveno na Pytorchi.</div>
<div class='p'>Přemmýšlím, jestli <a href='http://cimrman-smoljak-sverak.blogspot.com/2019/05/vrazda-v-salonnim-coupe.html' class='external'>Cimrmanovsky neprozradit konec celé detektivky</a>? Asi jo,
oni nám jinak diváci zůstavají sedět …</div>
<pre>git clone https://github.com/luxonis/depthai-experiments.git
cd depthai-experiments/gen2-yolo/device-decoding
python main.py -config ~/git/Coneslayer/coneslayer.json -recording ~/git/osgar/follow-path.mp4</pre>
<div class='p'>(zase pozor u configu mají být dvě pomlčky! staré TODO web parser, aby to nebylo interpretováno jako škrtnutý text)</div>
<div class='p'>Přiběh začíná tak, že PavelJ řešil rychlost neuronky na <a href='/competitions/robotour/2024/cs'>Robotour</a>. A právě kvůli zmiňovaným konverzním problémům to
dal na <a href='https://github.com/pavliik/oak_segmentation.git' class='external'>github</a>, jestli není problém jen u něj. Já jsem pro model
<a href='https://gitlab.com/KSU_EVT/autonomous-software/yolov7-luxonis-detection/-/blob/master/coneslayer_openvino_2021.4_6shave.blob?ref_type=heads' class='external'>coneslayer_openvino_2021.4_6shave.blob</a>
nemohl přímo pustit původní skript, tak jsme to na pravidelném <i>callu</i> zkoušeli v Pavlově prostředí. Nekreslilo to žádné detekce (ano, má rozpoznávací schopnost
zda něco funguje je dost chabá) a tak došlo na ladění a tím jsem <i>call</i> zcela <i>zabil</i> a všem účastníkům se ještě jednou omlouvám.</div>
<div class='p'>Na výstupu sítě bylo <b>48672 floatů</b> — co to je? Resp. na výstupu nebylo nic, ale když člověk zavolal <i>in_nn.getAllLayerNames()</i>, tak získal nápovědu, že
výstup není <i>output</i>, ale jedna z variant <i>['output1_yolov7', 'output2_yolov7', 'output3_yolov7']</i>. Dobře, takže to neni jen 48672 floatů, ale 18*52*52 floatů.
Lepší? Když je to celé na hromadě, tak není jasné, zda 18 je ta první dimenze nebo poslední (ano, mohla by být i prostřední, ale to by nám snad neudělali).
Yolo jede na „mřízce detekcí”, tj. těch 52x52 bude ta mřížka a 18 budou detekce. Jsou to <i>bounding boxy</i>, tj. pozice x, y, velikost w, h a pak důvěryhodnost
detekce, ale že by tam měli 14 typů kuželů??</div>
<div class='p'>Další den Jirka doporučil si udělat vlastní blob konverzi: <i>Vezmi ten onnx model a zkonvertuj si ho pomocí Luxonis blobconverteru sám</i>
<a href='https://blobconverter.luxonis.com/' class='external'>https://blobconverter.luxonis.com/</a>. <i>Nastav -mean_values=[0,0,0] -scale_values=[255,255,255].</i>
Tak vznikl nový <i>blob</i>. Jirka lehce naznačil „co se všechno může pokazit”, resp. co vše může být jinak. Barvy nejsou 0 až 255, ale třeba 0 až 1 nebo -0.5 až +0.5.
Uspořádané jsou buď RGB nebo BRG. Obrázek může vyžadovat jistou velikost např. 416x416. Data obrázku jsou buď 3x416x416 nebo 416x416x3. Ještě jsem na něco zapomněl?
Jirku nic nezastaví, takže odpověď byla</div>
<pre>img = cv2.imread(str(args.input_image), cv2.IMREAD_COLOR) # BGR, HWC
img = cv2.resize(img, (args.width, args.height))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # RGB, HWC
img = img.transpose(2, 0, 1) # RGB, CHW
img = numpy.expand_dims(img, 0) # NCHW, i.e. including a "batch" dimension.
img = (img / 255.).astype(numpy.float32) # [0..1] range</pre>
<div class='p'>… no mne to tenkrát přišlo skoro vtipné, že tam byly úplně „všechny věci co se pokazit můžou” — Murphy by byl spokojený.</div>
<div class='p'>Ještě psal, že ta síť, resp. <a href='https://github.com/mkrupczak3/Coneslayer/blob/main/coneslayer-simplified.onnx' class='external'>ONNX varianta</a> dává nahlédnout
pod … jak se to dnes korektně říká? … kapotu:</div>
<div class='p'><i>Zajimave je, ze kdyz si zobrazim ONNX variantu modelu v</i> <a href='http://netron.app' class='external'>http://netron.app</a><i>, vypadaji vystupy jinak, nez co jsme videli v tom xml.</i></div>
<div class='p'><i>1. Jsou ctyri. Tri nepojmenovane, ktere vypadaji (skoro, ne uplne!) jako ty v tom xml. A jeden "agregovany", ktery z tech tri vznike preskalovanim a slepenim a ktery se jmenuje "output".</i></div>
<div class='p'><i>2. Ty tri nepojmenovane jsou vicerozmerne a maji tvary jako 1x3x56x56x6. Tj, ta divna osmnactka je asi ve zkutecnosti 3x6. Ta 3 mi unika, ale 6 je neco, co bych cekal, kdyz mam x, y, w, h plus dva typy kuzelu.</i></div>
<div class='p'><i>3. Ten agregovany "output" ma rozmer 1x1064x6. Tj. 6 zustane, ostatni dimenze se splacnou.</i></div>
<div class='p'><i>Zkusil jsem pustit ten ONNX model na CPU, ale zatim uplne nechapu skalu hodnot v tom "output". Jsou mimo 0..1, ale moc male na to, aby to byly pixely ve 416x416 obrazku.</i></div>
<div class='p'>Jirka se asi bude zlobit, že to nebylo ke zveřejnění, ale … snad mi to odpustí. Výsledek vypadal takto:</div>
<div class='p'><table class='image_panel center' style='width: 506px;'><tr><td>
<a href='/articles/oak-d-pro/cone-onnx-ji.jpg'><img src='/articles/oak-d-pro/cone-onnx-ji_t.jpg' alt='Detekce kuželu přes ONNX' title='Detekce kuželu přes ONNX' class='border' width='500' height='282'/></a><br/>
<a href='/articles/oak-d-pro/cone-onnx-ji.jpg'>Detekce kuželu přes ONNX</a>
</td></tr></table></div>
<div class='p'>Spousta malých obdělníčků. Znova jsem koukal na <a href='https://www.v7labs.com/blog/yolo-object-detection' class='external'>yolo popisek</a> a zmiňují tam jednak tu mřížku:</div>
<div class='p'><i>YOLO divides an input image into an S × S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. Each grid cell predicts B bounding boxes and confidence scores for those boxes. These confidence scores reflect how confident the model is that the box contains an object and how accurate it thinks the predicted box is.</i></div>
<div class='p'>a dále NMS:</div>
<div class='p'><i>One key technique used in the YOLO models is non-maximum suppression (NMS). NMS is a post-processing step that is used to improve the accuracy and efficiency of object detection. In object detection, it is common for multiple bounding boxes to be generated for a single object in an image. These bounding boxes may overlap or be located at different positions, but they all represent the same object. NMS is used to identify and remove redundant or incorrect bounding boxes and to output a single bounding box for each object in the image.</i></div>
<div class='p'>To Jirka zmiňoval a já moc nechápal o co jde … ale je to způsob, jak z těch mnoha detekci (confidence level 0.999!) získat jednu velkou. Teď už přeskočím na konec
(za chvíli budu muset do práce) … s tvrzením „Vrah je slon” (jj, pondělky bývají náročnější) … a zkonvertuji alespoň data nahraná <a href='/robots/pat-a-mat/cs#240302'>Patem</a>.</div>
<div class='p'>Hmm, tak asi později — nemám teď u sebe OAK-D a mezi desítkami parametrů nevidím ukládání výstupu:</div>
<pre>(depthai) md@md-ThinkPad-P50:~/git/depthai-experiments/gen2-yolo/device-decoding$ python main.py -h
usage: main.py [-h] [-conf CONFIG] [-recording RECORDING] [-rgbr RGBRESOLUTION]
[-rgbf RGBFPS] [-monor MONORESOLUTION] [-monof MONOFPS] [-fps FPS]
[-defaultRes {None,min,max}] [-isp ISPSCALE] [-sharpness SHARPNESS]
[-lumaDenoise LUMADENOISE] [-chromaDenoise CHROMADENOISE]
[-manualFocus MANUALFOCUS] [-afMode AFMODE] [-awbMode AWBMODE]
[-sceneMode SCENEMODE] [-abMode ANTIBANDINGMODE]
[-effectMode EFFECTMODE] [-dct DISPARITYCONFIDENCETHRESHOLD]
[-lrct LRCTHRESHOLD] [-sig SIGMA] [-med {0,3,5,7}]
[-lrc STEREOLRCHECK] [-ext EXTENDEDDISPARITY] [-sub SUBPIXEL]
[-maxd MAXDEPTH] [-mind MINDEPTH] [-sbbsf SBBSCALEFACTOR]
[-openvinoVersion {2020_3,2020_4,2021_1,2021_2,2021_3,2021_4,2022_1,UNIVERSAL}]
[-xls XLINKCHUNKSIZE] [-tun CAMERATUNING] [-dev DEVICEID]
[-usbs {usb2,usb3}] [-irDotBrightness IRDOTBRIGHTNESS]
[–irFloodBrightness IRFLOODBRIGHTNESS]
…</pre>
<hr/>
<div class='p'><a id="240316"></a></div>
<h2>16. března 2024 — Software syncing</h2>
<div class='p'>Dnes jsem se zase něco naučil — od Jirky, jak jinak. <span class='wink'></span></div>
<div class='p'>OAK-D kamera nějak běží, detekuje a reportuje kužely (a loguje v OSGARovi), ale když pak chci detekce
visualizovat s původními obrázky, tak mám problém:</div>
<pre>python -m osgar.logger oak-cone-detection-240315_203533.log -stream oak.detections oak.color \
-format "{timestamp} {len(data)}"
0:00:03.442914 219488
0:00:03.487640 4
0:00:03.489948 214840 <====
0:00:03.517288 309346
0:00:03.540213 301433
0:00:03.566320 4
0:00:03.566519 290162
0:00:03.589637 4
0:00:03.599398 299662
0:00:03.615203 304556
0:00:03.638670 4
0:00:03.664591 4
0:00:03.664854 283100
0:00:03.681872 222737
0:00:03.713446 4
0:00:03.724757 4
0:00:03.743658 733428
0:00:03.747007 375482
0:00:03.776240 4
0:00:03.787632 4
0:00:03.790691 386878
0:00:03.812691 408704</pre>
<div class='p'>… prostě mi přišly tři obrázky za sebou a k čemu se váže ta detekce z času <i>3.566320</i>?!
Jirka to komentoval: <i>Dataframy z OAKu obsahují i timestamp a sequence id. Podle sequence id by to mělo jít párovat se vstupním obrázkem.</i>
… a je to přesně tak <span class='smile'></span> … viz <a href='https://docs.luxonis.com/projects/api/en/latest/tutorials/message_syncing/#software-syncing' class='external'>Software syncing</a>.
Přidal jsem sekvenční číslo do OSGAR driveru pro OAK-D kameru (rovnou i pro <i>depth</i>) a výsledky detekce z neuronky je teď možné relativně snadno napárovat v použitým
vstupním obrázkem. Ale … sekvenční čísla pro <i>depth</i> jedou v „jiném rytmu” a tak jsem raději rovnou doplnil i ten <i>timestamp_us</i>:</div>
<pre>seq_num = packets[-1].getSequenceNum() # for sync of various outputs
dt = packets[-1].getTimestamp() # datetime.timedelta
timestamp_us = ((dt.days * 24 * 3600 + dt.seconds) * 1000000 + dt.microseconds)</pre>
<div class='p'>OSGAR používá <a href='https://msgpack.org/' class='external'>msgpack</a> a ten nemá Pythonovský <a href='https://docs.python.org/3/library/datetime.html#timedelta-objects' class='external'>datetime.timedelta</a>
v základní sadě. A je škoda ukládat <i>floaty</i>, když vím, že zdroj je v mikrosekundách. Výsledek?</div>
<pre>5 oak.depth_seq 1864 | 166 | 8.3Hz
6 oak.color_seq 341 | 31 | 1.5Hz
7 oak.detections_seq 341 | 31 | 1.5Hz
OSGAR time, OSGAR stream, [seq_num, timestamp_us]
0:00:03.472923 6 [0, 163893263641]
0:00:03.516000 7 [0, 163893263641]
0:00:03.518708 6 [2, 163893313635]
0:00:03.547843 6 [3, 163893338631] <<tt>==
0:00:03.567436 5 [0, 163893348213]
0:00:03.569827 6 [4, 163893363629]
0:00:03.596117 7 [2, 163893313635]
0:00:03.596373 6 [5, 163893388627]
0:00:03.619423 7 [3, 163893338631] <</tt>==
0:00:03.619587 6 [6, 163893413624]
0:00:03.646627 6 [7, 163893438618]
0:00:03.650795 5 [1, 163893448204]
0:00:03.666352 7 [4, 163893363629]</pre>
<hr/>
<div class='p'><a id="240318"></a></div>
<h2>18. března 2024 — Debugging DepthAI pipeline</h2>
<div class='p'>Přiznám se bez mučení — synchronizace obrázku se seznamem detekcí nebylo vše, co mne v sobotu trápilo. I když jsem nahrávání pouštěl několikrát dokola, tak typicky u 31.
obrázku se mi to „kouslo” (ale hloubková data se nahrávala dál). Když jsem vypnul nahrávání hloubkových dat, stále stejný problém. Když jsem snížil FPS
(počet snímků za sekundu) na 1, tak stejně po 30 sekundách konec.</div>
<div class='p'>Jako tonoucí jsem hledal „stéblo” na stránkách Luxonisu a našel <a href='https://docs.luxonis.com/projects/api/en/latest/tutorials/debugging/' class='external'>Debugging DepthAI pipeline</a>. Úvodní
věta, <i>currently, tools for debugging the DepthAI pipeline are limited</i>, mne příliš nepovzbudila (fakticky lze zapnout debug výstup na konzoli a to je asi vše),
ale byla tam i zmínka <i>... which would allow users to debug a “frozen” pipeline much easier, which is usually caused by a filled up blocking queue.</i> Prostě
že probém je typicky plná blokovaná fronta.</div>
<div class='p'>V mém případě to byl <a href='https://github.com/luxonis/depthai-experiments/blob/master/gen2-yolo/device-decoding/main_api.py#L101' class='external'>xoutRgb</a>, který jsem vůbec v upravené
verzi <i>OSGAR driveru</i> nečetl. Sice měla být jako „neblokovaná”, ale 32 už je možná moc? V každém případě po vyčítání i této fronty, případně úplné odstranění
<i>xoutRgb</i>, to najednou jede jak má! <span class='smile'></span></div>
<div class='p'>A zároveň jsem pochopil, proč v tom jejich demu jsou <b>dvě</b> výstupní okna. V popisu <a href='https://docs.luxonis.com/projects/api/en/latest/components/nodes/color_camera/' class='external'>ColorCamera modulu</a>
je zmíněno, že <i>preview - ImgFrame - RGB (or BGR planar/interleaved if configured), mostly suited for small size previews and to feed the image into NeuralNetwork</i>.
Prostě zmenšený obrázek se používá jak pro „normální náhled” tak jako vstup do neuronek! A toto <i>preview</i> zobrazovalo to druhé okno. Proč? Protože pokud chcete
na vstupu mít 416x416 pixelový obrázek se zachováním poměrů stran, musíte řezat. A to pěkně ukazuje obrázek <a href='https://docs.luxonis.com/projects/api/en/latest/_images/isp.jpg' class='external'>isp.jpg</a>:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/oak-d-pro/isp.jpg'><img src='/articles/oak-d-pro/isp_t.jpg' alt='výřez pro preview - převzato z Luxonis webu' title='výřez pro preview - převzato z Luxonis webu' class='border' width='640' height='479'/></a><br/>
<a href='/articles/oak-d-pro/isp.jpg'>výřez pro preview - převzato z Luxonis webu</a>
</td></tr></table></div>
<div class='p'>A když bboxy pronásobíte <b>pouze výškou</b> a posunete o polovičku rozdílu výšky a šířky dostanete konečně to co chcete:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/oak-d-pro/osgar-oak-cones.jpg'><img src='/articles/oak-d-pro/osgar-oak-cones_t.jpg' alt='Detekce kuželů přes OSGAR HIL (hardware-in-the-loop)' title='Detekce kuželů přes OSGAR HIL (hardware-in-the-loop)' class='border' width='640' height='360'/></a><br/>
<a href='/articles/oak-d-pro/osgar-oak-cones.jpg'>Detekce kuželů přes OSGAR HIL (hardware-in-the-loop)</a>
</td></tr></table></div>
<div class='p'>p.s. už jenom drobné pozorování, že pokud byl původný záběr kamery úzký, tak po tom ořezu pro detekci bude ještě užší … ale jak to vylepšit si nechám do nějaké <i>ver2</i>.</div>
<hr/>
<div class='p'><a href='/articles/oak-d-pro/cs#email'>kontaktní formulář</a></div>
ELROB 2024https://robotika.cz/competitions/elrob/2024/cs2022-12-22T00:00:00ZMartin Dlouhý a Jiří Iša
Jak vypadá ELROB skoro po dvaceti letech existence? Nevím, ale bude to až za
necelé dva roky, tak by to mohl být takový milník naše mobilní roboty a algoritmy
oprášit a spojit v novém. <b>Blog update:</b>
11/03/2024 — <a href='/competitions/elrob/2024/cs#240311'>Půlhodina (zbývá 105 dní)</a>
<ul>
<li><a href='https://www.elrob.org/elrob-2024' class='external'>https://www.elrob.org/elrob-2024</a></li>
</ul>
<div class='p'><i>ELROB 2024 - European Land Robot Trial, 12th European Land Robot Trial, 9th Military ELROB24 - 28 June 2024, Trier, Germany</i></div>
<div class='p'><i>This is the first official announcement for the twelfth European Land Robot Trial 2024! The military ELROB, which takes place for the ninth time now, enables you to get a glance at the latest R&D in the area of unmanned outdoor/off-road ground systems. The scenarios have been developed in closest co-operation with the military users and reflect the up-to-date requirements of the forces. This event offers the fantastic opportunity to mingle with the international experts from the user community, the industry and the R&D sector. ELROB is a strictly non-profit activity! The event is organized and carried out only by non-profit organisations. All participation fees are completely redistributed among the participants to cover travel expenses.</i></div>
<ul>
<li>jirka says:
<a href='https://www.elrob.org/files/elrob2022/ELROB2022_Scenario_Mule.pdf' class='external'>https://www.elrob.org/files/elrob2022/ELROB2022_Scenario_Mule.pdf</a></li>
</ul>
<h3>Google translate říká:</h3>
<div class='p'><i>ELROB 2024 – European Land Robot Trial, 12. European Land Robot Trial, 9. Military ELROB24 – 28. června 2024, Trier, Německo
Toto je první oficiální oznámení pro dvanáctý European Land Robot Trial 2024! Vojenský ELROB, který se koná již podeváté, vám umožní nahlédnout do nejnovějšího výzkumu a vývoje v oblasti bezpilotních venkovních/terénních pozemních systémů. Scénáře byly vypracovány v nejužší spolupráci s vojenskými uživateli a odrážejí aktuální požadavky sil. Tato událost nabízí fantastickou příležitost setkat se s mezinárodními odborníky z komunity uživatelů, průmyslu a sektoru výzkumu a vývoje. ELROB je přísně nezisková aktivita! Akci organizují a provádějí pouze neziskové organizace. Veškeré účastnické poplatky jsou zcela přerozděleny mezi účastníky na pokrytí cestovních nákladů.</i></div>
<h2>Obsah</h2>
<ul>
<li><a href='/competitions/elrob/2024/cs#240311'>240311 - Půlhodina (zbývá 105 dní)</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog</h1>
<hr/>
<div class='p'><a id="221222"></a></div>
<h2>22. prosince 2022 - O co jde? (zbývá 550 dní) [MD]</h2>
<div class='p'>Jirka mne na včerejším pravidelném <i>callu</i> přesvědčil, že by mělo smysl se účastnit „soutěže”
<a href='/competitions/elrob/cs'>ELROB</a>. Naposledy jsem tam byl v roce <a href='/competitions/elrob/2006/cs'>2006</a> jako „novinář”, ale už
tehdy mne zarazil rozdíl mezi americkou a evropskou verzí „soutěže”: zatímco americká
<a href='https://www.darpa.mil/' class='external'>DARPA</a> vám za vítězství nabídne milión dolarů nebo i více, v evropské
dostanete (snad) diplom a ještě si zaplatíte registrační poplatek 500 EUR <span class='smile'></span> … ale třeba
už to tak není — časem prověříme.</div>
<div class='p'>Tak proč se tím vůbec zabývat? ELROB nabízí mnoho srovnávacích kategorií, z nichž se Jirkovi
zalíbila <a href='https://www.elrob.org/files/elrob2022/ELROB2022_Scenario_Mule.pdf' class='external'>mula</a>.
Ve zkratce nejprve jede robot za vámi do cílové pozice a následně ho přepnete do <i>autonomního módu</i>.
Robot se sám vrátí na start po stejné trase a pak pendluje start-cíl-start-cíl-… a když
to začne být přiliš nuda, tak vám tam organizátoři přidají překážku.</div>
<div class='p'>Podobná úloha může být i použitelná v praxi a je jedno, jestli robot veze cihlu (md) nebo rohlíky (zw).
Prostě tím vytvoříte takový dočasný <i>transportní kanál</i>.</div>
<div class='p'>Kdybychom vyráželi dnes, tak Jirka má „na skladě” <a href='/robots/freyja/cs'>Freyju</a>, Jakub <a href='/robots/kloubak/cs'>kloubáky K2 a K3</a>,
a vlastně by asi šly použít všechny <a href='/competitions/robotour/cs'>Robotour</a> roboti. No a je to takový milník, resp. zatím
vzdálený <i>deadline</i>, tak uvidíme …</div>
<hr/>
<div class='p'><a id="231005"></a></div>
<h2>5. října 2023 - Čas začít (zbývá 263 dní) [JI]</h2>
<div class='p'><a href='/robots/freyja/cs#231004'>Freyja 2.0</a> je až na drobné detaily hotová. <a href='/robots/pat-a-mat/cs'>PatAMat</a> pluje. Nastal čas psát software a jezdit!</div>
<div class='p'>Freyja má v tomto trochu náskok, protože psát software jsem začal už v zimě, kdy jsme o soutěži začali mluvit. Testoval jsem na Deedee, což je takový menší domácí robot, kterého jsem už i při SubT používal jako "technologický demonstrátor." Deedee mě následovala po bytě a pak se vracela na start a jezdila tam a zpátky už na jaře. Mezitím jsem dopřestavěl Freyju a začal software "portovat". Tento týden pak poprvé jezdila tam a zpátky i Freyja. Na 34 metrech vedle domu najezdila za 25 minut 830 metrů. Tam, zpátky, tam, zpátky, tam … prostě strhující zážitek.</div>
<div class='p'>Co jsem se z těchto pokusů naučil?</div>
<ul>
<li>RealSense tracking camera, kterou používá doma Deedee, je mocná zbraň. Robot vždycky ví, kde je. Freyja venku takovou jistotu s takovou přesností nemá. Je potřeba dál pracovat na lokalizaci a fůzi dat z různých senzorů. Relativní lokalizace vůči vzorové cestě může stačit.</li>
<li>"Následuj člověka" a "vyhýbej se překážkám" jsou úkoly, které se navzájem vylučují. Člověk je taky překážka! Tady řešení zatím nevidím. Zkoušel jsem sledovanou osobu vymazávat z lokální mapy, ale jednak detekce vůdčí osoby není na tohle v tuto chvíli dostatečně spolehlivá a přesná a jednak do mě pak robot ochotně nabourá. Což se mi moc nelíbí. Související potíž je, když z mapy odmaže nejen mě, ale i zeď vedle mě, a nabourá do ní.</li>
<li>Když robot detekuje překážky (zatím) jen lidarem a z lidaru přestanou chodit data, je to špatné. Kdo by to byl řekl?</li>
</ul>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/elrob/2024/freyja_against_the_wall.jpg'><img src='/competitions/elrob/2024/freyja_against_the_wall_t.jpg' alt='Freyja najíždí na zeď' title='Freyja najíždí na zeď' class='border' width='640' height='480'/></a><br/>
<a href='/competitions/elrob/2024/freyja_against_the_wall.jpg'>Freyja najíždí na zeď</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231018"></a></div>
<h2>18. října 2023 - Achilova pata (zbývá 250 dní) [JI]</h2>
<div class='p'>Tak dlouho se s robotem jezdí, až se kolo utrhne. Kdo chce psa bít, hůl si vždycky najde. Těmito a dalšími úslovími neohlašuje pan Jiří příjezd tety Kateřiny, ale rozbitého robota. I nějaké to "já jsem ti to říkal" už si vyslechl.</div>
<div class='p'>O co jde? Freyja je robotická konstrukce typu <i>Na Programátora Dobré</i>. A občas je to znát. Mechanické uchycení v místě přenosu síly z motoru na kola je výzva. Na
<a href='/robots/kloubak/cs'>K2</a>, sestřence (nebo bratranci?) na <a href='/competitions/subtchallenge/cs'>SubT</a>, drží kola ve vysoustružených železných blocích. Robík (nebo to byl jeho následovník?) má ve stejném místě vyvrtaný a pečlivě seříznutý železný blok s velmi podobným výsledkem. Freyje drží kola 3D tisk. Úplně to slyším: "Cožééé?" Na svoji obhajobu: "Ja vím." Jednou se budu muset naučit, jak se v místním dialektu, <a href='https://als.wikipedia.org/wiki/Z%C3%BCrichdeutsch' class='external'>Züritüütsch</a>, řekne: "Potřeboval bych vysoustružit taký onaký bazmek".</div>
<div class='p'>Upřímně řečeno, po letošních zátěžových testech, kdy jsem nechal Freyju skákat přes kmeny, jsem už čekal, že to bude držet. Nebylo tomu tak. Při pokusu o smykovou otočku téměř na místě - <a href='/robots/freyja/cs'>další "Já jsem ti to říkal!"</a> - to luplo, kolo povolilo a ukroutil se kabel. "Naštěstí" vždycky - no jo, i předchozí zkušenost by byla - nejdřív povolí tenký kabel k hallovým senzorům, ODrive se lekne a zastaví.</div>
<div class='p'>Tým expertů povolaný na místo robotického neštěstí, tj. já, pak dospěl k závěru, že konstrukční tým, tj. já, mohl odvést lepší práci. Vytištěný díl je sice z karbonem posíleného PLA, což pomáhá, ale nechal jsem nastavený nízký infill a díl byl spíš prázdný než ne. Navíc tam pro verzi 2.0 zůstala z verze 1.0 díra na šroub, která už není potřeba. Podél ní to prasklo.</div>
<div class='p'>Züritüütsch pořád neovládám, takže Freyja obdržela tištěný díl verze 2.1. Bez nadbytečné díry na šroub, s větším infillem a s připevněným kusem hliníku v místě, kde to povolilo. Pro jistotu na všech čtyřech kolech. Freyja tak opět jezdí. Snad teď vydrží více.</div>
<hr/>
<div class='p'><a id="231203"></a></div>
<h2>3. prosince 2023 - Takhle ne? (zbývá 203 dní) [JI]</h2>
<div class='p'>Takhle to snad na ELROBu v červnu vypadat nebude:</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/competitions/elrob/2024/snow-freyja.jpg'><img src='/competitions/elrob/2024/snow-freyja_t.jpg' alt='Freyja ve sněhu' title='Freyja ve sněhu' class='border' width='400' height='300'/></a><br/>
<a href='/competitions/elrob/2024/snow-freyja.jpg'>Freyja ve sněhu</a>
</td></tr></table></div>
<div class='p'>Anebo ano?</div>
<ul>
<li>Voda ve vzduchu … pršet klidně může.</li>
<li>Sníh na zemi … to sice ne, ale bláto se může nabalovat dost podobně.</li>
<li>Vizuálně chudé prostředí … písečná plocha, betonová plocha, posekaná plocha, nedefinovaná cesta, to všechno nejspíš bude.</li>
</ul>
<div class='p'>Takže co jsme se s Freyjou naučili?</div>
<ul>
<li>Sníh ve vzduchu pro detekci překážek lidarem nevadí.</li>
<li>Nepořádek na kolech do nějaké míry nevadí, ale s bahnem to může být i horší.</li>
<li>Když už si Freyja sedne na břicho, nic ji nezachrání.</li>
<li>V robotovi zůstalo sucho.</li>
<li>Bacha na joystick padající při přenášení robota do závěje. Špatně se pak hledá.</li>
</ul>
<hr/>
<div class='p'><a id="240105"></a></div>
<h2>5. ledna 2024 - Neinvertibilní chování (zbývá 171 dní) [JI]</h2>
<div class='p'>Otázka: Jaký mám poslat Freyje řídící signál, aby zatáčela rychlostí 70 stupňů za sekundu? Odpověď: Freyja a zatáčet? To jako vážně?</div>
<div class='p'>Kontrolovaně zatočit smykem řízeného robota není nic snadného. Freyja není výjimkou. V roce 2005 jsme na tohle téma na jedné konferenci publikovali článek o řízení <a href='/robots/ester/cs'>pásového robota Ester</a> pomocí neuronových sítí.</div>
<div class='p'>Myšlenka byla vcelku přímočará:</div>
<ul>
<li>Budeme chvíli "náhodně" jezdit na joystick.</li>
<li>Z logu nasbíráme data <řízení, chování>. Aneb "když udělám X, stane se Y".</li>
<li>Data prohodím na <chování, řízení>. Aneb "aby se stalo Y, musím udělat X".</li>
<li>Natrénuji neuronovou síť modelující chování -> řízení.</li>
<li>Hotovo. Když potřebuji zatočit, zeptám se neuronové sítě, jaký mám poslat řídící signál.</li>
</ul>
<div class='p'>Jenže ono to takhle jednoduše nejde!</div>
<div class='p'>Pojďme si to nasimulovat na zjednodušeném, ale dostatečně realistickém problému. Nechť je náš systém lineární s nepřesnostmi / se šumem.</div>
<div class='p'>Nejdříve si vygenerujeme vzorová data:</div>
<pre>import numpy
N = 1000000
numpy.random.seed(42)
control = numpy.random.normal(scale=6, size=(N,))
behavior = 0.1 * control + numpy.random.normal(scale=2, size=control.shape)</pre>
<div class='p'>Tj. na řídící signál (<i>control</i>) náš simulovaný robot zatáčí (<i>behavior</i>) rychlostí odpovídající desetině řídícího signálu. Klidně si můžeme představovat, že zatáčení je v radiánech za sekundu. Shodou okolností je to, snad až na měřítko, rozumný zjednodušený model zatáčení Freyji. Zatáčení Freji závisí také na povrchu, aktuální dopředné a rotační rychlosti a pár dalších věcech. Ty náš zjednodušený model explicitně nezahrnuje. Spadají pod šum / nepřesnost.</div>
<div class='p'>A teď si pojďme "naučit" inverzní model (<i>control_model</i>). Máme lineární systém, lineární model by měl stačit. Pro jistotu vyrobíme i dopředný model chování (<i>behavior_model</i>).</div>
<pre>import scipy
behavior_model = scipy.stats.linregress(control, behavior)
control_model = scipy.stats.linregress(behavior, control)
print(behavior_model)
> LinregressResult(slope=0.100300724814567, intercept=-0.00048361981064025785,
rvalue=0.28784673170627245, pvalue=0.0, stderr=0.0003337044737230931,
intercept_stderr=0.0020026058962632327)</pre>
<div class='p'>To vypadá dobře. Model chování pochopil, že rychlost zatáčení je desetinou řídícího signálu a křivka prochází nulou.</div>
<div class='p'>Kdo si vsadí na <code>control_model.slope == 10</code>, tj. "opak" dopředného modelu chování? Já! Myšlenka je prostá: Když <code>behavior = 0.1 * control</code>, tak <code>control = 10 * behavior</code>, no ne?</div>
<pre>print(control_model)
> LinregressResult(slope=0.8260732024336218, intercept=-0.008403739321622323,
rvalue=0.28784673170627245, pvalue=0.0, stderr=0.00274837817757052,
intercept_stderr=0.005747146531042411)</pre>
<div class='p'>Uhh? Takže podle dopředného modelu chování když pošlu řídící signál 10.0, bude robot zatáčet 1 rad/s, ale podle modelu chování, aby robot zatáčel 1 rad/s, musím poslat řídící signál 0.8? To ale bude robot zatáčet jen 0.08 rad/s, tj. skoro vůbec! O co jde?</div>
<div class='p'>Prvně, není to nedostatkem trénovacích dat. Těch jsme si nasimulovali přehršel a scipy si je, podle <code>control_model.stderr</code>, svým výstupem jisté.</div>
<div class='p'>Zadruhé, není to tím, že bychom "špatně jezdili na joystick". Data jsou simulovaná, krásně normálně rozložená. Ale tady už přihořívá. Na rozložení dat záleží. A také záleží na tom, co který z těch lineárních modelů minimalizuje.</div>
<pre>import matplotlib.pyplot as plt
plt.xlabel('Control')
plt.ylabel('Behavior')
plt.plot(control[:500], behavior[:500], 'bo', label='Training data')
plt.plot(control[:1000], control[:1000] * behavior_model.slope + behavior_model.intercept,
'ro', label='Model chování: control -> behavior')
plt.plot(behavior[:1000] * control_model.slope + control_model.intercept, behavior[:1000],
'yo', label='Model řízení: behavior -> control')
plt.legend()
plt.show()</pre>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/competitions/elrob/2024/fig1.png'><img src='/competitions/elrob/2024/fig1_t.png' alt='' title='' class='border' width='400' height='269'/></a>
</td></tr></table></div>
<div class='p'>Zaprvé, vzorová data jsou hustší kolem nulového řídícího signálu. Na skutečném robotovi by to odpovídalo tomu, že robot jezdí převážně rovně.</div>
<div class='p'>Zadruhé, model chování minimalizuje čtverec rozdílu mezi očekávaným a pozorovaným chováním. Model řízení minimalizuje čtverec rozdílu mezi očekávaným řízením a skutečným řízením. První z těch dvou rozdílů se měří v ose Y, druhý v ose X! Všimněte si, že průměrná hodnota řídícího signálu, který způsobil rotaci 1 rad/s, je skutečně velmi blízká nule. Ty dva lineární modely mají rozdílné úkoly a není nejmenší důvod, aby model řízení byl inverzním k modelu chování.</div>
<div class='p'>Oba dva body dohromady znamenají, že data táhnou model řízení k nule.</div>
<div class='p'>A skutečně, pokud si "pohrajete" z rozložením vzorových dat - ta dvě <code>numpy.random.normal</code> volání - můžete v <code>control_model.slope</code> dostat poměrně široký rozsah hodnot.</div>
<div class='p'>Dokonce ani rovnoměrné rozložení řídícího signálu z omezeného intervalu místo normálního rozložení to nespraví.</div>
<div class='p'>Na skutečném robotovi pak ani nepřesnost v chování není symetricky normálně rozložená. Je pravděpodobnější, že robotovi se zatočit nepodaří, než že nepředvídaně začne prudce rotovat. To táhne i model chování k nule. Ale k nule na jiné ose než kam je tažen model řízení. Nůžky se rozevřou ještě víc.</div>
<div class='p'>Pokud jste teď zmatenější než na začátku, je to dobře. Aspoň při vlastních pokusech se strojovým učením, anebo i s jednoduššími aproximacemi, budete rozvážnější než my ohledně vlivu rozložení dat a vlivu chybové funkce na výsledek.</div>
<div class='p'>A pokud je vám to celé zřejmé, blahopřeji. Jste o osmnáct roků rychlejší než já. Upřímně, mám neodbytný pocit, že mi ještě nedochází všechny důsledky.</div>
<div class='p'>Takže co s tím? To snad radši nechám na jindy. Pokud nebude <a href='https://cs.wikipedia.org/wiki/Velk%C3%A1_Fermatova_v%C4%9Bta' class='external'>okraj této stránky příliš malý</a>.</div>
<div class='p'><details>
<summary><b>Komentáře (1)</b></summary>
<i>1/6/24, 12:44</i>
Ahoj Jirko a Martine,
dovolil bych si pár poznámek k Neinvertibilnímu chování. Předem se omlouvám.
Neuronové sítě mi moc neříkají, ale selský rozum (a trocha z teorie řízení, kterou si pamatuju ze školy)
mi říkají, že tudy cesta nevede.
To, o se tu snažíš je tzv. dopředné řízení, tj. když budu mít model chování
robota, tak inverzí najdu požadovanou akci pro získání kýženého výsledku.
Toto funguje, ale za zásadního předpokladu, že systém není ovlivňován dalšími
významnými vlivy (to co označuješ za šum/poruchu) - systém je prediktibilní.
I tento problém se dá kompenzovat, pokud jsem schopen tu poruchu nějak "změřit" (což v tomto
případě asi nepůjde - např. zjišťovat aktuální prokluz). Využívá se to třeba
u tzv. ekvitermí regulace. Měřím teplotu venku (porucha/šum) a na základě modelu
chování v reakci na poruchu řídím topení abych dosáhl požadované teploty uvnitř.
To funguje pokud se podmínky podobají stavu při němž byl sestaven model
(když bude např. -10 st. a bude pražit sluníčko, tak už to tak pěkně fungovat nebude,
ale tady to moc nevadí, protože dům má obrovskou setrvačnost).
To použití neuronky pro řízení otáčení mi přijde, jako bych chtěl řídit
vytápění podle obrazu z webkamery, kterou vystrčím z okna (= vyvěštím dle
obrázku venkovní teplotu a na základě té, budu topit).
Takže podle mě jediná šance je použít osvědčené zpětnovazební řízení, které
řídí na základě měření aktuálního stavu. Tj. stále měřím
aktuální rychlost otáčení (gyroskop) a porovnávám s požadavkem, rozdíl zpracuji
"nějakým" regulátorem. Toto bude zaručeně fungovat, i když seřízení toho
regulátoru nebude úplně triviální, protože poruchy, resp. rychlosti jejich změn
jsou zde obrovské.
Martin
PS. Docela mě láká to zkusit.
</details></div>
<hr/>
<div class='p'><a id="240109"></a></div>
<h2>9. ledna 2024 - Svítí, nesvítí, svítí, nesvítí … (zbývá 167 dní) [JI]</h2>
<div class='p'>Dnes něco pro odlehčení.</div>
<div class='p'>Pravidla Elrobu vyžadují, aby byl každý robot vybaven oranžovým majáčkem. Dostupné oranžové majáčky jsou buď pro stavby, nebo pro náklaďáky. Na malého robota se vejdou jen těžko.</div>
<div class='p'>Ale takové hipsterské supersvítívé blikačky na kolo to jistí!</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/competitions/elrob/2024/freyja_lights_medium.gif' alt='Freyja s majáčky' title='Freyja s majáčky' class='border' width='640' height='360'/></span><br/>
<span>Freyja s majáčky</span>
</td></tr></table></div>
<hr/>
<div class='p'><a id="240311"></a></div>
<h2>11. března 2024 - Půlhodina (zbývá 105 dní) [JI]</h2>
<div class='p'>Robotika je aktivita pro trpělivé. Anebo pro blázny. Když sebou robot po patnácti letech práce někde zase práskne, je mi z toho smutno.</div>
<div class='p'>Teď se mi ale poštěstilo zajímavé pozorování. Potřeboval jsem promazat logy a uvolnit místo na disku. Tak jsem se díval, které ELROB logy chci nechat a které ne. Na konci července se robot nerozjel. Na konci srpna se rozjel, ale na špatnou stranu. Včera jezdil 29.5 minuty a najezdil 1720 metrů. A pak zaparkoval pod dodávku, no. Pokrok to je, ne?</div>
<div class='p'>29.5 minuty je dostatečně blízko půlhodinovému limitu v Elrobu, abych cítil nějaké to uspokojení. Výmluva pro dodávku je, že řešení asi existuje. Taková dodávka totiž robota trápí výškou svého podvozku. Freyja lidarem vidí spodem a jediná viditelná překážka jsou kola, kdesi daleko. Dobrá zpráva je, že na Freyje jsou i čtyři stereo kamery. Jedna z nich překážku detekovala. Detekce z kamer "akorát" zatím ignoruji, protože s bočními malými kamerami zatím spokojený nejsem. Lezou z nich časté falešné poplachy. V zájmu ochrany dodávek v blízkém okolí bych měl asi začít používat přední a zadní kameru. Ty jsou OK. Ony i ty boční po překalibrování a při konzervativnějším nastavení začínají vypadat lépe.</div>
<div class='p'>Co tedy posunulo Freyju ke světlejším zítřkům? Nechal jsem si poradit od MartinaL. PavelS potvrdil, že dělá něco podobného. Přidal jsem jednu zpětnovazební smyčku pro řízení zatáčení. V původním řešení konzumovalo kompas a gyroskop vysokoúrovňové řízení, které vyprodukovalo požadovanou dopřednou a rotační rychlost. Ty jsem transformoval na požadovanou rychlost kole na levé a na pravé straně, které by, podle jednoduchého matematického modelu (inverze k odometrii), měly vést k žádoucímu efektu. Kontroléry motorů vlevo a vpravo pak s pomocí PI řízení dbaly na to, aby se kola točila správnými rychlostmi. Bohužel toto vede ke správné rychlosti a k několikanásobně podhodnocenému zatáčení.</div>
<div class='p'>Nové řešení ruší onen model a rozklad na levou a pravou rychlost. Přidává střední úroveň PID řízeni se zpětnou vazbou z gyroskopu a z enkodérů, resp. hallovek. Pokud robot nezatáčí dost rychle, víc zabere. Nízká úroveň řízení rychlosti jednotlivých kol zůstává. A je to. Robot je teď mnohem hbitější.</div>
<div class='p'>Jenom jsem se nenechal od MartinaL přesvědčit, že k tomu potřebuji mikrokontrolér. Real-time priorita procesů na PC a komunikace po USB vedou k tomu, že i z PC tu novou smyčku zvládnu dostatečně pravidelně na 100 Hz, aniž by se počítač zadýchal. To mi stačí.</div>
<div class='p'>Tím je vyřešená jedna ze dvou motivací - ta veřejná - pro nedávnou dlouhou úvahu na téma dopředného a zpětného modelování. Druhá motivace vydá na samostatný konferenční článek, takže ji nechám na jindy.</div>
<div class='p'>Hbitější robot odhalil chybu v novém experimentálním vyhýbání se překážkám. Nějak si nemůžu vzpomenout, proč jsem nepoužil starší, funkční řešení. Asi jsem měl chytrý nápad :-/ Něčím se bavit musím <span class='wink'></span> Každopádně chybu jsem opravil a to taky hodně pomohlo.</div>
<div class='p'>Jo, a ve vysokoúrovňovém plánování trajektorie taky byla bota jak vrata. Ono to mělo důvod, když jsem před Vánocemi 2022 říkal, že rok a půl do ELROBu 2024 bude s odřenýma ušima tak akorát.</div>
<div class='p'>A co dál? Druhý důvod Freyjiny výpravy pod dodávku byl, že se po té půlhodině ztratila. Pro mě překvapivě věděla správně svoji pozici, ale byla o šedesát stupňů ztracená v orientaci, takže zamířila špatným směrem. Chápu, že dva palubní GPS kompasy nemají vždycky dostatečný signál, ale CMPS14 kombinující magnetometr a gyro (BNO080) by se takhle ztratit neměl, ne? Až na to, že to dělá. Nejen mě. Zdravím PavlaJ! Na netu jsem se dočetl, že je velmi citlivý na své umístění. Takže dneska ho stěhuji. Kompas. Ne Pavla.</div>
<hr/>
<div class='p'>Pokud máte nějaké doplňující informace či komentáře
<a href='/competitions/elrob/2024/cs#email'>napište nám</a>.</div>
VanJee Lidarhttps://robotika.cz/articles/vanjee-lidar/cs2023-11-03T00:00:00ZMartin Dlouhý, Jiří Iša
WLR-719C je 4-paprskový lidar od čínské firmy <b>VanJee</b>. Jedná se venkovní variantu používanou u donáškových robotů.
Lidar je otočný a pokrýva celých 360 stupňů. Cenově je do 1000 USD.
<b>Blog update:</b> 10/3/2024 — <a href='/articles/vanjee-lidar/cs#240310'>Zapojení a WAGO spojky</a>
<h2>VanJee Lidar WLR-719C</h2>
<ul>
<li><a href='https://www.vanjee.net/vanjee_products/196228.html' class='external'>VanJee Lidar WLR-719C</a></li>
</ul>
<h2>Obsah</h2>
<ul>
<li><a href='/articles/vanjee-lidar/cs#231103'>231103 - Vánoce v listopadu</a></li>
<li><a href='/articles/vanjee-lidar/cs#231104'>231104 - První data?</a></li>
<li><a href='/articles/vanjee-lidar/cs#231105'>231105 - Parsování dat</a></li>
<li><a href='/articles/vanjee-lidar/cs#231106'>231106 - Lidarview</a></li>
<li><a href='/articles/vanjee-lidar/cs#240310'>240310 - Zapojení a WAGO spojky</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog</h1>
<div class='p'><a id="231103"></a></div>
<h2>3. listopadu 2023 — Vánoce v listopadu</h2>
<div class='p'>Dnes dorazil FedEx balíček. Chvíli jsem u sebe neměl telefón a málem to Santa vzdal … prý že adresa neni v Google maps, tak jako by nebyla. Teď jsem to zkoušel
a už chápu … ono to neřekne, že přesnou adresu to nenalezlo, ale ukáže to úplně jinam. No nic, paní řidička byla ochotna se zase vrátit a balíček (cca 20x20x20cm)
mi předala. Co je uvnitř? Dva všesměrové lidary <a href='https://www.vanjee.net/vanjee_products/196228.html' class='external'>WLR-719C</a>.</div>
<div class='p'>Na první pohled dost připomínají TiM lidary od německé firmy SICK, ale tady by měly pokrýt všech 360 stupňů a hlavně detekovat překážky/díry ve čtyřech směrech:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/vanjee-lidar/lidar-params.png'><img src='/articles/vanjee-lidar/lidar-params_t.png' alt='základní parametry lidaru' title='základní parametry lidaru' class='border' width='640' height='279'/></a><br/>
<a href='/articles/vanjee-lidar/lidar-params.png'>základní parametry lidaru</a>
</td></tr></table></div>
<div class='p'>Koukám, že už je to rok, co Jirka posílal takové <a href='https://www.youtube.com/watch?v=uOpzEVw-DOY&ab_channel=JiriIsa' class='external'>šílené video</a> …</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/vanjee-lidar/vanjee-box.jpg'><img src='/articles/vanjee-lidar/vanjee-box_t.jpg' alt='krabice' title='krabice' class='border' width='320' height='180'/></a><br/>
<a href='/articles/vanjee-lidar/vanjee-box.jpg'>krabice</a>
</td></tr></table>
<table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/vanjee-lidar/unboxing.jpg'><img src='/articles/vanjee-lidar/unboxing_t.jpg' alt='obsah krabice' title='obsah krabice' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/vanjee-lidar/unboxing.jpg'>obsah krabice</a>
</td></tr></table>
<table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/vanjee-lidar/lidar.jpg'><img src='/articles/vanjee-lidar/lidar_t.jpg' alt='VanJee Lidar' title='VanJee Lidar' class='border' width='320' height='180'/></a><br/>
<a href='/articles/vanjee-lidar/lidar.jpg'>VanJee Lidar</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231104"></a></div>
<h2>4. listopadu 2023 — První data?</h2>
<div class='p'>Mno, včera jsem to ani nezapnul. Jako mohl jsem si to nastudovat dříve a trošku se připravit … prostě ten lidar je spíše na 24V a já tady mám tak leda 12V baterku
z traktůrku. Ono sice píšou <i>operating voltage is 12-28V DC</i>, ale ještě v té samé větě je <i>nominal operating voltage is 24V DC, nominal operating current is 0.25A,
nominal power is 6W</i>. Asi není úplně ideální začínat na hranici povoleného rozmezí, ale … když tu baterku více nabiju, tak bude mít třeba 14V a rozjede se to?</div>
<div class='p'>Hmm, tak zas úplně triviální to není. Nastavil jsem pevnou IP adresu, abych si po Ethernetu mohl povídat s <b>192.168.0.2</b> (default). Dobrá zpráva je:</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=255 time=0.384 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=255 time=0.418 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=255 time=0.408 ms</pre>
<div class='p'>Také krabička po chvíli od připojení na baterku začala „vrnět”, tj. snad úplně cihla to není.</div>
<div class='p'>No není nad „přítele na telefonu”. <span class='smile'></span> … <i>Posli
'\xFF\xAA\x00\x1E\x00\x00\x00\x00\x00\x00\x01\x01\x19\x0C\x00\x00\x00\x00\x00
\x00\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\x00\x0D\xEE\xEE'
UDP packet na port 6050 a cti, co ti prijde zpatky. O parsovani te ale preci ochudit nemuzu!</i></div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.record -duration 10
config/test-vanjee-lidar.json -note "port 6050, trigger from Jirka, in run()"
2023-11-04 19:29:25,123 root WARNING Environment variable OSGAR_LOGS is not set - using working directory
2023-11-04 19:29:25,124 __main__ INFO /home/md/git/osgar/test-vanjee-lidar-231104_182925.log
2023-11-04 19:29:25,144 __main__ INFO SIGINT handler installed
2023-11-04 19:29:35,176 __main__ ERROR vanjee_udp: maximum delay of 0:00:10.031742 at 0:00:10.052223
(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.logger /home/md/git/osgar/test-vanjee-lidar-231104_182925.log
k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>—
0 sys 130460 | 1591 | 158.3Hz
1 vanjee.raw 36 | 1 | 0.1Hz
2 vanjee.xyz 0 | 0 | 0.0Hz
3 vanjee.scan 0 | 0 | 0.0Hz
4 vanjee_udp.raw 2198431 | 1586 | 157.8Hz
Total time 0:00:10.052477</pre>
<div class='p'>Za mne dobrý! Myslím, že můžu v klidu vypnout počítač (v sobotu mám typicky „odvykačku” <span class='wink'></span>) … co ty pakety obsahují tedy až zítra.</div>
<div class='p'>p.s. pokud by někoho zajímaly detaily, tak viz <a href='https://github.com/robotika/osgar/compare/feature/vanjee-lidar' class='external'>https://github.com/robotika/osgar/compare/feature/vanjee-lidar</a></div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/vanjee-lidar/first-test.jpg'><img src='/articles/vanjee-lidar/first-test_t.jpg' alt='první test' title='první test' class='border' width='320' height='180'/></a><br/>
<a href='/articles/vanjee-lidar/first-test.jpg'>první test</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231105"></a></div>
<h2>5. listopadu 2023 — Parsování dat</h2>
<div class='p'>Tak jo, venku je tma, tak hurá na bitíky … Upravil jsem původní callback z</div>
<pre>def on_raw(self, data):
pass</pre>
<div class='p'>na</div>
<pre>def on_raw(self, data):
assert len(data) == 0, len(data)</pre>
<div class='p'>a pak pustil přehrávání logu:</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.replay -module vanjee
test-vanjee-lidar-231104_182925.log
original args: b"['/home/md/git/osgar/osgar/record.py', '-duration', '10', 'config/test-vanjee-lidar.json',
'-note', 'port 6050, trigger from Jirka, in run()']"
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 24, in run
self.update()
File "/home/md/git/osgar/osgar/node.py", line 36, in update
handler(data)
File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 17, in on_raw
assert len(data) == 0, len(data)
AssertionError: 34
maximum delay: 0:00:00</pre>
<div class='p'>… což takto malý paket jsem opravdu nečekal. Asi je to odpověď na ten <i>magic packet</i>?</div>
<div class='p'>Tak znova <i>replay</i> a změna očekávané hodnoty na 34:</div>
<pre>File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 17, in on_raw
assert len(data) == 34, len(data)
AssertionError: 1384</pre>
<div class='p'>… to už vypadá spíše jako <i>point cloud data</i>. <span class='smile'></span></div>
<div class='p'>OK, tak teď už na</div>
<pre>assert len(data) in [34, 1384], len(data)</pre>
<div class='p'>projde celá 10s nahrávka ze včerejška. <i>The effective length of the WLR-719C data packet is 1380 bytes</i> … hmm, skoro.</div>
<pre>File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 20, in on_raw
assert data[:2] == b'\xFF\xAB', data[:2].hex()
AssertionError: ffaa</pre>
<div class='p'>tj. na začátku je SoF, <i>Start of frame</i> (to FFAB jsem tam dal úmyslně, aby to selhalo a vypsalo to očekávane FFAA)</div>
<pre>length = struct.unpack_from('<H', data, 2)
assert length == 42, length
…
File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 22, in on_raw
assert length == 42, length
AssertionError: (25605,)</pre>
<div class='p'>hmm, nečekané, tj. obrácený endians?</div>
<pre>length = struct.unpack_from('>H', data, 2)
assert length == 42, length
…
File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 22, in on_raw
assert length == 42, length
AssertionError: (1380,)</pre>
<div class='p'>… lepší, jen jsem zapomněl si vzít 0tý prvek a ta délka tedy snad už odpovídá tomu <i>the effective length</i>.</div>
<pre>frame = struct.unpack_from('>H', data, 4)[0]</pre>
<div class='p'>… to už pěkně jede od 1 dále.</div>
<pre>assert data[6:10] == bytes.fromhex('00000000'), data[6:10].hex()
…
File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 24, in on_raw
assert data[6:10] == bytes.fromhex('00000000'), data[6:10].hex()
AssertionError: 000007f9</pre>
<div class='p'>… tak to už očekávané není. Vycházím z PDFka stažitelného v
<a href='https://www.vanjee.net/repository/portal-local/ngc202208190002/cms/file/f5300115-68ac-4a8b-88d0-8badbd762910.pdf' class='external'>download sekci výrobce</a>.
A pro případ, že by to zmizelo, tak zde je očekávaný začátek paketu:
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/vanjee-lidar/packet.png'><img src='/articles/vanjee-lidar/packet_t.png' alt='úvodní část paketu' title='úvodní část paketu' class='border' width='640' height='568'/></a><br/>
<a href='/articles/vanjee-lidar/packet.png'>úvodní část paketu</a>
</td></tr></table></div>
<div class='p'>… prostě rezervovaná data jsou jiná, což si nemůžeme moc stěžovat … od toho jsou rezervovaná. A mění se:</div>
<pre>assert data[6:10] == bytes.fromhex('000007f9'), data[6:10].hex()
AssertionError: 000007fa</pre>
<div class='p'>Další bajty …</div>
<pre>assert data[11:14] == bytes.fromhex('02 000C'), data[11:14].hex()
AssertionError: 02190c</pre>
<div class='p'>… jako s assertama na real-time robotovi je „trošku” problém, ale zatím mi to přijde jako nejrychlejší způsob porovnání
co říká dokumentace a co leze ze zařízení. Tj. asi nějaký nový <i>device type</i>?</div>
<pre>bank, motor_speed = struct.unpack_from('>BH', data, 18)
assert 1 <= bank <= 16, bank
assert 38000 <= motor_speed <= 39300, motor_speed</pre>
<div class='p'>… banky, jak slibovali (ne že bych tušil co že to je) a rychlosti motoru jsou proměnné — časem asi budu muset zvednout, resp. assert zrušit.</div>
<div class='p'>Ještě tam nejsme, ale blíží se to …
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/vanjee-lidar/packet-end.png'><img src='/articles/vanjee-lidar/packet-end_t.png' alt='druhá část paketu' title='druhá část paketu' class='border' width='640' height='393'/></a><br/>
<a href='/articles/vanjee-lidar/packet-end.png'>druhá část paketu</a>
</td></tr></table></div>
<div class='p'>Už to taková zábava není … asi chápu Jirku, že preferuje, když dokumentace je generovaná stejně tak s parsery pro všechny možné
programovací jazyky. No nic, ověřil jsem ještě EEEE na konci a teď je na čase se zakousnout do té největší časti (jj, checksum by to asi také
chělo ověřit). NTP bych si nechal někdy na jindy.</div>
<div class='p'>1350 bajtů co má nést informaci o 450 bodech = 3 bajty na bod.
<i>10 circles/second; 7200 points/circle; Scanning data -10°, -5°, 0°, 0.3° in sequence; 24 bytes per point, 1-byte reserved +
7-byte intensity + 16-byte distance.</i> … to zní opravdu drsně. Tak alespoň sedí, že 450 bodů krát 16 bank je těch 7200 bodu na otočku.</div>
<div class='p'><i>... every 3 bytes corresponds to a single point cloud information. It outputs point cloud data at
-10°, -5°, 0° and 0.3° in cycle, where the lower 7 bits of the first byte represent the intensity value, and
the last two bytes represent the distance</i> … aha, tak oni si také pletou bity a bajty, fajn. Tj. nikoliv 24 bajtů, ale pouze 24 bitu = 3 bajty
a rezervovaný je jen jeden bit u intenzity.</div>
<pre>points = struct.unpack_from('>' + 'BH' * 450, data, 21)
assert 0, points[:20]
…
File "/home/md/git/osgar/osgar/drivers/vanjee.py", line 35, in on_raw
assert 0, points[:20]
AssertionError: (4, 808, 16, 980, 10, 0, 4, 111, 0, 0, 17, 976, 0, 0, 16, 0, 0, 0, 17, 971)</pre>
<div class='p'>… jako není to obrázek v lidarview, co jsem měl původně v plánu, ale timeout 2 hodiny právě nastal a asi bych si dal večeři a pokračování
zítra (??? … ono je to pracovní den a večer je <a href='https://triagechallenge.darpa.mil/' class='external'>DARPA DTC kick-off</a>, takže tomu dávám jen 30%).</div>
<hr/>
<div class='p'><a id="231106"></a></div>
<h2>6. listopadu 2023 — Lidarview</h2>
<div class='p'>Dnes jenom rychlovka. Ty banky 1 až 16 vypadají jako pouze rozdělení velkého scanu na bloky, tj. je třeba je slepit dohromady a pak pracovat
s celým scanem. Trošku mne zmátlo, že to „řežou v půlce” — ty body jdou za sebou podle jednotlivých vrstev pro -10, -5, 0 a +0.3 stupně.
Prostě 450 úplně není dělitelné 4 (vrstvami). Slepené je to OK.</div>
<div class='p'>Když teď Jakub nově oprášil <a href='https://github.com/robotika/osgar/blob/master/osgar/drivers/replay.py' class='external'>OSGAR driver replay</a>, který simuluje
v běžícím systému data z původní nahrávky, tak jsem mohl i doplnit <b>vanjee.scan</b>, který na začátku implementován nebyl. <span class='smile'></span></div>
<pre>{
"version": 2,
"robot": {
"modules": {
"vanjee": {
"driver": "vanjee",
"in": ["raw"],
"out": ["raw", "scan"],
"init": {}
},
"vanjee_udp": {
"driver": "replay",
"in": ["raw"],
"out": ["raw"],
"init": {
"filename": "/home/md/git/osgar/test-vanjee-lidar-231104_182925.log",
"pins": {"vanjee_udp.raw": "raw"}
}
}
},
"links": [["vanjee_udp.raw", "vanjee.raw"],
["vanjee.raw", "vanjee_udp.raw"]
]
}
}</pre>
<div class='p'>A když jsem restartoval celý počítač, abych si zase mohl pustit <b>lidarview</b>, tak jsem dostal:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/vanjee-lidar/lidarview-scan.jpg'><img src='/articles/vanjee-lidar/lidarview-scan_t.jpg' alt='Lidarview 360deg scan' title='Lidarview 360deg scan' class='border' width='640' height='360'/></a><br/>
<a href='/articles/vanjee-lidar/lidarview-scan.jpg'>Lidarview 360deg scan</a>
</td></tr></table></div>
<div class='p'>p.s. to restartování mne hrozně irituje, ale vždy mi nějakou dobu trvá si vzpomenout, co že je to za problém :-(</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/osgar$ python -m osgar.tools.lidarview
/home/md/git/osgar/test-replay-vanjee-lidar-231106_100810.log –lidar vanjee.scan
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 152 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)
Value in failed request: 0x0
Serial number of failed request: 91
Current serial number in output stream: 92</pre>
<hr/>
<div class='p'><a id="240310"></a></div>
<h2>10. březen 2024 — Zapojení a WAGO spojky</h2>
<div class='p'>Číňan měl pravdu, že jsem s „VanJee blogem” moc nepostoupil. To ale neznamená, že jsem si s lidarem vůbec nehrál!
Nějaký čas jsem s ním jezdil na robotu Eduro a zkoušel ICP (viz <a href='/guide/scan-matching/cs'>průvodce scan matching</a>).
Pak se ale ukázalo, že pro dostatečné vykrytí prostoru před robotem stejně potřebuji zapojit kameru a tak se pozornost
přesunula na <a href='/articles/oak-d-pro/cs'>OAK-D Pro</a>. Včera jsem lidar konečně přidělal na <a href='/robots/pat-a-mat/cs'>Pata</a>
a dnes se snažil narychlo nasbírat nějaká data venku:</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/vanjee-lidar/vanjee-on-pat.jpg'><img src='/articles/vanjee-lidar/vanjee-on-pat_t.jpg' alt='VanJee lidar na Patovi' title='VanJee lidar na Patovi' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/vanjee-lidar/vanjee-on-pat.jpg'>VanJee lidar na Patovi</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/vanjee-lidar/vanjee-on-pat-side.jpg'><img src='/articles/vanjee-lidar/vanjee-on-pat-side_t.jpg' alt='pohled z boku' title='pohled z boku' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/vanjee-lidar/vanjee-on-pat-side.jpg'>pohled z boku</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 226px;'><tr><td>
<a href='/articles/vanjee-lidar/wago.jpg'><img src='/articles/vanjee-lidar/wago_t.jpg' alt='WAGO spojky' title='WAGO spojky' class='border' width='220' height='124'/></a><br/>
<a href='/articles/vanjee-lidar/wago.jpg'>WAGO spojky</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>Už jsem za tu dobu zapomněl, co je ten žlutý kabel, tak pro příště vytrhávám z dokumentace:</div>
<div class='p'><table class='image_panel center' style='width: 270px;'><tr><td>
<a href='/articles/vanjee-lidar/cables.jpg'><img src='/articles/vanjee-lidar/cables_t.jpg' alt='kabely' title='kabely' class='border' width='264' height='327'/></a><br/>
<a href='/articles/vanjee-lidar/cables.jpg'>kabely</a>
</td></tr></table></div>
<ul>
<li><i>Negative pole of the power supply is black (wire 1)</i></li>
<li><i>Positive pole of the power supply is red (wire 2)</i></li>
<li><i>Chassis ground is yellow (wire 3)</i></li>
</ul>
<div class='p'>Toto byla také moje první zkušenost s <a href='https://www.conrad.cz/cs/p/wago-221-221-413-1-kabelova-svorka-pin-3-450-v-32-a-1-ks-1188437.html' class='external'>WAGO spojkami</a>.
Ostatní je používají, tak jen varování, že jsou dva druhy — WAGO 2273 - na tuhé dráty (ty nechcete) a dále <b>WAGO 221</b>, které jednoduše zaklapnete.
Pokud si chcete dělat elektriku, tak jsem při tom narazil na celkem koukatelné video:
<a href='https://www.youtube.com/watch?v=dIWvuAAFBds&ab_channel=DominikShaim' class='external'>Základní práce s Wago svorkami, kontrolní otvory bez rozebrání a tipy (Elektrika pro začátečníky)</a></div>
<div class='p'>A jak vypadají dnešní data? No nijak, protože když jsem zapojil Ethernetový kabel lidaru, tak jsem ztratil wifinu. Ano, je to mým nastavením na počítači,
ale dohledávat skript na změnu IP od Jirky nebyl čas. :-( Tak snad příští týden bude už <i>datová sada</i> kompletní.</div>
<hr/>
<div class='p'><a href='/articles/vanjee-lidar/cs#email'>kontaktní formulář</a></div>
DARPA Triage Challengehttps://robotika.cz/competitions/dtc/cs2023-10-13T00:00:00ZMartin Dlouhý
DARPA přišla s novou „výzvou”/soutěží: <b>DARPA Triage Challenge</b>. <i>Triage</i> znamená třídění raněných
u hromadných neštěstí, přírodních katastrof nebo na bojišti. V zásadě jde o to, že podle úrovně zranění
šance na přežití rychle klesá. Mluvíme o zhruba o prvních 15 minutách. Naděje, že v tomto čase bude dostatek kvalifikovaných
doktorů je mizivá. Tak nastupují roboti a AI. <b>Update:</b> 6/3/2024 —
<a href='/competitions/dtc/cs#240306'>Event Qualification 3/5 - 4/5</a>
<ul>
<li><a href='https://triagechallenge.darpa.mil/' class='external'>https://triagechallenge.darpa.mil/</a> — oficiální stránky soutěže</li>
</ul>
<div class='p'><i>DARPA Triage Challenge</i> má podobný časový rozvrh jako již ukončená <a href='/competitions/subtchallenge/cs'>SubT Challenge</a>.
Soutěž bude trvat 3 roky, jsou tři základní kategorie (<i>Primary System</i>, <i>Primary Virtual</i> a <i>Secondary Data</i>) a účastníci
jsou jak DARPA sponzorované týmy, tak <i>self-funded</i> týmy.</div>
<div class='p'><table class='image_panel center' style='width: 161px;'><tr><td>
<a href='https://triagechallenge.darpa.mil/'><img src='/competitions/dtc/dtc-logo.png' alt='' title='' class='border' width='155' height='59'/></a><br/>
<a href='https://triagechallenge.darpa.mil/'></a>
</td></tr></table></div>
<hr/>
<h2>Obsah</h2>
<ul>
<li><a href='/competitions/dtc/cs#231013'>231013 - Tým Robotika se úspěšně kvalifikoval do Virtual Challenge</a></li>
<li><a href='/competitions/dtc/cs#231109'>231109 - Challenge Kick-Off</a></li>
<li><a href='/competitions/dtc/cs#231114'>231114 - Pravidla ver1</a></li>
<li><a href='/competitions/dtc/cs#231121'>231121 - Triage Promo Video</a></li>
<li><a href='/competitions/dtc/cs#231207'>231207 - Virtual Competition dataset</a></li>
<li><a href='/competitions/dtc/cs#240124'>240124 - Oficiální vyhlášení soutěžících týmů</a></li>
<li><a href='/competitions/dtc/cs#240306'>240306 - Event Qualification 3/5 - 4/5</a></li>
</ul>
<hr/>
<h1>Blog</h1>
<hr/>
<div class='p'><a id="231013"></a></div>
<h2>13. října 2023 — Tým Robotika se úspěšně kvalifikoval do Virtual Challenge</h2>
<div class='p'>Už je to tu zase. <span class='wink'></span> Tentokrát v tom nejedu já, ale hlavní „hybatel” je František Brabec (viz např. jeho úspěchy v
<a href='/competitions/space-robotics-challenge/cs'>NASA Space Robotics Challenge 2</a>). Tým je česko-americký a doktorsko-programátorský.
Jelikož roboti tady mají hrát až druhé housle, a komplikací s převážením robotů přes Atlantik jsme si užili až dost,
zvolil Franta <i>jenom</i> <a href='https://triagechallenge.darpa.mil/virtual-competition' class='external'>virtuální kategorii</a>
(+ Data Challenge). Kvalifikace do virtuální proběhla bez problémů (asi i pomohl
odkaz na SRC2 a SubT).</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/dtc/triage-track-c.jpg'><img src='/competitions/dtc/triage-track-c_t.jpg' alt='Triage Virtual Challenge (zdroj DARPA)' title='Triage Virtual Challenge (zdroj DARPA)' class='border' width='640' height='400'/></a><br/>
<a href='/competitions/dtc/triage-track-c.jpg'>Triage Virtual Challenge (zdroj DARPA)</a>
</td></tr></table></div>
<div class='p'><a href='https://triagechallenge.darpa.mil/data-competition' class='external'>Data Challenge</a> je zatím stále ve fázi přihlášky —
po vyplnění přihlašovacího formuláře dostanete „domácí úkol”. Jedná se o
data více jak 3000 měřených osob a máte je co nejlépe zařadit do věkových kategorií. Uvidíme, kostky jsou již vrženy.</div>
<hr/>
<div class='p'><a id="231109"></a></div>
<h2>9. listopadu 2023 — Challenge Kick-Off</h2>
<div class='p'>Tento týden byla oficiálně zahájena <a href='https://triagechallenge.darpa.mil/' class='external'>DARPA Triage Challenge</a> dvoudenním „kick-off meetingem”
Pokud by někoho zajímaly detaily, tak jsou k dispozici <a href='https://triagechallenge.darpa.mil/resources' class='external'>prezentace v DTC resources</a>
sekci. Pokud by jste ale hledali pravidla soutěže, tak ty jsou zatím <i>Coming Soon</i> … mimochodem, pokud jste stránky navštívili
třeba předevčírem, tak dnes mají úplně jiný vzhled.</div>
<div class='p'>Zákládní rámec je stále stejný: <b>Primary Challenge</b> je o lokalizaci raněných a rychlé klasifikaci závažnosti zranění. Nově přibyly podrobnosti
co se má zjišťovat - zda osoba dýchá, zda mrká, jestli nekrvácí, stupeň popálení, jestli má všechny končetiny atd. Každý rok bude týdenní soustředění,
kde raněné budou hrát jak skutečné osoby, tak figuríny. <i>Primary Challenge</i> se dělí na <i>System</i> a <i>Virtual</i>, podobně jako bylo u <a href='/competitions/subtchallenge/cs'>SubT Challenge</a>,
ale s tím rozdílem, že <i>Virtual</i> DARPA nesponzoruje. Co mi přišlo drsné bylo, že ve virtuálu chtějí modelovat situace, které by v realitě už byly
mimo DARPA možnosti.</div>
<div class='p'><b>Secondary Challenge</b> nebo také <b>Data Challenge</b> je o následné péči a sledování pacienta. Zatímco v <i>Primary Challenge</i> se roboti (typicky drony)
nesmí k raněným přiblížit více jak metr (asi aby jim v rámci testování ještě více neublížili), tak v <i>Secondary Challenge</i> jsou osoby naopak na přístroje
napojeny a „sbírají data”. Úkolem je průběžně vyhodnocovat co se pravděpodobně stane následující 4 hodiny. Jedná se o potenciálně netriviální množství
dat a v reálném (resp. omezeném) čase je třeba situaci vyhodnotit. Toto vše v několika časových úsecích, tj. algoritmus postupně dostavá více a více dat.
Kdo nejlépe odhadne budoucnost vyhrál.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/dtc/data-scoring.jpg'><img src='/competitions/dtc/data-scoring_t.jpg' alt='vyhodnocení odpovědí v Data Challenge' title='vyhodnocení odpovědí v Data Challenge' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/dtc/data-scoring.jpg'>vyhodnocení odpovědí v Data Challenge</a>
</td></tr></table>
Převzato z <a href='https://triagechallenge.darpa.mil/docs/Day1/APL-20231016_Metrics_Phase1_KO-Distar%20approved_final.pptx' class='external'>APL-20231016_Metrics_Phase1_KO-Distar approved_final.pptx</a>.</div>
<div class='p'>Franta (šéf <i>Robotika International</i> týmu) celkem racionálně vyhodnotil, že reální roboti jsou mimo naše současné možnosti (a to jsme ani nevěděli o
nutnosti mít pilotní zkoušky v USA a pořádné pojištění), takže nás registroval na <i>Primary Virtual</i> a <i>Data</i>. První registrace prošla celkem snadno —
jednak to bude „strašné maso” (tj. se tam asi týmy moc nehrnou) a dále za sebou máme nějaké úspěchy v <a href='/competitions/subtchallenge/cs'>SubT</a> a
<a href='/competitions/space-robotics-challenge/cs'>NASA SRC2</a>. Tuto informaci jsem nakonec nezveřejnil, protože nebyla <i>DARPA oficiální</i>. To se ale po <i>kick-off</i>
změnilo, viz <a href='https://www.darpa.mil/news-events/2023-11-07' class='external'>https://www.darpa.mil/news-events/2023-11-07</a>. Tady mi přišlo vtipné to, že jsem si toho při prvním čtení ani nevšiml - koukal jsem, že bývaly BARC
tým získal grant a stejně tak např. <a href='https://www.kitware.com/kitware-secures-11-5m-multi-year-darpa-contract-to-teach-ai-how-to-make-difficult-decisions-aligned-with-humans/' class='external'>Kitware</a>
… <i>Kitware Secures $11.5M, Multi-Year DARPA Contract to Teach AI How to Make Difficult Decisions Aligned with Humans</i> … jj, nějaké drobné …
i když to je asi nějaký jiný DARPA program ale nejspíše s nenulovým přesahem.</div>
<div class='p'>Ještě poznámka, že na <i>Data Challenge</i>, která je kombinovaná se sponzorovanými týmy, je výběr komplikovanější a zatím jsme neuspěli, resp. je to stále
v procesu (mimochodem datum konce kvalifikace týmů posunuli na 27. listopadu 2023).</div>
<h3>Primary Challenge - Virtual</h3>
<div class='p'>Pro první rok <i>Primary Virtual</i> se očekává relativně statická scéna jako je např. vlakové neštěstí:
<table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/dtc/unreal-derailment-scenario.jpg'><img src='/competitions/dtc/unreal-derailment-scenario_t.jpg' alt='vykolejení vlaku' title='vykolejení vlaku' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/dtc/unreal-derailment-scenario.jpg'>vykolejení vlaku</a>
</td></tr></table>
Foto převzato z veřejně dostupné prezentace <a href='https://triagechallenge.darpa.mil/docs/Day1/DTC_Kickoff_VirtualTestbed_ARA-amended.pptx' class='external'>DTC_Kickoff_VirtualTestbed_ARA-amended.pptx</a>.</div>
<div class='p'>Na druhou stranu jsem se musel usmát, jak mají „po americku” nastavené generátory na všechny možné typy lidí, barvy pleti a pohlaví:
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/dtc/age-skin-color.jpg'><img src='/competitions/dtc/age-skin-color_t.jpg' alt='generátor avatarů' title='generátor avatarů' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/dtc/age-skin-color.jpg'>generátor avatarů</a>
</td></tr></table></div>
<div class='p'>Pokud jste drsnější nátury a zajímají vás schopnosti renderingu v <a href='https://www.unrealengine.com/' class='external'>Unreal Engine</a>, tak viz <a href='https://triagechallenge.darpa.mil/docs/Day1/DARPA-Challenge-23-MMSIV-Manikin-Capabilites-poster.pdf' class='external'>DARPA-Challenge-23-MMSIV-Manikin-Capabilites-poster.pdf</a> … ale spíše nedoporučuji k jídlu …</div>
<h3>Secondary Challenge - Data</h3>
<div class='p'><i>Data Challenge</i> na druhou stranu tak děsivě nevypadá (resp. záběry z kamery budou k dispozici až později, druhý nebo třetí rok) — prostě řady <i>nějakých</i> čísel.
Zajímavé bylo, jak se k těm kritickým scénářům DARPA dostala: ve dvou velkých nemocnících nainstalovali sběr dat do záchranářských vrtulníků, které létají
opravdu jen k nejhorším případům.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/dtc/ritmo.jpg'><img src='/competitions/dtc/ritmo_t.jpg' alt='RITMO projekt' title='RITMO projekt' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/dtc/ritmo.jpg'>RITMO projekt</a>
</td></tr></table></div>
<div class='p'>Převzato z <a href='https://triagechallenge.darpa.mil/docs/Day2/DTC%20Kickoff%20UPitt.pptx' class='external'>DTC Kickoff UPitt.pptx</a>.</div>
<hr/>
<div class='p'>Oficiální zahájení bylo proloženo několika přednáškami, proč je <i>triage</i>/třídění tak důležité. Asi nejvíce mne zaujala poslední prezentace zachranářské akce
z <a href='https://www.google.com/search?q=teton+national+park' class='external'>Grand Teton National Park</a> (tam jsem se chtěl vždy podívat), kde se jeden den rychle změnilo počasí a 3 skupiny lidí (celkově 17 lidí) bylo s ruznými stupni v kritickém
ohrožení života.</div>
<div class='p'>Na akci také prezentovali sponzorované týmy a to jak své plány, tak dostupné technologie. Zajímavé bylo např. kam se posunulo EEG, ale tyto slajdy nejsou veřejně dostupné.</div>
<div class='p'>Nemáte noční můry? DARPA má pro vás řešení … <a href='https://triagechallenge.darpa.mil/docs/DTC_Team_Qualification_Guide-Version1b.pdf' class='external'>stačí se přihlásit</a>. <span class='smile'></span></div>
<hr/>
<div class='p'><a id="231114"></a></div>
<h2>14. listopadu 2023 — Pravidla ver1</h2>
<div class='p'><i>Please review the rules document for Challenge 1. This document describes
tasks for each competition track and associated scoring mechanisms. We will
make updates to this document over time and will let you know each time
content has been added.
The rules doc will be available on the website.</i> … hmm, sakra, proč to nedali rovnou online
na <a href='https://triagechallenge.darpa.mil/resources' class='external'>triagechallenge.darpa.mil/resources</a>?! V každém případě
tam bude pravděpodobně brzy update.</div>
<div class='p'>Pro <i>Primary System</i> mne zaujalo pár bodů (i když v této kategorii nesoutěžíme):</div>
<ul>
<li><i>There are two themes for Challenge 1: a plane crash and a post-battle environment.</i></li>
<li><i>All courses are expected to be located outdoors during
daylight where the ground will be pavement, grass or gravel.</i></li>
<li><i>Courses are expected to be 100 ft x 100 ft x 100 ft or smaller.</i></li>
<li><i>Qualified teams will be
eligible to participate in the event, which will consist of three scored runs 15-30 minutes in duration. The
total score for the event will be sum of a team’s best two runs.</i></li>
<li><i>In Phase 1, competitors will be permitted to teleoperate their deployed systems with up to one Operator
per UxV system and one Human Supervisor per team.</i></li>
</ul>
<div class='p'>Toto snad zapadá co o soutěži říkali dříve, takže snad OK.</div>
<h3>Primary Triage: Virtual Competition Rules</h3>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/competitions/dtc/virtual-env.jpg'><img src='/competitions/dtc/virtual-env_t.jpg' alt='Virtuální prostředí' title='Virtuální prostředí' class='border' width='400' height='172'/></a><br/>
<a href='/competitions/dtc/virtual-env.jpg'>Virtuální prostředí</a>
</td></tr></table></div>
<div class='p'><i>(1) DTC Simulator, an extensible Unreal Engine (UE5)-based simulation environment
employing MetaHumans augmented with physiology data (2) automated testing and assessment tools; and
(3) associated software support infrastructure.</i></div>
<div class='p'>Po pravdě tomu stále moc nerozumím. Simulace probíhá v <i>Unreal Engine</i> rozšířené o simulovaná zdravotní
data. Ale když se podíváte na následující tabulku <i>releases</i>, tak tam bude mezifáze „teleoperation”?!
Aha, já jen neumím číst — <i>Manual teleportation</i> … tak to asi bude skákání na XYZ?</div>
<div class='p'><table class='image_panel center' style='width: 546px;'><tr><td>
<a href='/competitions/dtc/releases.jpg'><img src='/competitions/dtc/releases_t.jpg' alt='Releases' title='Releases' class='border' width='540' height='483'/></a><br/>
<a href='/competitions/dtc/releases.jpg'>Releases</a>
</td></tr></table></div>
<div class='p'>A konečně vyhodnocení je podobné jako v <i>Primary System</i>:</div>
<div class='p'><table class='image_panel center' style='width: 651px;'><tr><td>
<a href='/competitions/dtc/scoring.jpg'><img src='/competitions/dtc/scoring_t.jpg' alt='Bodování' title='Bodování' class='border' width='645' height='447'/></a><br/>
<a href='/competitions/dtc/scoring.jpg'>Bodování</a>
</td></tr></table></div>
<div class='p'>… i toto odpovídá prezentacím na <a href='/competitions/dtc/cs#231109'>KickOff meetingu</a>, tak snad nás nevyloučí ještě než soutěž začne.</div>
<div class='p'>p.s. ono tam ta pravidla možná byla (viz <a href='https://triagechallenge.darpa.mil/docs/DARPA_Triage_Challenge_Rules-v1b_2023_11_14.pdf' class='external'>DARPA_Triage_Challenge_Rules-v1b_2023_11_14.pdf</a>),
jen jsem se zaměřil na hlášku dole místo abych četl shora:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/dtc/dtc-resources-rules.jpg'><img src='/competitions/dtc/dtc-resources-rules_t.jpg' alt='Pravidla jsou a budou ...' title='Pravidla jsou a budou ...' class='border' width='640' height='431'/></a><br/>
<a href='/competitions/dtc/dtc-resources-rules.jpg'>Pravidla jsou a budou ...</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231121"></a></div>
<h2>21. listopadu 2023 — Triage Promo Video</h2>
<div class='p'><center>
<iframe width="640" height="360" src="https://www.youtube.com/embed/lTP-cur6JwU" title="DARPA Triage Challenge - Join the Challenge, Help Save Lives" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></div>
<div class='p'></center></div>
<hr/>
<div class='p'><a id="231207"></a></div>
<h2>7. prosince 2023 — Virtual Competition dataset</h2>
<div class='p'>V úterý večer (středoevropského času) jsme dostali link na stažení 38GB datasetu pro <i>Virtual Competition</i>.
Stahovalo se to celou noc, ale přálo mi štěstí a stáhlo se to celé a <i>md5sum</i> seděla (klasicky Vodafone/bývalé UPC
moc neřeší výpadky, resp. tento týden je navíc avízovali: <i>Modernizujeme naši síť pevného internetu</i>).</div>
<div class='p'>Asi první co mne dostalo při rozbalovaní staženého tar souboru byl soubor <b>Game.exe</b>?! To nezní moc linuxově.
Chystal jsem se teď organizátorům psát, jaké jsou tedy požadavky na počítač a ono je tam i <i>README.pdf</i>,
které se rozbalilo asi jako úplně poslední soubor a tak jsem ho včera nezaregistroval. Píšou, že součástí
datasetu je i <i>Game Application</i>, která byla použita pro generování trénovací sady. Pro Windows.</div>
<div class='p'>Dataset obsahuje 5 různých tras, kudy se pohybovalo simulované vozidlo (UGV) a kudy i letěla drona (UAV):</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/competitions/dtc/virtual-map-overview.jpg'><img src='/competitions/dtc/virtual-map-overview_t.jpg' alt='Přehledová mapka tras robotů' title='Přehledová mapka tras robotů' class='border' width='400' height='324'/></a><br/>
<a href='/competitions/dtc/virtual-map-overview.jpg'>Přehledová mapka tras robotů</a>
</td></tr></table></div>
<div class='p'>… a ano, je to to slibované vlakové neštěstí …</div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/dtc/route2a.jpg'><img src='/competitions/dtc/route2a_t.jpg' alt='' title='' class='border' width='320' height='168'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/dtc/route2b.jpg'><img src='/competitions/dtc/route2b_t.jpg' alt='' title='' class='border' width='320' height='178'/></a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/dtc/route2c.jpg'><img src='/competitions/dtc/route2c_t.jpg' alt='' title='' class='border' width='320' height='180'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/dtc/route2d.jpg'><img src='/competitions/dtc/route2d_t.jpg' alt='' title='' class='border' width='320' height='180'/></a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<div class='p'>Vedle RGB videa je k dispozici i IR záznam a audio.</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/competitions/dtc/route2-ir.jpg'><img src='/competitions/dtc/route2-ir_t.jpg' alt='Záznam z termokamery' title='Záznam z termokamery' class='border' width='400' height='222'/></a><br/>
<a href='/competitions/dtc/route2-ir.jpg'>Záznam z termokamery</a>
</td></tr></table></div>
<div class='p'>K dispozici je i <i>Ground Truth</i> (CSV soubory) popisující zdravotní stav všech 30 osob, včetně tepu, dýchání,
stupně popálení atd.</div>
<hr/>
<div class='p'><a id="240124"></a></div>
<h2>24. ledna 2024 — Oficiální vyhlášení soutěžících týmů</h2>
<div class='p'>Včera DAPRA oficiálně oznámila seznam soužežících týmů. Skoro bych řekl <i>konečně</i>, protože tato informace byla
pravděpodobně známá už více jak před měsícem, ale … prostě teď už můžeme napsat, že
<b>DARPA Triage Challenge Data Competition - Robotika Team Accepted</b>. <span class='smile'></span></div>
<div class='p'>Co nás oba s Frantou překvapilo, je poměrně velké množství týmů ve všech kategoriích:</div>
<h3><a href='https://triagechallenge.darpa.mil/systems-competition' class='external'>System Competition Teams</a></h3>
<ul>
<li>AIR TAGS: Automated Image and Radar-based Triage, Assessment, and Geolocation System (DARPA-funded)</li>
<li>APAT: AI Powered Autonomous Triage</li>
<li>Coordinated Robotics</li>
<li>DART: Drone Assisted Rapid Triage (DARPA-funded)</li>
<li>Engineering Dynamics and RIIS</li>
<li>FRANTIC</li>
<li>MR NIB</li>
<li>POINTER: Point of Injury Navigation, Triage, and Emergency Response (DARPA-funded)</li>
<li>PRISM</li>
<li>PRONTO: Penn RObotic Non-contact Triage and Observation (DARPA-funded)</li>
<li>RAPID: Reliable Assessment of People in Disasters (DARPA-funded)</li>
<li>RESCUE: Reliable Evaluation and Sensing of Casualties in Uncertain Environments</li>
<li>RoboScout (DARPA-funded)</li>
<li>STRAPS: Stand-off Triage with Real-time Advanced Physiological Signatures (DARPA-funded)</li>
<li>TTT: TAK Triage Technologies</li>
<li>UAS-DTU: Unmanned Aerial Systems Delhi Technological University</li>
</ul>
<h3><a href='https://triagechallenge.darpa.mil/virtual-competition' class='external'>Virtual Competition Teams</a></h3>
<ul>
<li>Anderson</li>
<li>CC: Cambridge Consultants</li>
<li>Coordinated Robotics</li>
<li>Engineering Dynamics</li>
<li>Flying Fitches</li>
<li>GammaCat</li>
<li>Mongata</li>
<li>NurseBotics</li>
<li>Robotika</li>
<li>Second Sight</li>
<li>TNT: Tinkerers</li>
<li>TrueFit.AI</li>
<li>TTT: TAK Triage Technologies</li>
<li>UAS-DTU: Unmanned Aerial Systems Delhi Technological University</li>
<li>VIA TAGS</li>
</ul>
<h3><a href='https://triagechallenge.darpa.mil/data-competition' class='external'>Data Competition Teams</a></h3>
<ul>
<li>AI TEMPO: Alert for Intervention using Timeseries EMergency Physiological Observations (DARPA-funded)</li>
<li>ALICE: AI Life Saving Intervention Compute Engine (DARPA-funded)</li>
<li>Anderson</li>
<li>AUSTERE: AI User Supporting Triage and Evacuation Recommendation Engine (DARPA-funded)</li>
<li>CAMA: Center for Advanced Medical Analytics</li>
<li>CNA: Center for Naval Analyses</li>
<li>Coordinated Robotics</li>
<li>CRITIC: Continuous Review and Intervention for Timely Care (DARPA-funded)</li>
<li>HTTD: Healcisio Tactical Triage Detachment</li>
<li>LENS: LSI Early Notification System (DARPA-funded)</li>
<li>Medic Copilot</li>
<li>MGB-Harvard</li>
<li>MSAI: MarvsAI</li>
<li>Robotika</li>
<li>TrueFit.AI</li>
<li>University of Augsburg</li>
</ul>
<hr/>
<div class='p'><a id="240306"></a></div>
<h2>6. března 2024 — Event Qualification 3/5 - 4/5</h2>
<div class='p'>Nevím, zda je to vtipné, ale zase jsem těm amíkům skočil na špek — <i>Hi Andrew, the team portal will be open from 3/5 to 4/5 for qualification.</i>
Komentoval jsem to, že je hrozné, že na to jsou jen dva dny … ale Franta mne uvedl do reality, že je na to měsíc a první možný termín odevzdání byl včera. :-(</div>
<ul>
<li><a href='https://triagechallenge.darpa.mil/docs/DTC%20Event%20Qualification%20Guide-Workshop-1-2_22_2024.pdf' class='external'>Year One Workshop Qualification Guide</a></li>
</ul>
<h3>Virtual Competition Event Qualification</h3>
<div class='p'><i>Teams must pass the qualification scenario to be considered for competition scoring. The
qualification scenarios will be a simple scenario to confirm the team’s submitted software executes
without error and produces the results required for scoring as defined in the Virtual Testbed ICD.</i></div>
<div class='p'><i>To qualify, teams must demonstrate an initial ability to interface with the software. Teams will
be provided with an API to test this ability. Teams will provide a short screen capture video
demonstrating their system running through the latest version of the virtual testbed.</i></div>
<h3>Data Competition Event Qualification</h3>
<div class='p'><i>To qualify, teams must demonstrate an initial ability to interface with the data. This will include
the following elements.</i></div>
<div class='p'><i>1. Ability to properly read in different file formats (CSV and HDF5)</i></div>
<div class='p'><i>2. Ability to link data for a particular case between data tables and signals</i></div>
<div class='p'><i>3. Ability to use the data dictionary to interpret data</i></div>
<div class='p'><i>Teams will demonstrate this through a series of tasks and submit
their answers through AWS.</i></div>
<div class='p'>p.s. jsou vtipný <span class='wink'></span> … já měl pocit, že na ten virtuál to ještě nevydali a vlastně i plán byl myslím koncem března. Okno na registraci je tedy sice
měsíc, ale nutné předpoklady budou splněny až v jeho posledním týdnu … tedy jestli to dobře chápu???</div>
<div class='p'><i>Q: Is there an update on when the ICD can be expected and whether or not the Event #1 Qualification dates will be adjusted?</i></div>
<div class='p'><i>A: We anticipate releasing the Virtual Competition ICD by end of March. Please stay tuned and check the website, where it will be located on the Resources Page.</i></div>
<div class='p'>Možná ještě <b>Important Dates</b>:</div>
<ul>
<li><b>Week of June 10</b> - <i>Workshop Version of Testbed released</i></li>
<li><b>June 17</b> - <i>Lessons Learned Panel</i></li>
<li><b>July 30</b> - <i>Virtual Competition Submission Window Open for Challenge Event 1</i></li>
<li><b>August 30</b> - <i>Virtual Submissions Due for Challenge Event 1</i></li>
<li><b>October 5</b> - <i>Awards Ceremony for Challenge Event 1 (hybrid)</i></li>
</ul>
<hr/>
<div class='p'><a href='/competitions/dtc/cs#email'>kontaktní formulář</a></div>
Servo WaveShare ST3215https://robotika.cz/articles/digitalservo/cs2024-01-02T00:00:00ZMartin Locker
Ke konci roku 2022 jsem konečně objevil pohon "snů" pro malé roboty
- digitální servo WaveShare ST3215. Digitální robotická serva samořejmě existují již dávno,
ale buď jsou cenově mimo běžné možnosti, nebo mají jiný nedostatek,
např. nemají měření polohy v celém rozsahu otáčení (obvykle jen 0 - 270°).
Servo ST3215 splňuje téměř všechny požadavky na ideální pohon pro malé roboty.
<h2>Technický popis</h2>
<div class='p'>Jedním ze stěženích problémů při stavbě vlastního robota je výběr vhodného pohonu.
Je jedno jestli se jedná o robota mobilního, kde využijeme pohony pro vlastní pohyb,
nebo o robotické rameno, kde pohony zajišťují pohyb kloubů.<br>
Vždy potřebujeme pohon, který má vhodnou rychlost, požadovanou sílu,
možnost řízení rychlosti a polohy a v neposlední řadě i rozumnou cenu.</div>
<h3>Parametry serva</h3>
<div class='p'><table class='image_panel right' style='width: 226px;'><tr><td>
<a href='/articles/digitalservo/ST3215-hw.jpg'><img src='/articles/digitalservo/ST3215-hw_t.jpg' alt='Konstrukce serva' title='Konstrukce serva' class='border' width='220' height='165'/></a><br/>
<a href='/articles/digitalservo/ST3215-hw.jpg'>Konstrukce serva</a>
</td></tr></table></div>
<ul>
<li>velikost standardního serva</li>
<li>napájení 6 – 12,6V</li>
<li>krouticí moment 3 Nm (30kg.cm)</li>
<li>komunikace – sériová linka TTL</li>
<li>magnetický snímač otáčení 360° ! (rozlišení 4096 poloh, tj. < 0,1°)</li>
<li>režim servo polohové / servo rychlostní - motor</li>
</ul>
<h3>Dobré vlastnosti</h3>
<ul>
<li>zpětná vazba pozice, rychlost, teplota, …</li>
<li>kvalitní převodovka (kovová kola, malé vůle)</li>
<li>super cena ~650,- Kč (za to nelze pořídit slušný motor s převodovkou, enkodér, H-můstek a procesor pro řízení)</li>
</ul>
<h3>Horší vlastnosti</h3>
<ul>
<li>není dokumentace – pouze příklady zdrojových kódů //(update: výrobce už má na wiki popis komunikačního protokolu)//</li>
<li>nižší rychlost (oproti standardním servům) //(update: už existuje rychlejší varianta serva ST3215 HS - cca 2,5x rychlejší)//</li>
<li>obousměrná TTL sériová linka</li>
</ul>
<hr/>
<h2>Připojení serva k mikrokontroleru</h2>
<div class='p'>Pro komunikaci se servy je použita 1-drátová sériová sběrnice v úrovních 3V,
umožňující teoreticky připojit 253 serv.
Proto jen nutné u mikrokontrolerů, které tento typ sběrnice hardwarově nepodporují
doplnit potřebný obvod. Obvykle se pro komunikaci využije uart mikrokontroleru
a "spojí se" signály TX a RX.</div>
<div class='p'><table class='image_panel left' style='width: 243px;'><tr><td>
<a href='/articles/digitalservo/esp32_servodriver.jpg'><img src='/articles/digitalservo/esp32_servodriver_t.jpg' alt='Servo Driver WaveShare' title='Servo Driver WaveShare' class='border' width='237' height='134'/></a><br/>
<a href='/articles/digitalservo/esp32_servodriver.jpg'>Servo Driver WaveShare</a>
</td></tr></table>
<table class='image_panel center' style='width: 190px;'><tr><td>
<a href='/articles/digitalservo/esp32_servodriver2.jpg'><img src='/articles/digitalservo/esp32_servodriver2_t.jpg' alt='Servo Driver WaveShare' title='Servo Driver WaveShare' class='border' width='184' height='133'/></a><br/>
<a href='/articles/digitalservo/esp32_servodriver2.jpg'>Servo Driver WaveShare</a>
</td></tr></table></div>
<div class='p'>Pro prvotní hraní jsem použil desku Servo Driver od výrobce serv. Je založena
na mikrokontroleru ESP32 a obsahuje budič 1-drátové sběrnice s automatickým
přepínámí směru.</div>
<h3>Budič s automatický přepínáním směru (originálního zapojení)</h3>
<div class='p'><table class='image_panel center' style='width: 441px;'><tr><td>
<a href='/articles/digitalservo/hw1.png'><img src='/articles/digitalservo/hw1_t.png' alt='Originální zapojení servo driveru' title='Originální zapojení servo driveru' class='border' width='435' height='199'/></a><br/>
<a href='/articles/digitalservo/hw1.png'>Originální zapojení servo driveru</a>
</td></tr></table></div>
<h3>Budič s automatický přepínáním směru</h3>
<div class='p'>zjednodušená varianta originálního zapojení (bylo by vhodné přidat zpoždění přepnutí směru pro rychlejší přechod linky do H)</div>
<div class='p'><table class='image_panel center' style='width: 280px;'><tr><td>
<a href='/articles/digitalservo/hw2.png'><img src='/articles/digitalservo/hw2_t.png' alt='Budič s automatickým přepínáním směru' title='Budič s automatickým přepínáním směru' class='border' width='274' height='192'/></a><br/>
<a href='/articles/digitalservo/hw2.png'>Budič s automatickým přepínáním směru</a>
</td></tr></table></div>
<h3>Budiče s „ručním“ přepínáním směru</h3>
<div class='p'>v tomto zapojení je přepínání směru - vysílání/příjem řízeno zvláštním výstupem
mikrokontroleru (používá originál Dynamixel)</div>
<div class='p'><table class='image_panel center' style='width: 280px;'><tr><td>
<a href='/articles/digitalservo/hw3.png'><img src='/articles/digitalservo/hw3_t.png' alt='Budič s ručním přepínáním směru' title='Budič s ručním přepínáním směru' class='border' width='274' height='192'/></a><br/>
<a href='/articles/digitalservo/hw3.png'>Budič s ručním přepínáním směru</a>
</td></tr></table></div>
<h3>Wired AND (drátový AND)</h3>
<div class='p'>realizace diodou, která zajistí aktivní výstup pouze pro logickou "0", v logické "1" je výstup odpojen
a požadovanou úroveň zajišťuje pull-up rezistor</div>
<div class='p'>"nevýhoda" - na RXD echo vysílaných dat</div>
<div class='p'><table class='image_panel center' style='width: 209px;'><tr><td>
<a href='/articles/digitalservo/hw4.png'><img src='/articles/digitalservo/hw4_t.png' alt=' Wired AND ' title=' Wired AND ' class='border' width='203' height='123'/></a><br/>
<a href='/articles/digitalservo/hw4.png'> Wired AND </a>
</td></tr></table></div>
<div class='p'>pokud využijeme v mikrokontroleru výstup TXD v režimu otevřeného kolektoru, tak můžeme ušetřit
diodu</div>
<div class='p'><table class='image_panel center' style='width: 174px;'><tr><td>
<a href='/articles/digitalservo/hw5.png'><img src='/articles/digitalservo/hw5_t.png' alt=' Wired AND open colector ' title=' Wired AND open colector ' class='border' width='168' height='123'/></a><br/>
<a href='/articles/digitalservo/hw5.png'> Wired AND open colector </a>
</td></tr></table></div>
<div class='p'>Mechanicky je připojování serv na sběrnici realizováno pomocí konektorů SPOX (molex) 2,5 mm – 3 pin.</div>
<div class='p'><table class='image_panel left' style='width: 218px;'><tr><td>
<a href='/articles/digitalservo/con1.jpg'><img src='/articles/digitalservo/con1_t.jpg' alt='Konektor SPOX 3' title='Konektor SPOX 3' class='border' width='212' height='144'/></a><br/>
<a href='/articles/digitalservo/con1.jpg'>Konektor SPOX 3</a>
</td></tr></table>
<table class='image_panel left' style='width: 188px;'><tr><td>
<a href='/articles/digitalservo/con2.jpg'><img src='/articles/digitalservo/con2_t.jpg' alt='Konektor SPOX 3' title='Konektor SPOX 3' class='border' width='182' height='144'/></a><br/>
<a href='/articles/digitalservo/con2.jpg'>Konektor SPOX 3</a>
</td></tr></table></div>
<hr/>
<h2>Konfigurace serva</h2>
<div class='p'>U digitálních serv lze nastavovat řadu parametrů - režim práce, rychlost, maximální moment, teplotu, …
Stejně tak lze mnoho údajů ze serva číst - poloha, aktuální rychlost, krouticí moment, napětí, proud, …</div>
<div class='p'>Bohužel výrobce dokumentaci s popisem registrů serva nemá k dispozici (tedy zatím jsem neobjevil).
Ale dostal jsem tip, že toto servo vypadá jako klon serv firmy FeeTech. Takže jsem zapátral
na jejich stránkách a našel jejich software pro konfiguraci serv (odkaz ve zdrojích).
Zkusil jsem se připojit tímto softwarem k servu a opravdu servo komunikovalo.
Vypadá to, že i struktura registrů je stejná (všechny parametry, které jsem zatím
zkusil nastavit fungovaly). // (update: už existuje i konfigurační software od WaveShare)//</div>
<div class='p'><table class='image_panel center' style='width: 701px;'><tr><td>
<span><img src='/articles/digitalservo/ft.png' alt='Konfigurační software FeeTech' title='Konfigurační software FeeTech' class='border' width='695' height='540'/></span><br/>
<span>Konfigurační software FeeTech</span>
</td></tr></table></div>
<div class='p'>Pro práci s tímto sw je potřeba připojení sériovou linkou s PC. To lze snadno realizovat
jednoduchým prográmkem s využitím výše uvedené desky Servo Driver. Program
pouze přeposílá data ze sériové linky z PC (USB) na sériovou linku, která je převáděna
na 1-drátovou sběrnice a naopak.</div>
<pre>#include <Arduino.h>
#define S_RXD 18
#define S_TXD 19
void setup() {
Serial.begin(115200);
Serial1.begin(1000000, SERIAL_8N1, S_RXD, S_TXD);
delay(1000);
}
void loop() {
if (Serial.available()) {
int a = Serial.read();
Serial1.write(a);
}
if (Serial1.available()) {
int a = Serial1.read();
Serial.write(a);
}
}</pre>
<hr/>
<h2>SW řešení - jak si se servy povídat</h2>
<div class='p'>Pro použití serv ve vlastních projektech je potřeba softwarová obsluha komunikace po
sběrnici (viz. popis komunikačního protokolu) a mapa registrů v paměti serva.
Lze využít knihovnu, která je součástí <a href='https://files.waveshare.com/upload/d/d8/ST_Servo.zip' class='external'>ukázkového demo projektu</a>.</div>
<div class='p'>Já osobně používám vlastní knihovnu (originální mi přijde zbytečně složitá), protože
využívám jednodušší variantu zapojení 1-drátové sběrnice wired and (a tedy
je potřeba řešit echo při vysílání).</div>
<hr/>
<h2>Projekty se servy ST3215</h2>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/digitalservo/robo.jpg'><img src='/articles/digitalservo/robo_t.jpg' alt='Jednoduchý robot s diferenciálním řízením' title='Jednoduchý robot s diferenciálním řízením' class='border' width='220' height='165'/></a><br/>
<a href='/articles/digitalservo/robo.jpg'>Jednoduchý robot s diferenciálním řízením</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/digitalservo/brachiograph.jpg'><img src='/articles/digitalservo/brachiograph_t.jpg' alt='Kreslicí ruka' title='Kreslicí ruka' class='border' width='220' height='165'/></a><br/>
<a href='/articles/digitalservo/brachiograph.jpg'>Kreslicí ruka</a>
</td></tr></table></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/digitalservo/rocker.jpg'><img src='/articles/digitalservo/rocker_t.jpg' alt='Terénní robot Rocker' title='Terénní robot Rocker' class='border' width='220' height='165'/></a><br/>
<a href='/articles/digitalservo/rocker.jpg'>Terénní robot Rocker</a>
</td></tr></table></div>
<hr/>
<h3>Použitá literatura a odkazy na internetu</h3>
<div class='p'>[1] <a href='https://www.waveshare.com/product/robotics/motors-servos/servos/st3215-servo.htm' class='external'>Waveshare Servo ST3215 - stránka výrobce</a></div>
<div class='p'>[2] <a href='https://www.waveshare.com/wiki/ST3215_Servo' class='external'>Waveshare Servo ST3215 - wiki</a></div>
<div class='p'>[3] <a href='https://www.waveshare.com/servo-driver-with-esp32.htm' class='external'>Waveshare Servo driver</a></div>
<div class='p'>[4] <a href='https://emanual.robotis.com/docs/en/dxl/protocol1/' class='external'>Protokol Dynamixel 1.0</a></div>
<div class='p'>[5] <a href='https://files.waveshare.com/upload/2/27/Communication_Protocol_User_Manual-EN%28191218-0923%29.pdf' class='external'>WaveShare Communication Protocol</a></div>
<div class='p'>[6] <a href='https://www.theremino.com/wp-content/uploads/files/SmartMotors/Feetech_Motors_Programming_Kit_V1.1.zip' class='external'>FeeTech - programming kit</a></div>
<hr/>
<div class='p'><i>Článek je převzat z</i> <a href='https://robotika.vosrk.cz/' class='external'>https://robotika.vosrk.cz/</a></div>
Rockerhttps://robotika.cz/robots/rocker/cs2024-01-25T00:00:00ZMartin Locker
Robota s nezávislým pohonem a řízením všech kol jsem si chtěl postavit již dávno.
Konečně jsem objevil vhodné pohony - robotická serva (WaveShare ST3215),
která splnila téměř všechny požadavky (a za rozumnou cenu).
A tak vznikl robot se čtyřkolovým podvozkem typu rocker-bogie.<br><br>
<b>Aktualizace:</b> 28.1.2024 <a href='/robots/rocker/cs#220128'>Odladěn driver pro komunikaci se servy</a>
<h1>Základní údaje</h1>
<div class='p'><table class='image_panel right' style='width: 226px;'><tr><td>
<a href='/robots/rocker/robot.jpg'><img src='/robots/rocker/robot_t.jpg' alt='Podvozek robota' title='Podvozek robota' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/robot.jpg'>Podvozek robota</a>
</td></tr></table></div>
<dl>
<dt>Autor</dt>
</dl>
<ul>
<li>Martin Locker</li>
</ul>
<dl>
<dt>Řídicí počítače</dt>
</dl>
<ul>
<li>low level - STM32F103</li>
<li>high level - Raspberry Pi 3B</li>
</ul>
<dl>
<dt>Senzory</dt>
</dl>
<ul>
<li>IMU</li>
<li>GPS</li>
<li>Lidar LDrobot LD-06</li>
<li>hloubková kamera RealSense D455</li>
</ul>
<dl>
<dt>Pohon</dt>
</dl>
<ul>
<li>8x digitální robotické servo WaveShare ST3215</li>
</ul>
<dl>
<dt>Napájení</dt>
</dl>
<ul>
<li>pohony LiPol 3s 5Ah</li>
<li>elektronika power banka 20Ah</li>
</ul>
<dl>
<dt>Koncepce</dt>
</dl>
<ul>
<li>čtyřkolový podvozek typu Rocker-bogie (výkyvné uložení kol)</li>
<li>každé kolo má nezávislý pohon a nezávislé natočení směru</li>
</ul>
<hr/>
<h2>Charakteristika robota</h2>
<h3>Podvozek</h3>
<div class='p'>Podvozek robota je postaven z hliníkových profilů, plexi a dílů vyrobených 3D tiskem z PLA.
Snahou bylo udělat konstrukci co nejčistší (aby nikde nic nepřekáželo, nekoukaly dráty, …).
Takže některé části jsou nakonec celkem komplikované - převodovka s pohonem uvnitř kola,
vidlice kol, jejímž vnitřkem vedou vodiče k servům (viz. fotky).</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/rocker/kolo.jpg'><img src='/robots/rocker/kolo_t.jpg' alt='Kolo' title='Kolo' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/kolo.jpg'>Kolo</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/rocker/vidlice.jpg'><img src='/robots/rocker/vidlice_t.jpg' alt='Vidlice kola' title='Vidlice kola' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/vidlice.jpg'>Vidlice kola</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/robots/rocker/motor.jpg'><img src='/robots/rocker/motor_t.jpg' alt='Pohon kola' title='Pohon kola' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/motor.jpg'>Pohon kola</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/rocker/pohon.jpg'><img src='/robots/rocker/pohon_t.jpg' alt='Kompletní pohon' title='Kompletní pohon' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/pohon.jpg'>Kompletní pohon</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/rocker/soucasti.jpg'><img src='/robots/rocker/soucasti_t.jpg' alt='Součásti kyvných ramen' title='Součásti kyvných ramen' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/soucasti.jpg'>Součásti kyvných ramen</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/robots/rocker/telo.jpg'><img src='/robots/rocker/telo_t.jpg' alt='Tělo robota' title='Tělo robota' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/telo.jpg'>Tělo robota</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/rocker/robot2.jpg'><img src='/robots/rocker/robot2_t.jpg' alt='Podvozek 2' title='Podvozek 2' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/robot2.jpg'>Podvozek 2</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/rocker/robot3.jpg'><img src='/robots/rocker/robot3_t.jpg' alt='Podvozek 3' title='Podvozek 3' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/robot3.jpg'>Podvozek 3</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/robots/rocker/robot4.jpg'><img src='/robots/rocker/robot4_t.jpg' alt='Podvozek 4' title='Podvozek 4' class='border' width='220' height='165'/></a><br/>
<a href='/robots/rocker/robot4.jpg'>Podvozek 4</a>
</td></tr></table></div>
<h3>Řízení pohybu</h3>
<div class='p'>Podvozek je navržen tak, že osy zatáčení kol jsou ve vrcholech čtverce (robot má stejný rozchod
i rozvor kol).</div>
<div class='p'>Díky nezávislému natáčení každého kola lze realizovat dva základní způsoby řízené:</div>
<ul>
<li>"automobilové" řízení s (ackermannovým) řízením všech čtyř kol a samostatným řízením rychlosti každého kola</li>
<li>synchrodrive (všesměrové řízení) - všechna kola natáčena do stejného směru a otáčejí se stejnou rychlostí<br>+ otáčení na místě (kola se natočí ve směru kružnice procházející osami natáčení kol)
<br>Vlastní řízení (výpočty natočení kol a jejich rychlosti) řídí mikrokontroler na základě
povelů z nadřízeného systému <br>
(1. dopředná rychlost + úhlová rychlost, 2. rychlost + směr).</li>
</ul>
<h3>Video</h3>
<div class='p'><center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ROULPehfyL0" frameborder="0" allowfullscreen></iframe>
<br>První jízda - dálkově řízeno
</center></div>
<hr/>
<div class='p'><a id="220128"></a></div>
<h3>28. ledna 2024 - Odladěn driver pro komunikaci se servy</h3>
<div class='p'>Po postrčení Martinem D. jsem (po delší době) vytáhl robota a pustil se konečně do
napsání rozumného rozhraní pro komunikaci s digitálními servy.</div>
<div class='p'>Snažil jsem se to napsat tak, aby to bylo použitelné na různých platformách
(zatím tedy AVR, STM32 a ESP32). Nejnižší vrstvu implementující jednodrátovou
sériovou komunikaci jsem oddělil od vyšších vrstev a pro STM32 vyzkoušel
tři varianty realizace - standardní využití knihovní obsluhy uartu
(s možností využití hw řešení single wire half duplex na STM32), vlastní obsluha
uartu přes přerušení (zatím nevyzkoušeno) a využití dma přenosu (to by měla být
cílová varianta). Bohužel zatím DMA přenos nepůjde použít, protože na použité desce
zrovna UART3 sdílí stejné kanály s rozhraním SPI1, které bude sloužit pro komunikaci
s RPi a tam je dma nutností.</div>
<div class='p'>Low level mikrokontroler by měl být v budoucnu schopen obsloužit všechny
periferie (kromě kamery), tj. pohony, imu, gps a lidar. Z hlediska pohonů
bude zajišťovat výpočet natočení jednotlivých kol a jejich rychlosti dle
povelů z nadřízeného systému a zpětné čtení enkodérů. U dalších periferií bude
zajišťovat periodické vyčítání dat. Proto se snažím napsat obsluhu tak, aby co
nejméně zatěžovala mikrokontroler. Použití dma pro uart jsem už zvládl (po
větším úsilí) při vyčítání lidaru. Proto to u komunikace se servy už celkem
šlo (jen se museli použít dva kanály - pro vysílání a příjem).</div>
<div class='p'>Závěr</div>
<ul>
<li>hotovo: vyčítání dat z lidaru, komunikace se servy</li>
<li>k řešení: doladit řízení pohonů (výpočty natočení a rychlostí), komunikace s imu (třetí uart po fyzické vrstvě can), komunikace s RPi (spi)</li>
</ul>
<hr/>
<div class='p'><i>Článek je převzat z</i> <a href='https://robotika.vosrk.cz/' class='external'>https://robotika.vosrk.cz/</a></div>
Infentohttps://robotika.cz/articles/infento/cs2021-12-12T00:00:00ZMartin Dlouhý
Infento je stavebnice snů, minimálně podle marketingu. Lze z ni postavit nejrůznější vozítka pro děti,
a v co bych doufal, i středně velké mobilní roboty. <span class='smile'></span> Prostě jsem neodolal a před vánoci 2021 to
pořídil jako „firemní dárek”. Jestli to byl dobrý nebo špatný nápad se asi ukáže poměrně brzy
(doufám, že z toho nebudu natolik otrávený, že bych se o info nechtěl ani podělit).
<b>Blog update:</b> 28/1/2024 — <a href='/articles/infento/cs#240128'>Multi Angle Joint Set</a>
<h2>Představení stavebnice</h2>
<ul>
<li><a href='https://www.infento.com/' class='external'>www.infento.com</a></li>
</ul>
<div class='p'>Pro úvod bych zatím použil volný překlad <a href='https://www.infento.com/about-us/' class='external'>popisu od výrobce</a>:
<i>Vzpomínáte na hračky z Lega nebo Merkuru? Nuže, toto je o trošku větší. Infento je první na světě, které vyrábí stavebnice pro rodiny, jenž umožnují konstrukci vozítek pro děti. Potřebujete pouze stavebnice a šestihranný klič
k sestavení nekonečného</i> (to bych asi trošku rozporoval) <i>množství typu vozítek, které můžete používat celé dětství...</i></div>
<div class='p'>Původní text: <i>Remember the iconic toys Lego and Meccano? Well, this is bigger than that. Infento is the first in the world to develop a kit for families that lets them build real constructible rides together. You only need one kit and one hex key to create unlimited rides for their whole childhood. From toddler to teenager. From a walker, scooter, tricycle, bicycle, go-kart, skibock to a sledge and more. Infento’s modular parts allow endless possibilities.</i></div>
<div class='p'>Co jsem to vlastně objednal? No naivně si představuji, že je to <a href='https://www.infento.com/product/legend-kit/' class='external'>Legend Kit</a> s nějakýma extra drobnostna
(nechci říci blbostma, ale nějak se mi to slovo vnucuje) — svítící kola a lyžiny zdarma, no neberte to.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/infento/riders.jpg'><img src='/articles/infento/riders_t.jpg' alt='Vozítka' title='Vozítka' class='border' width='640' height='410'/></a><br/>
<a href='/articles/infento/riders.jpg'>Vozítka</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/infento/box.jpg'><img src='/articles/infento/box_t.jpg' alt='Krabice' title='Krabice' class='border' width='640' height='416'/></a><br/>
<a href='/articles/infento/box.jpg'>Krabice</a>
</td></tr></table></div>
<h2>Obsah</h2>
<ul>
<li><a href='/articles/infento/cs#211212'>211212 - Balíček dorazil</a></li>
<li><a href='/articles/infento/cs#211230'>211230 - První výtvor - Ice Breaker</a></li>
<li><a href='/articles/infento/cs#220205'>220205 - Sněžný test - FAIL</a></li>
<li><a href='/articles/infento/cs#220905'>220905 - Elektrická tříkolka</a></li>
<li><a href='/articles/infento/cs#240120'>240120 - Inverzní vánoce</a></li>
<li><a href='/articles/infento/cs#240128'>240128 - Multi Angle Joint Set</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog</h1>
<div class='p'><a id="211212"></a></div>
<h2>12. prosinec 2021 — Balíček dorazil</h2>
<div class='p'>Balíček z Amsterdamu dorazil v pátek 10. prosince 2021. Objednával (resp. platil) jsem to v pondělí, takže první část slibu
<i>Fast delivery: 2-5 working days</i> opravdu splnili. Doma se to úplně s nadšením nesetkalo (krabice zabírají skoro půlku chodby),
ale to se dalo čekat. Na vánoce se to odveze pryč a doma bude klid … možná.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/infento/delivered-boxes.jpg'><img src='/articles/infento/delivered-boxes_t.jpg' alt='Vánoční nadílka' title='Vánoční nadílka' class='border' width='320' height='180'/></a><br/>
<a href='/articles/infento/delivered-boxes.jpg'>Vánoční nadílka</a>
</td></tr></table></div>
<div class='p'>Co mne zatím „trošku” mate je, že přestože ty tři krabice byly těžké jak prase (kamarádi z ČZU by jistě oponovali, že prase
může být daleko těžší) <span class='wink'></span> … tak to bylo 55.73 Kg ve třech krabicích a uplně to nesedí k obrázku výše. Nálepky také nesedí
a osobní váhu tu nemám, tak to asi holt bude překvapení!</div>
<hr/>
<div class='p'><a id="211230"></a></div>
<h2>30. prosinec 2021 — První výtvor - Ice Breaker</h2>
<div class='p'>Včera jsme to už nevydrželi a krabice rozbalili (oficiálně jsme měli počkat až do Silvestra, na kdy se odsunuly společné
Vánoce). V těch třech bednách, o celkové váze asi 50kg, je šest „malých” (cca 40x40cm) krabic a čtyři „velké” (cca 40x70cm).
Vše je ve svítivé červené, což jsem si z obrázků na webu automaticky spojil s plechem — nevím proč. Jsou normálně papírové.</div>
<div class='p'>V <i>legend</i> sadě jsou 4 velká kola (průměr 33cm), které mi připomínají <a href='/robots/kloubak/cs'>Kloubáka</a>. <span class='smile'></span> Ty jsou pořádné,
s duší a pláštěm. Pak tam jsou 4 prostřední plastové a 4+2 malé, jako na inline brusle. A ano, děti nejvíce zaujaly LEDkové
kola (co jsem je komentoval „taková blbost”) … prostě děti to vidí jinak. <span class='wink'></span></div>
<div class='p'>Poměrně rychle jsem propadl malomyslnosti — jak začít?! Možností je opravdu hodně, tak jsme koukali na různé obrázky
a vypadalo to, že malá tříkolka by byl dobrý úvod. Ale přes noc napadlo 5cm nového sněhu a tak padla volba na „něco
s lyžema”, což byl druhý přídavek k vanočnímu balení. Volba padla na
<a href='https://d2qy34mdia9x7s.cloudfront.net/wp-content/uploads/2017/06/InfentoICEBREAKER_G2_EN-v1.1.pdf' class='external'>Ice Breaker</a> (PDF, 60 stran).</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/infento/icebreaker.jpg'><img src='/articles/infento/icebreaker_t.jpg' alt='Ice Breaker PDFko' title='Ice Breaker PDFko' class='border' width='640' height='360'/></a><br/>
<a href='/articles/infento/icebreaker.jpg'>Ice Breaker PDFko</a>
</td></tr></table></div>
<div class='p'>Vypadá to, že každé konstrukci je ke stažení PDFko — no došlo na varování Jirky, že sestavit cokoliv je na několik
hodin a pro úplně malé děti to není. Prostě tak dlouho tu pozornost neudrží. A navíc první stavba znamená i
mnoho omylů a nejasností … ale <i>dopadlo to výborně, jsem jen trošku v šoku.</i> <span class='smile'></span> Mimochodem na sestavovaní se hodí
dost velký volný prostor. Po 21h byl skůtr na světě. Jen venku v mezičase začalo pršet a sníh slezl, takže možná
před prvním testem ještě lyže nahradíme za kola.</div>
<div class='p'>p.s. asi jedinou výtku, kterou bych zatím měl, je chybějící malý šestihranný klíč na přidělání úchytu na řidítka,
ale stejně tak je možné, že jsem ho zatím přehledl.</div>
<div class='p'>p.s.2 motivace, že až to dostavíte, tak se na tom projedete, je opravdu silná <span class='smile'></span></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/infento/ski-and-wheel.jpg'><img src='/articles/infento/ski-and-wheel_t.jpg' alt='Lyže a kolo' title='Lyže a kolo' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/ski-and-wheel.jpg'>Lyže a kolo</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/infento/motor.jpg'><img src='/articles/infento/motor_t.jpg' alt='Elektrický motor' title='Elektrický motor' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/motor.jpg'>Elektrický motor</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/articles/infento/room-with-boxes.jpg'><img src='/articles/infento/room-with-boxes_t.jpg' alt='Pokoj s krabicema' title='Pokoj s krabicema' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/room-with-boxes.jpg'>Pokoj s krabicema</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="220205"></a></div>
<h2>5. únor 2022 — Sněžný test - FAIL</h2>
<div class='p'>Po dlouhé době konečně nějaký pokus a report. Dnes jsme ověřili, ze na <i>Ice Breaker</i> sníh není dostačující podmínka. <span class='wink'></span>
Pár pozorování:</div>
<ul>
<li>konstrukce je pro děti celkem těžká (na nošení určitě)</li>
<li>asi jsem opravdu měl zakapávat šroubky barvou, protože přestože jsem je včera všechny sám dotáhl, tak se řidítka trošku uvolnila
(ano, může to být skleróza, že jsem na nějaké šroubky zapomněl … a s „nedosažitelnými” jsem rozhodně nic nedělal)</li>
<li>chce to doplnit úchyt na tahání (psí vodítko OK, ale je třeba, aby přední lyže následovala „tažné zvíře”)</li>
</ul>
<div class='p'>Jinak co jsme výtvor <i>dorvali</i> na kopec, tak po nasednutí se o 10cm probořil skrz vrchní zmrzlou krustu a nikam se mu jet
nechtělo. Menšímu dítěti se podařil „drobný kotrmelec” přes řidítka, když předek více zapadl. No bude to chtít nějaký <i>upgrade</i>
nebo nejprve nástroj na udusání kopce/bobové dráhy …</div>
<hr/>
<div class='p'><a id="220905"></a></div>
<h2>5. září 2022 — Elektrická tříkolka</h2>
<div class='p'>Koukám, jak se ta „věc” jmenovala a <i>icebreaker</i> vypadá po sedmi měsících úplně stejně:</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/infento/icebreaker-in-summer.jpg'><img src='/articles/infento/icebreaker-in-summer_t.jpg' alt='Icebreaker v létě' title='Icebreaker v létě' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/infento/icebreaker-in-summer.jpg'>Icebreaker v létě</a>
</td></tr></table></div>
<div class='p'>Není divu, že to na půdě pomalu „překáží” a <i>měl bych si to odvézt pryč</i> … ale příšlo mi to škoda, včera byl krásný
slunečný den a tak jsem vytahal všechny ty krabice (ono už to je první energetická překážka, kterou člověk musí překonat)
ven na trávu a "hrál si". <span class='smile'></span></div>
<div class='p'>Nahradit zadní lyže za kola byla otázka cca jedné minuty — chtěl jsem napsat pár sekund, ale ta minuta to asi byla. Osa
je kompatibilní šestihran, takže stačilo povolit dorazy, vyndat lyžiny na ložisku a zandat velká kola, také s ložisky.
Až později jsem zjistil, že si nejsou všechna 4 kola rovna — jedno je napevno, míněno pravděpodobně jako pohonné.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/infento/semi-breaker.jpg'><img src='/articles/infento/semi-breaker_t.jpg' alt='Mutant' title='Mutant' class='border' width='320' height='180'/></a><br/>
<a href='/articles/infento/semi-breaker.jpg'>Mutant</a>
</td></tr></table></div>
<div class='p'>Co ale s předkem? Nabízely se nášlapy na rychlý test, což nevypadalo úplně špatně, ale funkční to nebylo — kam dát nohy a
limit na zatáčení:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/infento/fake-front.jpg'><img src='/articles/infento/fake-front_t.jpg' alt='Falešný předek' title='Falešný předek' class='border' width='320' height='180'/></a><br/>
<a href='/articles/infento/fake-front.jpg'>Falešný předek</a>
</td></tr></table></div>
<div class='p'>Situaci trošku řešila delší osa umístěná místo přední lyžiny:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/infento/fixed-front-mount.jpg'><img src='/articles/infento/fixed-front-mount_t.jpg' alt='Pevný úchyt předních kol' title='Pevný úchyt předních kol' class='border' width='320' height='180'/></a><br/>
<a href='/articles/infento/fixed-front-mount.jpg'>Pevný úchyt předních kol</a>
</td></tr></table></div>
<div class='p'>Moc bytelně to ale nevypadalo. Navíc hned začaly vyskakovat body, jako co se bude dít v terénu, v zatáčce,
každé kolo by se mělo točit jinou rychlostí (ano, toto byl okamžik, kdy jsem zjistil, že jen jedno kolo je jiné, ale zde
se hlavní osa protáčela). Jako popojet se na tom dalo, ale „nic moc”.</div>
<div class='p'>Pak šel okolo OndraP a říká, že je to divné a jak to bude fungovat s těma náklonama? <span class='wink'></span> Tj. tato varianta měla hodně krátkou
dobu života.</div>
<div class='p'>Kyvná náprava byla super, ale že by to bylo nějak extra stabilní se opravdu říci nedalo. Navíc jízda po trávě šla ztuha a
„chtělo by to motor”. <span class='smile'></span> Ale to už jsem nebyl sám a hráli jsme si dva.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/infento/flexible-front.jpg'><img src='/articles/infento/flexible-front_t.jpg' alt='Kyvná přední náprava' title='Kyvná přední náprava' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/infento/flexible-front.jpg'>Kyvná přední náprava</a>
</td></tr></table></div>
<div class='p'>Ondra předělal předek na jedno kolo, po pravdě chtěl zkusit spíše elektrokoloběžku, a já experimentoval s pohonem. Ve stavebnici
jsou 3 ozubené řemeny ruzných délek, ale ani jedna moc nepasovala, tak Ondra ještě celou konstrukci o pár cm prodloužil výměnou
zadních dílů.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/infento/electric-tricycle.jpg'><img src='/articles/infento/electric-tricycle_t.jpg' alt='Elektrická trojkolka' title='Elektrická trojkolka' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/infento/electric-tricycle.jpg'>Elektrická trojkolka</a>
</td></tr></table></div>
<div class='p'>Mno, evidentně jsem přestal pravidelně dokumentovat změny, protože první fotka má „časovou známku” 11:18 a posledni 17:59 …
skoro jakoby poslední „refactoring” trval 4 hodiny … hmm, no byl tam ještě oběd, káva, … nějaké testy. <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/infento/eli-etri.jpg'><img src='/articles/infento/eli-etri_t.jpg' alt='EliEtri' title='EliEtri' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/infento/eli-etri.jpg'>EliEtri</a>
</td></tr></table></div>
<div class='p'>A ještě pár „detailů”:</div>
<ul>
<li>nejsou tam brzdy</li>
<li>není připojen chránič řemenu</li>
<li>převod je do pomala</li>
</ul>
<div class='p'>To první mne asi trápilo nejméně - ono to celkem brutálně <i>brzdí motorem</i>. Pravda, že jsem měl dnes v noci sen, jak to proletí
výlohou, ale to mi spíše připomínalo robota ze SubT, možná v rámci ročního výročí <a href='/competitions/subtchallenge/finals/cs'>finále</a>. <span class='wink'></span></div>
<div class='p'>Kryt mi příšel na první pokusy trošku zbytečný, ale jak Eli měla dlouhé šaty, tak bych tomu skoro dal „vysokou prioritu do další
iterace”.</div>
<div class='p'>No a převod do pomala jsem primárně dělal kvůli sobě — a ano i po té trávě to táhlo skvěle … ale děti chtějí rychlost, nebezpečí,
… no comment <span class='wink'></span> … možná bych to řešil s tou brzdou a jestli tam Infento nemá i spojku?? Za mne ať to raději jezdí nudně pomalu.</div>
<div class='p'>Tak jo, čas přepnout na jinou „zábavu” — ve zkratce pro dospělé je ta stavebnice fajn. Chce ale hodně prostoru na vybalení
a ještě více času … jo a ty děti bude třeba do toho nějak znova zapojit … jednou.</div>
<hr/>
<div class='p'><a id="240120"></a></div>
<h2>20. ledna 2024 — Inverzní vánoce</h2>
<div class='p'>Asi jsem <i>zlej strejda</i> — letos (vlastně teď už je to loni) o vánocích jsem dětem stavebnici "zabavil", protože se na ní
pomalu na půdě prášilo a já zjistil, že má nová hračka (<a href='/robots/pat-a-mat/cs'>robot Pat</a>) má na horní straně dvě „kolejnice”,
které vypadají úplně stejně jako <a href='https://www.infento.com/parts/profiles/' class='external'>Infento profily</a>,
a že bych nějaké pokusné <i>nadstavby</i> mohl zkusit právě ze stavebnice…</div>
<div class='p'>… se čtyřma velkýma krabicema se tu už skoro nehnu a nostalgicky vzpomínám na první pokusy, kdy vše bylo rozbalené na
nově dokončeném (tehdy ještě úplně prázdném) podkroví. Skoro mi přišlo, že bude rychlejší hledat na internetu, co všechno za díly
mám k dispozici (což není úplně dobré znamení), ale jako malá inventura to jde:</div>
<ul>
<li><a href='https://www.infento.com/parts/' class='external'>https://www.infento.com/parts/</a></li>
<li><a href='https://www.infento.com/parts/bolts/' class='external'>https://www.infento.com/parts/bolts/</a></li>
</ul>
<div class='p'>Po pravdě jsem hledal <i>Infento fasteners measurement sheet</i>, kde jsou v poměru 1:1 vyobrazeny všechny dostupné šrouby a spojky.
Klasicky jsem to našel ve spodní krabici úplně na dně. <span class='smile'></span></div>
<div class='p'>A co jsem postavil? No chtěl jsem začít nějakým uchytem pro lidar a kameru, protože z robota čouhá takový „trn” (něco jako
konektor na připojení do Matrixu) a je tedy nutné se dostat výše. V praxi jsem pak ověřil, co kamarádí říkali minulý týden
ve škole, ty profily vypadají podobně ale nejsou stejné! Tj. takové <a href='https://www.infento.com/parts/nuts/' class='external'>kouzelné spojky</a>
(<i>profile nut short</i>) s pružinkou do čínského profilu nepasovaly. :-( … dobrá zpráva ale byla, že alespoň šrouby jsou
<i>kompatibilní</i> a tak jsem konstrukci namotoval místo dvou šroubů držící původní děrovanou desku.</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/articles/infento/lidar-holder.jpg'><img src='/articles/infento/lidar-holder_t.jpg' alt='Držák na senzory' title='Držák na senzory' class='border' width='400' height='225'/></a><br/>
<a href='/articles/infento/lidar-holder.jpg'>Držák na senzory</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="240128"></a></div>
<h2>28. ledna 2024 — Multi Angle Joint Set</h2>
<div class='p'>Vedle snadného uchycení a rychlého polohování pomocí profilů jsem si teď o víkendu celkem užil <a href='https://www.infento.com/parts/connectors/' class='external'>Multi Angle Joint Set</a> —
prostě spojku s nastavitelným úhlem.</div>
<div class='p'><table class='image_panel center' style='width: 546px;'><tr><td>
<span><img src='/articles/infento/infento-multi-angle-joint.jpg' alt='Multi angle joint (převzato z webu Infento)' title='Multi angle joint (převzato z webu Infento)' class='border' width='540' height='540'/></span><br/>
<span>Multi angle joint (převzato z webu Infento)</span>
</td></tr></table></div>
<div class='p'>Potřeboal jsem přidělat <a href='/articles/oak-d-pro/cs'>OAK-D hloubkovou kameru</a> a už při testování na <a href='/robots/eduro/cs'>Eduru</a> jsem vyzkoušel, že musí být mírně
nakloněna dolů, aby detekovala blízké překážky. Otázka ale je, jak moc ji naklonit? Případně vyzkoušet pár experimentů pro různé úhly? Na tuto úlohu je ta
spojka úplně ideální nástoj. <span class='smile'></span></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/infento/camera-10deg.jpg'><img src='/articles/infento/camera-10deg_t.jpg' alt='náklon 10 stupňů' title='náklon 10 stupňů' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/camera-10deg.jpg'>náklon 10 stupňů</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/infento/camera-20deg.jpg'><img src='/articles/infento/camera-20deg_t.jpg' alt='náklon 20 stupňů' title='náklon 20 stupňů' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/camera-20deg.jpg'>náklon 20 stupňů</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/articles/infento/camera-30deg.jpg'><img src='/articles/infento/camera-30deg_t.jpg' alt='náklon 30 stupňů' title='náklon 30 stupňů' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/camera-30deg.jpg'>náklon 30 stupňů</a>
</td></tr></table></div>
<div class='p'><i>Interface</i> propojení kamery se stavebnicí je „lehce” ostudný, ale požadavky <i>ver0</i> to splňuje a třeba se toho TomášP chytí a vytiskne k tomu pak
nový úchyt … až to vše bude fungovat! Pro teď chápu Jirku, proč preferuje jako materiál dřevo — prostě i my programátoři to nějak uděláme. <span class='smile'></span></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/infento/camera-holder.jpg'><img src='/articles/infento/camera-holder_t.jpg' alt='držák na kameru' title='držák na kameru' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/camera-holder.jpg'>držák na kameru</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/infento/camera-holder-side.jpg'><img src='/articles/infento/camera-holder-side_t.jpg' alt='boční pohled' title='boční pohled' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/camera-holder-side.jpg'>boční pohled</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/articles/infento/oak-camera-on-robot-pat.jpg'><img src='/articles/infento/oak-camera-on-robot-pat_t.jpg' alt='OAK-D kamera na Patovi' title='OAK-D kamera na Patovi' class='border' width='220' height='124'/></a><br/>
<a href='/articles/infento/oak-camera-on-robot-pat.jpg'>OAK-D kamera na Patovi</a>
</td></tr></table></div>
<div class='p'>Řešení spoje pomocí 3 hlavních dílů umožňuje polohování s krokem 10 stupňů. Říkal jsem si, že kdyby u toho prostředního kolečka posunuli zuby
o 5 stupňů, tak by bylo možné, podle výběru středového dílu, dostat kroky 0, 10, 20 nebo 5, 15, 25 … a co myslíte? Ano, viz
<a href='https://www.infento.com/parts/connectors/' class='external'>přehledová stránka spojek</a> a konkrétně díl
<i>Knurled Disc I Stripe (Knurled Disc I-stripe can make angles of 5 ° – 15 ° – 25 ° -35 ° – etc.)</i>
a <i>Knurled Disc II Stripes (Knurled Disc II-stripes can make angles of 0 ° – 10 ° – 20 ° – 30 ° – etc.)</i>.
Je tedy dost pravděpodobné, že v těch krabicích někde mám i ten první typ. <span class='smile'></span></div>
<hr/>
<div class='p'><a href='/articles/infento/cs#email'>kontaktní formulář</a></div>
Robotour Marathon 2023https://robotika.cz/competitions/robotour/marathon-2023/cs2022-10-22T00:00:00ZMartin Dlouhý
<b>Robotour Marathon</b> je doplňková disciplina k podzimní <b>Robotour</b>. Je pro ni
hned několik motivací, kde pravděpodobně první je zvýšení úrovně testování
jednotlivých týmů. To zároveň odpovídá úrovni spolehlivosti robotů v Robotour
soutěži. A navíc to umožňuje srovnání různých týmů z celého světa po dobu
celého roku. <span class='smile'></span> <b>Update 4/1/2024</b>:
<a href='/competitions/robotour/marathon-2023/cs#240104'>Vítěz roku 2023 je ARBot! (4.09 km)</a>
<h1>Pravidla</h1>
<div class='p'>Pravidla pro <b>Robotour Marathon 2023</b> jsou podobná samotné Robotour. Robot
má za úkol předvést své schopnosti autonomně navigovat po cestách bez lidského
zásahu. Může to být libovolná cesta zmapovaná na
<a href='http://www.openstreetmap.org/' class='external'>OpenStreetMap</a>. Hlavní rozdíl je v tom, že je
to <b>vaše</b> výzva, realizovaná <b>kdy</b> vám to vyhovuje a <b>kde</b> vám to
vyhovuje. Pravda, že si sami budete i sudími, což je trošku divné, ale …
vyberte si místo, spusťte vás Robotour kód a podělte se o vaše video s GPS
logem. Vítězí robot, který autonomně ujede nejdelší vzdálenost.</div>
<h1>Průběžné bodové hodnocení</h1>
<h2>Long Range Category</h2>
<div class='p'><center>
<table border="1">
<tr>
<th>Pořadí</th>
<th>Tým</th>
<th>Vzdálenost</th>
<th>Datum</th>
<th>Video</th>
<th>GPS log</th>
</tr>
<tr bgcolor="yellow">
<td align="center">1.</td>
<td><b> ARBot </b></td>
<td align="center">4.09 km</td>
<td>2023-08-18</td>
<td><a href='https://youtu.be/MjUlkFbLrrU' class='external'>MjUlkFbLrrU</a></td>
<td align="center">—</td>
</tr>
<tr>
<td align="center">2.</td>
<td><b> Cogito - Emily </b></td>
<td align="center">0.79 km</td>
<td>2023-05-29</td>
<td><a href='https://youtu.be/dql4iOZPlLQ' class='external'>dql4iOZPlLQ</a></td>
<td><a href='https://www.openstreetmap.org/user/cogitoteam/traces/7695958' class='external'>#7695958</a></td>
</tr>
<tr>
<td align="center">3.</td>
<td><b> Istrobotics </b></td>
<td align="center">0.40 km</td>
<td>2023-08-21</td>
<td><a href='https://youtu.be/ePQYd9pSx9Q' class='external'>ePQYd9pSx9Q</a></td>
<td><a href='https://www.openstreetmap.org/user/pablosksk/traces/9482547' class='external'>#9482547</a></td>
</tr>
</table>
</center></div>
<div class='p'><a id="240104"></a></div>
<h1>Vítěz 2023 - ARBot (4.09 km)</h1>
<div class='p'><center>
<iframe width="868" height="488" src="https://www.youtube.com/embed/MjUlkFbLrrU" title="ARBot: Robotour Maraton 2023, attempt 1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</center></div>
<hr/>
<h1>Submissions/Backlog</h1>
<h2>Report Generator: <a href='https://www.trackreport.net/' class='external'>https://www.trackreport.net/</a></h2>
<hr/>
<div class='p'><a id="221021"></a></div>
<h3>ARBot — 10/21/22, 5:56 PM</h3>
<ul>
<li><a href='https://www.openstreetmap.org/user/Ales%20Ruda/traces/5172824' class='external'>https://www.openstreetmap.org/user/Ales%20Ruda/traces/5172824</a></li>
<li><a href='https://youtu.be/7t2f6tkSXHU' class='external'>https://youtu.be/7t2f6tkSXHU</a></li>
</ul>
<pre>Distance: 0.57 km Average speed: 2.45 km/h
Total ascent: 0 m Avg. moving speed: 0.58 km/h
Total descent: 0 m Maximum speed: 3.92 km/h
Total time: 0:13:57.0 Moving time: 0:00:17.0</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/robotour/marathon-2023/arbot-221021.jpg'><img src='/competitions/robotour/marathon-2023/arbot-221021_t.jpg' alt='ARBot 0.57 km' title='ARBot 0.57 km' class='border' width='640' height='323'/></a><br/>
<a href='/competitions/robotour/marathon-2023/arbot-221021.jpg'>ARBot 0.57 km</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230410"></a></div>
<h3>Istrobotics — 4/10/23, 10:20 AM</h3>
<ul>
<li><a href='https://www.openstreetmap.org/user/pablosksk/traces/6986074' class='external'>https://www.openstreetmap.org/user/pablosksk/traces/6986074</a></li>
<li><a href='https://youtu.be/SHtm814_StE' class='external'>https://youtu.be/SHtm814_StE</a></li>
</ul>
<pre>Distance: 0.26 km Average speed: 3.00 km/h
Total ascent: 0 m Avg. moving speed: 3.01 km/h
Total descent: 0 m Maximum speed: 3.75 km/h
Total time: 0:05:09.0 Moving time: 0:05:08.0</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/robotour/marathon-2023/istrobotics-230410.jpg'><img src='/competitions/robotour/marathon-2023/istrobotics-230410_t.jpg' alt='Istrobotics 0.26 km' title='Istrobotics 0.26 km' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/robotour/marathon-2023/istrobotics-230410.jpg'>Istrobotics 0.26 km</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230430"></a></div>
<h3>Cogito - Emily — 4/30/23 8:16 PM</h3>
<ul>
<li><a href='https://www.openstreetmap.org/user/cogitoteam/traces/7275665' class='external'>https://www.openstreetmap.org/user/cogitoteam/traces/7275665</a></li>
<li><a href='https://youtu.be/1OO6b9SIerg' class='external'>https://youtu.be/1OO6b9SIerg</a></li>
</ul>
<pre>Distance: 0.27 km Average speed: 2.59 km/h
Total ascent: 9 m Avg. moving speed: 2.78 km/h
Total descent: 14 m Maximum speed: 3.42 km/h
Total time: 0:06:15.9 Moving time: 0:05:48.2</pre>
<ul>
<li>Deep Neural network controlling the robot. First non-trivial drive in that mode.
Neural network input: Depth image from a Luxonis depth camera.
Neural network output: Velocity, rotation.</li>
</ul>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/robotour/marathon-2023/cogito-emily-230430.jpg'><img src='/competitions/robotour/marathon-2023/cogito-emily-230430_t.jpg' alt='Cogito - Emily 0.27 km' title='Cogito - Emily 0.27 km' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/robotour/marathon-2023/cogito-emily-230430.jpg'>Cogito - Emily 0.27 km</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230529"></a></div>
<h3>Cogito - Emily run2 — 5/29/23, 8:24 PM</h3>
<ul>
<li><a href='https://www.openstreetmap.org/user/cogitoteam/traces/7695958' class='external'>https://www.openstreetmap.org/user/cogitoteam/traces/7695958</a></li>
<li><a href='https://youtu.be/dql4iOZPlLQ' class='external'>https://youtu.be/dql4iOZPlLQ</a></li>
<li><a href='https://www.google.com/maps/d/u/0/edit?mid=1fUBaYkMyuM-RsigFEXRIt9ZsuYYQNnE&usp=sharing' class='external'>Google Maps</a></li>
</ul>
<pre>Distance: 0.79 km Average speed: 2.38 km/h
Total ascent: 39 m Avg. moving speed: 2.81 km/h
Total descent: 58 m Maximum speed: 4.46 km/h
Total time: 0:19:54.5 Moving time: 0:16:43.8</pre>
<ul>
<li>Deep Neural network controlling the robot. This time closer to training conditions and better.
Neural network input: Depth image from a Luxonis depth camera.
Neural network output: Velocity, rotation.</li>
</ul>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/robotour/marathon-2023/cogito-emily-230529.jpg'><img src='/competitions/robotour/marathon-2023/cogito-emily-230529_t.jpg' alt='Cogito - Emily 0.79 km' title='Cogito - Emily 0.79 km' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/robotour/marathon-2023/cogito-emily-230529.jpg'>Cogito - Emily 0.79 km</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230818"></a></div>
<h3>ARBot — 8/18/23 11:20 AM</h3>
<ul>
<li><a href='https://youtu.be/MjUlkFbLrrU' class='external'>https://youtu.be/MjUlkFbLrrU</a></li>
</ul>
<pre>Distance: 4.09 km Average speed: 2.26 km/h
Total ascent: 0 m Avg. moving speed: 2.78 km/h
Total descent: 0 m Maximum speed: 20.46 km/h
Total time: 1:48:38.5 Moving time: 1:26:47.4</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/robotour/marathon-2023/arbot-230818.png'><img src='/competitions/robotour/marathon-2023/arbot-230818_t.png' alt='ARBot 4.09 km' title='ARBot 4.09 km' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/robotour/marathon-2023/arbot-230818.png'>ARBot 4.09 km</a>
</td></tr></table></div>
<div class='p'>md: musím přiznat, že i zpracování GPX nebylo přimočaré <span class='smile'></span></div>
<pre>Sorry, file size cannot be more than 2500 kB.
If you uploaded a GPX file, try to upload a zipped file instead.
Filename: RT-maraton-2023.1.gpx.gz
Reading GPX file failed.
Unable to open zip file, because it contains a directory.
Filename: RT-maraton-2023.1.zip
Reading GPX file failed.</pre>
<div class='p'><a href='https://stackoverflow.com/questions/9710141/create-zip-file-and-ignore-directory-structure' class='external'>https://stackoverflow.com/questions/9710141/create-zip-file-and-ignore-directory-structure</a></div>
<pre>zip -9 -j ~/Downloads/RT-maraton-2023.1.zip ~/Downloads/RT-maraton-2023.1.gpx
adding: RT-maraton-2023.1.gpx (deflated 85%)</pre>
<div class='p'>… v každém případě gratulace. Jako homologace/připrava na <a href='/competitions/robotour/2023/cs'>Robotour 2023</a> super!!!</div>
<hr/>
<div class='p'><a id="230821"></a></div>
<h3>Istrobotics — 8/21/23 2:10 PM</h3>
<ul>
<li><a href='https://www.openstreetmap.org/user/pablosksk/traces/9482547' class='external'>https://www.openstreetmap.org/user/pablosksk/traces/9482547</a></li>
<li><a href='https://youtu.be/ePQYd9pSx9Q' class='external'>https://youtu.be/ePQYd9pSx9Q</a></li>
</ul>
<pre>Distance: 0.40 km Average speed: 2.74 km/h
Total ascent: 0 m Avg. moving speed: 2.79 km/h
Total descent: 0 m Maximum speed: 4.14 km/h
Total time: 0:08:47.0 Moving time: 0:08:39.0</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/robotour/marathon-2023/istrobotics-230821.jpg'><img src='/competitions/robotour/marathon-2023/istrobotics-230821_t.jpg' alt='Istrobotics 0.4km ' title='Istrobotics 0.4km ' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/robotour/marathon-2023/istrobotics-230821.jpg'>Istrobotics 0.4km </a>
</td></tr></table></div>
<hr/>
<div class='p'>Pokud chcete nějak podpořit tuto soutěž nebo máte nějaký komentář/dotaz, tak
prosím použijte <a href='/competitions/robotour/marathon-2023/cs#email'>kontaktní formulář</a>.</div>
Scan matchinghttps://robotika.cz/guide/scan-matching/cs2023-12-20T00:00:00ZMartin Dlouhý
„Přišla bída na kozáky” aneb <i>Eduro odometrie</i> není dokonalá a je třeba s tím něco
udělat. V tomto článku probereme základ matchování 2D lidarového scanu pomocí ICP
(Iterative Closest Point) a jednoduché pokusy v Python + <i>numpy</i>.
<h1>Úvod</h1>
<div class='p'>Matchování laserových scanu je taková „pěkná začátečnická úloha”, které jsem se leta vyhýbal,
ale teď by se mi hodila a rád bych tomu rozumněl o trošku více, co se tam děje a za jakých příležitostí
to selže. K dispozici máme teď <a href='/articles/vanjee-lidar/cs'>360 stupňové 4 úrovňové VanJee lidary</a> a
ta vrstva vodorovným scanem je na to jak dělaná.</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/guide/scan-matching/vanjee-scan.png'><img src='/guide/scan-matching/vanjee-scan_t.png' alt='360 stupňový scan, 2 vrstvy' title='360 stupňový scan, 2 vrstvy' class='border' width='400' height='228'/></a><br/>
<a href='/guide/scan-matching/vanjee-scan.png'>360 stupňový scan, 2 vrstvy</a>
</td></tr></table></div>
<div class='p'>Obrázek výše je možná zavádějící, protože ukazuje 2 scany, které ale matchovat nebudeme. Je to vlastně
první předpoklad, že matchovat má smysl jen pokud 2x pozorujeme to samé prostředí (zde bod odrazu).
Pokud je podlaha vodorovná, lidar namontován vodorovně a při rozjezdu a brždění se robot příliš nekolíbá,
tak dává smysl jednotlivé scany porovnávat (zde světle zelené). Na druhou stranu scan sklopený 10 stupňů
dolu (hnědý) je pro matchování nepoužitelný — při změně pozice jsou skoro všechny body jiné.</div>
<div class='p'>Tak teď snad vhodnější obrázek co se snažíme namatchovat:</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/guide/scan-matching/icp1.png'><img src='/guide/scan-matching/icp1_t.png' alt='sesazení dvou scanů' title='sesazení dvou scanů' class='border' width='400' height='211'/></a><br/>
<a href='/guide/scan-matching/icp1.png'>sesazení dvou scanů</a>
</td></tr></table></div>
<div class='p'>Toto jsou dva scany cca po 1s, tj. s mírným posunem jízdou rovně. A teď co? Přiznám se, že na čtení
článku jsem neměl úplně náladu, tak jsem koukal na
<a href='https://www.youtube.com/watch?v=LETPf6eoyYg&ab_channel=MadhurBehl' class='external'>skoro hodinové video</a>.
Jako úvod mi to přišlo celkem poučné. Navíc je to v kontextu <a href='https://f1tenth.org/' class='external'>F1/10th</a>,
což by mohla být docela <i>pařba</i>, ale my asi už zůstaneme u těch pomalejších robotů …</div>
<div class='p'><a href='https://en.wikipedia.org/wiki/Iterative_closest_point' class='external'>ICP (Iterative closest point)</a> ve své základní
podobě vezme ke každému bodu prvního scanu nejbližší bod z druhého scanu a tím definuje <i>páry korespondencí</i>.
Aneb obejde tím základní problém a to, které body si vzájemně odpovídají. To je také hned první slabina,
resp. předpoklad ICP, že ty odpovídající si body budou relativně blízko. Je tedy rozhodně dobré
algoritmu pomoci, a pokud tušíme, jak se robot mezi jednotlivými scany zhruba pohyboval (z odometrie),
tak tím začít.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/guide/scan-matching/icp2.png'><img src='/guide/scan-matching/icp2_t.png' alt='nejbližší body' title='nejbližší body' class='border' width='320' height='169'/></a><br/>
<a href='/guide/scan-matching/icp2.png'>nejbližší body</a>
</td></tr></table>
<table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/guide/scan-matching/icp3.png'><img src='/guide/scan-matching/icp3_t.png' alt='další nejbližší body' title='další nejbližší body' class='border' width='320' height='169'/></a><br/>
<a href='/guide/scan-matching/icp3.png'>další nejbližší body</a>
</td></tr></table></div>
<div class='p'>Pokud jednotlivé páry většinou vypadají, že „tam by bylo dobré druhý scan posunout”, tak je vše
vpořádku. A teď trik z youtube, který mne potěšil a <i>vrátil do školních let</i>. <span class='smile'></span> Pokud si
totiž vystačíte jen s 2D, tak pro řešení existuje uzavřená formule … prostě dosadíte čísla a je to.
Ano, není tak prostá:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/guide/scan-matching/youtube-svd.jpg'><img src='/guide/scan-matching/youtube-svd_t.jpg' alt='SVD na youtube' title='SVD na youtube' class='border' width='640' height='366'/></a><br/>
<a href='/guide/scan-matching/youtube-svd.jpg'>SVD na youtube</a>
</td></tr></table></div>
<div class='p'>Ještě tomu předcházel jeden slide, který ale asi je celkem <i>předpověditelný</i>, aneb jak by jste
dva scany (už páry bodů) posunuli, aby jejich součet vzdáleností byl minimální? Střední hodnota
<i>x</i> a <i>y</i> a ty <i>dát přes sebe</i>. Pěkná je ale ta rotace. Pokud uděláte korekci na
střední hodnotu a spočítáte matici kombinaci x1x2, x1y2, x2y1, y1y2, tak stačí
<a href='https://en.wikipedia.org/wiki/Singular_value_decomposition' class='external'>SVD (Singular value decomposition)</a>
a rotaci dostanete (teoreticky) jak je na snímku z videa.</div>
<div class='p'>Na rovinu se to <i>SVD</i>, tak pěkně nepočítá, takže mne zase mile překvapilo numpy:
<a href='https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html' class='external'>numpy.linalg.svd()</a>
(jako já si musel zopakovat i <a href='https://numpy.org/doc/stable/reference/generated/numpy.matmul.html' class='external'>násobení matic</a>,
ale tím bych se tady moc nechlubil).</div>
<pre># compute translation and rotation
a, b, c, d = 0, 0, 0, 0
for (x1, y1), (x2, y2) in pairs:
a += (x1-xc1) * (x2-xc2)
b += (x1-xc1) * (y2-yc2)
c += (y1-yc1) * (x2-xc2)
d += (y1-yc1) * (y2-yc2)
m = np.array([a, b, c, d]).reshape(2, 2)
U, S, V = np.linalg.svd(m)
# rot = U * V.T
# rot = U * V
rot = np.matmul(U, V)
trans = np.array([xc1, yc1]) - np.matmul(rot, np.array([xc2, yc2]).T)</pre>
<div class='p'>No a teď už jen drobný problém, že ta <i>U * V</i> není rotační matice … aha … není nad to si to sepsat. <span class='smile'></span>
Vždyť říkám, že mám i problém s násobením matic! Tak opravou za <i>np.matmul</i> už to jako rotační matice vypadá.</div>
<div class='p'>Chybí už jen dovětek, jestli se nejprve posouvá nebo rotuje (za mne „nekonečný příbeh”)? Ano, dopsal jsem si
unittesty na triviální případy, abych viděl co je převrácené nebo to nesedí.</div>
<div class='p'>Závěr? No nechal bych to s otevřeným koncem, protože by bylo dobré minimálně probrat <i>point-line</i>
variantu, možná nějaké optimalizační triky. Ale to raději až příště.</div>
<div class='p'>p.s. trošku jsem to poklidil, otočil směr rotace, takže i v natočení to začalo konvergovat, a výsledek vypadá takto:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/guide/scan-matching/scan-matching.gif' alt='uměle otočený 2. scan o 10 stupňů' title='uměle otočený 2. scan o 10 stupňů' class='border' width='640' height='480'/></span><br/>
<span>uměle otočený 2. scan o 10 stupňů</span>
</td></tr></table></div>
<div class='p'>případně python kód je zatím <a href='https://github.com/robotika/osgar/compare/master...feature/eduro-vanjee' class='external'>zde</a>.</div>
<hr/>
<div class='p'><a href='/guide/scan-matching/cs#email'>kontaktní formulář</a>.</div>
Robotour 2024https://robotika.cz/competitions/robotour/2024/cs2023-12-12T00:00:00ZMartin Dlouhý
Devatenáctý ročník soutěže outdoorových autonomních robotů se bude konat
<b>14. září 2024</b> v zámeckém parku Buchlovice. Do krásného parku se sice
platí vstupné, ale lze jej zkombinovat i s návštěvou zámku. Soutěž je přístupná
veřejnosti.
<hr/>
<h2>Pravidla</h2>
<div class='p'>Pravidla jsou stejná jako loni a naleznete je GitHubu s tagem ROBOTOUR2023RC1:
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2023RC1/rules/pravidla.md' class='external'>česky</a>
a
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2023RC1/rules/rules.md' class='external'>anglicky</a>.</div>
<hr/>
<h2>Lokalita</h2>
<div class='p'>Soutěž bude probíhat v zámeckém parku <a href='http://zamek-buchlovice.cz/' class='external'>Buchlovice</a>.</div>
<ul>
<li><a href='https://zamek-buchlovice.cz/en/photogalleries/1469-the-chateau-garden' class='external'>https://zamek-buchlovice.cz/en/photogalleries/1469-the-chateau-garden</a></li>
</ul>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice1.jpg'><img src='/competitions/robotour/2024/buchlovice1_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice2.jpg'><img src='/competitions/robotour/2024/buchlovice2_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice3.jpg'><img src='/competitions/robotour/2024/buchlovice3_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice4.jpg'><img src='/competitions/robotour/2024/buchlovice4_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice5.jpg'><img src='/competitions/robotour/2024/buchlovice5_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice6.jpg'><img src='/competitions/robotour/2024/buchlovice6_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice7.jpg'><img src='/competitions/robotour/2024/buchlovice7_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice8.jpg'><img src='/competitions/robotour/2024/buchlovice8_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchlovice9.jpg'><img src='/competitions/robotour/2024/buchlovice9_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
</tr>
<tr>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchloviceA.jpg'><img src='/competitions/robotour/2024/buchloviceA_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchloviceB.jpg'><img src='/competitions/robotour/2024/buchloviceB_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2024/buchloviceD.jpg'><img src='/competitions/robotour/2024/buchloviceD_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<hr/>
<h2>Partneři</h2>
<div class='p'><table class='image_panel center' style='width: 358px;'><tr><td>
<a href='http://zamek-buchlovice.cz/'><img src='/competitions/robotour/2024/npu-logo.png' alt='' title='' class='border' width='352' height='149'/></a><br/>
<a href='http://zamek-buchlovice.cz/'></a>
</td></tr></table></div>
<div class='p'><center>
<table border="0">
<tr>
<td><table class='image_panel center' style='width: 454px;'><tr><td>
<a href='https://www.bdsensors.cz/'>
<span><img src='/competitions/robotour/2024/bd-sensors-logo.png' alt='' title='' class='border' width='444' height='72'/></span>
</a>
</td></tr></table></td>
<td><table class='image_panel center' style='width: 268px;'><tr><td>
<a href='https://www.visc.cz/'>
<span><img src='/competitions/robotour/2024/visc-logo.png' alt='' title='' class='border' width='258' height='73'/></span>
</a>
</td></tr></table></td>
</tr>
</table>
</center></div>
<hr/>
<div class='p'>Pokud chcete soutěž nějakým způsobem podpořit nebo máte nějaké doplnění/dotaz,
tak se nám prosím ozvěte pomocí <a href='/competitions/robotour/2024/cs#email'>kontaktního formuláře</a>.</div>
Enrich 2023https://robotika.cz/competitions/enrich/2023/cs2023-09-25T00:00:00ZJonas Wuehr
I can highly recommend visiting Enrich. Already the exclusive guided tour through the power plant is worth it. We participated with the hexapod and my robot Lois. The hexapod had some electrical problems and could not participate. Anyway, we had 3 successul rounds with Lois and could also find some artifacts and create a 3D map of a small part of the area. So it was not a complete shame <span class='wink'></span>
<b>Update:</b> 8/11/2023 — <a href='/competitions/enrich/2023/cs#231108'>The Full Story</a>
<div class='p'>I totally underestimated how complicated is to operate a robot remotely but after the first round and some additional training I got familiar with the situation. The big problem at the competition is bad WIFI. Although it is provided by the organisator, it is a really bad connection because of the thick concrete walls and the robot also switches between multiple access points. So You can completely forget about using a distributed ROS setup or something similar. I fixed the problem by creating a tmux session, where I could give the robot simple commands like drive 1m on this course and then stop. For camera transmission X-forwarding worked kind of well. The whole mapping was running on the robot and based on rtabmap.</div>
<div class='p'>Next year the organizer wants fully autonomous robots.</div>
<div class='p'>In the end many other teams had the same problems and it was a great week anyway. I would definitely go there again.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/control-room.jpg' alt='Control room' title='Control room' class='border' width='-1' height='-1'/></span><br/>
<span>Control room</span>
</td></tr></table>
<table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/display.jpg' alt='Display' title='Display' class='border' width='-1' height='-1'/></span><br/>
<span>Display</span>
</td></tr></table>
<table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/hexapod.jpg' alt='Hexapod' title='Hexapod' class='border' width='-1' height='-1'/></span><br/>
<span>Hexapod</span>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/lois.jpg' alt='Lois' title='Lois' class='border' width='-1' height='-1'/></span><br/>
<span>Lois</span>
</td></tr></table>
<table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/map3d.jpg' alt='3D Map' title='3D Map' class='border' width='-1' height='-1'/></span><br/>
<span>3D Map</span>
</td></tr></table>
<table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/power-plant.jpg' alt='Power plan' title='Power plan' class='border' width='-1' height='-1'/></span><br/>
<span>Power plan</span>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/reactor.jpg' alt='Reactor' title='Reactor' class='border' width='-1' height='-1'/></span><br/>
<span>Reactor</span>
</td></tr></table>
<table class='image_panel center' style='width: 5px;'><tr><td>
<span><img src='/competitions/enrich/2023/reactor2.jpg' alt='Reactor door' title='Reactor door' class='border' width='-1' height='-1'/></span><br/>
<span>Reactor door</span>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231108"></a></div>
<h1>ENRICH - The European Robotics Hackathon</h1>
<div class='p'>Incidents such as Fukushima, Majak or Chernobyl as well as the decommissioning and dismantling of old nuclear facilities (e.g. Sellafield, Asse or Murmansk) have taught us that the use of robotics technology has clear advantages. There are many measurement and sampling tasks too risky for humans to carry out. For these radiological and nuclear (RN) scenarios specialized robot systems have to be developed.</div>
<div class='p'>ENRICH takes place every two years at Zwentendorf Nuclear Power Plant in Austria. The organisers are The Austrian Armaments and Defence Technology Agency (ADTA), EVN AG, European Robotics and mainly the Cognitive Mobile Systems Department of the Fraunhofer Institute for Communication, Information Processing and Ergonomics FKIE. The event is not organised as a competition but as a trial. There are some awards for best performance in specific subject areas. The main goal of the event is to give the teams the ability to demonstrate and test their technology in a realistic enviroment. The boiling water reactor of Zwentendof NPP ist perfect for this. This power plant was completed but never put into operation, so there is no high level of radioactivity. Already the exclusive guided tour through the power plant is worth visiting ENRICH <span class='smile'></span></div>
<h2>ENRICH 2023 (10.6.23 - 16.6.23)</h2>
<div class='p'>There were four tasks at ENRICH 2023:</div>
<ul>
<li>Mapping: Draw a digital 3D map of the power plant and a heat map of artifically placed real radiation sources.</li>
<li>Manipulation: Identify pipes containing radioactive coolant and close the corresponding valves.</li>
<li>Search and Rescue: Move dummy humans to a safe area with Your robot.</li>
<li>UAV: Do the Mapping task with an UAV (in a different area).</li>
</ul>
<div class='p'>I joined 107-Systems as one of the 13 teams going for ENRICH 2023. We participated with a hexapod called L3XZ and my differentially driven robot Lois one might know from different competitions. We decided to go for the mapping and manipulation tasks. For mapping I set up RTAB-Map using an Intel Realsense D435i and a SICK Lidar as source for odometry data. For the manipulation task a portal frame was added on the back of Lois. I 3D-printed a drum shaped tool with a camera in it's middle in order to be able to open and close the valves.</div>
<div class='p'><table class='image_panel left' style='width: 246px;'><tr><td>
<a href='/competitions/enrich/2023/manipulationtask.jpg'><img src='/competitions/enrich/2023/manipulationtask_t.jpg' alt='manipulatio task' title='manipulatio task' class='border' width='240' height='381'/></a><br/>
<a href='/competitions/enrich/2023/manipulationtask.jpg'>manipulatio task</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/enrich/2023/manipulationtool.jpg'><img src='/competitions/enrich/2023/manipulationtool_t.jpg' alt='manipulation tool' title='manipulation tool' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/enrich/2023/manipulationtool.jpg'>manipulation tool</a>
</td></tr></table></div>
<div class='p'>There are three runs. As the hexapod had some electrical problems we only participated with Lois. I totally underestimated how complicated it is to operate a robot remotely and crashed the valve manipulation tool by driving backwards into a door during round one. After the first round and some additional training I got familiar with the situation. One problem at the competition is bad WIFI. Although it is provided by the organisator, it is a really bad connection because of the thick concrete walls and the robot also switches between multiple access points. So You can completely forget about using a distributed ROS setup or something similar. I fixed the problem by creating a tmux session, where I could give the robot simple commands like drive 1m on this course and then stop. For camera transmission X-forwarding worked kind of well. The whole mapping was running on the robot itself, so it was not affected by connectivity issues.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/enrich/2023/crashedtool.jpg'><img src='/competitions/enrich/2023/crashedtool_t.jpg' alt='crash' title='crash' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/enrich/2023/crashedtool.jpg'>crash</a>
</td></tr></table></div>
<div class='p'>Anyway, we had 3 successul rounds where Lois came back from the area to be explored. We could also find some radioactive artifacts and create a 3D map of a small part of the area.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/enrich/2023/uavmappingtask.jpg'><img src='/competitions/enrich/2023/uavmappingtask_t.jpg' alt='UAV mapping task' title='UAV mapping task' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/enrich/2023/uavmappingtask.jpg'>UAV mapping task</a>
</td></tr></table></div>
<div class='p'>Many other teams had the same problems and it was a great week anyway. I would definitely go there again. Next year the organiser wants fully autonomous robots.</div>
<h2>Links</h2>
<ul>
<li><a href='https://enrich.european-robotics.eu/' class='external'>https://enrich.european-robotics.eu/</a></li>
<li><a href='https://107-systems.org/' class='external'>https://107-systems.org/</a></li>
</ul>
Freyjahttps://robotika.cz/robots/freyja/cs2019-08-07T00:00:00ZJiří Iša (zkompiloval Martin Dlouhý)
Freyja je čtyřkolový diferenciálně řízený robot, který zatáčí pomocí smyku. Je
dílem švýcarského <b>Cogito Teamu</b>, který je jednou z „organizací” zapojených
do <i>SubT Challenge Tunnel Circuit</i>. Freyja vznikala 3 měsíce z nuly v jednom
člověku a je to až neuvěřitelné, že je to vůbec možné … tak mi přišlo líto to
nezdokumentovat! <span class='wink'></span> <b>Update:</b> 4/10/2023 — <a href='/robots/freyja/cs#231004'>Freyja 2.0, jaro a léto 2023</a>
<ul>
<li><a href='https://sites.google.com/site/cogitoteam/subterranean-challenge' class='external'>https://sites.google.com/site/cogitoteam/subterranean-challenge</a></li>
</ul>
<div class='p'>Tento „článek” je kompilací Jirkových mailových reportů během přípravy na
<a href='/competitions/subtchallenge/tunnel-circuit/cs'>SubT Challenge Tunnel Circuit</a>.</div>
<div class='p'>Je třeba vzít v úvahu hodně omezený časový rámec v jakém Freyja vznikala —
rozhodnutí padlo po našem návratu ze <a href='/competitions/subtchallenge/stix/cs'>SubT
STIX v Idaho Springs/Colorado</a> v dubnu a do konce června se musela
kvalifikovat (předvést autonomní jízdu, funkčnost ručního a vzdáleného
EMERGENCY STOP a demonstrovat průjezd úzkým prostorem). Soutěž samotná začíná
15. srpna 2019.</div>
<hr/>
<h2>Freyja: Stav k 27.5.</h2>
<div class='p'>Narodila se nám Freyja. Na lačno (= bez baterek) váží 25 kg. Trochu váhy se dá
ubrat přestěhováním elektroniky (pc, stereokamery) do batohu. Obrázek v
příloze.</div>
<div class='p'>Konstrukce je v zásadě hotová. Pár kousku, jako třeba SICKy, zatím chybí, ale
pro homologaci nejsou potřeba. Kabeláž hotová není. Akumulátor tam, jak jsem
napsal o pár řádků výš, zatím taky není.</div>
<div class='p'>Dobrá zpráva je, že mě unese, když si na ni kleknu. Špatná zpráva je, že
kombinace těchhle pneumatik a zatáčení smykem je nedomyšlena. Takže teď se
kromě roztrhnutí obávám i neschopnosti zatočit. Skoro mám chuť přestavět ji
na <a href='/robots/kloubak/cs'>kloubáka</a>, ale to v časovém limitu nehrozí <span class='wink'></span> A taky by
se mi pak nevešla do jednoho zavazadla.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/freyja/freya-birth.jpg'><img src='/robots/freyja/freya-birth_t.jpg' alt='IMG_20190527_211726882.jpg' title='IMG_20190527_211726882.jpg' class='border' width='320' height='240'/></a><br/>
<a href='/robots/freyja/freya-birth.jpg'>IMG_20190527_211726882.jpg</a>
</td></tr></table></div>
<div class='p'>Zbyněk: <i>Wow. To je dost impozantní! Už jsi posílal link, kde jsi kupoval ta
kola?</i></div>
<ul>
<li><a href='https://www.uumotor.com/9-10-13-15-350w-500w-800w-mono-shaft-motor.html' class='external'>https://www.uumotor.com/9-10-13-15-350w-500w-800w-mono-shaft-motor.html</a>
resp. <a href='https://www.uumotor.com/ws/p/48v-800w-gearless-brushless-mono-shaft-motor/' class='external'>https://www.uumotor.com/ws/p/48v-800w-gearless-brushless-mono-shaft-motor/</a></li>
</ul>
<div class='p'>PavelS: <i>Trochu je škoda, že se nikdo nepoučil z Robíka - o problémech
smykového podvozku (potažmo v terénu) jsem psal a mluvil opravdu hodně a
většina ze zúčastněných to viděla v akci...</i></div>
<div class='p'>"Nikdo nepoučil" je trochu extrémní vyjádření. Na vědomí jsem to vzal a mimo
jiné jsou ta kola kupříkladu kulatější v příčném směru, než má Robík. Taky je
to silově celé dost výrazně naddimenzované. Odtud obava o roztrhnutí. A dost me
mrzí, že kvůli přepravním rozměrům nemůže být širší, aby měl lepší zatáčecí
páku.</div>
<div class='p'>Na druhou stranu, navzdory opakovaným a opakovaným snahám zjistit kde přesně je
s tím problém jsem se dozvěděl tak nanejvýš "smykový podvozek bych už znovu
nestavěl", "<a href='/robots/eduro/cs'>Eduro</a> nemělo šanci kvuli casteru" a co všechno
jiného by kdo nestavěl. Naposledy včera: "Kloubáka bych (zatím) neduplikoval".
To všechno můžu zkombinovat s vlastními zkušenostmi, jako třeba že odpružit
těžkého robota není žádná sranda. Za takových okolností mám dvě možnosti: Nedělat
nic, nebo odhadnout některou variantu jako možná funkční a možná pro mě
vyrobitelnou.</div>
<div class='p'>Koneckonců, jezdil jsem jak s mobem, tak se šestikolkou, takže nějaké
zkušenosti se smykovými roboty mám. Což je i důvod, proč moji předchozí roboti
smykoví nebyli <span class='wink'></span> Na nedělat nic ještě dojít může, pokud se ukáže, že jsem to
odhadl špatně. Jsem ochotný s tím žít.</div>
<div class='p'>MD: <i>well, to vypadá na flame ... :(</i></div>
<div class='p'><i>Za mne byl zatím Robík jediný robot, který dával i složitější terén - a to za
mne stále platí. Dále je to stále "nejjednodušší konstrukce" - i toho bych se
držel. Volili ho ostatní, tak to "úplně mimo" není (CMU, Colorado/Husky, teď
CRAS). Koloubák ani po měsíci ještě nejede rovně a je dost možné, že skončí v
"Robík konfiguraci".</i></div>
<div class='p'><i>Takže s hláškou PavlaS nesouhlasím (slyšeli jsme to mnohokrát, ale v praxi to
dával lépe) ... a pravě důvod jak jsem ho viděl bych ho i znova volil (viz mé
starší maily o odkupu). Až někdo bude mít alternativní platformu, která do
30dni bude zvládat terén v tunelu, tak rád změním názor.</i></div>
<div class='p'>Tak já zatím hlavně nemám problém. Jen obavy. Takže těžko problém popisovat.
Obava je, že v tuhle chvíli je přilnavost k hladké podlaze taková, že se smyk
nebude konat. Vůbec.</div>
<div class='p'>Jako nejlepší popis by mi asi přišlo video z pohledu vnějšího pozorovatele v
situaci, kdy má robot potíže. Jinak, jak říkáš, je to dost vágní popis.</div>
<div class='p'>Vzrušenější debata, kdy si navzájem ujasníme názory a výchozí předpoklady, mi
přijde užitečná. Kdybychom na sebe měli jen křičet a dokola opakovat to samé,
pak by neměla smysl.</div>
<div class='p'>V tuhle chvíli to vidím dost podobně jako Martin — byla to jediná platforma,
která něco dělala a je nenulová šance, že udělá znovu. A když jezdí tanky,
nějak to jít musí. Na vynálezy nemam čas. Zároveň ale jsem si vědom rizik, a
proto všechnu svoji účast podmiňuju "ujede metr a zatočí". Pokud tohle zvládne,
dá i to ostatní. Pokud ne, byla sranda a mám spoustu nových dílu na staré
roboty.</div>
<hr/>
<h2>Freyja: Stav k 2.6.</h2>
<div class='p'>Světla svítí, kola se točí (ve vzduchu). Tj. základní kabeláž je hotova. Včetně
červeného tlačítka.</div>
<div class='p'>Plán na další týden: Jízda na joystick. A pokud by se opravdu hodně poštěstilo,
tak i remote stop.</div>
<div class='p'>MD: <i>Až robota dáš na zem (což už jsi touto dobou určitě udělal), nechceš
rovnou natočit video se STOP tlačítkem - ručním a vzdáleným (Ctrl+C)?
Pokud to dáš jako </i>unlisted"" něco jako "Robotika/Freyja SubT Tunnel
Circuit Qualification", tak to mužu rovnou přeposlat??""</div>
<div class='p'>Kdepak, na zem ještě nešla. Na to je moc hrozivá <span class='wink'></span> Ale joydrive ve vzduchu,
zda se, funguje. Trošku zklamání je, že ty odrive kontrolery nedokážu (zatím)
krmit rychleji, než na 20 Hz. Příjemné překvapeni je, že odrive (už?) podporuje
watchdog, takže, až to připrogramuju na své straně, motory by mely po CTRL+C
přestat udržovat rychlost.</div>
<div class='p'>Stačí pro homologaci opravdu červené tlačítko a ctrl+c, nebo je potřeba i
remote e-stop? A vycházím z předpokladu, že joydrive je přípustná homologační
jízda, protože některé týmy koneckonců v tunelu nic jiného nedělají. Je potřeba
předstírat detekci objektu?</div>
<div class='p'>MD: <i>předstírat detekci objektu určitě ne (to už jsme dělali na STIX a to jim
stačí per team). e-stop je diskutabilní, ale budu jim tvrdit, že používáme
jednotný SW a jestli na tom trvají, tak ať ti pošlou dva vzorky do Švýcar
(předpokládám, že pak na tom trvat nebudou). Co jsme se bavili se Zbyňkem, tak
ten kill switch je asi primárně pro drony a "nebezpečné potvory" a Freyja zatím
vypadá přátelsky. Ale čím dříve jim ty "homologační videa" pošlu, tím dříve
budu mít jistotu, že s E-stopem nebudou prudit.</i></div>
<hr/>
<h2>Freyja - první videa (milnik dosazen) (7/6/2019)</h2>
<div class='p'>Martine, řekni si, jestli ti to první video vyhovuje.</div>
<div class='p'>To druhé ukazuje, že na čtyřkolce bude asi lepší pro odometrii brát minimum z
enkoderu na jedné straně místo jejich průměru. Takhle je to zjevné, ale v kódu
to mám blbě. PID ještě není naladěné, proudový limit je nízký, takže nějaké
velké závěry bych z toho druhého videa nedělal.</div>
<div class='p'>Viděl jsem ji i zatočit (milník dosažen!), ale kvůli gumovému a slabému PID to
byl buď hodně neřízený prosmyk na té hladké podlaze, nebo opravdu široký oblouk
venku na asfaltu. Taky jsem se na ni metr svezl <span class='smile'></span></div>
<ul>
<li><a href='https://youtu.be/L738ZErWUe8' class='external'>https://youtu.be/L738ZErWUe8</a></li>
<li><a href='https://youtu.be/aAVI79Q2SiE' class='external'>https://youtu.be/aAVI79Q2SiE</a></li>
</ul>
<div class='p'>MD: <i>:) super! Jen mne v první chvíli vylekala ta tma v půlce prvního videa -
prostě po stisknuti STOP tlačítka to i zhasne. Snad pochopí, že ten druhy STOP
je na klávesnici (možná jsi to komentoval, já to pouštěl bez zvuku). Pošlu a
uvidíme</i></div>
<div class='p'>Dobry nápad, ale nekomentoval. "Remote stop" je v popisku pod videem.</div>
<div class='p'>PavelJ: <i>Pěkný :-) Akorát se mi pořád nechce věřit, že je to jen 45cm široké. Působí to na mne mohutněji.</i></div>
<div class='p'>46 cm je možná přesnější číslo. Ale skoro půlka z toho jsou kola, takže proto
to vypadá trochu divočeji. To tělo je úzké. 24 cm by mohla být šířka <a href='/robots/mobos/cs'>mobose</a> bez
jednoho kola, ne?</div>
<div class='p'>S lepším PID nastavením to vypadá lépe: <a href='https://youtu.be/ROKj9tp_a94' class='external'>https://youtu.be/ROKj9tp_a94</a></div>
<div class='p'>A teď jdu zpevňovat upevněni kol, protože povolilo :-/</div>
<div class='p'><b>Možná je tohle můj "low week". Paradoxně kvůli tomu, že vývoj probíhá přesně
podle očekávání :-) Žádné zázraky se nekonají.</b></div>
<hr/>
<h2>Freyja: Stav k 16.6.</h2>
<div class='p'>Dobrá zpráva:
Funguje jízda na joystick s logováním kamer a stereo kamer.</div>
<div class='p'>Špatná zprava:
Většinou.</div>
<div class='p'>Zdroj potíží:
USB na limitu svých schopností, nebo těsně za ním. Každé zařízení si vyžádá
nějakou přenosovou rychlost, každé z nich udělá horní odhad a napříč přes čtyři
kamery, dvě stereo kamery, joystick a wifi se to nasčítá. USB pak odmítá
spolupracovat. <a href='/articles/reviews/kayeton-camera/cs'>Kayeton kamery</a>, které si
pro jistotu vyžádají maximum možné to jistí :-/</div>
<div class='p'>Současné řešení:
Vlastní fork uvcvideo ovladače, který pro kamery s komprimovaným streamem (tj.
kayeton) udělá vlastní odhad přenášených dat, kdežto pro nekomprimovaný stream
(stereo Mynt Eye) respektuje přání zařízení. Taky jsem různě pozpřehazoval
joystick a wifi, aby byly na jiných USB "bus".</div>
<div class='p'>Budoucí riziko:
Ještě jsem nezapojil IMU a Frantův <a href='/articles/reviews/lora/cs'>LoRa modul</a>. Ty taky přijdou do USB :-/</div>
<div class='p'>Možná budoucí řešení:</div>
<ul>
<li>Zahodit USB wifi a Wifi router místo současného hloupého ethernetoveho switche. Nebo se pokusit rozchodit virtuálni wifi na integrovaném wifi modulu.</li>
<li>Možná by tam šlo přihodit RaspberryPI nebo něco jako USB proxy, ale moc se mi do toho nechce. Mimo jiné proto, že by se to nevešlo.</li>
<li>Snížit FPS kamer ze současných 30 Hz na 15 Hz.</li>
</ul>
<div class='p'>Další nešťastný důsledek:
Vypadá to, že USB řadič se zahřeje natolik, že i CPU o kousek vedle nadává na
vysokou teplotu. A to jsem ještě nezačal nic počítat.</div>
<div class='p'>Zajímavá zpráva:
Loguju cca 3 GB za minutu. Tj. na disku mam místo na dvě hodiny jízdy a ani na
největší disk v domácnosti se nevejde nijak oslnivě mnoho.</div>
<div class='p'>MD: <i>řekl bych "no tě bůh!" (i když poslední dobou všichni okolo říkají "Zdař
Bůh"! :).</i></div>
<div class='p'><i>3GB/min - máš nějaký "- - stat", kolik co žere? To je předpokládám ještě
bez lidaru, right? 4 kamery, 2 stereo kamery?</i></div>
<div class='p'>Výborná otázka. Přidal jsem do logvieweru výpis statistiky. Vypadá to, že cca
půlka dat je hloubková mapa z přední stereo kamery. Takže až začnu počítat
zadní, jsem v háji. Dobrá zpráva na tom ale je, že hloubka jsou v tuhle chvíli
metry ve floatech. Když z toho udělam centimetry nebo milimetry a protobuf to
uloží jako varinty, mělo by se to výrazně srazit (zhruba na půlku?). Za cenu
náročnější serializace/deserializace. Špatná zpráva je, že zadní stereo kamera
má skoro dvakrát vyšší framerate. Možná to bude chtít podívat se po kompresních
algoritmech pro hloubkové mapy.</div>
<div class='p'>Čtyřminutový log (hm, takže venku je to víc jak 3 GB / min):</div>
<pre>.configuration: 1.83 kB
camera_back.jpeg: 1.34 GB
camera_front.jpeg: 1.57 GB
camera_left.jpeg: 1.54 GB
camera_right.jpeg: 1.32 GB
freyja.buttons: 163.86 kB
freyja.pose2d_info: 78.62 kB
freyja.velocity2d_info: 69.56 kB
heartbeat.heart_beat: 154.78 kB
joydrive.beep: 217.01 kB
joydrive.velocity2d_cmd: 239.72 kB
joystick.joystick: 683.92 kB
logging.LoggingInfo: 385 B
loginfo2text.text: 313 B
selfcheck.LoggingInfo: 393 B
stereo_back.jpeg: 1.04 GB
stereo_front.depth_map: 6.20 GB
stereo_front.jpeg: 545.89 MB</pre>
<div class='p'>MD: <i>
stereo_front.depth_map: 6.20 GB
to je zippovany výstup? nebo nebalené pole? (u Huskyho ani ve virtuálu jsem neměl šanci přežít s hloubkovou mapou bez pakování :(
dík
m.
p.s. předpokládám, že zatím loguješ vše svým kódem, right?
</i></div>
<div class='p'>Nebalené pole. Od zipu bych si moc nesliboval. Tobě něco dělal? Ale pokud bych
uložil inty a každá další hodnota by byla uložena jako rozdíl od hodnoty
předchozí, pak by to vzhledem k vysoké "plochosti" mohlo dát velmi malý počet
různých hodnot a jejich kombinaci a to už by zipovat jít mohlo.</div>
<div class='p'>Ano, jsou to všechno protocol buffery.</div>
<div class='p'>Zbyněk: <i>To jo, ale balit to zipem není dobrý nápad CPU-wise. Jediný, co
působil jakž takž rozumně bylo lz4. Leda že bys měl nějaké zbytečné jádro, co
by se tomu mohlo věnovat.</i></div>
<pre>$ ls -lh /tmp/depth*
-rw-r- -r- - 1 jirka jirka 6.2G Jun 17 18:57 /tmp/depth.log
-rw-r- -r- - 1 jirka jirka 898M Jun 17 19:11 /tmp/depth.log.gz</pre>
<div class='p'>Při gzip -9.</div>
<div class='p'>Takže prostor ke zlepšení by tam byl. Co se cpu týče, možná stojí za úvahu
logovat nekomprimované a zabalit to až po jízdě.</div>
<div class='p'>A centimetrové inty jsou ještě o kus menší.</div>
<pre>$ ls -lh /tmp/depth_cm.log*
-rw-r- -r- - 1 jirka jirka 2.0G Jun 17 20:12 /tmp/depth_cm.log
-rw-r- -r- - 1 jirka jirka 522M Jun 17 20:32 /tmp/depth_cm.log.gz</pre>
<hr/>
<h2>Freyja: Stav k 24.6.</h2>
<div class='p'>Zbrzdila mě rýmička. A dcera zvrací. A do toho se nám v práci tenhle týden
sjíždí ~60 lidi z celého světa :-/</div>
<div class='p'>Teoreticky mám naprogramovanou jízdu pomocí pravé zdi podle stereokamery, což
by pro homologaci mělo stačit.</div>
<div class='p'>Prakticky to ještě nejelo víc než tři metry na balkóně, kde není moc místa.
Doma má stereokamera potíže s ne moc texturovanou hodně odrazivou podlahou. Je
možné, že na testovacím polygonu (tj. ve sklepě) to bude podobné.</div>
<div class='p'>MD: <i>máš zapojený lidar? Nebylo by to jednodušší? OSGAR na Freyje asi ještě
není right?</i></div>
<div class='p'>Lidar zapojený není a do konce týdne nebude. A ano, pro jízdu podél zdi by to
bylo jednodušší.</div>
<hr/>
<h2>SubT Qualification - Robotika robots Freyja and Kloubak (28/6/2019)</h2>
<div class='p'><b>Thanks for sending Martin. We'll go ahead and accept these videos as
sufficient for qualifying the two additional platforms. We would still be
interested in seeing any further videos, but nothing else is required for
bringing your platforms to the Tunnel Circuit and competing with them.</b></div>
<div class='p'>Martine, můžeš jim poslat nové video?</div>
<ul>
<li><a href='https://youtu.be/VMXuGFwEE8I' class='external'>https://youtu.be/VMXuGFwEE8I</a></li>
</ul>
<div class='p'>@"piece of cake": Ani nevíš, jak jsem pak ztuhnul, když se následující zatáčka ne a ne podařit <span class='wink'></span></div>
<hr/>
<h2>Freyja: Stav k 30.6.</h2>
<div class='p'>Kvalifikováno.</div>
<div class='p'>S čím byly potíže:</div>
<ul>
<li>Pořád ještě někdy (mám podezření, že při vysoké teplotě cpu nebo motherboardu), nenaběhne odrive a v logu je oblíbené "not enough bandwidth". Homologační videa jsem natáčel s vypnutými kamerami.</li>
<li>I když všechno naběhne (včetně těch kamer), je řízení jakési zpomalené.</li>
<li>Jízda kolem rohu bez mapy, když stereo kamera kouká jenom dopředu a onen roh nevidí.</li>
<li>Kompas občas najednou poskoci o ~šedesát stupňů. Zatím natvrdo takové skoky ignoruju, ale především by neměly nastat.</li>
</ul>
<div class='p'>Co fungovalo pěkně:</div>
<ul>
<li>Freyja zatáčení urve a už ji při tom nepovoluje uchyceni kol.</li>
</ul>
<div class='p'>Co mám v planu další týden:</div>
<ul>
<li>V zásadě nic. Mám tu na návštěvě rodiče.</li>
<li>Když najdu nějaký čas, budu buď řešit některé ze známých problémů, nebo budu zkoumat vhodnost Jupyter Notebooku jako prostředí pro operátora. Python běžící na robotovi a přístupný z prohlížeče mi zní jako zajímavá možnost.</li>
</ul>
<hr/>
<h2>Freyja: Stav k 7.7.</h2>
<ul>
<li>SICKy jsou připevněny a zapojeny. Lezou z nich (trochu divná) data.</li>
<li>Přidal jsem 1.8 TB harddisk naformátovaný jako ZFS s kompresi. Mělo by se na něj vejít odhadem 2.5 - 3.5 TB logu (~ 13 - 19 hodin jízdy).</li>
</ul>
<div class='p'>Překonané potíže:</div>
<ul>
<li>SSD je tak rychlé, že to ZFS driver při ukladáni plnou parou vpřed nedá, crashne a vezme s sebou systém. Žádné chybové hlášky, kterých bych se dokázal chytit :-/ Řešením bylo přepnout ZFS z asynchronního do synchronního režimu. Nevím proč. Šťastný odhad.</li>
<li>Umím změnit IP adresu SICKa i bez magických aplikaci.</li>
</ul>
<div class='p'>Nepřekonané potíže:</div>
<ul>
<li>SICK Sopas a App Studio pro Linux nejsou a na Wine neběží. Bez App Studia tu jejich Luu podle všeho patřičně nezabalím. Tohle řešit nehodlám.</li>
<li>Naměřené vzdálenosti obou SICKu nějak divně "pulzuji". Celé to kmitá o zhruba deset cm tam a zpátky. Pokud jste to někdy viděli, dejte vědet, co s tím.</li>
</ul>
<div class='p'>Zbývá dodělat:</div>
<ul>
<li>Kritický hw: Dálkové vypínání.</li>
<li>Nekritický hw:</li>
<li>Lepší boční krabičky se zapínáním/vypínáním, s nouzovým stop tlačítkem, kamerami a žárovičkami. Kamery a žárovičky teď trčí a při nošení a bočních nárazech do zdi trpí.</li>
<li>Lora. Ačkoli pořád nevím, co s ni jako budeme dělat.</li>
<li>Sw: Všechno.</li>
<li>Organizace: Letenky, baterky do USA.</li>
</ul>
<div class='p'>Franta: <i>Re LoRa - samozřejmě by se to dalo použít k nějaké koordinované
exploraci (swarm, atd), ale i bez toho by roboti měli minimálně broadcastovat
nalezené artefakty a pozici, rychlost, orientaci, atd a být na příjmu pro
instrukce typu zastav, otoč se, vrať se na základnu, jed' na koordináty x/y
apod.</i></div>
<div class='p'>Zni to pěkně. A má to pár slabých míst:</div>
<ul>
<li>Nemáme detekci artefaktů a u pozice teprve domlouváme systém souřadnic, takže není *co* hlásit.</li>
<li>Krabičky jsou u tebe, takže je nikdo neintegruje ani do Osgara, ani do Erra. Takže není *odkud* hlásit.</li>
<li>Nemáme Control Station a nikdo ji neprogramuje. Takže není *kam* hlásit.</li>
<li>Operátor neví stav robota, takže *proc* by ho volal zpátky?</li>
<li>*Kdo* to naprogramuje a *kdy*?</li>
</ul>
<div class='p'>Pokud pro tyhle věci existuje plán, sem s ním. Nevím o něm. Pokud je to
dlouhodobá vize, ne krátkodobý plán pro Pittsburgh, tak je to ovšem jiná. Pak
bych ale celou tuhle diskuzi s radosti odložil za Pittsburgh a vyřešil to
pořádně.</div>
<hr/>
<h2>Freyja umí projet dvěřmi (otevřenými <span class='wink'></span> )</h2>
<ul>
<li><a href='https://youtu.be/ZlWl-0S2OXk' class='external'>https://youtu.be/ZlWl-0S2OXk</a></li>
</ul>
<div class='p'>Spousta senzorů ještě není integrována, takže velká část toho debugovacího
videa je černá. Až začnu používat imu, měl bych dokázat stereo detekci překážek
protáhnout níž k podlaze. Taky jsem vytáhl boční žárovičky, protože zavazí.
Chci je předělat. A přední a zadní svícení budu muset odstínit, aby nesvítilo
přímo do kamer.</div>
<div class='p'>Nicméně čekal jsem, ze můj první velký robot, který úspěšně projede dveřmi,
bude Clementine. S Edurem jsem to, pokud si dobře pamatuju, taky nedal.</div>
<div class='p'>PS: Zavřenými dveřmi možna taky umí projet <span class='wink'></span></div>
<hr/>
<h2>Freyja: Stav k 14.7.</h2>
<div class='p'>Dodělávám hw:</div>
<ul>
<li>Předělal jsem uchyceni bočních kamer a světla, aby nepřečnívaly a nepřišly tak snadno k úrazu.</li>
<li>Vyměnil jsem plastové distanční šrouby za kovové, kterým by se měl méně ochotně strhnout závit.</li>
<li>Vyměnil jsem desku pod PC, které jsem během středečního callu v přímém přenosu ulomil roh.</li>
</ul>
<div class='p'>Začínám dávat dohromady sw:</div>
<ul>
<li>Lokální plánovač nad daty z lidaru (bez nahromaděné mapy) funguje. Viz. video "průjezd dveřmi" v týdnu. Stereo kamery do něj ještě integrované nejsou.</li>
<li>Globalní lokalizace: Mám prototyp s rbpf-slam z MRTP <a href='https://www.mrpt.org/' class='external'>https://www.mrpt.org/</a>. Je to v zásadě to, co zkoušel Pavel, ale bez ROSu. Opět zatím jen nad daty z lidaru. A (zatím?) jen ve 2D. Dost mě irituje, že ani po deseti letech pokusů nedokážu napsat vlastní SLAM na míru :-( A že jsem to (zase) zkoušel <span class='smile'></span></li>
</ul>
<div class='p'>Doháním organizační věci:</div>
<ul>
<li>Koupil jsem letenky.</li>
</ul>
<div class='p'><table class='image_panel center' style='width: 266px;'><tr><td>
<span><img src='/robots/freyja/map.png' alt='SLAM' title='SLAM' class='border' width='260' height='310'/></span><br/>
<span>SLAM</span>
</td></tr></table></div>
<h2>Freyja: Stav k 21.7. (The Good, The Bad, The Ugly)</h2>
<div class='p'>The Good:</div>
<ul>
<li>SLAM je integrovaný. Když se robotovi chce, není to moc daleko a měsíc je v úplňku, vrátí se robot zpátky na start.</li>
</ul>
<div class='p'>The Bad:</div>
<ul>
<li>Odepsal jsem jeden SICK. Freyja *umí* vyjet na zeď, ale pak se tam *neudrží* :-/</li>
</ul>
<div class='p'>The Ugly:</div>
<ul>
<li>Z nějakého důvodu se mi zpožďuje poměrně triviální zpracovaní lidaru a
hromadí se mi tam zprávy. Mimo jízdu to dá skoro 10k zprav za sekundu, během
jízdy se mi tam občas hromadí data z 15 FPS lidaru. První podezření je na cpu
throttling způsobený přehřátím. Po zvýšení rychlosti otáček větráku se to už
nepřehřívá, ale problém trvá. Další podezřelý je linuxovy plánovač úloh, ale
podle "perf sched record" a spol. je všechno v pohodě a nic se nepřiškrcuje.
Podle htop je zátěž někde kolem 20% cpu. Hromadění zpráv má za následek jízdu
podle až několik sekund starých dat, takže se robot ztrácí a bourá do zdi. Když
na ni zrovna nevyjede. Začínám být krapet bezradný.</li>
</ul>
<hr/>
<div class='p'>Tak zpozděné zpracování se mi podařilo vztáhnout k vysoké teplotě na CPU (>=75
C). Potíž je, že se to takhle zahřeje, i když robota nechám otevřeného. Takže
ventilací to není. Asi nainstaluju nádrže s tekutým dusíkem.</div>
<div class='p'>MD: <i>1) jak vyčítáš data ze SICKu - máš tam sleep aby to vycházelo na 15Hz,
nebo jsi ho donutil, ať "stremuje"? Defaultně ti totiž klidně pošle 10x stále
stejná data</i></div>
<div class='p'>Ano, streamuju. A jestli si špatně nepamatuju, nebo jsem neměřil něco jiného,
chodit by to mělo na těch 15 Hz. Můžu zkontrolovat … potvrzuji.</div>
<div class='p'>MD: <i>2) plánuješ nahradit dočasně TIM svým starším (TIM551?)</i></div>
<div class='p'>Ano, je tam teď našroubovaný můj TIM551 a pečlivě běhám za robotem <span class='wink'></span></div>
<hr/>
<div class='p'>Takového strýčka bych potřeboval dřiv <span class='wink'></span> A byly doby, ne tak dávno, kdy bych takový e-mail napsat neuměl :-/</div>
<div class='p'>Kontext pro ostatní: Náhradní SICK je na cestě.</div>
<hr/>
<div class='p'>Problém byl/je poměrně komplikovaný. Trošku jak letecká katastrofa.</div>
<div class='p'>1) Počítač se přehřívá a CPU reaguje zpomalením.</div>
<div class='p'>2) Po zpomalení běhu jednotlivých modulů se mi tam začínají hromadit na různých místech zprávy a nedorazí do cíle.</div>
<div class='p'>3) Na ODrive je puštěný watchdog. Když delší dobu nedorazí řídicí signál, zastaví.</div>
<div class='p'>4) Z takového zastavení se dá dostat jenom rebootem ODrive, o což se kód pokouší.</div>
<div class='p'>5) Reboot ODrive trvá zhruba 20 sekund. (Nějak dlouho trvá domluva mezi odrivem a PC na aktuálním protokolu a nastaveni všech možných RPC.)</div>
<div class='p'>6) V případě rebootu po watchdogu se mi podařilo nešťastně blokující volání dokud se ODrive neprobudí.</div>
<div class='p'>7) Během toho blokujícího volání se hromadily další zprávy.</div>
<div class='p'>8) Po restartu odrive tam mohlo byt nabufferovanych řídicích pokynů tak na půl minuty.</div>
<div class='p'>9) Hodně zmatených pokynů, protože byly vypočítané na základě různě navzájem opožděných měření.</div>
<div class='p'>10) Takže se je odrive jal vykonávati. Hurá na zeď.</div>
<div class='p'>11) To 20s stání spolu s výpisem na konzoli, že už se vrátil domů, byl důvod,
proč jsem nestihl zareagovat dost rychle.</div>
<div class='p'>PavelS: <i>Ahoj, jenom takový nápad - heatpipe chlazeni by mohlo byt účinější a
radiátor můžeš případně umístit mimo chlazený prostor.</i></div>
<div class='p'>Byl jsem zvědavý, jestli na tu blbost (nebo ne?) někdo zareaguje <span class='smile'></span> Díky.</div>
<div class='p'>Nejdřív zkusím softwarová řešení, jako třeba v BIOSU nastavit výkon větráku na
maximum bezpodmínečně a možná vypnout Turbo Boost. Intel Pstate, linuxové
řízení frekvence cpu, vykazuje navíc všechny znaky software od Intelu: Je to
piece of crap. Zkusím ho různě přenastavit, nebo vypnout&nahradit. Například
když přepnu z "performance" na "ondemand", trvá to o *hodně* dýl než to cpu
zase přehřeju. "ondemand" ho mnohem agresivněji drží těsně pod 75 C, aniž by se
mi něco začalo zasekávat. Tj. s "performance" mam horší výkon. Ehm.</div>
<div class='p'>Zbyněk: <i>Jo zkusit vypnout Turbo Boost mě taky napadlo. Až přijdeš na to, jak se to
dělá, tak to sem určitě napiš. Svého času jsem hledal case, který je vlastně
chladič a s procesorem je spojený pomocí heatpipe - tj. v podstatě to, co
navrhoval Pavel. V práci jsem kdysi takový velký chladič na procesor použil na
chlazení teplé strany peltiera a určitě uchladil přes 100W.</i></div>
<hr/>
<h2>Freyja: Stav k 28.7. (Vlastni SLAM 5/5)</h2>
<div class='p'>Vyřešeny potíže s přehříváním: Vypnul jsem v BIOSU Turbo Boost cpu, zapnul
větráky na 100 %, výrazně subsampluju data z kayetoních kamer.
RBPF SLAM se a) chvílemi zamyslel na moc dlouho, b) ztrácel. ICP SLAM se chová
lépe, ale taky se ztrácí. Nakonec jsem napsal s pomoci Ceresu vlastní hybrid
mezi ICP a GraphSLAMem s využitím triku z ORB SLAMu (keyframes). Je psaný více
s ohledem na real-time požadavky a na míru konkrétní úloze (informace o otočení
je absolutní, protože kompas; "uzavření smyčky" je většinou speciální případ,
protože robot se vrací domů zpátky po vlastních stopách). Mělo by být snazší
integrovat detekované <a href='/articles/reviews/apriltag/cs'>april tagy</a>.</div>
<div class='p'><b>Výsledkem je pět úspěšných návratů domu v pěti po sobě jdoucích jízdách.</b>
Z těch pěti jízd se třikrát vrátil zadkem napřed, dvakrát předkem. Ať žijí symetričtí roboti.</div>
<div class='p'>Taky se robot za skoro dvě hodiny testovaní jen dvakrát lehce dotkl zdi. Žádné
divočejší nárazy. To je novinka. Tj. (zatím) stíhá zpracovat data.</div>
<div class='p'>Dorazil nový SICK, ale ještě jezdím se svým vlastním starým.</div>
<div class='p'>Obavy do budoucna: i) Zbývá málo času a hodně práce. ii) Nemám reprezentativní
testovací prostredí. iii) SLAM nemusí se stejnými parametry fungovat v jiném
prostředí. iv) Zjevně operuju poblíž hranice teplotního/výpočetního/io výkonu.
A to mi ještě chybí jedno stereo vidění a detekce artefaktů ze čtyř kamer. v) V
úzkém prostoru nebo v rohu se dokáže Freyja dostat do situace, kdy se bojí jet
jak dopředu, tak dozadu.</div>
<div class='p'>MD: <i>:) gratuluji :) 5/5 zni dost dobře!
Ze zrad co mne napadá - mužeš tam zakomponovat šikmou plochu/nájezd do garáže? Co překážky, které nevidí lidar?
Není nad pravidelný Freyja update --- ten mne vždy vrátí naději :)
</i></div>
<div class='p'>No, na mě padal splín v týdnu. PC se přehřívalo a odolávalo mým zásahům, zprávy
se opoždovaly a nebylo to jak debugovat, SLAM nefungoval a já jsem věděl, že
funkční vlastní se mi navzdory mnoha pokusům nikdy napsat nepodařilo.</div>
<div class='p'>A máš pravdu, "je to 2D" mělo být na seznamu rizik. Kromě celé šikmé plochy
bych tam zařadil i "robot najel jedním kolem na cihlu". Něco takového jsem měl
na mysli v "nemám reprezentativní testovací prostor." Nicméně šikmý nájezd do
garáže mám. To bych zkusit mohl.</div>
<hr/>
<h2>Freyja: Stav k 4.8.</h2>
<ul>
<li>Freyja dostala kufr (viz příloha).</li>
<li>Spouštění/vypínání programu a zobrazování a přehráváni dat v prohlížeči
víceméně funguje (viz další příloha). Zatím není hotové řízení z prohlížeče.
Lesson learned: ipywidgets nepodporují mouse click na obrázek, ipyevents jsem
nějak nerozchodil.</li>
<li>Upadl připájený napájecí drát k jednomu z enkoderů. Je na tak nešťastném
místě, že oprava je náročná. Opraveno jest. Hrozně nerad bych aby se něco
podobného stalo na "soutěži".</li>
<li>Zase se mi někde zdržují zprávy. Aktualní hlavni kandidát je samotné Erro, a to
v místě, kde ukladám logy. Když neflushuju za každou zprávou, zlepší se to.
Když neloguju vůbec, zlepší se to ještě víc. Nelogovat na komprimovaný
souborový systém taky pomáhá. Ještě jsem ale nenašel řešení, které by fungovalo
úplně k mé spokojenosti.</li>
</ul>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/freyja/freyja-as-lagguage.jpg'><img src='/robots/freyja/freyja-as-lagguage_t.jpg' alt='' title='' class='border' width='320' height='240'/></a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231004"></a></div>
<h2>Freyja 2.0, jaro a léto 2023</h2>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/freyja/freyja2.jpg'><img src='/robots/freyja/freyja2_t.jpg' alt='Freyja 2.0' title='Freyja 2.0' class='border' width='320' height='240'/></a><br/>
<a href='/robots/freyja/freyja2.jpg'>Freyja 2.0</a>
</td></tr></table></div>
<div class='p'>Od posledních fotek z před čtyř let Freyja povyrostla. Přední a zadní stereo kamery MyntEye od nyní již zkrachovalého výrobce nahradily <a href='https://shop.luxonis.com/collections/oak-cameras-1/products/oak-d-pro-w?variant=43715946447071' class='external'>Oak-D Pro W</a> od Luxonis. Ty obsahují integrované RGB senzory, takže přední a zadní samostatné RGB kamery už nejsou potřeba a šly pryč. Boční RGB kamery byly nahrazeny za stereo kamery <a href='https://shop.luxonis.com/collections/oak-cameras-1/products/oak-d-sr' class='external'>OAK-D SR</a>. Freyja tím sice ztratila schopnost vnímání barev do stran, ale získala schopnost vnímat hloubku a tím detekovat překážky vedle sebe.</div>
<div class='p'>Místo dvou jednořádkových lidarů od SICku s úhlem pohledu 270 stupňů vozí jeden <a href='https://www.vanjee.net/vanjee_products/196228.html' class='external'>čtyřřádkový lidar VanJee</a> s výhledem do všech stran.</div>
<div class='p'>Přibyly dva <a href='/articles/ardusimple-rtk3b/cs'>Ardusimple simpleRTK3B GNSS moduly</a> a korekční RTK základnová stanice pro určení pozice, směru a náklonu, protože Freyja se po SubT, kde se <a href='/competitions/subtchallenge/tunnel-circuit/cs'>projela v uhelném dole</a>, chystá na <a href='/competitions/elrob/2024/cs'>ELROB</a>, kde bude jezdit tam a zpět v úloze robotické muly.</div>
<div class='p'>Pro úvodní fázi, kdy má robot následovat vůdčí osobu, zužitkuji <a href='/articles/pozyx/cs#220201'>UWB BU01</a>.</div>
<div class='p'>Co zůstalo z verze 1.0 jsou ODrive kontroléry motorů, i když nyní s podstatně lépe nastavenými proudovými limity, takže kontroléry jsou méně lekavé a nepřestávají řídit při sebemenším náznaku vyššího proudu. Jejich USB jsem opticky odizoloval, protože na jiných robotech na SubT vznikaly zemní smyčky, které ODrivy odpalovaly.</div>
<div class='p'>Robota nadále řídí Intel NUC. Kromě hallových senzorů v motorech v kolech zůstal asi jediný senzor, a to <a href='https://www.robot-electronics.co.uk/products/sensors/compass-sensors/cmps14-tilt-compensated-compass.html' class='external'>CMPS14</a>, což je magnetický kompas kombinovaný s gyroskopem a akcelerometrem.</div>
<div class='p'>S novým upevněním kol vytištěným z PLA s uhlíkovými vlákny se Freyja směle vrhá do nových off-road dobrodružství.</div>
<div class='p'><center>
<iframe width="692" height="389" src="https://www.youtube.com/embed/yzmFZMYC65c" title="Freya off-road, manual driving" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a href='/robots/freyja/cs#email'>kontaktní formulář</a></div>
Robotour 2023https://robotika.cz/competitions/robotour/2023/cs2023-04-04T00:00:00ZMartin Dlouhý
The 18th year of Robotour contest for autonomous outdoor robots will take place
in the city park of <b>Piešťany</b> in Slovakia on <b>30th September 2023</b>. Note, that
there is a minor rules update, that robots can deliver payload multiple times.
There will be 4 rounds at 10, 11:30, 14:30 and 16:00.
<b>Update:</b> 1/10/2023 — <a href='/competitions/robotour/2023/cs#231001'>A short summary</a>
<hr/>
<h2>Rules</h2>
<div class='p'>The rules are slightly updated when compared to the last year. They are available on GitHub with tag
ROBOTOUR2023RC1:
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2023RC1/rules/rules.md' class='external'>English</a>.
and
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2023RC1/rules/pravidla.md' class='external'>Czech</a></div>
<h2>Location</h2>
<ul>
<li><a href='https://www.openstreetmap.org/way/33267920#map=17/48.59238/17.83871' class='external'>OpenStreetMap</a></li>
</ul>
<div class='p'><table class='image_panel center' style='width: 370px;'><tr><td>
<a href='/competitions/robotour/2023/piestany-osm.png'><img src='/competitions/robotour/2023/piestany-osm_t.png' alt='' title='' class='border' width='364' height='309'/></a>
</td></tr></table></div>
<ul>
<li><a href='http://www.piestanycard.sk/behvparku/img/KratsiaTrasa.pdf' class='external'>detailed map for orienteering (PDF)</a></li>
</ul>
<div class='p'><center>
<table>
<tr>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/piestany-1723.jpg'><img src='/competitions/robotour/2023/piestany-1723_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/piestany-1724.jpg'><img src='/competitions/robotour/2023/piestany-1724_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/piestany-1802.jpg'><img src='/competitions/robotour/2023/piestany-1802_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></th>
</tr>
</table>
</center></div>
<hr/>
<div class='p'><a id="230729"></a></div>
<h2>Registration</h2>
<div class='p'>There is no registration form for this year - simply send us email (ideally till the <b>end of July 2023</b>) to <i>webmaster-at-robotika.cz</i>
with subject <i>Robotour 2023 - TEAM NAME</i></div>
<div class='p'>p.s. and thanks for already registered teams <span class='smile'></span></div>
<hr/>
<div class='p'><a id="230928"></a></div>
<h1><a href='http://live.robotour.cz' class='external'>live.robotour.cz</a></h1>
<hr/>
<div class='p'><a id="230930"></a></div>
<div class='p'><table class='image_panel left' style='width: 740px;'><tr><td>
<span><img src='/competitions/robotour/2023/robotour2023-results.png' alt='Robotour 2023 - results' title='Robotour 2023 - results' class='border' width='734' height='461'/></span><br/>
<span>Robotour 2023 - results</span>
</td></tr></table></div>
<hr/>
<div class='p'><a id="231001"></a></div>
<h2>A short summary</h2>
<div class='p'>OK, the game for 2023 is over, but it was a nice game. <span class='smile'></span> We had all weather conditions — from light rain, over mirror
roads once sun came up to perfect sunny afternoon as the day before. It was a kind reminder to teams that their robot has to be
ready for bad weather, and the lesson learned is that it is not enough to protect it from the top only. There was almost nobody,
when the competition started in the rainy morning, and it was quite crowded once the final run at 4pm was held.</div>
<div class='p'>The base was an outdoor cinema, but we could also use indoor space, which was great. Warm + electricity, what would you need more?</div>
<div class='p'>Not all robots show up on the preliminary testing round (yeah, some robots did not show even for the finals). The coordinates
for the 1st round remained the same, but nobody managed more than to leave the semi-autonomous zone. In particular I would highlight
<b>BeMaTo</b> team, which built a new robotic platform and even though it was driving with skid steering it was moving beautifully. Actually
you can find team <a href='/competitions/robotour/2006/teams/cs'>HiBeMaTo</a> in 2006 so there is „some” overlap. <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/bemato.jpg'><img src='/competitions/robotour/2023/bemato_t.jpg' alt='BeMaTo' title='BeMaTo' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2023/bemato.jpg'>BeMaTo</a>
</td></tr></table></div>
<div class='p'>Both <i>Istrobotics</i> and <i>ARBot</i> had issues to enter sandy footway from perfect asphalt road. Moreover there were leaves and bits
(maybe more than bits) of grass. Both teams were driving back and forth around the entry, but failed. I remember <i>Istrobotics</i>
hitting the bench and <i>ARBot</i> driving on the grass.</div>
<div class='p'>The 2nd round was supposed to be easy, pickup place next to the memorial of Stefanik, asfalt road all the way. But … the teams had
complete maps of the park with nearby roads and their planner looked for the optimal (shortest path, weighted length of segments
with the surface type), so they selected a direct road which I overlooked. Not only cars were there "once a while" but also "locomotive
with tourists". Again both leading times explored parking areas with cars, which was the end for <i>Istrobotics</i> once a driver of a pick-up
opened high white doors. It was not considered as obstacle by the robot. <i>ARBot</i> interupted his attempt when the robot finally found
the way back on the road, yes, in the middle of the road, and suddenly a locomotive was approaching it. I think that in the rules we have some
exception that it could be restored and <i>ARBot</i> would score an extra 10 points for pickup, but …</div>
<div class='p'>The 3rd round in the afternoon was on the main promenade, all the way to the fountain and left to a smaller road. Again both leading robots
went to the fountain without any issue but there must be something strange, because <i>Istrobotics</i> picked lower left corner and <i>ARBot"
the upper one. </i>ARBot"" managed to recover (the platform is tricycle, which can turn in place) and reached the pickup area, but <i>Istrobotics</i>
during backup ended in the grass without scoring. OTOH after manual recovery they managed to reach pickup, delivery and home without any
issue.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/arbot.jpg'><img src='/competitions/robotour/2023/arbot_t.jpg' alt='ARBot' title='ARBot' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2023/arbot.jpg'>ARBot</a>
</td></tr></table></div>
<div class='p'>The last 4th run was the most exciting. A lot of visitors and robots finally scored. <i>ARBot</i> was leading, pickup, delivery, but then
it was impossible for the robot to return on the main road. There was a small edge, change of surface and the robots always changed its
mind when it was "too close".</div>
<div class='p'><i>Istrobotics</i> decided to try a new rule that they can re-run the pickup-delivery pair for extra 20 points, but … as the robot was
approaching the pickup area Rado suddenly said that it would not work. There is a limit for 3 waypoints and after the last one the robot will
just go straight "for ever" (I would expect to stop but maybe this was some testing backdoor to test basic road navigation). And yes
the robot passed the pickup place without stopping and continue straight over two crossings. But then it headed to the service area!
There is a rule that robot can return (autonomously) to a service area anytime for repair or replacement of batteries. And that is exactly
what they did + increased the speed as the 1 hour for the round was ending. Yeah, and they did it — perfect pickup, delivery,
say hello to unhappy <i>ARBot</i> and back home. In total 51 points for this round and final victory!</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/short-circuits.jpg'><img src='/competitions/robotour/2023/short-circuits_t.jpg' alt='Short Circuits' title='Short Circuits' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2023/short-circuits.jpg'>Short Circuits</a>
</td></tr></table></div>
<div class='p'>And what about the other teams? <i>Short Circuits</i> had some fatal problems with the USB hub, which connected several critical sensors and over
time it degraded some much that in the final round the robot was not able to move at all. The opposite was the progress of team <i>Slnava</i>
and their „police car”. At 4:55pm it almost reached the end of the semi-autonomous zone, but failed. And <i>Smely Zajko</i>? Nobody knows.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/slnava.jpg'><img src='/competitions/robotour/2023/slnava_t.jpg' alt='Slnava' title='Slnava' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2023/slnava.jpg'>Slnava</a>
</td></tr></table></div>
<div class='p'>To summarize I would say that the contest was nice this year with dramatic finals. The park was large and combined various road types
and as Piestany is a spa city, there were also many visitors (once the sun showed up). Big thanks to Richard Balogh, who organized this year
Robotour! <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/teams.jpg'><img src='/competitions/robotour/2023/teams_t.jpg' alt='Robotour 2023 teams' title='Robotour 2023 teams' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2023/teams.jpg'>Robotour 2023 teams</a>
</td></tr></table></div>
<div class='p'>p.s. If you are interested and you would like to join us next year then you can look forward to the
<a href='https://www.zamek-buchlovice.cz/' class='external'>castle garden Buchlovice/Czech Republic</a>.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2023/poster.jpg'><img src='/competitions/robotour/2023/poster_t.jpg' alt='Robotour poster' title='Robotour poster' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2023/poster.jpg'>Robotour poster</a>
</td></tr></table></div>
<hr/>
<div class='p'>If you would like to somehow support this contest or you have some
comments/question, please use our standard <a href='/competitions/robotour/2023/cs#email'>contact form</a>.</div>
Paulahttps://robotika.cz/robots/paula/cs2021-02-02T00:00:00ZMartin Dlouhý
Paula je loňský model malé drony do dlaně. Je to hračka na doma za necelých 3kkč
od DJI a Intelu. Oficiální jméno zní <b>Ryze Tello</b>. Standardní použití je
řízení pres WiFi z mobilního telefonu, ale výrobce podporuje i oficiální SDK.
Tento blog je pro podobně praštěné, na které již to „domácí vězení” trošku padá
a potřebují rozptýlit. <span class='smile'></span> <b>Blog update:</b>
10/6/2023 — <a href='/robots/paula/cs#230613'>Tello go, go, go!</a>
<h2>Obsah</h2>
<ul>
<li><a href='/robots/paula/cs#210202'>210202 - Základní info</a></li>
<li><a href='/robots/paula/cs#210203'>210203 - Google Play 2.8</a></li>
<li><a href='/robots/paula/cs#210204'>210204 - command "command"</a></li>
<li><a href='/robots/paula/cs#210205'>210205 - H.264 video</a></li>
<li><a href='/robots/paula/cs#210206'>210206 - Takeoff!</a></li>
<li><a href='/robots/paula/cs#210207'>210207 - Selfie</a></li>
<li><a href='/robots/paula/cs#210208'>210208 - cv2.Stitcher_create</a></li>
<li><a href='/robots/paula/cs#230613'>230613 - Tello go, go, go!</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog / Paula</h1>
<div class='p'><a id="210202"></a></div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/paula/tello.jpg'><img src='/robots/paula/tello_t.jpg' alt='' title='' class='border' width='320' height='251'/></a>
</td></tr></table></div>
<h2>2. únor 2021 — Základní info</h2>
<div class='p'>Na <a href='https://www.ryzerobotics.com/tello' class='external'>Tello</a> dronu jsem narazil před pár dny,
kdy mi na YouTube vyskočilo 3 hodinové video
<a href='https://www.youtube.com/watch?v=LmEcyQnfpDA' class='external'>Drone Programming With Python Course (2021)</a>.
Jednak mne zaujalo, že je někdo schopen v tomto prostoru vysvětlit základy létání s dronou,
programování v Pythonu, OpenCV a pod. + i ta malá drona vypadala zajímavě. <span class='smile'></span>
Autor videa sice píše, že s DJI a Intel nemá nic společného, ale za mne jim reklamu rozhodně
dělá. Mne zviklal, že jsem si dronu objednal a dnes by měla dorazit (možná je to i motivace
začít sepisovat poznámky, než budu realitou nemile překvapen). Evidentně se nemohu dočkat/dospat,
protože bylo <i>3:45</i>, když jsem prvně koukl na hodiny.</div>
<div class='p'>Co je na té droně tak zajímavého? No připomíná mi to kombinaci staré <a href='/robots/heidi/cs'>Parrot ARDrone2 (Heidi)</a>
s SDK a možností řízení přes WiFi a o něco novější mini-drony <a href='/robots/jessica/cs'>Parrot Rolling Spider (Jessica)</a>.
Reklama slibuje 13 minut letu, streaming HD videa a snadné ovldádání. Je fakt, že <a href='https://terra-1-g.djicdn.com/2d4dce68897a46b19fc717f3576b7c6a/Tello%20%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/For%20Tello/Tello%20SDK%20Documentation%20EN_1.3_1122.pdf' class='external'>Tello SDK 1.3 (pdf)</a>
má pouhých 8 stránek a projdete to za pár minut.</div>
<h3>Řízení</h3>
<div class='p'>Drona se ovládá pomocí UDP paketů, kde na první pohled vidím tři kanály pro tři porty:</div>
<ul>
<li>8889 — posílání příkazů</li>
<li>8890 — příjem stavů</li>
<li>11111 — příjem videa</li>
</ul>
<div class='p'>Defaultní IP adresa je 192.168.10.1 a předpokládám, že drona má DHCP s nastavitelným zabezpečením.</div>
<div class='p'>Příkazy jsou textové, jako <i>takeoff</i>, <i>land</i>, <i>streamon</i>, <i>streamoff</i>, tj. vlet, přistání,
zapnutí a vypnutí posílání videa. Dále <i>emergency</i> vypne všechny motory, <i>up 20-500</i> vzlétne
nahoru 20cm až 5m, podobně <i>down</i>, <i>left</i>, <i>right</i>, <i>forward</i>, <i>back</i> … a to už jsme
na čtvrté stránce dokumentace SDK. Zbývá otočení <i>ccw 1-3600</i> (conterclockwise/proti směru hodinových ručiček),
tj. až 10 otáček, podobně <i>cw</i> ve směru hodinových ručiček. S <i>flip</i> a <i>go x y z speed</i>
už máte všechny jednoduché stavební bloky „pro děti” (ano, těm je tato hračka primárně určena).</div>
<div class='p'>Drsněji vypadá <i>curve x1 y1 z1 x2 y2 z2 speed</i> což by měl být oblouk. Rychlost se pak nastavuje
pomocí <i>speed 10-100</i> v cm/s, tj. do 1m/s. No a kdyby někomu nestačily tyto základní příkazy
tak ještě existuje <i>rc a b c d</i>, který nastavuje podobně jako u <i>ARDrone2</i> RC kanály <i>left/right</i>,
<i>forward/backward</i>, <i>up/down</i>, <i>yaw</i>, vše s hodnotami <i>-100</i> až <i>100</i>.</div>
<h3>Čtení stavu</h3>
<div class='p'>Průběžně se můžete dotazovat na stav jednotlivých parametrů jako: <i>speed?</i>, <i>battery?</i>,
<i>height?</i>, <i>temp?</i> (teplota), <i>attitude?</i> (IMU data pitch, roll, yaw), <i>baro?</i>
(barometer v metrech?), <i>acceleration?</i> (ve všech osách x, y, z), <i>tof?</i> (time of flight,
předpokládám sonar dolu), <i>wifi?</i> (SRN … seriové číslo?). A to je všechno.</div>
<div class='p'>Konečně se lze zeptat na <i>Tello State</i>, což by měl být string a jako příklad uvádí:</div>
<pre>"pitch:%d;roll:%d;yaw:%d;vgx:%d;vgy%d;vgz:%d;templ:%d;temph:%d;tof:%d;h:%d;bat:%d;baro:%.2f;
time:%d;agx:%.2f;agy:%.2f;agz:%.2f;\r\n"</pre>
<div class='p'>… hmm, to vypadá spíše jako print příkaz do Pythonu nebo C … tj. asi se lze zeptat na vše najednou??
To by asi byl i můj případ ale otázka, jak často se člověk může ptát?</div>
<h3>Závěr</h3>
<div class='p'>O videu se v SDK PDFku nic nepraví, tak doufám, že to bude nějaký standardní video stream nebo JPEG obrázky.
Stejně tak očekávám ještě nějaký „druhý protokol”, binární, pro interní účely. No možná to byly vyhozené
peníze, ale to se člověk nedozví, dokud to nezkusí (ano, nebo dokud nebude více sledovat internet, ale
to už mne pomalu přestává bavit). Tak uvidíme — držte mi palce. <span class='wink'></span></div>
<div class='p'>p.s. pokud dronu máte a už s ní máte i nějaké zkušenosti, tak napište … díky!</div>
<hr/>
<div class='p'><a id="210203"></a></div>
<h2>3. únor 2021 — Google Play 2.8</h2>
<div class='p'>Včera jsem si ještě před vyzvednutím balíčku nainstaloval
<a href='https://play.google.com/store/apps/details?id=com.ryzerobotics.tello&hl=en&gl=US' class='external'>Google
Play aplikaci Tello</a>. Co mne ale „trošku” vyděsilo bylo její hodnocení:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/paula/tello-google-play.jpg'><img src='/robots/paula/tello-google-play_t.jpg' alt='hodnocení Tello aplikace' title='hodnocení Tello aplikace' class='border' width='320' height='312'/></a><br/>
<a href='/robots/paula/tello-google-play.jpg'>hodnocení Tello aplikace</a>
</td></tr></table></div>
<div class='p'>Možná jsem měl zrovna smůlu, ale vzhledem k tomu, že nejčastější hodnocení byla
pouze jedna hvězdička, to bylo asi očekávané.</div>
<div class='p'><i>Tello drones are garbage. Ordered 1 new for my son for christmas and came
with a dud battery. Returned and replaced with a 2nd and it worked for 1 day,
tho never stable and always floated to the side banging into objects. Then day
2 the back propellers began going haywire, outspinning the front making the
piece junk flip over every takeoff. Returned a 2nd time for full refund, no
replacements. We're done. Our worst experience ever on Amazon was this
garbage.</i> … no hned jsem se těšil více (ironie).</div>
<div class='p'>Dronu a extra ochrannou klec jsem si včera večer vyzvedl. Pro referenci jsem kupoval:</div>
<ul>
<li><a href='https://dronpro.cz/dji-tello-boost-combo' class='external'>RYZE Tello Boost Combo</a> (4 190 Kč)</li>
<li><a href='https://dronpro.cz/ryze-tello-ochranna-klec' class='external'>RYZE Tello ochranná klec</a> (299 Kč)</li>
</ul>
<div class='p'>První, co mne překvapilo, jak je to hrozně malinké. Balíček je jak malá
svačinka. Těch by se opravdu bez problému vešlo 10 do komínkui i na
<a href='/robots/kloubak/cs'>Kloubáka K2</a>. <span class='smile'></span></div>
<div class='p'>Druhé pozorování bylo, že jsem udělal dobře a koupil <i>combo</i>. V praxi to
znamená dvě baterky navíc a malá nabíječka. V opačném případě by totiž člověk
chvíli lítal a pak musel dronu použít jako nabíječku a za hodinu by mohl udělat
další mini-pokus. Baterky se nabíjí postupně s tím, že u každé svítí, zda je
nabitá (zelená), právě se nabíjí (blikající zelená) nebo je ve frontě na
nabíjení (žlutá). Předpokládám, že jsou ještě nějaké chybové stavy, ale ty snad
hned tak neuvidím.</div>
<div class='p'>Baterky jsem nechal nabíjet přes noc, tj. teď mám „tři dávky”,
jenom to bude muset počkat (pes, snídaně, práce,
<a href='http://www.robotika.sk/seminar.php' class='external'>Robotour webinář</a>, SubT středeční call
…), takže report z prvního pokusu o navázání komunikace až zítra.</div>
<div class='p'>p.s. ještě jsem se dozvěděl, že <i>EDU</i> verze podporuje SDK 2.x a swarm dronů,
což základní (moje) verze nepodporuje, ale tím se nechám znervózňovat až zítra
…</div>
<div class='p'>p.s.2 přiložený český manuál říká „revidovaná verze 1.2 z roku 2018”, takže
tyto mini-drony žádná novinka nejsou</div>
<hr/>
<div class='p'><a id="210204"></a></div>
<h2>4. únor 2021 — command "command"</h2>
<div class='p'>… aby k tomu nedošlo, prozradím vám konec celé detektivky:</div>
<div class='p'><table class='image_panel center' style='width: 683px;'><tr><td>
<span><img src='/robots/paula/first-talk.jpg' alt='první úspěšný pohovor' title='první úspěšný pohovor' class='border' width='677' height='342'/></span><br/>
<span>první úspěšný pohovor</span>
</td></tr></table></div>
<div class='p'>(Cimrman)</div>
<div class='p'>No nechtěla se se mnou mrcha bavit. Stáhl jsem si příklad
<a href='https://terra-1-g.djicdn.com/2d4dce68897a46b19fc717f3576b7c6a/Tello%20%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/Both/Tello3(1).py' class='external'>Tello3.py</a>
odkazovaný z SDK a ani to nefungovalo. Aplikace na Android byla také taková
„zvláštní”. Obraz z kamery byl rozbitý, ale když jsem si uložil obrázek, tak
pak v galerii vypadal OK. Když jsem ale přepnul na nahrávání videa, tak
aplikace po chvíli napsala <i>Overheet, shutting down</i>?!</div>
<div class='p'>A rozuzlení? No ono je to vlastně v tom SDK v úvodu napsané: <i>Remark2: Send
“command” command to Tello via UDP PORT 8889 to initiate Tello’s SDK mode,
before sending all other commands</i>, prostě je nejprve třeba poslat
příkaz/commnad "command", aby se zapnul SDK mód.</div>
<div class='p'>A vlastně mi už funguje i první pokus v <a href='https://github.com/robotika/osgar/compare/feature/tello' class='external'>OSGARovi</a>:</div>
<pre>python -m osgar.logger tello-210203_225017.log
k name bytes | count | freq Hz
- - - - - - - - - - - - - - - - - - - - - - -
0 sys 916 | 6 | 0.6Hz
1 tello.cmd 9 | 1 | 0.1Hz
2 udp_cmd.raw 0 | 0 | 0.0Hz
3 udp_status.raw 13343 | 101 | 9.9Hz
4 udp_video.raw 0 | 0 | 0.0Hz
Total time 0:00:10.163582</pre>
<div class='p'>… tj. po odeslání <i>command</i> už chodí stavové data na 10Hz.</div>
<div class='p'>Data pak vypadají takto:</div>
<pre>0:00:00.110007 3 b'pitch:0;roll:0;yaw:-2;vgx:0;vgy:0;vgz:0;templ:92;temph:94;tof
:10;h:0;bat:27;baro:358.34;time:0;agx:-2.00;agy:6.00;agz:-999.00;\r\n'
0:00:00.213012 3 b'pitch:0;roll:0;yaw:-2;vgx:0;vgy:0;vgz:0;templ:92;temph:94;tof
:10;h:0;bat:27;baro:358.35;time:0;agx:-3.00;agy:7.00;agz:-998.00;\r\n'
0:00:00.314018 3 b'pitch:0;roll:0;yaw:-2;vgx:0;vgy:0;vgz:0;templ:92;temph:94;tof
:10;h:0;bat:27;baro:358.39;time:0;agx:-4.00;agy:4.00;agz:-1000.00;\r\n'
…</pre>
<div class='p'>… tj. baterky jsou asi skoro vybité (27%). Na večer experimentování z jedné baterky OK.
Tak první krůček snad učiněn.</div>
<hr/>
<div class='p'><a id="210205"></a></div>
<h2>5. únor 2021 — H.264 video</h2>
<div class='p'>Včera jsem se kousek posunul i s nahráváním videa, ale bohužel skoro o zanedbatelný
kousek:</div>
<pre>python -m osgar.logger tello-210204_154413.log
k name bytes | count | freq Hz
- - - - - - - - - - - - - - - - - - - - - - - - -
0 sys 918 | 6 | 0.6Hz
1 tello.cmd 30 | 3 | 0.3Hz
2 udp_cmd.raw 12 | 3 | 0.3Hz
3 udp_status.raw 13737 | 101 | 10.0Hz
4 udp_video.raw 2494746 | 1801 | 178.6Hz
Total time 0:00:10.085510</pre>
<div class='p'>Tj. vidíte tam zhruba 2.5MB video UDP paketů. Přidal jsem i jednoduchou sekvenci:</div>
<pre>python -m osgar.logger tello-210204_154413.log –stream tello.cmd
0:00:00.017842 1 b'command'
0:00:02.009850 1 b'streamon'
0:00:05.010625 1 b'streamoff'</pre>
<div class='p'>tj. v čase 0 zapni SDK protokol mód, v čase 2s spusť nahrávání a v čase 5s ho zase vypni.
Datově cca 1MB/s myslím zní celkem rozumně.</div>
<div class='p'>Z <a href='https://github.com/dji-sdk/Tello-Python/blob/master/doc/readme.pdf' class='external'>https://github.com/dji-sdk/Tello-Python/blob/master/doc/readme.pdf</a> cituji:</div>
<div class='p'><i>Listen to the data stream with the port number 11111 through UDP. The data stream is
encoded with the format of h264. Because size of encoded data of one frame image in this
stream is larger than the maximum load for a single udp transmission, every segment of one
frame encoded picture’data are divided into different blocks, with the unit size of 1460bytes.
And the last block of a image data is smaller than 1460 bytes.</i></div>
<div class='p'>… toto zní celkem rozumně. Jeden frame může být (typicky je) veliký a tak se rozdělí na několik
o velikosti 1460 bajtů</div>
<div class='p'><i>So by detecting the size of the block, it can be determined whether the data block is
the end of the data of the current single image. Splicing the last block in sequence with the
data blocks previously listened to, you can get the complete encoded data of a single image.</i></div>
<div class='p'>… toto ale už je divočina! Pokud vám přijde kratší paket, tak je to konec frame?! A co výpadky?</div>
<pre>python -m osgar.logger tello-210204_154413.log –format "{timestamp} {len(data)}"
–stream udp_video.raw | head -n 25
0:00:00.036130 1460
0:00:00.036936 1460
0:00:00.037336 1460
0:00:00.038663 1460
0:00:00.038781 1460
0:00:00.039000 1460
0:00:00.039154 1460
0:00:00.041383 1460
0:00:00.041505 1460
0:00:00.041573 1460
0:00:00.041779 1460
0:00:00.041900 552
0:00:00.070896 1460
0:00:00.071040 1460
0:00:00.071232 1460
0:00:00.071323 1460
0:00:00.073455 1460
0:00:00.073628 1460
0:00:00.073719 1460
0:00:00.073964 1460
0:00:00.075897 1460
0:00:00.076018 1460
0:00:00.076285 1460
0:00:00.076400 729
0:00:00.105331 1460</pre>
<div class='p'>Takto to vypadá skoro rozumně, časově jsou si ty bloky blízko a pak začíná nový, ale dekódovat to jako H.264
frame se mi zatím nedaří. Parrot u každého paketu měl jeho index a délku, tak možná něco podobného je i zde??
Z nostalgie bych se po letech mohl podívat zase dovnitř, viz starý článek
<a href='/articles/h264-drone-vision/cs'>H.264 pro vidění dravce</a>.</div>
<hr/>
<div class='p'><a id="210206"></a></div>
<h2>6. únor 2021 — Takeoff!</h2>
<div class='p'>První vzlet je vždycky drama, obzvláště pokud se jedná o start autonomní mise. A ani <i>Paula</i>
nezklamala. <span class='smile'></span></div>
<div class='p'>Sekvence byla poměrně minimalistická:</div>
<pre>self.tasks = [
[2, b'streamon'],
[3, b'takeoff'],
[5, b'land'],
[8, b'streamoff']
]</pre>
<div class='p'>tj. zapni nahrávání videa, odstartuj a po dvou sekundách zase raději přistaň a následně
vypni nahrávání videa. A jak to dopadlo?</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/paula/first-flight.png'><img src='/robots/paula/first-flight_t.png' alt='první let' title='první let' class='border' width='320' height='167'/></a><br/>
<a href='/robots/paula/first-flight.png'>první let</a>
</td></tr></table></div>
<div class='p'>Program skončil, ale drona stále visela ve vzduchu (necelý metr nad zemí).
Byl jsem rád, že jsem použil ochrannou klec, ale stejně, jak jí sundat dolů?!</div>
<div class='p'>Nenapadlo mne nic lepšího, než ten jediný program, co jsem dosud měl, pustit znova:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/paula/second-flight.png'><img src='/robots/paula/second-flight_t.png' alt='druhý let' title='druhý let' class='border' width='320' height='183'/></a><br/>
<a href='/robots/paula/second-flight.png'>druhý let</a>
</td></tr></table></div>
<div class='p'>Home, sweet home! <span class='smile'></span> Předpokládám, že u vzletu drona neakceptuje další příkazy
nebo se něco porouchalo. Mám pocit, že podobné chování měla i <a href='/robots/jessica/cs'>Jessica</a>
— což bylo extrémně nepříjemné, pokud se na startu vymkla kontrole, prostě neakceptovala
ani příkaz přistaň.</div>
<pre>python -m osgar.logger tello-210205_190125.log –stream tello.cmd udp_cmd.raw
0:00:00.032778 1 b'command'
0:00:00.046018 2 b'ok'
0:00:02.086795 1 b'streamon'
0:00:02.137147 2 b'ok'
0:00:03.002316 1 b'takeoff'
0:00:05.000937 1 b'land'
0:00:08.001190 1 b'streamoff'
0:00:08.003700 2 b'ok'</pre>
<div class='p'>… no nevypadá to, že by "takeoff" byl potvrzený!</div>
<div class='p'>A v druhém pokusu, začínaje ve vzduchu, na "takeoff" odpověděla "error":</div>
<pre>python -m osgar.logger tello-210205_190142.log –stream tello.cmd udp_cmd.raw
0:00:00.032203 1 b'command'
0:00:00.076145 2 b'ok'
0:00:02.065302 1 b'streamon'
0:00:02.115965 2 b'ok'
0:00:03.024324 1 b'takeoff'
0:00:03.036509 2 b'error'
0:00:05.026166 1 b'land'
0:00:08.023093 1 b'streamoff'
0:00:08.034631 2 b'ok'
0:00:09.106121 2 b'ok'</pre>
<div class='p'>… a to potvrzení přistání vypadá také jako až po jeho skončení. Byla by pěkná nějaká
stavová proměnná, nebo holt na ten start musím počkat o něco déle.</div>
<hr/>
<div class='p'><a id="210207"></a></div>
<h2>7. únor 2021 — Selfie</h2>
<div class='p'>Další cíl dosažen a vypadá takto:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/paula/paula074.jpg'><img src='/robots/paula/paula074_t.jpg' alt='Paula selfie z tello-210205_190125.log' title='Paula selfie z tello-210205_190125.log' class='border' width='320' height='240'/></a><br/>
<a href='/robots/paula/paula074.jpg'>Paula selfie z tello-210205_190125.log</a>
</td></tr></table></div>
<div class='p'>To řešení je brutální, ale šlo o „prokopnutí cesty” a stačí náznak světla na konci tunelu.
Prostě video jsem nahrával už předevčírem, ale nebyl jsem schopen ho dekókovat. Potvrdil jsem
si, že je to H264 kodek, dokonce upravený starší kód vylámal počty <i>makrobloků</i>, tj. zjistil
jsem, že výsledný obrázek je menší než u ARDrone2 … ano, marketingový klam 720p … jen to není
16:9, ale 4:3, tj. rozlišení je 960x720. Ale pokusy dekódovat I-frame (jestli to nepletu) selhal.</div>
<div class='p'>Když už jsem propadl malomyslnosti, tak jsem koukal <a href='https://youtu.be/LmEcyQnfpDA?t=1293' class='external'>dále na to 3h video</a>.
Říkal jsem si, že on to také musí nějak řešit?! Pro řízení drony používá <a href='https://github.com/damiafuentes/djitellopy' class='external'>DJITelloPy</a>
a <a href='https://github.com/damiafuentes/DJITelloPy/blob/master/djitellopy/tello.py' class='external'>tam</a> je čtení
videa řešeno přes <b>cv2.VideoCapture()</b> a jako parametr dostává <b>address_schema = 'udp://@{ip}:{port}'</b>.
Prostě pustí pomocné vlákno a to přímo čte UDP pakety a OpenCV to i rovnou dekóduje do numpy obrázků.
Pěkné! Ale funguje to? Jako první jsem zkusil jsem
<a href='https://github.com/damiafuentes/DJITelloPy/blob/master/examples/take-picture.py' class='external'>take-picture.py</a></div>
<div class='p'>Napůl mne vlastně potěšila záplava hlášek:</div>
<pre>(osgar) md@md-ThinkPad-P50:~/git/DJITelloPy/examples$ python take-picture.py
[INFO] tello.py - 104 - Tello instance was initialized. Host: '192.168.10.1'. Port: '8889'.
[INFO] tello.py - 418 - Send command: 'command'
[INFO] tello.py - 443 - Response command: 'ok'
[INFO] tello.py - 418 - Send command: 'streamon'
[INFO] tello.py - 443 - Response streamon: 'ok'
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] decode_slice_header error
[h264 @ 0x153f740] no frame!
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] decode_slice_header error
[h264 @ 0x153f740] no frame!
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] decode_slice_header error
[h264 @ 0x153f740] no frame!
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] non-existing PPS 0 referenced
[h264 @ 0x153f740] decode_slice_header error
[h264 @ 0x153f740] no frame!
[h264 @ 0x153f740] non-existing PPS 0 referenced
…</pre>
<div class='p'>… ale drona vzlétla, opravdu jeden snímek udělala a přistála. Dveře do „tajemné komnaty”
jsou tímto pootevřeny. <span class='smile'></span></div>
<div class='p'>V druhém pokusu, kdy jsem zkoušel příklad nahrávání videa, už to bylo divočejší, protože
drona se zamotala do věšáku — ochranná klec byla dobrá investice. Ono to trošku vypadá jak
míč, tak jsem to zkusil vzít do ruky a po vzoru starých ARDrone2 to otočit vzhůru nohama
a motory se zastavily. To se také může někdy hodit.</div>
<div class='p'>Problém je tedy množství nevalidních snímků v úvodu nahrávání videa a zatím
nevím, jak ty nástroje přesvědčit, aby to ignorovaly. Alternativa byla vytvořit
fiktivní Tello dronu, předstírat, že vysílá UDP pakety s daným časováním a výsledek
vypadá takto
(po spojení obou kousků pomocí <i>ffmpeg -i "concat:video1.avi|video2.avi" -c copy video.avi</i>).</div>
<div class='p'><center>
<iframe width="640" height="480" src="https://www.youtube.com/embed/VXZVHs6Bfds" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a id="210208"></a></div>
<h2>8. únor 2021 — cv2.Stitcher_create</h2>
<div class='p'>Přemýšlel jsem, co by nejlépe vystihlo dnešní pokusy s dronou (neděle 7/2 … je to takové posunuté)
a je to pokus o poskládání panoramatu z videa drony. <span class='smile'></span> Nejprve jsem trošku ladil kód, abych droně
posílal další příkazy až když předešlé vykoná (hlavně <i>takeoff</i>) a když toto začalo celkem rozumně
fungovat, tak jsem chtěl udělat <i>panoramatický snímek</i>, resp. video 360 stupňů dokola. Asi rovnou
naznačím co je další cíl — udělat <b>dva panoramatické snímky nad sebou</b>. Drona má totiž senzor
na měření vzdálenosti od země a tak bych mohl udělat <i>panoramatické stereo</i>.</div>
<div class='p'>Příkaz pro dronu:</div>
<pre>command
streamon
takeoff
cw 360
land
streamoff</pre>
<div class='p'><i>cw 360</i> je „otoč se o 360 stupňů po směru hodinových ručiček”. Samozřejmě jsem tam měl překlep,
což je ve vzduchu vždy „komické”:</div>
<pre>0:00:01.069556 SEND b'streamon'
0:00:01.119955 — b'streamon' b'ok'
0:00:02.004058 SEND b'takeoff'
0:00:03.263466 Battery: 78 -> 77
0:00:07.193178 Battery: 77 -> 76
0:00:08.315170 — b'takeoff' b'ok'
0:00:09.183728 Battery: 76 -> 75
0:00:10.010189 SEND b'cv 360'
0:00:10.050536 — b'cv 360' b'unknown command: cv'</pre>
<div class='p'>… ale pak to správně přistálo, takže OK.</div>
<div class='p'>No a teď to skládání obrázků. Je to na dva řádky (!):</div>
<pre>stitcher = cv2.Stitcher_create()
status, result_img = stitcher.stitch(images)</pre>
<div class='p'>Drsné, nemyslíte? Uplně se mi nechce sdílet panoramatický snímek pracovno-ložnice, ale …</div>
<div class='p'>První pokus je jen pár snímků „obrazu” (takové to černé je ochranný kryt drony).</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/paula/stitch-image.jpg'><img src='/robots/paula/stitch-image_t.jpg' alt='Poskládaný obraz' title='Poskládaný obraz' class='border' width='320' height='177'/></a><br/>
<a href='/robots/paula/stitch-image.jpg'>Poskládaný obraz</a>
</td></tr></table></div>
<div class='p'>Druhý pokus skončil <i>Killed</i> (pravděpodobně na nedostatek paměti) a tak místo všech
obrázků z 360 stupňové otočky jsem tomu podhodil jenom každý pátý snímek. A dopadlo to
takto:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/paula/stitch-bedroom.jpg'><img src='/robots/paula/stitch-bedroom_t.jpg' alt='360deg snímek z videa z drony' title='360deg snímek z videa z drony' class='border' width='640' height='80'/></a><br/>
<a href='/robots/paula/stitch-bedroom.jpg'>360deg snímek z videa z drony</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230613"></a></div>
<h2>13. červen 2023 — Tello go, go, go!</h2>
<div class='p'>Na <i>robotickém víkendu</i> jsme zase po letech vytáhli různé „kostlivce ze skříně”. Sám jich pár mám a nakonec padl los na mini-dronu Tello
(to, že jsem ji pojmenoval <i>Paula</i>, jsem už za ty dva roky zapomněl). Nepamatoval jsem si nic, tak mne potešilo, že jsem našel tématicky pojmenovou
větev v gitu <i>feature/tello</i> <span class='smile'></span> a poslední commit <i>Date: Thu Feb 11 14:08:03 2021 +0100</i> … to už tak veselé nebylo.</div>
<div class='p'>Dobrá zpráva byla, že stačilo jen pustit nahrávání</div>
<pre>python -m osgar.record config/tello.json –note "test na zahrade"</pre>
<div class='p'>a drona vzlétla, cca v metru se otočila o 360 stupňů, pak vystoupala ještě cca 1 metr, znova provedla scan 360 stupňů a přistála. Pohoda.
Celý „program” byl schován v seznamu příkazů:</div>
<pre>self.tasks = [
[1, b'streamon'],
[2, b'takeoff'],
[10, b'cw 360'],
[11, b'up 30'],
[12, b'cw 360'],
[20, b'land'],
[22, b'streamoff']
]</pre>
<div class='p'>… a odkazy na dokumentaci jsem si naštěstí napsal do tohoto článku. Koukám do gitu a nebyl to tedy 1m, ale pouze 30cm a ještě připomenu, že <i>streamon</i> pouští
kameru, resp. streamování, a <i>streamoff</i> kameru vypíná.</div>
<div class='p'>První, co jsem si do kódu doplnil byl seznam existujících příkazů:</div>
<pre>class TelloCmd(Enum):
COMMAND = b'command' # entry SDK mode
TAKEOFF = b'takeoff' # Tello auto takeoff
LAND = b'land' # Tello auto land
STREAMON = b'streamon' # Set video stream on
STREAMOFF = b'streamoff' # Set video stream off
EMERGENCY = b'emergency' # Stop all motors immediately
UP = b'up' # Tello fly up with distance x cm, x: 20-500
DOWN = b'down' # Tello fly down with distance x cm, x: 20-500
LEFT = b'left' # Tello fly left with distance x cm, x: 20-500
RIGHT = b'right' # Tello fly right with distance x cm, x: 20-500
FORWARD = b'forward' # Tello fly forward with distance x cm, x: 20-500
BACK = b'back' # Tello fly back with distance x cm, x: 20-500
CW = b'cw' # Tello rotate x degree clockwise, x: 1-3600
CCW = b'ccw' # Tello rotate x degree counter-clockwise, x: 1-3600
FLIP = b'flip' # Tello fly flip x, l (left), r (right), f (forward), b (back)
GO = b'GO'
# go x y z speed - Tello fly to x y z in speed (cm/s) (x: 20-500, y: 20-500, z: 20-500, speed: 10-100)
CURVE = b'curve'
# curve x1 y1 z1 x2 y2 z2 speed - Tello fly a curve defined by the current and two given coordinates
# with speed (cm/s) If the arc radius is not within the range of 0.5-10 meters, it responses false
# x1, x2: 20-500, y1, y2: 20-500, z1, z2: 20-500, speed: 10-60
# x/y/z can’t be between -20 – 20 at the same time .
SPEED = b'speed' # set speed to x cm/s, x: 10-100
RC = b'rc'
# rc a b c d - Send RC control via four channels.
# a: left/right (-100~100), b: forward/backward (-100~100),
# c: up/down (-100~100), d: yaw (-100~100)</pre>
<div class='p'>a v rámci experimentování jsem se dostal k testu <b>go</b>:</div>
<pre>self.tasks = [
[1, b'streamon'],
[2, b'takeoff'],
[11, b'up 300'],
[12, b'cw 360'],
[12, b'go 200 0 300 50'],
[12, b'go 200 200 300 50'],
[12, b'go 0 0 300 50'],
[12, b'go 0 0 100 50'],
[20, b'land'],
[22, b'streamoff']
]</pre>
<div class='p'>kontrolní otázka — co si myslíte, že tento kód udělá? No můžu vám řící, co jsem chtěl aby udělal: drona vystoupá do 3m,
zatočí se, aby se neřeklo, a pak poletí dopředu 2m, pak vlevo 2m, pak se vrátí, klesne na 1m nad zemí a přistane. No úplně takto
se to fakt nechovalo. <b>go je relativní</b> (!!!), takže s každým příkazem si nastoupal další 3 metry. Skončil cca ve 12m a tam se drona
zasekla a já už jenom čekal, kdy jí dojdou baterky a spadne. Fouknul ale větřík a dostal jsem tyto výstupy:</div>
<pre>…
0:04:58.926733 Battery: 11 -> 10
0:05:00.051663 — b'go 0 0 300 50' b'error Big wind'
0:05:00.051663 SEND b'go 0 0 100 50'
0:05:00.918411 Battery: 10 -> 9
0:05:03.160410 — b'go 0 0 100 50' b'error Auto land'</pre>
<div class='p'>a pak už byl v seznamu příkaz na přistání, tak šla celkem elegantně k zemi. S tímto zážitkem bych testování skončil, ale OndraL
trval na opravě, takže ještě správná verze kódu:</div>
<pre>self.tasks = [
[1, b'streamon'],
[2, b'takeoff'],
[11, b'up 300'],
[12, b'cw 360'],
[12, b'go 200 0 0 50'],
[12, b'go 0 200 0 50'],
[12, b'go -200 -200 0 50'],
[12, b'go 0 0 100 50'],
[12, b'go 0 0 -200 50'],
[20, b'land'],
[22, b'streamoff']
]</pre>
<div class='p'>Mimochodem v SDK dokumentaci jsou nesmysly (přepsal jsem je i do popisu, ale asi to v nějakém dalším commitu opravím), protože <i>go</i> akceptuje i nulu
a záporné hodnoty (všechna čísla jsou v centimetrech, nebo ve stupních + rychlost v cm/s).</div>
<div class='p'>Ještě rekonstrukce „z černé OSGARovi skříňky” (logy) ukázala, proč se drona na cca 12m výšky zasekla:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/paula/tello-altitude.png'><img src='/robots/paula/tello-altitude_t.png' alt='měřená vzdálenost od země' title='měřená vzdálenost od země' class='border' width='640' height='338'/></a><br/>
<a href='/robots/paula/tello-altitude.png'>měřená vzdálenost od země</a>
</td></tr></table></div>
<div class='p'>Proste někde okolo 9m nad zemí přestal senzor fungovat a začal vracet 65m, přesněji 6553cm, což <a href='https://cs.wikipedia.org/wiki/Hip_Hap_Hop' class='external'>modří už vědí</a>,
že interně nejspíše počítá v milimetrech a toto je max uint16, tj. 65535.</div>
<div class='p'>Čas na googlení "tello max altitude": <a href='https://dronies.org/tello-drone/' class='external'>https://dronies.org/tello-drone/</a> (April 28, 2022)
<i>The altitude limit for the tello drone is 30 meters (100 feet). Upon the drone’s initial release, Ryze had set the altitude limit to only 10 meters, but after a firmware update, a new setting was added. The new feature grants the user to set the altitude limit from 2 up to 30 meters.</i></div>
<div class='p'>Zajímavé, možná bych si měl dronu flashnout?! Asi bude i lepší si o tom něco přečíst … v poslední sekci, jestli se Tello může koupat píšou:
<i>Tello lacks GPS and compass, therefore it uses a belly camera facing downwards and a sophisticated algorithm to locate itself and find its course, allowing distance measurement and RTH emergency maneuver into third-party apps, like Tello FPV. Unfortunately, Optical Flow fails when flying above a patterned or moving body like grass or water, and the drone crashes. Despite this, some people had managed to fly over water bodies. The trick is choosing a flight path carefully by finding calm, shallow water or islands, rocks, dams, and every fixed reference (not floating objects) you can find. Any fixed object is enough for the belly camera to recognize its location.</i>
… tak už chápu, proč se relativně dobře visela na místě — má tam ještě jednu kameru směrem dolu.</div>
<div class='p'>p.s. čtu ten článek od začátku <i>Tello drone is mainly aimed at the younger audience.</i> ha ha ha <span class='smile'></span></div>
<div class='p'>p.s.2 vypadá to, že je k dispozici ještě binární protokol, kdyby mne ty ASCII znaky přestaly bavit, viz
<a href='https://bitbucket.org/PingguSoft/pytello/src/8ecc0037f05f16cb494aa29859a04d834f9c58c2/tello.py#lines-396' class='external'>tello.py hack 30m alt limit</a> …
odkazovaný z <a href='https://tellopilots.com/threads/tello-whats-possible.88/page-9#post-1829' class='external'>této diskuse</a>
na <a href='https://tellopilots.com' class='external'>tellopilots.com</a>.</div>
<div class='p'>p.s.3 ještě nějaký „důkazový materiál”</div>
<pre>python -m osgar.tools.play_udp_video /home/md/git/osgar/tello-230610_134957.log</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/paula/tello-alt-12m.jpg'><img src='/robots/paula/tello-alt-12m_t.jpg' alt='drona ve 12m' title='drona ve 12m' class='border' width='640' height='533'/></a><br/>
<a href='/robots/paula/tello-alt-12m.jpg'>drona ve 12m</a>
</td></tr></table>
… ta divná věc v obraze je ochranný kryt/kopule</div>
<hr/>
<div class='p'><a href='/robots/paula/cs#email'>kontaktní formulář</a></div>
Spider3 Riderhttps://robotika.cz/robots/spider/cs2017-10-11T00:00:00ZMartin Dlouhý
OSGAR is a long term project which will probably incorporate more than one
robotic platform in the future. The project started in 2014 when we decided to
modify school garden tractor <b>John Deere X300R</b> into autonomous robot. The
project is carried on in cooperation with the Czech University of Life Science
Prague. <b>Blog update:</b> 25/04/2023 — <a href='/robots/spider/cs#230425'>Speed control (stop and go)</a>
<h1>Spide3 Rider</h1>
<h2>Team</h2>
<ul>
<li>Milan Kroulík — project leader (<a href='http://www.tf.czu.cz/cs/' class='external'>CZU/TF</a>)</li>
<li>Stanislav Petrásek — mechanics (<a href='http://www.tf.czu.cz/cs/' class='external'>CZU/TF</a>)</li>
<li>Tomáš Roubíček — electronics (<a href='http://www.robsys.cz' class='external'>RobSys</a>)</li>
<li>Jakub Lev — software/testing (<a href='http://www.tf.czu.cz/cs/' class='external'>CZU/TF</a>)</li>
<li>Martin Dlouhý — software (<a href='https://robotika.cz' class='external'>robotika.cz</a>)</li>
</ul>
<hr/>
<div class='p'><a id="171011"></a></div>
<h2>11th October, 2017 — Spider 3Rider (first tests)</h2>
<div class='p'>There was no update on this blog, but it does not mean that there was no
progress in last 6 months. You can check
<a href='https://github.com/robotika/osgar' class='external'>github</a>, that there was some activity over
the summer and also <a href='http://osgar.robotika.cz/' class='external'>traces</a>, but only some of
them were uploaded. Nevertheless, what I wanted to write about today (at least a
paragraph) was about <b>Spider 3Rider</b>, which is another machine we are
preparing for autonomous navigation.</div>
<div class='p'>You can have a look at
<a href='https://www.youtube.com/watch?v=zuYi4udH9nU' class='external'>introduction video</a> (in Czech).
It is very nice machine where each wheel is steered independently, and it
supports <i>car like" and </i>spider"" modes. Spider3 is already 3rd generation of
successful <a href='http://www.slope-mower.com/products/' class='external'>radio controlled slope
mowers</a>.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/spider/cam170926_160408_026.jpg'><img src='/robots/spider/cam170926_160408_026_t.jpg' alt='Photo taken by nearby parked John Deere tractor' title='Photo taken by nearby parked John Deere tractor' class='border' width='320' height='240'/></a><br/>
<a href='/robots/spider/cam170926_160408_026.jpg'>Photo taken by nearby parked John Deere tractor</a>
</td></tr></table></div>
<div class='p'>The original machine was modified to support also control over CAN bus, and
thus allow <i>autonomy mode</i>. While we are still struggling with the full
control (note, that Spider3 weights over 1 ton, and you do not want to make
stupid mistakes), we are already able to collect data from manual drive.</div>
<div class='p'>On the following picture you can see angles of all 4 wheels. Their position was
printed only on change, so it is „compact graph”.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/robots/spider/spider3-wheel-angles.png'><img src='/robots/spider/spider3-wheel-angles_t.png' alt='Steering angles of all 4 wheels' title='Steering angles of all 4 wheels' class='border' width='320' height='148'/></a><br/>
<a href='/robots/spider/spider3-wheel-angles.png'>Steering angles of all 4 wheels</a>
</td></tr></table></div>
<div class='p'>You can see that the resolution is 9 bits (0 to 511). In the middle of the
graph you can see an experiment when we tried to twice turn the wheels for
360 degrees in <i>spider mode</i>.</div>
<hr/>
<div class='p'><a id="171206"></a></div>
<h2>6th November, 2017 — Spider3 finally autonomously moved!</h2>
<div class='p'>Yesterday was the D-day for our Spider3 Rider, which finally (after 2 months?)
autonomously moved. It was a small step for a robot but a leap for robotkind!
<span class='wink'></span></div>
<div class='p'>Yes, sure enough it was hacked to get it moving, so what you can see in the
following video from Martin S. (our new team member) is: for 5s set value to
50, for 2s stop (set value to 0), for 5s set value to 0x100 - 30, for 2s stop
(set value to 0). There was manual emergency STOP (remote) at the end … you
may notice that the robot was still moving although the value was set to 0
(TODO configure properly the center position).</div>
<div class='p'><center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/hpcP8zZkGUY" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>
</center></div>
<div class='p'>Now should come the fun with omnidirectional motion, test of Spider vs. Car
mode, integration of encoders etc. There is new GPS RTK sensor and
<a href='https://www.sick.com/robotday' class='external'>SICK TiM 571</a> (yes, we already recived
Christmas presents <span class='smile'></span>) to be integrated. Also
<a href='http://velodynelidar.com/vlp-16.html' class='external'>Velodyne</a> should be hopefully soon
recalibrated in the factory (I wonder how many Puck 16 in the world have this
problem):</div>
<div class='p'><table class='image_panel center' style='width: 366px;'><tr><td>
<a href='/robots/spider/velodyne-puck16-calibration-issue.png'><img src='/robots/spider/velodyne-puck16-calibration-issue_t.png' alt='8 wrongly calibrated lasers for
VLP-16 Velodyne LiDAR' title='8 wrongly calibrated lasers for
VLP-16 Velodyne LiDAR' class='border' width='360' height='161'/></a><br/>
<a href='/robots/spider/velodyne-puck16-calibration-issue.png'>8 wrongly calibrated lasers for
VLP-16 Velodyne LiDAR</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230326"></a></div>
<h2>26th March, 2023 — Web refactoring</h2>
<div class='p'>Note, that there was a "minor" web refactoring as <a href='https://github.com/robotika/osgar' class='external'>OSGAR</a> was further developed
(mainly for <a href='/competitions/subtchallenge/cs'>DARPA Subterranean Challenge</a>. The Spider3 Rider is currently pushed into
world of fully autonomous robots and somehow I could not find dedicated artifle for it. <span class='wink'></span> So the original page was split
into 3 and we will track them separately.</div>
<div class='p'>There are 3 new websites now:</div>
<ul>
<li><a href='/guide/osgar/cs'>OSGAR guide in /guide/osgar</a></li>
<li><a href='/robots/john-deere/cs'>John Deere as modified tractor</a></li>
<li><a href='/robots/spider/cs'>Autonomous Spide3 Rider</a> (this site)</li>
</ul>
<hr/>
<div class='p'><a id="230425"></a></div>
<h2>25th April, 2023 — Speed control (stop and go)</h2>
<div class='p'>Once upon a time there was a Spider … yeah, I could start with some fairy-tail. From older notes you can tell there "our"
Spider is more than 5 years old. This is really hard to believe, but it is true. It is used for
<a href='https://radiozurnal.rozhlas.cz/jablka-cese-ve-dne-i-v-noci-a-setrne-cesti-vedci-vyvijeji-unikatni-system-pro-8833653' class='external'>collecting data in orchard</a>
but the data collection is semi-manually. So what problem are the blocking points?</div>
<ul>
<li>autonomous mode for provided firmware is only in <i>spider mode</i>, which means where all wheels are pointing in the same direction</li>
<li>the speed is limited to <i>turtle</i>, which means around 0.5m/s max</li>
<li>there is no speed control on the device</li>
<li>"gas control" is not symmetric, so if you return to 0, the machine does not stop</li>
</ul>
<div class='p'>Yes, the last point is the main blocker. You can control <i>power</i> with int8 values, i.e. -127 .. 127
(not really sure what 128 would do, but I think that it is negative 0 here). Last week we did a couple of experiments and watched the response times.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/spider/spider-triangle-signal.png'><img src='/robots/spider/spider-triangle-signal_t.png' alt='triangle signal (go-spider-230418_171334.log)' title='triangle signal (go-spider-230418_171334.log)' class='border' width='640' height='338'/></a><br/>
<a href='/robots/spider/spider-triangle-signal.png'>triangle signal (go-spider-230418_171334.log)</a>
</td></tr></table></div>
<div class='p'>I liked this picture even though it is not very useful. You can tell that the brown command has the opposite direction, there is delay of valves (0.25s?) and also
before the robot starts to move. The <i>speed</i> is not really visible on this graph as it is a scale of left/right encoders to meters per second.</div>
<div class='p'>Maybe more useful is the <i>stairs signal</i>:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/robots/spider/spider-steps.png'><img src='/robots/spider/spider-steps_t.png' alt='step signal (go-spider-230418_191817.log)' title='step signal (go-spider-230418_191817.log)' class='border' width='640' height='480'/></a><br/>
<a href='/robots/spider/spider-steps.png'>step signal (go-spider-230418_191817.log)</a>
</td></tr></table></div>
<div class='p'>Observations:</div>
<ul>
<li>the two valves positions do not perfectly match</li>
<li>on the first step down the robot did not slow down at all</li>
<li>on backward motion the zero corresponds to visible non-zero speed</li>
</ul>
<div class='p'>So the task for today is to stop …</div>
<div class='p'>p.s. it worked?! <span class='smile'></span> … I mean simple PI-controller:</div>
<pre>err = desired_speed - self.speed
self.err_sum += err
scale_p = 100 # proportional
scale_i = 10 # integration
value = min(127, max(-127, int(scale_p * err + scale_i * self.err_sum)))</pre>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/spider/spider-stop-and-go.png'><img src='/robots/spider/spider-stop-and-go_t.png' alt='Stop and GO' title='Stop and GO' class='border' width='220' height='116'/></a><br/>
<a href='/robots/spider/spider-stop-and-go.png'>Stop and GO</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/robots/spider/spider-stop-and-go-overview.png'><img src='/robots/spider/spider-stop-and-go-overview_t.png' alt='Overview' title='Overview' class='border' width='220' height='116'/></a><br/>
<a href='/robots/spider/spider-stop-and-go-overview.png'>Overview</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/robots/spider/spider-pi-control.png'><img src='/robots/spider/spider-pi-control_t.png' alt='PI control' title='PI control' class='border' width='220' height='116'/></a><br/>
<a href='/robots/spider/spider-pi-control.png'>PI control</a>
</td></tr></table></div>
<div class='p'>The first test was with 0.5m/s speed, move 1 meter, stop and wait 5 seconds, and repeat backward. Then I slowed down to 0.2m/s and changed wait to 10s
so that it is obvious that the 650kg(?) monster is not moving. <span class='smile'></span></div>
<hr/>
<h2>Links</h2>
<ul>
<li><a href='https://github.com/robotika/osgar' class='external'>OSGAR source code on Github</a></li>
</ul>
<div class='p'><a href='/robots/spider/cs#email'>Contact Form</a></div>
Pozyxhttps://robotika.cz/articles/pozyx/cs2021-12-17T00:00:00ZMartin Dlouhý, Jiří Iša
GPS je velice užitečný systém pro velké množství aplikací vyžadující pozici … ale co dělat, pokud jste uvnitř budovy a nemáte signál?
Pozyx je možná odpověď, kterou se pokusíme blíže prozkoumat. Konkrétně s „Creator Kit” máme více plánů, ale postupně.
<b>Blog update:</b> 1/3/2023 — <a href='/articles/pozyx/cs#230301'>pypozyx.SingleRegister(size=2)</a>
<h2>Creator Kit</h2>
<ul>
<li><a href='https://www.pozyx.io/creator' class='external'>pozyx.io</a></li>
</ul>
<div class='p'>Firma <a href='https://www.pozyx.io/' class='external'>Pozyx</a> nabízí několik sestav pro lokalizaci uvnitř budov. (*)
V tomto článku se budeme zabývat sadou <a href='https://www.pozyx.io/creator' class='external'>Creator Kit</a>, který jsme
na experimenty pořídili. Není to úplně levná hračka (cca 1000EUR), ale pokud systém umožní
lokalizaci s přesností na 10cm do vzdálenosti 100m od majáčků (<i>anchors</i>), tak se to možná
vyplatí. Uvidíme. <span class='smile'></span></div>
<div class='p'>A pokud to úplně fungovat nebude, tak tento blog je ideální místo, kde se ventilovat. <span class='wink'></span></div>
<div class='p'>(*) <i>Pozyx by měl fungovat i venku, ale v některých zemích platí různá omezení.</i></div>
<h2>Obsah</h2>
<ul>
<li><a href='/articles/pozyx/cs#211217'>211217 - První test</a></li>
<li><a href='/articles/pozyx/cs#211219'>211219 - pozyx.doRanging()</a></li>
<li><a href='/articles/pozyx/cs#211221'>211221 - Lillyino robotické kvarteto</a></li>
<li><a href='/articles/pozyx/cs#211222'>211222 - Hodinový test a mrtvé kotvy</a></li>
<li><a href='/articles/pozyx/cs#211223'>211223 - Decaware, DWM1000 a další</a></li>
<li><a href='/articles/pozyx/cs#211224'>211224 - Creator Anchor vs. Developer Tag</a></li>
<li><a href='/articles/pozyx/cs#211225'>211225 - DW1000 první přiblížení</a></li>
<li><a href='/articles/pozyx/cs#211227'>211227 - DWM1001 API a Jirkovy dotazy</a></li>
<li><a href='/articles/pozyx/cs#220104'>220104 - Informační střípky</a></li>
<li><a href='/articles/pozyx/cs#220106'>220106 - Follow me</a></li>
<li><a href='/articles/pozyx/cs#220110'>220110 - pozyx.doPositioning()</a></li>
<li><a href='/articles/pozyx/cs#220114'>220114 - (Ne)dostupnost a časové známky</a></li>
<li><a href='/articles/pozyx/cs#220115'>220115 - Dosah 100 metrů? Ha, ha, ha</a></li>
<li><a href='/articles/pozyx/cs#220116'>220116 - UWB channels</a></li>
<li><a href='/articles/pozyx/cs#220123'>220123 - Channel 1, preambule 4096, gain 33 = více jak 80 metrů</a></li>
<li><a href='/articles/pozyx/cs#220201'>220201 - DW1000 + BU01 (Jirka)</a></li>
<li><a href='/articles/pozyx/cs#220210'>220210 - Decawave driver (Jirka)</a></li>
<li><a href='/articles/pozyx/cs#220213'>220213 - Pozyx + GPS</a></li>
<li><a href='/articles/pozyx/cs#220216'>220216 - No GPS vs. BU01 Single Sided</a></li>
<li><a href='/articles/pozyx/cs#220217'>220217 - Pozyx path vs. BU01 default range</a></li>
<li><a href='/articles/pozyx/cs#220221'>220221 - BU01 korekce korekce</a></li>
<li><a href='/articles/pozyx/cs#220303'>220303 - BU01 měření rychlosti světla</a></li>
<li><a href='/articles/pozyx/cs#220304'>220304 - Auta a UWB stereo tag</a></li>
<li><a href='/articles/pozyx/cs#220306'>220306 - 2+D vs. 2.5D</a></li>
<li><a href='/articles/pozyx/cs#220308'>220308 - Eduro a dosažené BU01 milníky</a></li>
<li><a href='/articles/pozyx/cs#220320'>220320 - BU01 mesh a Babel</a></li>
<li><a href='/articles/pozyx/cs#220330'>220330 - BU01 kalibrační čtverec</a></li>
<li><a href='/articles/pozyx/cs#220413'>220413 - BU01 zapouzdřeno jest</a></li>
<li><a href='/articles/pozyx/cs#220420'>220420 - BU01 Follow Me</a></li>
<li><a href='/articles/pozyx/cs#220426'>220426 - BU01 Follow Me obrázky</a></li>
<li><a href='/articles/pozyx/cs#220504'>220504 - BU01 stavový automat</a></li>
<li><a href='/articles/pozyx/cs#230108'>230108 - Pozyx digital I/O</a></li>
<li><a href='/articles/pozyx/cs#230110'>230110 - Look-at-me ver0</a></li>
<li><a href='/articles/pozyx/cs#230124'>230124 - Dva na jednoho</a></li>
<li><a href='/articles/pozyx/cs#230131'>230131 - followme_uwb ver0</a></li>
<li><a href='/articles/pozyx/cs#230207'>230207 - Bezpečnost především, časem ...</a></li>
<li><a href='/articles/pozyx/cs#230214'>230214 - Follow me UWB on/off</a></li>
<li><a href='/articles/pozyx/cs#230221'>230221 - Pull request #953</a></li>
<li><a href='/articles/pozyx/cs#230301'>230301 - pypozyx.SingleRegister(size=2)</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog</h1>
<div class='p'><a id="211217"></a></div>
<h2>17. prosinec 2021 — První test</h2>
<div class='p'>Včera dorazil balíček z Belgie. Po odtranění DHL expres obalovací krabice z něj vypadlo toto:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/creator-kit.jpg'><img src='/articles/pozyx/creator-kit_t.jpg' alt='Zabalená krabice' title='Zabalená krabice' class='border' width='320' height='180'/></a><br/>
<a href='/articles/pozyx/creator-kit.jpg'>Zabalená krabice</a>
</td></tr></table></div>
<div class='p'>A co je uvnitř? K tomu použiji <a href='https://store.pozyx.io/creator-kit-65?_ga=2.169182370.2026377525.1639763609-490974699.1639763609#attr=85' class='external'>foto přímo od výrobce</a>:</div>
<div class='p'><table class='image_panel center' style='width: 262px;'><tr><td>
<a href='/articles/pozyx/creator-kit-inside.jpg'><img src='/articles/pozyx/creator-kit-inside_t.jpg' alt='Obsah Creator kit balíčku' title='Obsah Creator kit balíčku' class='border' width='256' height='256'/></a><br/>
<a href='/articles/pozyx/creator-kit-inside.jpg'>Obsah Creator kit balíčku</a>
</td></tr></table></div>
<div class='p'>Je tam 5 <i>kotev</i> (anchor) majáčků, které jsou typicky umístěny na známých pozicích po budově.
Dále najdete 4 <i>vývojové tagy</i> pro mobilní zařízení, které chceme lokalizovat.
Zbývají ještě 3 power banky, 5 USB zdrojů (je dobré správně zvolit zemi, pro kterou budou
zástrčky), nějaké uchyty na suchý zip a spousta USB kabelů.</div>
<div class='p'>A jak dopadl <b>první test</b>? Podle očekávání — selhal. <span class='smile'></span> Zapojil jsem <i>anchor</i> přes
USB kabel do počítače, ale nic. Žádná zpráva v <i>dmesg</i>, nic nového v <i>lsusb</i>? Nějaké nápady?
Ano, asi mne to mělo hned napadnout, že „napájecí kabely” z power banky komunikaci podporovat
nebudou. No byl tam ještě jeden super-kabel, který ma na sobě dokonce display. Podle čísel tipuji
že je to napájení a proud, který kabelem protéká, ale hlavně to komunikuje:</div>
<pre>[1063478.914191] usb 1-6: new full-speed USB device number 8 using xhci_hcd
[1063479.064155] usb 1-6: New USB device found, idVendor=0483, idProduct=5740, bcdDevice= 2.00
[1063479.064161] usb 1-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1063479.064164] usb 1-6: Product: Pozyx Virtual ComPort in FS Mode
[1063479.064167] usb 1-6: Manufacturer: Pozyx Labs
[1063479.064170] usb 1-6: SerialNumber: 203E359F484E
[1063479.113745] cdc_acm 1-6:1.0: ttyACM0: USB ACM device
[1063479.114345] usbcore: registered new interface driver cdc_acm
[1063479.114349] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters</pre>
<div class='p'>Hodí se balíčk <a href='https://pypi.org/project/pypozyx/' class='external'>pypozyx</a> a fajn je <a href='https://github.com/pozyxLabs/Pozyx-Python-library' class='external'>Pozyx-Python-library</a>
na GitHubu. Asi nejrychlejší je si repository stáhnout, editovat
<a href='https://github.com/pozyxLabs/Pozyx-Python-library/blob/master/tutorials/ready_to_range.py' class='external'>tutorials/ready_to_range.py</a>
(je tam třeba vyplnit vůči kterému ID chcete měřit vzdálenost) a pak už jenom vidíte výpis jako:</div>
<pre>1966732 ms, 1034 mm, -79 dBm
1966777 ms, 959 mm, -79 dBm
1966823 ms, 1006 mm, -79 dBm
1966868 ms, 1011 mm, -79 dBm
1966912 ms, 1002 mm, -79 dBm
1966957 ms, 1020 mm, -79 dBm
1967001 ms, 992 mm, -79 dBm
1967045 ms, 978 mm, -79 dBm
1967090 ms, 983 mm, -79 dBm
1967137 ms, 974 mm, -79 dBm
1967183 ms, 988 mm, -79 dBm
1967228 ms, 974 mm, -79 dBm</pre>
<div class='p'>Asi očekávané chování, že když mezi majáčky cca 1m od sebe dám ruku, tak se detekovaná vzdálenost nepatrně změní.
Příště by to chtělo autodetekci, jaké majáčky jsem vůbec zapnul.</div>
<hr/>
<div class='p'><a id="211219"></a></div>
<h2>19. prosinec 2021 — pozyx.doRanging()</h2>
<div class='p'><a href='https://pypozyx.readthedocs.io/en/develop/pypozyx_api/index.html' class='external'>Pypozyx</a>
knihovna má „trošku” zvrhlou notaci volání jednotlivých funkcí. Asi je to inspirováno Arduinem, ale …
prostě místo aby funkce vrátila daný výsledek, tak je třeba jí předat třídu (resp. strukturu?), kam se výsledky
uloží a funkce pouze vrací kód pro úspěch nebo selhání.</div>
<div class='p'>Jako další plán jsem chtěl zkusit <i>remote ranging</i>, tj. mám-li zařízení A, B a C, kde v počítači mám zapojený
přes USB (jo, tentokrát již spravným kabelem) zařízení A, tak se chci dozvědět vzdálenost mezi B a C. A opravdu to je
přímočaré, prostě zavoláte <b>pozyx.doRanging(B, C)</b> a je to. <span class='smile'></span> Ono totiž všechna zařízení spolu komunikují a
tak si to nasdílí. Celkový kód vypadá takto:</div>
<pre>import pypozyx
serial_port = '/dev/ttyACM0'
pozyx = pypozyx.PozyxSerial(serial_port)
remote_id = 0x0D53
destination_id = 0x0D67
device_range = pypozyx.DeviceRange()
status = pozyx.doRanging(destination_id, device_range, remote_id)
print(device_range)</pre>
<div class='p'>A výsledek je jednoduše:</div>
<pre>63812 ms, 1081 mm, -80 dBm</pre>
<div class='p'><span class='smile'></span></div>
<div class='p'>p.s. tak už mi funguje i ta autodetekce — funkce <b>getDeviceListSize()</b> mi stále vracela 0, i když jsem měl zapnuto
hned několik zařízení. Trik je v tom, že je třeba nejprve zavolat <b>doDiscoveryAll()</b>. Pak už číslo sedí a pokračování
kódu vypadá takto:</div>
<pre>pozyx.doDiscoveryAll()
list_size = pypozyx.SingleRegister()
pozyx.getDeviceListSize(list_size)
device_list = pypozyx.DeviceList(list_size=list_size[0])
pozyx.getDeviceIds(device_list)
print([hex(i) for i in device_list])</pre>
<div class='p'>a výsledek jsou ta dvě vzdálená zařízení:</div>
<pre>['0xd53', '0xd67']</pre>
<hr/>
<div class='p'><a id="211221"></a></div>
<h2>21. prosinec 2021 — Lillyino robotické kvarteto</h2>
<div class='p'>Jedna z motivací, proč jsem si Pozyx pořídil, bylo demo <a href='https://sites.google.com/usc.edu/lillyclark/home' class='external'>Lilly Clark</a>
se čtyřmi autonomními mobilními
roboty. Všichni mají na sobě <i>anchor</i> majáček a v daném čase se vždy pohybuje pouze jeden
a jeho pozici odměřují zbývající tři stojící roboti. A tak se postupně střídají a jako skupina
udržují celkem kvalitní globální pozici.</div>
<div class='p'>K dispozici je TEAM (Trilateration for Exploration and Mapping with Robotic Networks)
<a href='https://lillyclark.github.io/files/TEAM.pdf' class='external'>článek</a> a <a href='https://youtu.be/nPLf2tXtbJ0?t=1689' class='external'>video</a>.
Je to nějaká studentská prezentace a některé „detaily” jsou tam možná až moc zjednodušené,
ale jako motivační video snad OK. <span class='smile'></span>
Konkrétně popis GPS je v realitě 3D a neznámá je i absolutní čas. Demo s robotama je
ale ve školních prostorách v jednom patře, tj. 2D, a navíc Pozyx přimo vrací vzdálenost mezi
zařízeními.</div>
<div class='p'><center>
<iframe width="640" height="480" src="https://www.youtube.com/embed/nPLf2tXtbJ0?start=1689" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a id="211222"></a></div>
<h2>22. prosinec 2021 — Hodinový test a mrtvé kotvy</h2>
<div class='p'>Je čas vrátit se do reality. Chtěl jsem udělat první test, kdy budu měřit vzdálenost mezi dvěma majáčky po dobu jedné hodiny.
První divnost byla, že zařízení, které je přímo zapojené přes USB do počítače své ID zamlčuje, resp. lze zjistit, ale přes
<b>pozyx.doRanging()</b> místo ID potrebuje <i>remote_id=None</i>.</div>
<div class='p'>Po 50 minutách už jsem to nevydržel, vypnul test a přidal další majáček. A po chvíli koukám, že dva majáčky/kotvy jsou
mrtvé (nebliká ani LEDka na majáčku ani LEDka na powerbance). Co to?</div>
<div class='p'>Ono asi stačí jenom trošku počítat. Ten vychytralý USB kabel, co ukazuje proud a napětí, říká 5V a 0.2A. Pronásobením je
tedy spotřeba cca 1W (potvrzeno i supportem, kdy ale záleží na konfiguraci, množství majáčků v dosahu a režimu měření).
A teď powerbanky. Jsou překvapivě malé = tak malé jsem ještě neviděl. ;-( … 1200mAh. Zkrátím to, napájet majáček ta
powerbanka (nebo powerbančička) vydži max tu hodinu.</div>
<div class='p'>Ještě je možné, že po prvním nabití nemají plnou kapacitu, protože se dvěma plně nabitými a jednou napůl jsem dostal tento
graf:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/one-hour-test.png'><img src='/articles/pozyx/one-hour-test_t.png' alt='hodinový test se čtyřmi majáčky' title='hodinový test se čtyřmi majáčky' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/one-hour-test.png'>hodinový test se čtyřmi majáčky</a>
</td></tr></table></div>
<div class='p'>Dobrá zpráva je, že ty dva majáčky vydržely celou hodinu. Ale ten částečně nabitý jen cca 20s. Je vidět i rozptyl, jak to
poskakuje cca těch +/- 10cm.</div>
<div class='p'>Možná ještě podivné pozorování ze včerejška, kdy jsem měřil pouze vzdálenost dvou vzdálených majáčků a je tam vidět díra,
kdy žádná měření nejsou k dispozici — dnes bych podezříval tu baterku, tj. možná se jeden resetoval a po nějakém čase
se vzpamatoval??</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/articles/pozyx/pozyx-50min.png' alt='včerejší 50min běh s výpadky' title='včerejší 50min běh s výpadky' class='border' width='640' height='480'/></span><br/>
<span>včerejší 50min běh s výpadky</span>
</td></tr></table></div>
<div class='p'>p.s. pro to hraní jsem si udělal pracovní <a href='https://github.com/robotika/osgar/tree/feature/pozyx' class='external'>feature/pozyx</a> větev a je tam i
<a href='https://github.com/robotika/osgar/blob/feature/pozyx/osgar/drivers/pozyx.py' class='external'>experimentální OSGAR Pozyx driver</a>.</div>
<div class='p'>p.s.2 nabití všech třech powerbank trvalo 2 hodiny, tak jsem ready na další hodinový test … <span class='smile'></span></div>
<div class='p'><b>MartinL píše</b>:
<i>S největší pravděpodobností je v té powerbance LiON baterka, která má nominální napětí 3,6V a tebou uváděnou kapacitu 1200 mAh.
Obsahuje měnič na 5V, který nebude mít 100% učinnost, ale takových 80% to snad bude. Tudíž proud odebíraný z baterky bude cca dvojnásobný oproti tomu, co teče na těch 5V. Tj. pro 5V a 0,2A to bude asi 0,4A.
Takže teoretická výdrž baterky by měla být 1200 / 400 = 3 hodiny. Pokud to vydrží jen tu hodinu, tak je ta baterka hodně špatná nebo je ten odběr podstatně vyšší.</i></div>
<hr/>
<div class='p'><a id="211223"></a></div>
<h2>23. prosinec 2021 — Decaware, DWM1000 a další</h2>
<div class='p'>Na včerejším <i>Robotika post SubT</i> pravidelném callu došlo i na Pozyx a jestli to není nějaká mrtvá větev
v oblasti <i>indoor radiové lokalizace</i>. Jirka říkal, že existuje <a href='https://www.firaconsortium.org/' class='external'>FIRA Consortium</a>,
do kterého jsou zapojeni velcí hráči (Apple, Google, Samsung, …) a jestli spíše to není cesta? A že také
existují i <a href='https://www.makerfabs.com/esp32-uwb-ultra-wideband.html' class='external'>jiné hračky</a> za $40 ve srovnání s 1050EUR za
<a href='https://store.pozyx.io/creator-kit-65?_ga=2.169182370.2026377525.1639763609-490974699.1639763609#attr=85' class='external'>Pozyx Creator kit</a>?!</div>
<div class='p'>Dobrá zpráva je, že obě cesty mají společný základ a to jsou UWB (Ultra Wide Band) čipy od firmy <a href='https://www.decawave.com/' class='external'>Decawave</a>,
kterou loni koupila firma Quorvo (viz. <a href='https://www.decawave.com/qorvo-completes-acquisition-of-decawave/' class='external'>Qorvo Completes Acquisition of Decawave</a>).
Když jsem o Pozyxu slyšel poprvé a psal o tom svému bývalému šefovi z Haptica/Irsko (podle mailu to bylo před šesti lety),
tak to komentoval: <i>I don’t know the guys but their kit is based on the UWB sensors of another Irish company</i> <a href='http://www.decawave.com/' class='external'>http://www.decawave.com/</a>.
Malý svět.</div>
<div class='p'>Jirka také zmiňoval firmu <a href='https://locatify.com/blog/in-practice-precise-indoor-location-detection-with-uwb-ultra-wideband/' class='external'>Locatify</a>,
kde lokalizaci použivají pro audio doprovod v galerii. A až to bude standard v telefonech, tak nebudete potřebovat ani žádné další zařizeni.</div>
<div class='p'>Franta posílal odkaz na článek <a href='https://www.cnx-software.com/2021/12/22/esp32-uwb-board-features-dw1000-module-for-accurate-indoor-positioning/' class='external'>ESP32 UWB board features DW1000 module for accurate indoor positioning</a> (aha, to jsem si ani nevšiml, že je ze včerejška), tak se nám to pěkně schází. <span class='smile'></span></div>
<div class='p'>Teď je asi na čase si přečíst to společné jádro — <a href='https://www.decawave.com/sites/default/files/resources/dwm1000-datasheet-v1.3.pdf' class='external'>DWM1000 datasheet</a>.</div>
<div class='p'>Ještě přidám dvě poznámky ke včerejšímu blogu. Když jsem zkoušel měřit jenom vůči jednomu majáčku, tak to vydrželo skoro dvě hodiny a to jsem před tím
ještě cca 20min jen tak měřil sensory s pohybem. Tj. výdrž powerbanky není jen 1 hodina, ale ani ty 3 hodiny co počítal MartinL. 2 hodiny je ale
na test už OK, tak se posunu k dalším pokusům.</div>
<div class='p'>Ještě bylo zvláštní, že když jsem zase zkoušel měřit vzdálenosti mezi čtyřmi majáčky, tak se to po nějaké době „kousne” (dříve jsem myslel,
že to došla ta baterka). Možná to má něco společného s tím, co píše Lilly, kdy jednotlivé <i>anchor</i> moduly měla zapojené přes USB do robotů,
ale dávala si velký pozor, aby nemluvili současně:</div>
<div class='p'><i>One thing I've wondered about is that it seems you can't call .doRanging(device B) on pozyx device A and .doRanging(device A) on pozyx device B at the same time -- in my experience it would cause them to stop outputting anything usable until reboot. Have you observed the same thing?</i> … zatím ještě nevím, ale možná to je to, co vidím na grafu níže:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/multi-range.png'><img src='/articles/pozyx/multi-range_t.png' alt='20 minutový test se třema zařízeníma' title='20 minutový test se třema zařízeníma' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/multi-range.png'>20 minutový test se třema zařízeníma</a>
</td></tr></table></div>
<div class='p'>Na co se to koukáme? Jenotlivé barvy odpovídají páru majáčků/kotev, pro které v daném čase volám <i>doRanging()</i>. <i>None</i> odpovídá zařízení zapojenému
přímo do PC. Na začátku jsem to nechal vše staticky v pokoji, ale po cca 10 minutách (čas 600s) mne to přestalo bavit a každý jednotlivý majáček jsem
vzal a prošel se s ním a pak ho vrátil na své místo. Ještě bych měl říci, že ta funkce vrací 3 hodnoty: POZYX_SUCCESS, POZYX_FAILURE, POZYX_TIMEOUT.
V grafu vidíte pouze ty POZYX_SUCCESS.</div>
<div class='p'>Jedna z divností je třeba zelená (3431, 3455), která je po chvíli konstantní. Mimochodem ta funkce vrací ve
struktuře i čas měření, ale bohužel netuším jakého zařízení, protože je to čas od spuštění. Tato čára má stále stejný čas. Skoro to vypadá, že modro-žlutá
3431 umře, ale fialovo-hnědá 3455 žije dál a reportuje základně poslední měření z 3431??</div>
<div class='p'>Ještě mám jednu obavu, jestli mi prostě neusínají? Ona cena Pozyxu je i v <a href='https://docs.pozyx.io/enterprise/Installing-the-Device-Configurator.1337786400.html' class='external'>nástrojích na konfiguraci</a>,
které jsem ještě ani nezkoušel instalovat … a <a href='https://docs.pozyx.io/enterprise/Configuring-the-tags.1224015986.html' class='external'>auto-sleep</a> tam je …</div>
<div class='p'>p.s. přemýšlím, jestli vedle dotazu <i>pozyx.doRanging(A, B)</i> bych neměl také zkoušet <i>pozyx.doRanging(B, A)</i>, aneb jak to vidí ze svého pohledu
to druhé zařízení?</div>
<hr/>
<div class='p'><a id="211224"></a></div>
<h2>24. prosinec 2021 — Creator Anchor vs. Developer Tag</h2>
<div class='p'>Vánoce, vánoce, přicházejí …</div>
<div class='p'>Včera jsem to nevydržel a rozšrouboval <i>anchor</i>/kotvu, abych se podíval dovnitř. Zkoumal jsem totiž nově i na <i>Developer Tag</i> (Arduino shield)
a přišlo mi, že rozměrově jsou si hodně podobné. Zkoušel jsem ale také <i>Pozyx Device Configurator</i> a ten nějak poznal, že to jsou různá zařízení:</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/creator-anchor.png'><img src='/articles/pozyx/creator-anchor_t.png' alt='Developer Anchor' title='Developer Anchor' class='border' width='320' height='418'/></a><br/>
<a href='/articles/pozyx/creator-anchor.png'>Developer Anchor</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/creator-tag.png'><img src='/articles/pozyx/creator-tag_t.png' alt='Developer Tag' title='Developer Tag' class='border' width='320' height='419'/></a><br/>
<a href='/articles/pozyx/creator-tag.png'>Developer Tag</a>
</td></tr></table></div>
<div class='p'>„Trošku” zklamání bylo „množství” věcí co lze nastavit — vlastně je všechny vidíte výše: <i>Channel</i>, <i>Datarate</i>, <i>Preamble</i>, <i>PRF</i> a <i>Power</i>.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/boards-comparison.jpg'><img src='/articles/pozyx/boards-comparison_t.jpg' alt='Creator Anchor vs. Developer Tag' title='Creator Anchor vs. Developer Tag' class='border' width='640' height='360'/></a><br/>
<a href='/articles/pozyx/boards-comparison.jpg'>Creator Anchor vs. Developer Tag</a>
</td></tr></table></div>
<div class='p'>Jak vidíte, tak desky jsou jiné — na kotvách chybí akcelerometry, gyra, kompas, tlakoměr … prostě se očekává, že budou statické.</div>
<pre>acc = pypozyx.Acceleration()
pozyx.getLinearAcceleration_mg(acc)
print(acc)</pre>
<div class='p'>s výsledkem:</div>
<pre>X: -4.0, Y: -7.0, Z: -33.0</pre>
<div class='p'>Ještě drobná mezihra byla, že po připojení <i>developer tagu</i> jsem zkoušel zase <i>anchor</i> a vůbec nic nefungovalo! Trošku jsem se vyděsil,
že jsem v konfiguraci něco zmenil. Panika. Zkusím další kotvu a stejné chování! A důvod? No změnilo se číslo portu. <span class='smile'></span></div>
<pre>[1146360.588322] usb 1-6: new full-speed USB device number 20 using xhci_hcd
[1146360.738850] usb 1-6: New USB device found, idVendor=0483, idProduct=5740, bcdDevice= 2.00
[1146360.738855] usb 1-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1146360.738859] usb 1-6: Product: Pozyx Virtual ComPort in FS Mode
[1146360.738861] usb 1-6: Manufacturer: Pozyx Labs
[1146360.738863] usb 1-6: SerialNumber: 359E385B3438
[1146360.741406] cdc_acm 1-6:1.0: ttyACM1: USB ACM device</pre>
<div class='p'>No jo no … asi žádné překvapení <b>ttyACM1</b> místo nuly na konci.</div>
<div class='p'>Pěkné je, že se můžete ptát na stavy senzorů i vzdálených zařízení: <i>pozyx.getLinearAcceleration_mg(acc, 0x680a)</i>.
Pro kotvu je pak odpověď poměrně nudná: <i>'X: 0.0, Y: 0.0, Z: 0.0'</i></div>
<div class='p'>Ještě existuje <i>raw</i> varianta, která najednou vrací měření ze všech senzorů:</div>
<pre>>>> raw = pypozyx.RawSensorData()
>>> pozyx.getAllSensorData(raw)
1
>>> str(raw)
'97840500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0'
>>> pozyx.getAllSensorData(raw, 0x680a)
1
>>> str(raw)
'97824750, -101, 224, 949, -28, -224, -520, -2, -1, 2, 202, -87, -217, 16152, 2007, 567, -1788,
-8, -4, 0, -93, 229, 948, 32'</pre>
<div class='p'>Včera jsem také koukal na ten <a href='https://www.decawave.com/sites/default/files/resources/dwm1000-datasheet-v1.3.pdf' class='external'>datasheet DWM-1000</a>
a on je to vlastně pouze modul co obaluje čip DW1000:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/dwm1000.png'><img src='/articles/pozyx/dwm1000_t.png' alt='Schema DWM-1000' title='Schema DWM-1000' class='border' width='640' height='283'/></a><br/>
<a href='/articles/pozyx/dwm1000.png'>Schema DWM-1000</a>
</td></tr></table></div>
<div class='p'>A jak vidíte, tak SPI komunikace jde přimo do čipu, žádný extra konvertor tam není. Ale to si necháme až na příště …</div>
<hr/>
<div class='p'><a id="211225"></a></div>
<h2>25. prosinec 2021 — DW1000 první přiblížení</h2>
<div class='p'>Nevím, kolik toho k tématu dnes sepíšu, tak alespoň dva odkazy, ze kterých budu vycházet:</div>
<ul>
<li><a href='https://www.decawave.com/sites/default/files/resources/dw1000_user_manual_2.11.pdf' class='external'>DW1000 USER MANUAL - HOW TO USE, CONFIGURE AND
PROGRAM THE DW1000 UWB TRANSCEIVER</a> (242 stran)</li>
<li><a href='https://www.decawave.com/sites/default/files/aps010_dw1000_wsn.pdf' class='external'>APS010 APPLICATION NOTE- WIRELESS SENSOR NETWORKS AND THE DW1000</a> (28 stran)</li>
</ul>
<div class='p'>První PDFko jsem před pár dny jenom narychlo prolílt, abych se ujistil, že to moc číst nemůžu. <span class='wink'></span> A to druhé (<i>application note</i>)
mi naopak přišlo čtivé a zajímavé. Teď mám pocit, že bych se měl zase vrátit k tomu prvnímu, protože z toho by mělo být jasné
co všechno řeší čip DW1000 a o co se musí postarat řídící počítač, ale uvidíme …</div>
<div class='p'><i>The DW1000 is a physical layer ultra-wideband (UWB) radio and brings the features of
location awareness, robust communications and resilience to multipath fading to a wireless sensor network (WSN).</i></div>
<div class='p'><i>A more formal definition of a WSN is that it could be considered as a physically distributed
computing system that interacts with the surrounding environment and provides a means to
efficiently transfer this interaction over a span of physical area larger than the transmission
range of the individual radio links between nodes.</i></div>
<div class='p'><i>The radio communications over a link between nodes is relatively expensive in terms of
power. The communications of 1-bit of information over a radio link is equivalent to the
execution of 1000 to 3000 instructions on a microprocessor.</i></div>
<div class='p'><i>... this means a sensor node needs a quarter of the transmit power to communicate over half
the distance. This means that multi-hop networking is more efficient in terms of transmit
power and the expense of more nodes.</i></div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/articles/pozyx/mesh-multi-hop-wsn.png'><img src='/articles/pozyx/mesh-multi-hop-wsn_t.png' alt='Mesh multi-hop wireless sensor network architecture' title='Mesh multi-hop wireless sensor network architecture' class='border' width='400' height='288'/></a><br/>
<a href='/articles/pozyx/mesh-multi-hop-wsn.png'>Mesh multi-hop wireless sensor network architecture</a>
</td></tr></table></div>
<div class='p'><i>A node in any WSN could use a routing table with range to neighbouring nodes as a metric
to control the transmit power to the minimum it requires to reliably communicate with that
neighbouring node.</i></div>
<div class='p'><i>For the DW1000 UWB PHY, the receive power is a constant for any link distance, therefore
the policy or protocol that controls when the receiver is active is very important for energy
conservation.</i></div>
<div class='p'><i>The DW1000 physical layer (PHY) has the capability to provide communication and precision ranging functions, even
where a line of sight (LOS) radio path may not exist.</i></div>
<div class='p'>Ve zkratce — vyplatí se posílat signál na kratší vzdálenost, protože je to méně energeticky náročné.
DW1000 umožňuje jak komunikaci tak měření vzdálenosti a je to tedy základní kámen pro mesh-sítě.</div>
<div class='p'>Ve článku následuje vysvětlení generování signálu a přeposílání +1 a -1 pulzu.</div>
<div class='p'><i>The DW1000 derives ranging capability from calculations using its ability to precisely
timestamp message transmission and reception events.
The DW1000 acquires these precision timestamps by building an accurate estimate of the
channel impulse response (CIR) and processing this data.</i></div>
<div class='p'><i>The DW1000 builds estimates of the CIR by correlating a known preamble sequence against
the received signal and accumulating the result over a period of time. These preamble
sequences are based on preamble codes from the large family of codes called perfect
ternary sequences.</i></div>
<div class='p'><i>The estimated CIR provides information about the first received radio path from another
node. This radio path is known as the first path or leading edge of the CIR. The DW1000
contains signal processing technology that finds this leading edge in the CIR and produces
timestamps to a resolution of 15 picoseconds. By using the DW1000 generated timestamps
a ranging application can produce ranges to a precision of 10 cm.</i></div>
<div class='p'><i>The method used by DW1000 for ranging is known as threshold based time of arrival (TOA).</i></div>
<div class='p'><i>The DW1000 payload consists of a number of symbols. A single symbol carries two
information bits.</i></div>
<ul>
<li><i>The payload bit is encoded as a burst in the symbol position</i></li>
<li><i>The convolutional parity bit is encoded as the polarity of the burst.</i></li>
</ul>
<div class='p'><i>A coherent receiver such as the DW1000 has the ability to see the polarity of a transmitted
burst and so may utilise it in a convolutional decoding algorithm. This is known as systematic
forward error correction (FEC) as the encoding preserves the original data bits.</i></div>
<div class='p'><i>In two-way ranging, a node exchanges timestamps with another node to calculate a time of
flight (TOF) between the nodes. This allows the calculation of a range between the two
nodes.</i></div>
<div class='p'><i>In one-way ranging, a node can transmit blinks to a number of other receiving nodes. The
timestamps from these other receiving nodes are used as time difference of arrival (TDOA)
values. A multilateration algorithm can then calculate the position of the transmitting node
from the TDOA values.</i></div>
<div class='p'><i>If the receiving nodes are in fixed location then the scheme is known as anchor based
location. If the receiving nodes are mobile then the scheme is known as anchor-less
location, however the receiving nodes may need to locate themselves before the TDOA
multilateration is performed.</i></div>
<div class='p'><i>DecaWave is a pioneering fabless semiconductor company whose flagship product, the
DW1000, is a complete, single chip CMOS Ultra-Wideband IC based on the IEEE 802.15.4-
2011 UWB standard. This device is the first in a family of parts that will operate at data rates
of 110 kbps, 850 kbps and 6.8 Mbps.</i></div>
<div class='p'>To by asi na <i>copy and paste</i> stačilo. Za mne to UWB vypadá zajímavě. Možná ještě
než se pokusím znova prokousat tím uživatelským manuálem k DW1000, tak motivační český
článek ze Smartmanie:</div>
<ul>
<li><a href='https://smartmania.cz/vse-co-potrebujete-vedet-o-uwb-technologie-budoucnosti-ktere-fandi-samsung-apple-i-xiaomi/' class='external'>Vše, co potřebujete vědět o UWB. Technologie budoucnosti, které fandí Samsung, Apple i Xiaomi</a></li>
</ul>
<div class='p'>Co mne tam zaujalo, že nové (resp. už skoro rok staré) <i>Samsung Galaxy S21+</i> a další telefony již UWB technologii podporují!
Bylo by zajímavé to zkusit zkombinovat s Pozyxem, ale mám obavy, že si „moc rozumnět nebudou”. Leda by existovala
nějaká <i>zadní vrátka</i> a přes seriák se dalo bavit přímo s SPI čipu … ale je to spíše nepravděpodobné. :-(</div>
<div class='p'>Což mne ještě přivádí k otázce, co měl Jirka: kdo tedy tu pozici počítá? No je to na 90% ten extra čip,
kterému po seriáku čtete nebo zapisujete registry a případně i pouštíte extra funkce. Seznam dostupných registrů/příkazů je na
<a href='https://github.com/pozyxLabs/Pozyx-Python-library/blob/master/pypozyx/definitions/registers.py' class='external'>pypozyx/definitions/registers.py</a>.
Je to cílené jako aplikace pro Arduino a Python wrapper je jen malý extra bonus.</div>
<div class='p'>p.s. tak ještě doplním řádově levnější alternativu k <i>Pozyx Creator Kit</i>:
<a href='https://www.symmetryelectronics.com/products/decawave-now-qorvo/mdek1001/' class='external'>MDEK1001</a> přímo od Decawave/Qorvo:</div>
<ul>
<li><b>12 modulů</b> (konfigurovatelné jako <i>anchor</i> nebo <i>tag</i>)</li>
<li>cena <b>$199</b></li>
<li><a href='https://www.decawave.com//wp-content/uploads/2019/01/MDEK1001_System_User_Manual-1.1.pdf' class='external'>MDEK1001_System_User_Manual-1.1.pdf</a></li>
</ul>
<hr/>
<div class='p'><a id="211227"></a></div>
<h2>27. prosinec 2021 — DWM1001 API a Jirkovy dotazy</h2>
<div class='p'>Dnes bych se vrátil k modulu <b>DMW1001</b>, který prodávají za cca 5x nižší cenu než <i>Pozyx</i>. Ono tam ještě může být nějaké „ale” … no to
se asi časem vyjasní. Jirka mi poslal několik odkazů a pár dotazů, na které asi zatím nemám odpověď, ale třeba někdo z vás ano. <span class='wink'></span></div>
<div class='p'>První dokument je <a href='https://www.decawave.com/wp-content/uploads/2019/01/DWM1001-API-Guide.pdf' class='external'>DWM1001-API-Guide.pdf</a>, kde o modulu píší:
<i>The DWM1001 module is a radio transceiver module integrating the Nordic Semiconductor nRF52
MCU and Decawave’s DW1000 IC. The nRF52 MCU, which has Bluetooth v4.2 protocol stack
implemented, is acting as the main processor of the DWM1001 module.</i> … a možná nám pomůže rozlousknout otázky, co řeší čip
DW1000 a o co se musí starat <i>main processor</i> (tady ten <i>Nordic Semiconductor nRF52</i>).</div>
<div class='p'>Uhh, chtěl jsem připsat, že na rozdíl od <i>Pozyxu</i> budou k <i>DMW1001</i> i zdrojové kódy … a jsou:
<a href='https://www.decawave.com/dwm1001-dw10001-dev-and-mdek1001-documents-source-code-android-application-firmware-image/' class='external'>
DWM1001, DW10001-DEV AND MDEK1001 DOCUMENTS, SOURCE CODE, ANDROID APPLICATION & R2.0 FIRMWARE IMAGE</a>
… jen je to 1.8GB!</div>
<div class='p'>No nic, zpět k API dokumentu. Každé jednotlivé zařízení si můžete nakonfigurovat jako <i>anchor</i> nebo <i>tag</i>, kde <i>anchor</i>
je očekáván, že je statický se známou pozicí a <i>tag</i> je pohyblivý a pozici určuje vůči pozorovaným <i>anchors</i>/kotvám.
Většina příkazu je typu <i>set</i>/<i>get</i>. Příkladem může být <b>dwm_pos_set</b>, který nastaví pozici, pokud je zařízení
konfigurované jako kotva (v <i>tag</i> módu je pozice uložena, ale jinak je ignorována). Odpovídající funkce je <b>dwm_pos_get</b>,
která vrátí aktuální pozici a pokud není k dispozici, tak tu jenž je uložena.</div>
<div class='p'>Funkce, která mne asi nejvíce zaujala je <b>dwm_loc_get</b> —
<i>Get last distances to the anchors (tag is currently ranging to) and the associated position. The
interrupt is triggered when all TWR measurements have completed and the LE has finished.</i>
Vrací to pole jak vzdáleností ke kotvám, tak jejich pozice. Pole má maximálně 15 prvků.
A také to posílá pozici samotného zařízení … prostě kompletní info na jakém základě
je pozice počítaná. <span class='smile'></span></div>
<div class='p'>Je tam ještě spousta funkcí pro konfiguraci, správu verzi firmware (všechny zařízení se umí automaticky
updateovat) a Bluetooth. Zatím jsem moc nepochopil co jsou <i>user data</i> (max 34 bajtů) a co je
<i>label</i> (max 16 bajtů). A ještě jsem zapomněl na GPIO, tj. vzdálené digitální vstupy a výstupy.</div>
<div class='p'>Modul poskytuje i jednoduchý terminál přes UART. Zajímavě vypadají např. příkazy: <b>la</b>, <b>ln</b> a <b>lr</b>,
tedy <i>list anchors</i>, <i>list nodes</i> a <i>list routes</i>. Předpokládám, že je to popis aktuální sítě,
ale třeba větě: <i>List nodes heard by BN through backhaul, only works for BN.</i> moc nerozumím. :(
Aha, tak BN = Bridge Node, to zatím ještě neznám.</div>
<div class='p'>Další link od Jirky: <a href='https://www.decawave.com/sites/default/files/aps010_dw1000_wsn.pdf' class='external'>https://www.decawave.com/sites/default/files/aps010_dw1000_wsn.pdf</a>
<i>The DW1000 provides the physical layer of the protocol stack and has some MAC protocol assist features.
The remaining layers of the protocol stack are realized as software executing on an external microprocessor.</i> [kapitola 5]</div>
<div class='p'>A Jirkův dotaz: <i>Tj. zajímalo by me, jestli se Pozyx umí domluvit "za roh." Z robotika.cz vím, ze se můžeš nodu A zeptat na vzdálenost mezi B a C. Ale je nutné, aby A aspoň na jeden z těch dvou měl přímé spojeni? Nebo se můžu zeptat i na Y a Z, které jsou dostupné jen s meziskoky přes další uzly? Pokud umi Pozyx i meziskoky, je tam nezanedbatelný value-add nad DW1000, asi i ospravedlňující cenový rozdíl.</i></div>
<div class='p'>Hmm, ale jak to vyzkoušet? Byt máme malý a tak si myslím, že když je všude WiFi, tak všude bude i signal pro kotvy/tagy.
Napadl mne jeden pokus s tagem ve výtahu a monitorovat z domova, ve kterém je patře … ale zas tak moc jich nemám
a na hru <i>follow me</i> teď úplně náladu nemám. <span class='smile'></span></div>
<div class='p'>p.s. jinak s tím Androidem to úplně růžově nevypadá. Viz článek
<a href='https://www.xda-developers.com/google-adding-ultra-wideband-uwb-api-android/' class='external'>Google has added an Ultra-wideband (UWB) API in Android</a>,
kde ale pak píšou <i>update</i>, že to API pro Android 12 zatím nebude dostupné aplikacím třetích stran … ale2 už je to skoro rok a třeba se něco
brzy změní <span class='wink'></span></div>
<div class='p'>p.s.2 procházka se psem …</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/walk-dog.png'><img src='/articles/pozyx/walk-dog_t.png' alt='Procházka se psem' title='Procházka se psem' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/walk-dog.png'>Procházka se psem</a>
</td></tr></table></div>
<div class='p'>… no na sledování polohy výtahu to rozhodně není. Jediné co z toho vidím je, že procházka byla cca 15 minut a že ten signal
se ztratil už na chodbě, tak ten Jirkův pokus by asi šel udělat i tady …</div>
<div class='p'>p.s.3 tak se ta vzájemné měření propagují … bez spojky nevidím vzdálenosti … ale vlastně vzájemné
vzdálenosti těch přimo nedosažitelných nodů nedostanu :(</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/articles/pozyx/remote-range-indirect.png' alt='vzdálené měření' title='vzdálené měření' class='border' width='640' height='480'/></span><br/>
<span>vzdálené měření</span>
</td></tr></table></div>
<div class='p'>(je tam také úlet na začátku — těch cca 70 metrů, ale pak se to srovná)</div>
<hr/>
<div class='p'><a id="220104"></a></div>
<h2>4. leden 2022 — Informační střípky</h2>
<div class='p'>Minulý týden jsem toho moc na počítači neudělal — to jsem si raději užival tajících hor, kde se turistické stezky změnily v divoké horské potoky. <span class='wink'></span>
Ale Jirka se činil a mám plnou schránku nejrůznějších odkazů, článků a doporučení. Také jsem dostal nějaké odpovědi od podpory Pozyxu a od Lilly.</div>
<div class='p'>Začal bych od opovědi Pozyxu. Poslali jednak datasheet k <i>Development tagu</i> a pak odpověď na téma kompatibility a otevřenosti SW:
<i>Regarding your other question, there is no compatibility with other devices due to the software which is indeed closed source. We also don't provide a way to directly communicate with the DW1000 chip.</i> Ještě přidali přání do nového roku, ale tyto špatné zprávy (asi očekávané) to přebily. Obávám se, že
svým dalším dotazem, jak je to ve srovnání s <i>DMK1001</i> za 199USD jsem asi podporu ukončil …</div>
<div class='p'>… tak ne, před chvíli ještě Robb odpověděl: <i>I understand your remarks, the creator kit was our first product when the company just started and is thus already quite a few years old by now. Regarding the advantage compared to the MDEK1001 Kit. Our product has different features that I don't find for the other kit such as:</i></div>
<ul>
<li><i>Arduino compatibility</i></li>
<li><i>Python programming using the python library</i></li>
<li><i>Extensive documentation with code examples</i></li>
<li><i>Visualization on a floor plan</i></li>
<li><i>on board IMU with access to IMU data</i></li>
<li><i>Access data via the MQTT stream (locally or via the cloud)</i></li>
<li><i>Implementation of certain filters</i></li>
<li><i>Implementation of localization algorithms</i></li>
<li><i>Auto calibration for more than 4 anchors</i></li>
<li><i>Easy configuration using the creator controller</i></li>
<li><i>Cleaner looking application with more options</i></li>
</ul>
<div class='p'><i>If you want program on the MDEK1001 Kit you will need a good technical knowledge and invest a significant time in reading the documentation whereas our system is much more user-friendly for people who don't have such a technical background.</i></div>
<div class='p'>Tak jo, tolik info přímo od Pozyxu. Zatím srovnání nemám, ale Jirka vypadal, že si možná ten alternativní <i>kit</i> pořídí.</div>
<div class='p'>A teď co nového od Jirky, který se rozhodně mezi svátkama neflákal. <span class='smile'></span></div>
<div class='p'>Asi první skupina se týká komunikace. Ona <i>mesh</i> komunikace je primární účel této technologie a lokalizace je
takový vedlejší prodkut, i když je nutná k vytvoření rozumné komunikační sítě. DWM1001 kit podporuje pouze 34 bajtů pro uživatelská data
což je na jeden packet hrozně málo.</div>
<ul>
<li><a href='https://www.decawave.com/wp-content/uploads/2019/01/DWM1001-Firmware-User-Guide-2.1.pdf' class='external'>DWM1001-Firmware-User-Guide-2.1.pdf</a> — <i>After reading this guide developers should be able to compile, build and run the DWM1001 firmware, including custom modifications.</i></li>
</ul>
<div class='p'><i>Decawave does not provide the library source code, or support any use of the PANS
library except through the PANS API which is described in the API Document.</i> … hmm, tak také samá voda.
A po pravdě žádné info o 1023 bajtových zprávách jsem tam neviděl (ale prošel jsem to hodně rychle).</div>
<div class='p'>Dále tu mám dotaz k minulému experimentu — doplňuji obrázek bytu a umístění kotev ke grafu:</div>
<div class='p'><table class='image_panel center' style='width: 718px;'><tr><td>
<span><img src='/articles/pozyx/home-tags.png' alt='Pozice kotev k experimetu z 27/12' title='Pozice kotev k experimetu z 27/12' class='border' width='712' height='405'/></span><br/>
<span>Pozice kotev k experimetu z 27/12</span>
</td></tr></table></div>
<div class='p'>Sedím u počítače, kde základna je <b>None</b>, bez <b>3455</b> další kotvy vůbec nevidím, a když přidám <b>3455</b>
tak můžu zjistit pouze vzdálenosti k <b>3455</b>, ale nikoliv vzdálenosti sousedních kotev <b>3411</b> a <b>3431</b>.</div>
<div class='p'>Jirka píše: <i>Při činnosti skrz zdi a za roh doporučuje Decawave přenastavit parametry:</i>
<a href='https://www.decawave.com/wp-content/uploads/2018/10/APS006_Part-2-NLOS-Operation-and-Optimizations_v1.5.pdf' class='external'>APS006_Part-2-NLOS-Operation-and-Optimizations_v1.5.pdf</a>.
<i>Pak si věří na zhruba 10m skrz dvě slabé zdi. Tj. na byt by to mohlo při troše štestí a dobrém umístění kotev stačit.
V dalším dokumentu pak přidávají "nižši frekvence, vyšší dosah" (což je vidět i na 2.4 GHz wifi vs 5 GHz wifi):</i>
<a href='https://www.decawave.com/sites/default/files/aps017_max_range_in_dw1000_systems.pdf' class='external'>aps017_max_range_in_dw1000_systems.pdf</a></div>
<hr/>
<div class='p'><a id="220106"></a></div>
<h2>6. leden 2022 — Follow me</h2>
<div class='p'>Dnes bych přidal druhou dávku „kompilovaných mailů od Jirky”. Včera jsme se na callu bavili, že není špatné najít všechny odkazy na jednom místě,
tak je to lepší hledat na webu než v mailech. <span class='smile'></span></div>
<div class='p'>Začal bych mailem z 30/12: <i>A trochu pro pobavení UWB Follow Me - čtyři kotvy na robotovi, jeden tag na clověkovi:</i></div>
<div class='p'><center>
<iframe width="640" height="360" src="https://www.youtube.com/embed/fieUOGI0wnw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<div class='p'>… něco podobného bych rád zkusil s <a href='/robots/eduro/cs'>Edurem</a>, pak <a href='/guide/osgar/cs'>John Deere</a> a případně i se Spiderem (ten má rozhodně širší základnu). <span class='smile'></span></div>
<div class='p'>Další maily se točili kolem toho, jak moc je UWB s DW1000 čipem certifikované a použitelné v různých zemích.</div>
<div class='p'><b>JI:</b> Odkazy táham z téhle přednašky (půl hodiny, asi za ten čas asi stojí): <a href='https://www.youtube.com/watch?v=TR-rahy3Y2k' class='external'>https://www.youtube.com/watch?v=TR-rahy3Y2k</a> (Po třinácté minutě jsou tyhle regulace.)</div>
<h3>Evropská regulace</h3>
<div class='p'><i>As per the ECC/DEC/(06)04 [i.2] and Decision 2007/131/EC [i.4] and its amendments [i.5], [i.6], the UWB transmitter equipment conforming to the present document is not to be installed at a fixed outdoor location, for use in flying models, aircraft and other forms of aviation. The present document applies to UWB equipment with an output connection used with a dedicated antenna or UWB equipment with an integral antenna.</i>
<a href='https://www.etsi.org/deliver/etsi_en/302000_302099/30206501/02.01.01_60/en_30206501v020101p.pdf' class='external'>ETSI.ORG en_30206501v020101p.pdf</a> (strana 7)
Mobilní nelétající užití venku je asi OK.</div>
<div class='p'>Nicméně, navazující pravidla přidávají:
(LT = Location Tracking)
<i>LT2 systems: These systems, operating in the 3,1 GHz to 4,8 GHz region (see ECC/REC(11)09 [i.8]), are intended for person and object tracking and industrial applications at well-defined locations. The transmitting terminals in these systems may be located indoors or outdoors, and may be fixed or mobile. They operate at fixed sites and may be subject to registration and authorization, provided local coordination with possible interference victims has been performed, ECC Report 167 [i.10] and ECC Report 170 [i.11].</i>
<a href='https://www.etsi.org/deliver/etsi_en/302000_302099/30206502/02.01.00_20/en_30206502v020100a.pdf' class='external'>ETSI.ORG en_30206502v020100a.pdf</a> (strana 8)
Tj. pro určité frekvence je asi lokalizace (ne přenos dat) možná i outdoor fixed.
Auta a vlaky v pohybu (!) budou asi jestě další speciální kategorie: <i>Furthermore, it does not cover LT1 UWB transmitters that are operated on board a road or rail vehicle running on a public network or highway.</i></div>
<div class='p'>Jestli ty frekvence čtu dobře, jsou to kanály 1 až 4. Z nějakého Decawave dokumentu si vybavuju <i>default: 5</i>.</div>
<hr/>
<div class='p'>Martine, v tom 1.8 GB zipu od Decawave je sice hromada zdrojaků, ale to nejdůležitější, co běží na tom Nordic cosi Armu řídícím DW1000, je tam jenom v binarní formě:</div>
<div class='p'>Otázka: <i>... But I can’t fing the PANS’s source code</i></div>
<div class='p'>Odpověď: <i>PANS is shipped as a library/binary only. There is no source code for this library available for download.</i>
<a href='https://decaforum.decawave.com/t/dwm1001-pans-release-2/4347/17' class='external'>https://decaforum.decawave.com/t/dwm1001-pans-release-2/4347/17</a></div>
<div class='p'>Je tam dost knihoven a zdrojáků, aby si člověk napsal vlastní, ale je nutné začít od nuly.</div>
<div class='p'>Koukám na to, protože hledám původ omezení uživatelských zpráv na 34 B. Jeden strop je TLV format, který používá 1B pro délku zprávy. Nicméně jsou tam 3B headeru a 252 B zbývá (anebo víc? počítá se ten header do délky?). Takže nevím. Jenže „prostě to zkompiluju s vyšší hodnotou” kvůli nepřítomnosti zdrojáků nepůjde.</div>
<hr/>
<div class='p'>U mě se podobně ochladilo po zjištení, že ten Decawave firmware pro dev board je closed source. Je tam pár drobností, které bych dělal jinak. Jednak těch 34 B pro <b>usr_data</b> packet, jednak celé chovaní kolem bluetooth - kupříkladu tam neni mesh <span class='wink'></span>, takže při nastavování musí být všechna zařízení v dosahu BLE. Vždyť je to komunikační modul s dlouhym dosahem, proboha!</div>
<div class='p'>Tj. koukám, kolik může dát práce to celé přeprogramovat.</div>
<div class='p'>Což je zajímavá výzva pro matfyzáky:</div>
<div class='p'>Vstup:</div>
<ul>
<li>N komunikačních zařízení, která umí <i>Send</i>, <i>Receive</i>, <i>GetTime</i> a <i>GetUniqueId</i>.</li>
<li>Všechna komunikují na jednom komunikačním kanálu a když mluví dvě blízká zařízení najednou, ruší se.</li>
<li>Ne všechna zařízeni jsou v komunikačním dosahu, ale každé je v dosahu aspoň tří dalších, která nejsou v jedné přímce.</li>
</ul>
<div class='p'>Výstup:</div>
<ul>
<li>Všech N zařízení zná své 3D souřadnice.</li>
</ul>
<div class='p'>Volitelný výstup:</div>
<ul>
<li>Schopnost routovat zprávy z A do B, i když nejsou v přímém komunikačním dosahu.</li>
</ul>
<div class='p'>S pomocí <i>Send</i>, <i>Receive</i>, <i>GetTime</i> a <i>GetUniqueId</i> se snadno udelá <i>GetDistanceTo</i> (two-way ranging), takže předpokladejme, že ta existuje taky. Akorát spotřebuje 2xSend, ideálně těsně po sobě.</div>
<div class='p'>Rozšířená varianta úlohy:</div>
<ul>
<li>Některá z těch N zařízení jsou mobilní a průběžně mění jak pozici, tak topologii sítě.</li>
</ul>
<hr/>
<div class='p'>Alternativni vyrobce podobné technologie:
<a href='https://www.nxp.com/products/wireless/secure-ultra-wideband-uwb:UWB-TRIMENSION' class='external'>www.nxp.com</a>
Plus: <i>FIRA stack installed</i> (ať už to znamená co přesně)
Mínus: Nevidím volně dostupné velké množství datasheetu, jako ma Decawave.</div>
<div class='p'>p.s. Oprava matfyzácké úlohy: „Vždycky jsou v dosahu alespoň čtyři další zařízení a nejsou v jedne rovině.” Nebo tak nějak. Proste „cokoli je geometricky potřeba, je splněno.”</div>
<div class='p'><b>MD:</b> nebylo by použitelné některé to jejich repo? <a href='https://github.com/Decawave/uwb-apps' class='external'>https://github.com/Decawave/uwb-apps</a></div>
<div class='p'><b>JI:</b> Jo, jo, z těch příkladů se dá vyjít. Jsou to, mimochodem, ty zdrojáky v tom 1.8 GB balíku.</div>
<div class='p'>Jsou nejspíš dobré na ověření toho, že dokážeme zkompilovat, nahrát a pustit funkční kód. Mezi těmi příklady a celou tou jejich closed source PANS funkcionalitou je ale dlouhá cesta.</div>
<div class='p'><b>MD:</b> oni tam těch repo mají 8 … není toto blíže? <a href='https://github.com/Decawave/uwb-core' class='external'>https://github.com/Decawave/uwb-core</a></div>
<div class='p'><b>JI:</b> Jo, to vypada sloziteji. Já jsem se napoprvé lekl někde u NewtOS („Co prosim?”), ale asi jsem měl pokračovat.</div>
<div class='p'>Mimochodem, proklikal jsem se odtamtud na <a href='https://lohmega.com/faq/' class='external'>https://lohmega.com/faq/</a>, kde dole zmiňují důležitost výšky antény nad zemí. A když si tak vybavuju snímky některých průmyslových instalací z přednášek, co jsem videl, asi by se to mělo aplikovat i na výšku pod stropem a vlastně vůbec vzdálenost od odrazive plochy
(<a href='https:/wikipedia.org/wiki/Fresnel_zone' class='external'>https:/wikipedia.org/wiki/Fresnel_zone</a>).</div>
<div class='p'>p.s. Autoři článku <a href='https://www.researchgate.net/publication/341586825_Error_Corrections_for_Ultrawideband_Ranging/fulltext/5ec8754c92851c11a8815f25/Error-Corrections-for-Ultrawideband-Ranging.pdf' class='external'>Error-Corrections-for-Ultrawideband-Ranging.pdf</a> (obr. 5), který je teda hlavně o něčem jiném, pozoruji nekolikaminutový (až ~18 min) warmpup DW1000, než začne hlásit stabilní čísla.</div>
<hr/>
<div class='p'><a id="220110"></a></div>
<h2>10. leden 2022 — pozyx.doPositioning()</h2>
<div class='p'>Asi je na čase udělat pár pokusů ve scénáři, pro který je Pozyx primárně určený — lokalizace. Přiznám se, že voláním jednotlivých funkcí
jsem neuspěl a od automatické kalibrace sítě autoři odrazují. Používám tedy <i>manuální nastavení</i> a vzor tutoriál
<a href='https://docs.pozyx.io/creator/Tutorial-2:-Ready-to-localize-(Python).1189118273.html' class='external'>Ready to localize</a>.</div>
<div class='p'>Přepsaný kód vypadá následovně:</div>
<pre>from pypozyx import PozyxSerial, DeviceCoordinates, Coordinates
serial_port = '/dev/ttyACM0'
pozyx = PozyxSerial(serial_port)
anchors = [DeviceCoordinates(0x0D53, 1, Coordinates(2980, 2240, 1250)),
DeviceCoordinates(0x0D67, 1, Coordinates(2980, 3140, 1250)),
DeviceCoordinates(0x0D7F, 1, Coordinates(710, 160, 930)),
DeviceCoordinates(0x6826, 1, Coordinates(130, 4350, 2230))]
remote_id = None
status = pozyx.clearDevices(remote_id)
for anchor in anchors:
status &= pozyx.addDevice(anchor, remote_id=remote_id)
position = Coordinates()
status = pozyx.doPositioning(position, 3, remote_id=remote_id)
print(status, position)</pre>
<div class='p'>A výsledek:</div>
<pre>1 X: 2841.0, Y: 1249.0, Z: 776.0</pre>
<div class='p'>To je OK. <span class='smile'></span> Stejně tak potěšila <i>vzdálená lokalizace</i>, kdy místo <i>remote_id=None</i> vyplníte
konkretní ID zařízení. Jen poznámka, že informace o všech kotvách je třeba nejprve do zařízení
nahrát (lze případně uložit dlohodobě pomocí <i>pozyx.saveAnchorIds()</i> a <i>pozyx.saveRegisters()</i>).</div>
<div class='p'>Aby to zas nebylo tak moc růžové, tak ta pozice 2x extra stabilní není, ale to může být mým
rozložením kotev:</div>
<pre>POS ID 0x0000, x(mm): 2780.0 y(mm): 1240.0 z(mm): 834.0
POS ID 0x0000, x(mm): 2882.0 y(mm): 1177.0 z(mm): 856.0
POS ID 0x0000, x(mm): 3541.0 y(mm): 1390.0 z(mm): 1539.0
POS ID 0x0000, x(mm): 2618.0 y(mm): 1414.0 z(mm): 754.0
POS ID 0x0000, x(mm): 2710.0 y(mm): 1233.0 z(mm): 1133.0
POS ID 0x0000, x(mm): 2860.0 y(mm): 1212.0 z(mm): 845.0
POS ID 0x0000, x(mm): 2881.0 y(mm): 1228.0 z(mm): 858.0
POS ID 0x0000, x(mm): 2864.0 y(mm): 1225.0 z(mm): 842.0
POS ID 0x0000, x(mm): 2890.0 y(mm): 1122.0 z(mm): 933.0
POS ID 0x0000, x(mm): 2882.0 y(mm): 1227.0 z(mm): 844.0
POS ID 0x0000, x(mm): 2871.0 y(mm): 1158.0 z(mm): 940.0
POS ID 0x0000, x(mm): 2896.0 y(mm): 1218.0 z(mm): 847.0
POS ID 0x0000, x(mm): 2898.0 y(mm): 1206.0 z(mm): 863.0
POS ID 0x0000, x(mm): 2675.0 y(mm): 1356.0 z(mm): 888.0</pre>
<hr/>
<div class='p'><a id="220114"></a></div>
<h2>14. leden 2022 — (Ne)dostupnost a časové známky</h2>
<div class='p'>Dlužím vám pár informací ohledně vývojového kitu <a href='https://www.symmetryelectronics.com/products/decawave-now-qorvo/mdek1001/' class='external'>MDEK1001</a>
za $199 (teoreticky). První co mne při objednání trošku zklamalo byla cena dopravy:
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/mdek-shipping.png'><img src='/articles/pozyx/mdek-shipping_t.png' alt='Cena dopravy pro MDEK1001 z Smmetry Electronics' title='Cena dopravy pro MDEK1001 z Smmetry Electronics' class='border' width='640' height='498'/></a><br/>
<a href='/articles/pozyx/mdek-shipping.png'>Cena dopravy pro MDEK1001 z Smmetry Electronics</a>
</td></tr></table></div>
<div class='p'>Plus to nebylo na skladě, tak jsem se 2x rozhoupával, zda do toho jít. Naskladněné to mělo být 12. ledna 2022
(ano, to již bylo — ja to objednával 5. ledna). Jirka přiznal, že si to již objednal a to mne poštouchlo, ale
chyba lávky. Nejprve přišel formulář, na co že se to chystáme používat. Byl jsem varován Jirkou, takže OK.
Druhý den ale přišel mail: <i>Unfortunately, we are now out of stock and it will take until April for item to arrive.
Please confirm if you would like to wait and keep your order opened.</i> Hmm, no Jirka objednával dříve a tak snad se vešel
do té várky k 12/1 … jo jo, to by bylo moc jednoduché. 11/1 přeposílal mail: <i>Unfortunately, the supplier had a delay
and the new date is May 2022</i>. Jirka objednávku zrušil a hledá alternativy. Já bych asi také měl … aneb <i>Pozyx</i>
je předražený, ale na druhou stranu jsem ho dostal ještě ten týden před vánoci.</div>
<div class='p'>Tak a teď ty <i>časové známky</i>. V úterý jsem dělal nějaké experimenty v hale ČZU a to také úplně růžové nebylo.
Vedle informace <i>kolik je naměřená vzdálenost mezi A a B?</i> je třeba se i ptát <i>jak stará je tato informace?</i>.
Krabičky totiž s radostí odpoví <i>to vím, to vím</i>, ale může to být několik minut staré! Měřil jsem totiž nejprve
krátké (cca 5m) vzdálenosti a pak přes celou halu (cca 20m) a chodily mi dál ty krátké … ale se starou
časovou známkou, což zase oceňuji.</div>
<div class='p'>A ještě se mi často děje jedna <i>nepěknost</i> — zapomínám některé kotvy zapnout (případně jim může dojít baterka).
Pokud se ptáte jen na pozici, tak je schopné si to něco vymyslet, tedy nejčastěji (0, 0, 0), což možná člověka
trkne. Ale pokud to jsou jiná čísla a vezme to v úvahu měření <i>z minulého století</i>, tak <i>špatný, špatný,
špatný</i>, abych citoval jednu sci-fi co jsem dostal pod stromečkem. <span class='wink'></span></div>
<div class='p'>A jak moc velká skleróza může být naznačuje tento obrázek (pozn. že ty časové známky jsou interní, od času 0
od okamžiku napájení kotvy) … hmm, takže jsem si ten obrázek interpretoval „naruby”??</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/articles/pozyx/forgotten-anchors.png' alt='zapomenuté (nenapájené) kotvy' title='zapomenuté (nenapájené) kotvy' class='border' width='640' height='480'/></span><br/>
<span>zapomenuté (nenapájené) kotvy</span>
</td></tr></table></div>
<div class='p'>No jsou vidět dvě hlavní „časové” skupinky, ale ta červená mne mate … to bude chtít ještě nějakou revizi.</div>
<hr/>
<div class='p'><a id="220115"></a></div>
<h2>15. leden 2022 — Dosah 100 metrů? Ha, ha, ha</h2>
<div class='p'>Jo, jo, jak titulek z Blesku. <span class='wink'></span> Jirka by to jistě rozporoval, že pro jiný kanál a preambuli bych mohl dostat více,
takže první <i>dálkové měření</i> venku na zahradě bylo s defaultním nastavením: kanál 5, datarate 110, preambule 1024,
PRF 64, power 11.5
(vycházím z toho obrázku pro 0x6867, kterou jsem měl zapojenou do počítače). Bylo to na výšku na monitoru na notebooku
(jinak položeném na zemi) a s druhou krabičkou (0x0D67) připojenou na powerbance jsem šel přes zahradu tam a pak zpět.
Přidal jsem tam cca 5s pauzy u „visuálně význačných bodů”, ale nutně jsem trasu nezopakoval. A výsledek vypadá takto:</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-outdoor1.png'><img src='/articles/pozyx/pozyx-outdoor1_t.png' alt='' title='' class='border' width='320' height='240'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-outdoor2.png'><img src='/articles/pozyx/pozyx-outdoor2_t.png' alt='' title='' class='border' width='320' height='240'/></a>
</td></tr></table></div>
<div class='p'>No 100m to není. Je zvláštní, že v druhém pokusu je to ještě horší než v tom prvním — že by se ta powerbanka tak
rychle vybila? Skoro to vypadá jistější do 30m a někdy do 50m. Možná znova zkusím projít nastavení, jestli nemůžu
zvětšit citlivost a ty powerbanky nabiju na max, ale s tímto nastavením by pořádně nefungovalo ani sekání zahrady,
resp. by to chtělo hustější síť kotev.</div>
<div class='p'>p.s. koukám znova na to nastavení a kanál můžu nastavit na 1, 2, 3, 4, 5, 7 (ano, 6 tam chybí). Datarate můžu zvýšit
z 110 na 850 nebo 6810. Preambule je od 64 do 4096 (mám 1024). PRF je 16 nebo 64 a power je od 0.0 do 33.0 (používám 11.5).
Závěr — je tam prostor pro zlepšení/experimenty. <span class='smile'></span></div>
<hr/>
<div class='p'><a id="220116"></a></div>
<h2>16. leden 2022 — UWB channels</h2>
<div class='p'>Dnes bych začal opisem tabulek z <a href='https://www.decawave.com/sites/default/files/resources/dw1000_user_manual_2.11.pdf' class='external'>dw1000_user_manual_2.11.pdf</a>.
Jirka včerejší post komentoval: <i>Co nejnižší kanál, co nejnižší datarate, co nejdelší preamble, PRF netuším, "power" zní jako "moarrrrre",
anténu aspoň půl metru nad zemí ve volném prostoru, ještě lépe metr nad zemí, a v cestě by neměla být žádná překážka nebo odrazová plocha,
jako třeba země, takže nejlépe testovat přes údolí nebo mezi mrakodrapy.</i> <span class='smile'></span></div>
<div class='p'>První tabulka naznačuje, že defaultní kombinace co používám (110kbs a 1024 preambule) není výrobcem doporučovaná:</div>
<div class='p'><table class='image_panel center' style='width: 545px;'><tr><td>
<span><img src='/articles/pozyx/dw1000-preamble-lengths.png' alt='Tabulka doporučených délek preambule' title='Tabulka doporučených délek preambule' class='border' width='539' height='306'/></span><br/>
<span>Tabulka doporučených délek preambule</span>
</td></tr></table></div>
<div class='p'><i>The preamble sequence used at all data rates is the same, i.e. it does not depend on the chosen data rate.
The preamble sequence length, (i.e. the number of symbol intervals for which it is repeated), has a
significant effect on the operational range and the accuracy of timestamps. Table 57 gives some
recommended preamble sequence lengths to use depending on the data rate. In general, a longer preamble
gives improved range performance and better first path time of arrival information while a shorter preamble
gives a shorter air time and saves power. When operating a low data rate for long range, then a long
preamble is needed to achieve that range. At a high data rate the operating range is naturally short so there
is no point in sending a very long preamble as it wastes time and power for no added range advantage.</i></div>
<div class='p'><i>There are two choices of mean pulse repetition frequency (PRF) within the DW1000. These are 16 MHz PRF
or 64 MHz PRF. The higher PRF gives
more accuracy on the first path timestamp and perhaps slightly improved operating range, however this
comes at the price of additional power consumption.</i></div>
<div class='p'><table class='image_panel center' style='width: 735px;'><tr><td>
<span><img src='/articles/pozyx/dw1000-channels-tab.png' alt='Tabulka frekvencí a šířka pásma pro jednotlivé kanály' title='Tabulka frekvencí a šířka pásma pro jednotlivé kanály' class='border' width='729' height='369'/></span><br/>
<span>Tabulka frekvencí a šířka pásma pro jednotlivé kanály</span>
</td></tr></table></div>
<div class='p'>Strana 209, sekce 9.1 Operating Range: <i>The operating
range also varies depending on the channel centre frequency and channel bandwidth selected – a lower
centre frequency gets more range than a higher one, while the wider bandwidth channels channel 4 and
channel 6 have more range than the standard 500 MHz bandwidth channels as the wider channel allows
more energy to be sent at a given dBm / MHz regulatory limit.</i> (předpokládám, že 6 má být 7?)</div>
<div class='p'>Zatím si to interpretuji tak, že nejlepší výsledek bych měl dostat pro kanál 1 (možná 4?), <i>datarate</i>
nechat na 110kbps, <i>preamble</i> zvýšit na 4096, PRF nechat na 64 a <i>power</i> „co to dá”???</div>
<div class='p'>…</div>
<div class='p'>No nic, dnes to nebude. :( Ten úžasný nastavovač <b>device-configurator-1.3.6.appimage</b> sice dovolí
vyplnit co jsem napsal výše, ale neuloží to do zařízení a po zapnutí se to vrátí do defaultu. Divné.
Je tam možnost si vytvořit vlastní <i>profil</i> pro danou kombinaci (našel jsem tam např. <i>High range</i>
a <i>High update rate</i>), ale do zařízení se to uloží jen krátkodobě. Co je nastavené lze zjistit i
z Pythonu:</div>
<pre>>>> serial_port = '/dev/ttyACM0'
>>> pozyx = pypozyx.PozyxSerial(serial_port)
>>> data = pypozyx.SingleRegister()
>>> pozyx.getUWBChannel(data)
1
>>> print(data)
0x5</pre>
<div class='p'>Je tam i odpovídající <b>setUWBChannel()</b>, s popisem <i>If using this remotely, remember to change
the local UWB channel as well to make sure you are still able to communicate with the remote device.</i>
Trošku mi to připomíná „Kdyby tisíc klarinetů” — až vyhodíte pojistky bude tma … no nic, je
čas sekat třisky a vrátit se do civilizace.</div>
<hr/>
<div class='p'><a id="220123"></a></div>
<h2>23. leden 2022 — Channel 1, preambule 4096, gain 33 = více jak 80 metrů</h2>
<div class='p'>Dnešní měření mi zase dodala naději. <span class='smile'></span> Udělal jsem <a href='https://github.com/robotika/osgar/commit/524671bb37ae983c58f440b07dd1428c0440faea' class='external'>drobný hack</a>,
který všem vypsaným zařízením nastaví:</div>
<pre>settings = pypozyx.UWBSettings()
settings.bitrate = 0 # {0: '110 kbit/s', 1: '850 kbit/s', 2: '6.81 Mbit/s'}
settings.channel = 1
settings.prf = 2 # {1: '16 MHz', 2: '64 MHz'}
settings.gain_db = 33.0
# {0x0C: '4096 symbols', 0x28: '2048 symbols', 0x18: '1536 symbols', 0x08: '1024 symbols',
# 0x34: '512 symbols', 0x24: '256 symbols', 0x14: '128 symbols', 0x04: '64 symbols'}
settings.plen = 0x0C
self.pozyx.setUWBSettings(settings, remote_id=remote_id)</pre>
<div class='p'>A když jsem nechal jednu kotvu uvnitř a druhou obešel chatu, tak nebyl žádný výpadek. Podobně pak dole
na zahradě stejný test jako před týdnem. Základnu jsem dal tentorkát na převráceny plastový sud (tj. mělo by to být
alespoň ten metr nad zemí) a druhou kotvu jsem napájel z 5000mA powerbanky dříve používané na <a href='/robots/marina/cs'>lodičce</a>.
Primárně jsem zkoušel nové nastavení výše (kanál 1, preambule 4096, max gain 33 čert ví čeho). A výsledky (opakované 2x)
mne tak potěšili, že jsem se prošel ještě vedle na „pole” a na 80 metrech to stále něco měřilo. Je tam mezera, protože
čast zakrýva <i>skoro padlý</i> strom. No a nakonec jsem použil defaultní nastavení jako referenci.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-82m.png'><img src='/articles/pozyx/pozyx-82m_t.png' alt='Maximální vzdálenost pro (1, 4096, 33)' title='Maximální vzdálenost pro (1, 4096, 33)' class='border' width='320' height='169'/></a><br/>
<a href='/articles/pozyx/pozyx-82m.png'>Maximální vzdálenost pro (1, 4096, 33)</a>
</td></tr></table>
<table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-power5000mA.png'><img src='/articles/pozyx/pozyx-power5000mA_t.png' alt='Původní nastavení' title='Původní nastavení' class='border' width='320' height='169'/></a><br/>
<a href='/articles/pozyx/pozyx-power5000mA.png'>Původní nastavení</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-channel1.png'><img src='/articles/pozyx/pozyx-channel1_t.png' alt='Bezztratové měření s novým nastavením' title='Bezztratové měření s novým nastavením' class='border' width='320' height='169'/></a><br/>
<a href='/articles/pozyx/pozyx-channel1.png'>Bezztratové měření s novým nastavením</a>
</td></tr></table></div>
<div class='p'>Ještě bych zmínil, že při testování změny nastavení mi vzdálenost mezi dvěma kotvama skočila v průměru z 3.93m na 4.01m,
ale to je vlastně v toleranci — možná by s různým nastavením šlo zjistit, zda je mezi zařízeními nějaká překážka?? No nic,
příště, možná, …</div>
<hr/>
<div class='p'><a id="220201"></a></div>
<h2>1. únor 2022 — DW1000 + BU01 (Jirka)</h2>
<div class='p'>Už mi zase ten seznam co jsem všechno za poslední dobu neudělal nějak nezdravě narostl. Navíc dnes není 1. února, ale už 5.
To datum se ale váže k Jirkovu mailu (začal psát s diakritikou, abych při přepisování nedělal tolik chyb <span class='wink'></span>), kde popisuje
své první úspěchy s alternativní deskou používající DW1000 čip.</div>
<div class='p'>Za sebe bych si udělal alespoň „záložku” na českou IoT stránku, kde jednak je celá technologie UWB popsána, a dále jsem
tam poprvé viděl grafy energetické náročnosti v závislosti na typu vysílané/přijímané části zpráv:</div>
<ul>
<li><a href='https://www.iot-portal.cz/2018/08/23/urcovani-polohy-v-realnem-case-s-presnosti-na-10-cm/' class='external'>Určování polohy v reálném čase s přesností na 10 cm (2018-08-23)</a></li>
</ul>
<div class='p'>Tak teď ten slibovaný mail od Jirky:</div>
<div class='p'><table class='image_panel right' style='width: 226px;'><tr><td>
<a href='/articles/pozyx/nodemcu-bu01.png'><img src='/articles/pozyx/nodemcu-bu01_t.png' alt='NodeMCU-BU01 (ai-thinker.com)' title='NodeMCU-BU01 (ai-thinker.com)' class='border' width='220' height='220'/></a><br/>
<a href='/articles/pozyx/nodemcu-bu01.png'>NodeMCU-BU01 (ai-thinker.com)</a>
</td></tr></table></div>
<div class='p'>Pracuju s <a href='https://docs.ai-thinker.com/en/uwb' class='external'>NodeMCU-BU01</a>, což je poměrně minimalistická deska s STM32F103C8 mikrokontrolérem kolem BU01 modulu s DW1000 čipem od Decawave pro komunikaci a následně pro měření vzdálenosti. Koupil jsem těch desek deset a vypadá to, že některé přišly flashnuté jako "anchor" a jiné jako "tag". To je ale zatím vcelku jedno, protože s defaultním firmware jsem je zatím nedonutil k vzájemné komunikaci. Ani se moc nesnažím, protože chci firmware vlastní.</div>
<div class='p'>Slušnou nadvládu nad tou deskou získávám, když vyjdu z "opencm" příkladu na <a href='https://github.com/satoshinm/pill_blink' class='external'>https://github.com/satoshinm/pill_blink</a>. OpenCM3 je knihovna dostatečne nízkoúrovňová, abych mohl řešit potíže, a dostatečně vysokoúrovňová na to, abych se nezbláznil z registrů a prescalerů a všeho možného. V důsledku dokážu blikat všemi třemi LED na palubě, komunikovat s PC přes UART a reagovat na přerušení vyvolané stiskem tlačítka. Dokumentaci OpenCM3 bych ale hodnotil jako nedostatečnou.</div>
<div class='p'>Mikrokontrolér programuji a debuguji pomocí <a href='https://packages.debian.org/sid/electronics/stlink-tools' class='external'>stlink-tools</a> přes <a href='https://www.waveshare.com/wiki/ST-LINK/V2_(mini)' class='external'>ST-LINK/V2 Mini</a>. Občas sáhnu po <a href='https://openocd.org/' class='external'>OpenOCD</a>, které se zdá mocnější, ale konkrétní výhody jsem zatím nenašel. Resp. tu jednu, o které vím, zatím nevyužívám. Snad až se budu snažit flashovat firmware větší než 64kB. Ono totiž tenhle procesor má podle datasheetu 64kB flash a to samé o sobě i tvrdí, ale <a href='https://mecrisp-stellaris-folkdoc.sourceforge.io/stm32f103c8-diags.html' class='external'>ve skutečnosti má často 128kB</a>. Jak je to konkrétně s mými kousky zatím nevím. S OpenOCD jde při flashování ignorovat, co o sobě ten procesor hlásí.</div>
<div class='p'>Co zatím taky nevím, je, jestli funguje USB pro přenos dat a ne jen pro napájení. Defaultní firmware přes USB nekomunikuje. USB bootloadery, které jsem nahrával - <a href='https://github.com/Serasidis/STM32_HID_Bootloader' class='external'>HID Bootloader</a> a <a href='https://github.com/rogerclarkmelbourne/STM32duino-bootloader' class='external'>STM32duino-bootloader</a> - nefungují. PC ani nedetekuje připojené zařízení. Včera jsem asi konečně vykopal psa, který to způsobuje. Externí oscilátor na NodeMCU-BU01 tiká na 16MHz, zatímco většina desek se stejným procesorem používá oscilátor na 8Mhz. Pokud bootloadery předpokládají 8MHz, je pak časování na USB úplně mimo.</div>
<div class='p'>Nejspíš z podobného důvodu, kvůli oscilátoru, jsem zatím nerozchodil ani <a href='https://github.com/stm32duino/Arduino_Core_STM32' class='external'>Arduino pro STM32</a>. <a href='https://www.zephyrproject.org/' class='external'>Zephyr OS</a> jednak naráží na to samé, jednak i po pokusu o přenastavení padá program v nějakém ošetření přerušení, o které jsem ani neprosil. Zephyr i Arduino prozatím odkládám.</div>
<div class='p'>Jako další krok bude nutné rozchodit SPI, abych se měl jak domluvit s DW1000. Jako bonus by se mi líbilo rozchodit to USB, abych nemusel pořád pracně připojovat USB-UART převodník. Pak by možná i znovu nastal čas na bootloader, aby nebyl potřeba ani ten STLINK.</div>
<hr/>
<div class='p'><a id="220210"></a></div>
<h2>10. únor 2022 — Decawave driver (Jirka)</h2>
<div class='p'>OK, dnes to budou zase novinky od Jirky, jeden starší a jeden nový …</div>
<h3>[Update 5/2/2022]</h3>
<div class='p'><b>0xdeca0130!</b> Tj. dokážu přes SPI přečíst device id z DW1000. Zádrhel byl <a href='http://libopencm3.org/docs/latest/stm32f1/html/group__spi__file.html' class='external'>opět v mizerné dokumentaci knihovny OpenCM3</a>. Pro zápis a čtení přes SPI neslouží funkce spi_write() a spi_read(), a to dokonce navzdory tomu, že jsou tyhle dvě funkce použité ve <a href='https://github.com/libopencm3/libopencm3-examples/blob/master/examples/stm32/f1/lisa-m-2/spi/spi.c' class='external'>vzorovém příkladu pro SPI</a>. Je potřeba <a href='https://www.mail-archive.com/libopencm3-devel@lists.sourceforge.net/msg00338.html' class='external'>použít spi_xfer()</a>. Teď ještě k tomu vlastnímu readfromspi() přidat writetospi() a měl by začít fungovat <a href='https://github.com/Decawave/dwm1001-examples/tree/master/deca_driver' class='external'>celý driver od Decawave</a>. Kus jsem ho už použil pro to čtení device id.</div>
<h3>[Update 10/2/2022]</h3>
<div class='p'>Mám portovaný <i>Decawave driver</i>. Funguje mi posílání a příjem zpráv. Mačkáním tlačítka na jedné desce blikám ledkou na druhé. Na obou deskách je stejný firmware, takže se přepínají navzájem.</div>
<div class='p'>Zajímavý zádrhel je vnitřní stavový automat DW1000. Kupříkladu ze stavu "přijímám" neumí přejít přímo do stavu "vysílám". Nejdříve je potřeba příjem přerušit a přejít do stavu "nic nedělám". Zároveň se taky ve stavu "přijímám" sám od sebe neudrží. Když přijde částečná, či jinak porušená zpráva, přejde DW1000 do stavu "chyba, nic nedělám". Takže je nutné pořád kontrolovat, zda pořád ještě přijímá, a případně ho znovu nahodit. Nebo si nastavit přerušení, aby pokrylo nejen příjem nové platné zprávy, ale i různé chyby, a v rámci obsluhy přerušení pak řešit, jestli přišla zpráva, nebo nastala chyba. A když tak znovu zapnout příjem.</div>
<div class='p'>Když už mluvím o přerušení … Na desce je bohužel tlačítko na portu A, pinu 0, zatímco DW1000 IRQ pin je připojený na port B, pin 0. Ztěžuje to život. U procesoru stm32f103 jsou oba připojitelné pouze na ten stejný interrupt, EXTI0. Řešit v jedné obslužné rutině dva možné zdroje přerušení není nic pěkného. Vlastně jsem to ani nezkoušel, takže nevím, jestli to zkombinovat vůbec jde. Alternativou je jeden z těch zdrojů pollovat. Protože v budoucnu asi tlačítko nebude potřeba, polluju to. Později tuhle ošklivou část kódu smažu.</div>
<div class='p'>Blíží se čas na nižší aplikační vrstvu: Komunikační protokol z PC přes sériák, komunikace se vzdálenými moduly přes proxy modul a UWB, časem snad včetně výroby mesh sítě. Pro vyšší aplikační vrstvu budou potřeba pokusy s časováním a měřením vzdálenosti.</div>
<hr/>
<div class='p'><a id="220213"></a></div>
<h2>13. únor 2022 — Pozyx + GPS</h2>
<div class='p'>Dnes jsem udělal pár rychlých testů na zahradě. Zasloužilo by si to pořádně rozměřit a udělat už <i>pořádné kotvy</i>, ale … raději něco málo než vůbec nic.
Graf (z druhého pokusu) mne zaujal:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/pozyx-gps.png'><img src='/articles/pozyx/pozyx-gps_t.png' alt='vzdálenosti pro 3 kotvy a opakovaný okruh' title='vzdálenosti pro 3 kotvy a opakovaný okruh' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/pozyx-gps.png'>vzdálenosti pro 3 kotvy a opakovaný okruh</a>
</td></tr></table></div>
<div class='p'>Je na něm pěkně vidět, že ty tři kotvy se nepohybovaly, zatímco <i>None</i> „základna” (notebook s GPS a Pozyxem) vzdálenost je proměnná.
Špatná zpáva je, že tam byla ještě čtvrtá kotva a ta při druhém pokusu vůbec vidět není.</div>
<pre>set OK 3431
set OK 3455
set OK 3411
ERROR 26662
set OK None</pre>
<div class='p'>Tak jo, už to vidím … ono již při prvním pokusu vypadlo spojení v čase 150s a pak už se tedy spojení neobnovilo. :-( … moc spolehnutí na to tedy není.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/gps-pozyx-4anchors.png'><img src='/articles/pozyx/gps-pozyx-4anchors_t.png' alt='výpadek 4. kotvy v čase 150s' title='výpadek 4. kotvy v čase 150s' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/gps-pozyx-4anchors.png'>výpadek 4. kotvy v čase 150s</a>
</td></tr></table></div>
<div class='p'>Teď bych měl přidat obázek z JOSM a spočítat pozici pomocí <i>trilaterace</i>, ale asi na to úplně při nedělním večeru nemám sil. Možná zítra. Pro referenci si sem
schovám logy <a href='/articles/pozyx/gps-pozyx-220213_142833.log'>gps-pozyx-220213_142833.log</a> a <a href='/articles/pozyx/gps-pozyx-220213_143221.log'>gps-pozyx-220213_143221.log</a>.</div>
<hr/>
<div class='p'><a id="220216"></a></div>
<h2>16. únor 2022 — No GPS vs. BU01 Single Sided</h2>
<div class='p'>Ještě o víkendu jsem si říkal, že by mohla být zábava jet s Jirkou „paralelní slalom” a porovnávat,
kdo se kam za jakou dobu dostal, ale teď už vím s jistotou, že by to divácky byla hrozná nuda: Jirka by byl
v cíli dříve než já se vůbec rozhoupu vyjet. <span class='wink'></span></div>
<div class='p'>Tak jsem si konečně rozchodil <a href='https://josm.openstreetmap.de/wiki/Download' class='external'>JOSM</a> (ano, nakonec zbaběle pod Windows)
a dupnul data z GPS seriáku:</div>
<div class='p'><i>python -m osgar.logger gps-pozyx-220213_142833.log --stream gps_serial.raw --raw</i></div>
<div class='p'><i>$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,142833.775,V,,,,,,,130222,,*25
$GPGGA,142834.775,,,,,0,00,,,M,0.0,M,,0000*5B
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,142834.775,V,,,,,,,130222,,*22
$GPGGA,142835.775,,,,,0,00,,,M,0.0,M,,0000*5A
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,142835.775,V,,,,,,,130222,,*23
$GPGGA,142836.775,,,,,0,00,,,M,0.0,M,,0000*59
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,2,1,07,29,54,218,31,02,43,079,27,31,23,084,26,27,28,165,*76
$GPGSV,2,2,07,04,22,045,,24,13,156,,20,01,100,*4F</i></div>
<div class='p'>(zdá se, že ani naformátovat text s dolarama a dvěma mínus mi moc nejde) … no nic, o co jde? Není tam žádná pozíce!</div>
<div class='p'>Nechal jsem se naivně ukolébat "statistikou":</div>
<pre>python -m osgar.logger gps-pozyx-220213_142833.log
k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>-
0 sys 715 | 6 | 0.0Hz
1 gps.position 540 | 180 | 1.0Hz
2 gps_serial.raw 36730 | 5731 | 31.8Hz
3 pozyx.range 56498 | 3104 | 17.2Hz
4 pozyx.settings 796 | 10 | 0.1Hz
Total time 0:03:00.231309</pre>
<div class='p'>ale ona ta `gps.position` je</div>
<div class='p'><i>python -m osgar.logger gps-pozyx-220213_142833.log --stream gps.position</i></div>
<pre>0:00:01.093414 1 [None, None]
0:00:02.105047 1 [None, None]
0:00:03.097231 1 [None, None]
0:00:04.101952 1 [None, None]</pre>
<div class='p'>… tak teorie, že Pozyx (na plný výkon) nejspíše trošku ovliňuje i příjem GPS. Zároveň se přiznám,
že jsem se nijak nesnažil je od sebe extra odstínit.</div>
<div class='p'>A teď příspěvky Jirky:</div>
<h3>Update 14-02-2022 (Jirka)</h3>
<ul>
<li>Posílám strukturované zprávy, včetně hlavičky podle IEEE 802.15.4. Díky tomu může DW1000 filtrovat příchozí zprávy podle adresáta a nezatěžovat mikroprocesor cizími zprávami.</li>
<li>Prvním uživatelem strukturovaných zpráv je Single-sided Two-way Ranging, aneb cesta tam a zase zpátky. To je nejjednodušší způsob měření vzdálenosti a Decawave ho v uživatelské dokumentaci srdečně nedoporučuje kvůli velké citlivosti na různé nepřesnosti. Dobrá zpráva je, že mi naměřená doba letu signálu roste se vzdáleností mezi moduly. Ne tak dobrá zpráva je, že při malých vzdálenostech, pod 1.5 metru, ten vztah není lineární.</li>
</ul>
<div class='p'>V dalším kroku nejspíš přejdu na Double-Sided Two-way ranging, které je sice složitější, vyžaduje více poslaných zpráv, ale mělo by být o řád až dva přesnější. Pak bude potřeba přijít na to, jak je to s těmi zpožděními signálu při cestě k anténě a z ní, což do naměřené doby letu signálu zanáší konstantní chybu.</div>
<div class='p'>Takhle nějak, viz příloha, vypadá odhad vzdálenosti vůči skutečné vzdálenosti. Tohle je hodně optimistický případ, protože to jsou stejná data, na kterých jsem ten převod kalibroval. Přijde mi to dost citlivé na umístění předmětů, včetně mě, kolem antén(y). Něco takového asi způsobovalo i tu nelinearitu včera, kterou dneska nevidím. Po 1.9 m se změní typ povrchu podlahy a celé to skočí.</div>
<div class='p'><table class='image_panel center' style='width: 418px;'><tr><td>
<a href='/articles/pozyx/single-sided-two-way-ranging.png'><img src='/articles/pozyx/single-sided-two-way-ranging_t.png' alt='Single sided two way ranging' title='Single sided two way ranging' class='border' width='412' height='218'/></a><br/>
<a href='/articles/pozyx/single-sided-two-way-ranging.png'>Single sided two way ranging</a>
</td></tr></table></div>
<h3>Update 16-02-2022 (Jirka)</h3>
<div class='p'>Doporučované Double-sided Two-way Ranging na krátké vzdálenosti vypadá skoro nerozlišitelně od Single-sided Two-way Ranging. Viz příloha. Střední kvadratická chyba je téměř stejná. Rozdíly v rychlosti hodin obou zařízení, a tedy výhody Double-sided, se ale asi více projeví až při větší vzdálenosti. Budu muset vymyslet, jak testovat na větší vzdálenost a nezmoknout při tom <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 418px;'><tr><td>
<a href='/articles/pozyx/double-sided-two-way-ranging.png'><img src='/articles/pozyx/double-sided-two-way-ranging_t.png' alt='Double sided two way ranging' title='Double sided two way ranging' class='border' width='412' height='218'/></a><br/>
<a href='/articles/pozyx/double-sided-two-way-ranging.png'>Double sided two way ranging</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="220217"></a></div>
<h2>17. únor 2022 — Pozyx path vs. BU01 default range</h2>
<div class='p'>Tak jo, nejlepší je mít nějakou urgentní nezajímavou práci a pak hraní jde úplně samo. <span class='wink'></span> A ano, zase jsem to „lehce” ošidil, protože místo pořádné trilaterace
je to pouze průběžný update pozice vůči měření k právě přijaté vzdálenosti ke kotvě. Ty chodí v různé časy … a vlastně by to i Kalmanem skončilo, jen
tam teď není žádný model pohybu a K=1.</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-path-overview.png'><img src='/articles/pozyx/pozyx-path-overview_t.png' alt='Přehled trasy' title='Přehled trasy' class='border' width='320' height='160'/></a><br/>
<a href='/articles/pozyx/pozyx-path-overview.png'>Přehled trasy</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/pozyx-path-detail.png'><img src='/articles/pozyx/pozyx-path-detail_t.png' alt='Detail cesty' title='Detail cesty' class='border' width='320' height='160'/></a><br/>
<a href='/articles/pozyx/pozyx-path-detail.png'>Detail cesty</a>
</td></tr></table></div>
<div class='p'>Co mne ale zase znervónilo byl assert na měření vzdálenosti mezi kotvami:</div>
<pre>AssertionError: ((0, 0, 0), (12.721, 29.308, 0), 31.94969021759053, 12.417)</pre>
<div class='p'>Prostě dvě kotvy co mají být cca 32 metrů od sebe „naměříme” 12.4m! No je to na 95% přetečení měření k mezi jinými uzly …</div>
<h3>Update 17-02-2022 12:44am (Jirka)</h3>
<div class='p'>Maximální hlášená vzdálenost v garáži je těsně nad 30 metrů. Až překvapivě se to shoduje s délkou té garáže, resp. toho parkoviště, odhadnuté podle Google maps. Kolem 29 metrů to měření začalo vypadávat. Těžko říct, jestli kvůli vzdálenosti, nebo kvůli rušivým odrazům.</div>
<div class='p'>V bytě přes zdi končím po pěti metrech.</div>
<div class='p'>Nastavené je to podle <a href='https://github.com/Decawave/dwm1001-examples/blob/1b2a46e14546d8f24cf08ff3d64d802e109cd2d3/examples/ss_twr_init/main.c#L41-L52' class='external'>příkladu od Decawave</a>. Zkusím si s tím pohrát.</div>
<h3>Update 17-02-2022 8:50pm (Jirka)</h3>
<div class='p'>Na čerstvém povětří:
channel=5, prf=64M, prefix_len=128,preamble_code=10: 77 m hlášených, ale podle Google maps to dost možná bylo ke 100 m. Že by se našla ta chybějící třetina rychlosti světla při převodu? Pak bych měl ale při malých vzdálenostech docela velkou chybu.
channel=4, prf=64M, prefix_len=128,preamble_code=20: 60 m hlášených, ale nad 50 m už to bylo mizerné, s mnoha výpadky. Podle map 80 m.</div>
<div class='p'>Zajímavostí terénního profilu je, že jsem šel přes mělký ďolík. Na protějším svahu byl příjem spolehlivější, než uprostřed dole. Navzdory tomu, že to bylo pořád v přímé viditelnosti. Tj. pro lokalizaci sekačky bude nejvhodnější, bude-li sekačka létat.</div>
<h3>Update 17-02-2022 9:54pm (Jirka)</h3>
<div class='p'><i>(to bylo po mém dotazu, zda to nechce vyzkoušet na více zařízeních)</i></div>
<div class='p'>Dost vysoko na mém seznamu priorit je kalibrace a ta chybějící třetina rychlosti světla. Dokud neměřím vzdálenost, nechce se mi to komplikovat více zařízeními. Decawave driver obsahuje <a href='https://github.com/Decawave/dwm1001-examples/blob/1b2a46e14546d8f24cf08ff3d64d802e109cd2d3/deca_driver/deca_range_tables.c#L457-L485' class='external'>korekční tabulku</a> a <a href='https://github.com/Decawave/dwm1001-examples/blob/1b2a46e14546d8f24cf08ff3d64d802e109cd2d3/deca_driver/deca_range_tables.c#L34' class='external'>magický offset</a>, které používá pro <a href='https://github.com/Decawave/dwm1001-examples/blob/1b2a46e14546d8f24cf08ff3d64d802e109cd2d3/deca_driver/deca_range_tables.c#L622-L698' class='external'>opravu odhadu</a>. To ale můj problém neřeší. Takže tady ještě nějaká práce zbývá.</div>
<h3>Update 17-02-2022 9:54pm (Jirka)</h3>
<div class='p'><a href='https://www.decawave.com/wp-content/uploads/2018/10/APS011_Sources-of-Error-in-Two-Way-Ranging-Schemes_v1.1.pdf' class='external'>Application Note 11</a> popisuje, kde se bere ta korekční tabulka. Silnější signál dřív překročí threshold pro detekci jeho přítomnosti. Různí uživatelé interpolují různě nelineárně [ <a href='https://decaforum.decawave.com/t/a-viable-range-compensation-model/3741/15' class='external'>1</a>, <a href='https://decaforum.decawave.com/t/trilateration-algorithms/848' class='external'>2</a> ]. V [ <a href='https://decaforum.decawave.com/t/a-viable-range-compensation-model/3741/15' class='external'>1</a> ] taky pozorovali citlivost na náklon antény a na přítomnost vodivých předmětů v jejím okolí.</div>
<div class='p'>Zajímavá je taky <a href='https://www.decawave.com/wp-content/uploads/2018/10/APS017_Max-Range-in-DW1000-Systems_v1.1.pdf' class='external'>Application Note 17</a>, která tvrdí, že kvůli odrazům od země může nastat situace, kdy je signál detekovaný do nějaké vzdálenosti, pak kus není a pak zase je.</div>
<div class='p'><i>p.s. k tomu mé pozorování, že ta pozice je taková klikatice je očekávaně, protože se nutně nepohybuji v rovině kotev a tak jsou vzdálenosti větší a budou moji pozici odstrkovat ... mi přijde v kontextu tech šílených kalibrací jen takové drobné placnutí do vody</i> <span class='smile'></span></div>
<hr/>
<div class='p'><a id="220221"></a></div>
<h2>21. únor 2022 — BU01 korekce korekce</h2>
<div class='p'>Doplňuji víkendové reporty od Jirky …</div>
<h3>Update 19-02-2022 9:01am (Jirka)</h3>
<div class='p'>Kalibrace na větších vdálenostech s anténou výš nad zemí, i když jen 80 cm místo doporučených 140 cm, vypadá lépe. Viz příloha. Na obrázku je méně bodů, než minule, protože různá měření v jedné vzdálenosti tentokrát nejdříve průměruji a pak až interpoluji.</div>
<div class='p'>Strmost převodu z tiků DW1000 na vzdálenost tentokrát odpovídá 97.4 % očekávané rychlosti světla. To je o řád lepší, než minule. A stále o řád horší, než abych byl spokojený. Pořád je to čtvrt metru rozdílu v desetimetrové vzdálenosti.</div>
<div class='p'>Jedním možným vysvětlením je ta dříve vysvětlená korekce pro klesající sílu signálu. Jestli čtu kód dobře, je zhruba na úrovni 3 % vzdálenosti. Podle odpovědi na fóru na poměrně detailní dotaz je korekci potřeba odečítat, což po zamyšlení dává smysl, ne přičítat, jak jsem myslel podle názvu funkce. To už by pak sedělo o kus lépe.</div>
<div class='p'>Druhým zajímavým prvkem je výrok ve stejné odpovědi: "As was mentioned in the code comment, uus indicates UWB microsecond, not microsecond. In calculation, 1 uus is around 1.025 us." To je jako co, tyhle dvoje různé mikrosekundy, které se liší o 2.5 %, resp. 2.4 % v opačném směru porovnání? Na to se budu muset ještě podívat.</div>
<div class='p'><table class='image_panel center' style='width: 630px;'><tr><td>
<span><img src='/articles/pozyx/double-sided-two-way-ranging-v2.png' alt='Double sided two-way ranging ver2' title='Double sided two-way ranging ver2' class='border' width='624' height='521'/></span><br/>
<span>Double sided two-way ranging ver2</span>
</td></tr></table></div>
<h3>Update 19-02-2022 9:58am (Jirka)</h3>
<div class='p'>Tak ten 1.025 faktor to není. To je něco specifického pro jejich kód a mého se to netýká. Převádí tam zadanou dobu odezvy kotvy z mikrosekund na tiky pomocí *512, jenže 512 tiků je ve skutečnosti trochu více, než jedna mikrosekunda, což pak musí zohlednit. Já všechno zadávám a měřím v ticích a takový převod tam nikde nemám.</div>
<div class='p'>V tuhle chvíli mi asi jako možná příčina zbývající chyby zůstávají odrazy signálu od zdí a podlahy a ten pokles síly signálu se vzdáleností, který pak ovlivňuje čas detekce.</div>
<div class='p'>Martine, přijde mi to, že ty tomu Pozyxu prostě věříš a že jsi přesnost s metrem v ruce neměřil. Je to tak? Pravda, je, že s metrem v ruce beztak nepoznáš, jestli pro převod nepoužívají nějakou podezřelou rychlost světla, nebo nějakou magickou konstantu či tabulku :-/</div>
<div class='p'><i>Tady bych asi měl připsat nějakou odpověď. Nahrubo jsem to měřil na začátku, ale teď tomu opravdu "slepě věřím", resp. nevěřím a ptám se na vzdálenosti mezi kotvami, které už by měly být konstantní. Měl jsem sem dát grafy od Lilly, které jsem úplně nepochopil, ale třeba někdo jo. A vlastně graf rozdílů k Ground Truth mi přijde čitelnější. Tak tedy skok v čase ...</i>"</div>
<h3>Update 19-01-2022 (Lilly, před měsícem)</h3>
<div class='p'>I didn't experiment with the settings (so as to not have to reconfigure them every reboot). Looking through your blog, I see you got ranges 30-50m, which is pretty good!</div>
<div class='p'>I did all my experimenting indoors (much smaller ranges) but one thing I noticed was that there appeared to be different and non-zero biases for different pairs of pozyx anchors:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-error.png'><img src='/articles/pozyx/lilly-pozyx-error_t.png' alt='' title='' class='border' width='640' height='408'/></a>
</td></tr></table></div>
<div class='p'>Another thing I was trying to figure out was whether estimates would be equally good in every direction. Here "UWB inside" was when I had installed the pozyx anchors next to the RPis on the robot (so the body of the robot itself was causing obstructions), and "UWB on top" was after moving the pozyx anchor externally, above the lidar. It looks like there might be some directionality, but hard to say from this one test.</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-direction.png'><img src='/articles/pozyx/lilly-pozyx-direction_t.png' alt='' title='' class='border' width='320' height='312'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-direction2.png'><img src='/articles/pozyx/lilly-pozyx-direction2_t.png' alt='' title='' class='border' width='320' height='312'/></a>
</td></tr></table></div>
<h3>Update 27-01-2022 (Lilly, cca před měsícem)</h3>
<div class='p'>80m is really promising!</div>
<div class='p'>My old notes are somewhat unorderly, but I have these plots of error and true distance. The pozyx devices were around 20cm off the ground, and the hallway width changed from about 2m to about 5m, which probably had a significant impact. I only realized that after these tests, so it's not carefully noted in my measurements.</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-error2.png'><img src='/articles/pozyx/lilly-pozyx-error2_t.png' alt='' title='' class='border' width='320' height='259'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-error3.png'><img src='/articles/pozyx/lilly-pozyx-error3_t.png' alt='' title='' class='border' width='320' height='259'/></a>
</td></tr></table>
<table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-error4.png'><img src='/articles/pozyx/lilly-pozyx-error4_t.png' alt='' title='' class='border' width='320' height='259'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/lilly-pozyx-error5.png'><img src='/articles/pozyx/lilly-pozyx-error5_t.png' alt='' title='' class='border' width='320' height='259'/></a>
</td></tr></table></div>
<h3>Update 19-02-2022 8:11pm (Jirka)</h3>
<div class='p'>Když si tu korekční tabulku od Decawave překreslím do grafu "korekce relativní vůči vzdálenosti" (příloha), je vidět, že ve vzdálenostech 4 až 12 metrů dochází k opravě o 1.8 % až 3.5 %. Zuby v grafu jsou artefakty toho, že je ta korekce po částech konstantní. O 2.6 % nižší rychlost světla v mé lineární interpolaci dělá v tomto rozsahu vzdáleností něco podobného. Z poklesu křivky korekčního grafu se dá tušit, že pro vyšší vzdálenosti vyjde moje lineární interpolace špatně.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/jirka-corr.png'><img src='/articles/pozyx/jirka-corr_t.png' alt='korekce relativní vůči vzdálenosti' title='korekce relativní vůči vzdálenosti' class='border' width='320' height='320'/></a><br/>
<a href='/articles/pozyx/jirka-corr.png'>korekce relativní vůči vzdálenosti</a>
</td></tr></table></div>
<div class='p'>Asi ještě zkusím, jestli tu korekční tabulku nejde aplikovat na měření z mého modulu. Nebo najít nějakou pěknou výpočetně nenáročnou nelineární aproximaci. Pokud ne, nechám to být, protože vevnitř nad 10 m stejně nenaměřím a ven se s tím zatím nechystám.</div>
<h3>Update 19-02-2022 8:11pm (Jirka)</h3>
<div class='p'>Při započtení korekcí od Decawave pro jejich vývojové moduly se mi interpolační převodní konstanta z času na vzdálenost přiblíží k rychlosti světla na 0.6 %. Dovedl bych si představit, že to při pečlivější kalibraci dokážu ještě srazit tak na polovinu, či třetinu. O řád už to nesrazím, tam někde už narazím na závislost rychlosti světla ve vzduchu na teplotě/tlaku.</div>
<h3>Update 21-02-2022 7:53pm (Jirka)</h3>
<div class='p'><table class='image_panel center' style='width: 506px;'><tr><td>
<a href='/articles/pozyx/jirka-uwb-holder.jpg'><img src='/articles/pozyx/jirka-uwb-holder_t.jpg' alt='UWB na špejli' title='UWB na špejli' class='border' width='500' height='375'/></a><br/>
<a href='/articles/pozyx/jirka-uwb-holder.jpg'>UWB na špejli</a>
</td></tr></table></div>
<div class='p'>Tohle není konečná verze, ale spíš proof-of-concept na uchycení modulu, který nemá díry na šrouby. Zatím to použiju jako stojan pro kalibraci ve volném prostoru.</div>
<hr/>
<div class='p'><a id="220303"></a></div>
<h2>3. březen 2022 — BU01 měření rychlosti světla</h2>
<div class='p'>Dnes bych začal zase s víkendovými novinkami od Jirky. Vlastně mi celkem přijde vtipné, že s těma UWB krabičkami si člověk <i>na koleně</i>
může měřit rychlost světla … (no teď koukám, že chybí i nějaké dovětky k poslednímu reportu, takže toho bude více).</div>
<h3>Update 21-02-2022 9:20pm (Jirka)</h3>
<div class='p'>Ano, za ideálních podmínek to vypadá dobře. Ale znáš mě … jak to nemám na mikrometry, jsem nesvůj <span class='wink'></span></div>
<div class='p'>Je potřeba brát v potaz, že jsem pro tu interpolaci vždycky průměroval dvanáct měření. Jednotlivá měření mi pořád ještě dost skákala. Nicméně včera jsem výrazně zkrátil pevnou dobu odezvy v two-way ranging a vypadá to, ťuk ťuk na dřevo, že poskakování ubylo. Tak uvidíme při příští kalibraci, na špejli, ve volnějším prostoru.</div>
<div class='p'>Dost se bojím těch různých efektů, které popisuje Lilly a na které narážím já: Směrovost, citlivost na náklon, citlivost na předměty okolo a především v cestě signálu, snížený výkon u podlahy. Většinu času to bude fungovat v podmínkách hodně neideálních. Proto to chci zpřesnit co nejvíc, aby to i při zvýšené chybě pořád stačilo. Na tu závislost na konkrétní dvojici zařízení, kterou zmiňuje Lilly, jsem teda taky hodně zvědavý.</div>
<h3>Update 24-02-2022 12:47pm (Jirka)</h3>
<div class='p'>Kalibrace i na větší vzdálenosti venku ve volném prostoru, průměrování přes ještě víc měření plus opravená optimalizace interpolačních parametrů rovná se naměřená rychlost světla 0.013 % od udávané (ve vzduchu). Takže nakonec až někde u té hranice závislosti na tlaku, teplotě, vlhkosti a spol. To jsem nečekal. Pro srovnání, ve vzduchu je světlo o 0.03 % pomalejší než ve vakuu (<a href='https://en.wikipedia.org/wiki/Speed_of_light' class='external'>wikipedia</a>).</div>
<div class='p'>V dalším kroku zkusím naměřit rozptyl jednotlivých měření, bez průměrování. A pak asi přijde na řadu zkusit, nakolik je to se stejnými parametry přenositelné na jinou dvojici modulů.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/interpol.png'><img src='/articles/pozyx/interpol_t.png' alt='Interpolace' title='Interpolace' class='border' width='320' height='290'/></a><br/>
<a href='/articles/pozyx/interpol.png'>Interpolace</a>
</td></tr></table></div>
<h3>Update 27-02-2022 10:34pm (Jirka)</h3>
<div class='p'>Různé dvojice modulů dávají, asi podle očekávání, trochu jiná měření. Viz příloha. Jedna dvojice odhaduje stejnou vzdálenost na 174 cm, druhá na 179.5 cm. Obě dvojice se směrodatnou odchylkou "šumu" pod tři centimetry.</div>
<div class='p'>Když matematicky ne úplně korektně smíchám chybu, kterou vidím v kalibraci převodu z tiků na vzdálenost, směrodatnou odchylku šumu, a těch pět centimetrů rozdílu mezi moduly, čekal bych dvě třetiny měření tak do osmi centimetrů od správné hodnoty a téměř všechna do šestnácti cm. V tomhle odhadu ještě nejsou zahrnuty chyby vzniklé náklonem antény a blízkostí k různým překážkám. To přidá k odhadu dalších pár centimetrů. Tohle platí pro jednotlivá měření. Při prohnání série měření Kalmanem a při kalibraci každé antény zvlášť, jak doporučuje Decawave, zase pár centimetrů zmizí.</div>
<div class='p'>Malý robot bez dalších senzorů takhle přesně na nabíječku nejspíš nenajede, ale dveřmi v bytě by naslepo projet mohl. Větší robot by mohl zvládnout mostek v Martinově japonské zahradě, aniž by polekal pádem kapry koi.</div>
<div class='p'><table class='image_panel center' style='width: 611px;'><tr><td>
<span><img src='/articles/pozyx/different-pairs.png' alt='Měření pro dva různé páry' title='Měření pro dva různé páry' class='border' width='605' height='340'/></span><br/>
<span>Měření pro dva různé páry</span>
</td></tr></table></div>
<div class='p'>p.s. Odvolávám. Příště se musím nejdřív víc zamyslet. Šum jednotlivých měření není 3 cm. To je šum průměrovaných (!) měření. Ten 5cm rozdíl mezi dvěma dvojicemi modulů platí.</div>
<h3>Update 03-03-2022 1:17pm (Jirka)</h3>
<div class='p'>Jenom rychlá poznámka …</div>
<div class='p'>Zatímco u dev kitů z Decawave by měla být zpoždění antén změřená v továrně a zapsaná v One Time Programmable paměti, u mých modulů na dané OTP adrese není nic.</div>
<div class='p'><i>Toto se váže k úternímu mailu, že Mouser psal, že už má MDEK1001 na skladě:</i> <a href='https://cz.mouser.com/ProductDetail/Qorvo/MDEK1001?qs=TiOZkKH1s2TlRZBi6MtMNg%3D%3D' class='external'>mouser.com:MDEK1001</a> … <i>v úterý tam bylo něco přes 300, teď je 216 a než dám push na web, tak už možná nebudou. No nic.</i></div>
<div class='p'><i>Vidím to tak, že své "novinky" s "dual tagem" si nechám na příště ... (md)</i></div>
<hr/>
<div class='p'><a id="220304"></a></div>
<h2>4. březen 2022 — Auta a UWB stereo tag</h2>
<div class='p'>Téma „k čemu je to vlastně vůbec dobré?” je takové „oblíbené”, resp. se stále vracející. <span class='wink'></span> Zhruba před 14 dny jsme se s Jirkou bavili,
že <a href='https://www.bmw.com/en/innovation/bmw-digital-key-plus-ultra-wideband.html' class='external'>BMW používá UWB zámky</a> a jestli by z toho nešlo vymačkat
trošku více? Jirka navrhoval, že by bylo fajn se dozvědět, že auto před autem, za kterým jedete, prudce brzdí. Mohlo by tuto informaci
poslat a člověk (resp. jeho stroj) by se to dozvěděl dříve než by to uviděl. To by jako aplikace šlo, co říkate? U těch zámků asi nebude extra velký
radiový výkon, ale třeba jich tam bude více?</div>
<div class='p'>Já cvičně experimentoval s párem — přidělal jsem ho na prkno 115cm dlouhé a to má přijít na zahrádku
auta. No a pro první pokusy vlastně auto vůbec není potřeba. Po pravdě ani nevím, jestli ta motivace byl Jirkův nápad nebo jsem chtěl
zjistit, jak dobře by šla zjišťovat vedle absolutní pozice i absolutní orientace pouze z UWB tagů, ale to je teď asi už jedno.
V praxi je rozhodně užitečné vědět, že to zuřivě brzdící auto je před vámi nebo v sousedním pruhu, což se z jednoho majáku
úplně snadno nedozvíte. Jo a <i>ultra rychle zipování</i> by se mi také líbilo. <span class='smile'></span> <i>(trávíce včera půl hodiny v koloně způsobené
jenom zipem)</i></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/pozyx/20220301-base.jpg'><img src='/articles/pozyx/20220301-base_t.jpg' alt='Sběrná kotva' title='Sběrná kotva' class='border' width='220' height='124'/></a><br/>
<a href='/articles/pozyx/20220301-base.jpg'>Sběrná kotva</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/pozyx/20220301-stereo-tag.jpg'><img src='/articles/pozyx/20220301-stereo-tag_t.jpg' alt='Stereo tag' title='Stereo tag' class='border' width='220' height='124'/></a><br/>
<a href='/articles/pozyx/20220301-stereo-tag.jpg'>Stereo tag</a>
</td></tr></table>
<table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/articles/pozyx/20220301-rose-anchor.jpg'><img src='/articles/pozyx/20220301-rose-anchor_t.jpg' alt='Kotva u růží' title='Kotva u růží' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/pozyx/20220301-rose-anchor.jpg'>Kotva u růží</a>
</td></tr></table></div>
<div class='p'>Hrál jsem si zase pouze s pěti Pozyx kotvama — dvě na prkně a tři statické. Jako vedlejší efekt je pozorování, že autodetekce
statických kotev by asi selhala, protože to jsou dva „pod-grafy”, resp. dvě soustavy, které se vůči sobě pohybují.
Začnu s dalším <i>kryptickým</i> obrázkem, který jsem posílal Pozyx supportu:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/pozyx-lost-module.png'><img src='/articles/pozyx/pozyx-lost-module_t.png' alt='Ztráta modulu 26727' title='Ztráta modulu 26727' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/pozyx-lost-module.png'>Ztráta modulu 26727</a>
</td></tr></table></div>
<div class='p'>Co na obrázku vidíme? Minimálně v čase 40s končí <i>fialovo-modré koleje</i>. Prostě v grafu už nejsou žádná měření vůči krabičce
s ID 26727. Dále mne tam rozčiluje žlutá tečka na šedivé stopě take okolo 40s … skoro jako by to souviselo?! (za mne je to
záměna IDs — prostě ta naměřená vzdálenost patří jinému páru)</div>
<div class='p'>Co ještě můžu řící, že počítač aneb „sběrné místo” jsem měl připojen k jedné statické kotvě a ta ID na prkně byla 0x0D7F a 0x0D53.
hex(3411), hex(3455) = ('0xd53', '0xd7f') … takže opravdu ta šedivá stopa jsou "tagy" na prkně.</div>
<div class='p'>Co je snad dobrá zpráva je, že ostatní kotvy si povídaly celou dobu i když jsem rozhodně nebyl v přímé viditelnosti. Byl jsem zvědav
co Z-ová souřadnice mimo rovinu těch třech kotev … příště.</div>
<div class='p'>Ještě jeden obrázek, resp. 2D mapka dvou okruhů s prknem/stereo-tagy. Trošku to skáče, což může být Z-ová souřadnice, případně
zastínění "operátorem". Ale nahrubo je myslím vidět, že ty dva okruhy jsou cca 1m od sebe:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/stereo-track.png'><img src='/articles/pozyx/stereo-track_t.png' alt='Stereo-track, dva okruhy' title='Stereo-track, dva okruhy' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/stereo-track.png'>Stereo-track, dva okruhy</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="220306"></a></div>
<h2>6. březen 2022 — 2+D vs. 2.5D</h2>
<div class='p'>Dnes nemám nic nového, jen takové „bloumání” nad tím co dále. Přemýšlel jsem nad scénářema, které bych rád realizoval.
Vlastně je to klasické <i>dostaň se z místa A na místo B</i> a <i>vyplň ohraničený prostor</i> (sekání, uklízení, sázení stromků, …).</div>
<div class='p'>U té cesty si přestavuji, že jako uživatel „vytýčím koridor” pomocí majáčků/kotev, možná bych to jednou projel ručně
a zbytek „kyvadlové dopravy” už by jezdil sám. Na robotovi bych nechal dva tagy, to se mi zatím líbí, ale pro trilateraci bych
typicky viděl pouze maják před a za sebou. Že by to byla spíše <i>bilaterace</i>? <span class='wink'></span>
<a href='https://www.youtube.com/watch?v=eaJ8cdu6y0w' class='external'>Před naší za naší cesta má ať nepráší</a> … jestli to teď nebude na blacklistu, vlastně na
<a href='https://abusix.com/resources/blocklists/why-changing-the-terms-blacklist-and-whitelist-isnt-as-easy-as-it-might-seem/' class='external'>blocklistu</a>.
No nic, co jsem to chtěl říci? Že situace, kdy uvidím právě dvě kotvy bude nejběžnější a měl bych se s tím
tedy vypořádat.</div>
<div class='p'><table class='image_panel center' style='width: 345px;'><tr><td>
<a href='/articles/pozyx/uwb-follow-path.png'><img src='/articles/pozyx/uwb-follow-path_t.png' alt='Sledování cesty definované UWB kotvami' title='Sledování cesty definované UWB kotvami' class='border' width='339' height='290'/></a><br/>
<a href='/articles/pozyx/uwb-follow-path.png'>Sledování cesty definované UWB kotvami</a>
</td></tr></table></div>
<div class='p'>U posekání zahrady nebo osázení mýtiny bych si představoval typicky 4 kotvy po obvodu a zase pár na robotovi/robotech. Vlastně
mi přijde UWB technologie v lese daleko rozumnější než DGPS … schválně jestli na podobný projekt ještě znova dojde.</div>
<div class='p'>A teď ten název <b>2+D vs. 2.5D</b> … určitě existuje nějaký termín pro <i>povrchovou lokalizaci</i> vs. 3D lokalizaci v prostoru.
Nechť mám pozemního robota a jezdím v terénu, tj. pro každé XY mám pravě jediné Z, na které robot skonči, když ho „pustím”.
Ale to není <b>2.5D</b>, co používá Pozyx. Tam je jedním ze vstupů Z-ová souřadnice (konstantní) a 3D pozice kotev vůči této <i>hladině</i>
pozici kompenzují. Pokud ale pojedu přímo od kotvy K(i) na K(i+1) se stereo-tagem, tak bych asi měl být schopen dopočítat i ten Z-ový
profil.</div>
<div class='p'>To mi připomíná stále ty Jirkovy <i>kapry koi</i> co jsem ještě nekomentoval. <span class='smile'></span> … no je to spíše polorozpadlá, cca 1m široká, lávka,
po které bych chtěl být schopen spolehlivě navigovat robůtky, třeba s cihlou, taškou nebo barelem na zádech …</div>
<hr/>
<div class='p'><a id="220308"></a></div>
<h2>8. březen 2022 — Eduro a dosažené BU01 milníky</h2>
<div class='p'>Dnes jsem jezdil s <a href='/robots/eduro/cs'>Edurem</a> na ČZU a bylo to celkem užitečné cvičení. Nejprve „klasika” aneb
staré bolesti, na které jsem už s radostí zapomněl:</div>
<ul>
<li>nepoužívat STOP tlačítko (občas se resetuje APU3 počítač)</li>
<li>odometrie občas „skočí”</li>
</ul>
<div class='p'>Zásilka s <a href='https://cz.mouser.com/ProductDetail/Qorvo/MDEK1001?qs=TiOZkKH1s2TlRZBi6MtMNg%3D%3D' class='external'>MDEK1001</a>
dnes nedorazila a v rozčílení jsem si nakonec na testy vzal jen dvě kotvy na hraní. Na Eduru
jsem doinstaloval <a href='https://pypi.org/project/pypozyx/' class='external'>pypozyx balíček</a> a hned to fungovalo. <span class='smile'></span> Drobný problém byl, když jsem kotvu vypnul a zapomněl,
že ta stále napájena na robotovi se s tou nově nabootovanou nedomluví (jiný kanál, preambule, atd.).</div>
<div class='p'>K věci — zajímavé mi přišlo toto měření:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/articles/pozyx/eduro-pozyx-5m.png' alt='Eduro jízda 5m' title='Eduro jízda 5m' class='border' width='640' height='480'/></span><br/>
<span>Eduro jízda 5m</span>
</td></tr></table></div>
<div class='p'>Trošku jsem <i>hacknul</i> "go.py", aby robot jel 2x tam a zpět a výstup byl následující:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/eduro-pozyx-w.png'><img src='/articles/pozyx/eduro-pozyx-w_t.png' alt='Opakovaná jízda 5m' title='Opakovaná jízda 5m' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/eduro-pozyx-w.png'>Opakovaná jízda 5m</a>
</td></tr></table></div>
<div class='p'>Asi je jasné o co mi jde — v oblasti mezi 3. a 4. metrem je nějaká divnost. Obě kotvy byly po celou dobu
jízdy vzájemně viditelné, volný koridor byl minimálně 1m (odhad). Skoro to vypadá, že došlo k nějakému odrazu
od zaparkovaného Spidera nebo nějaká interference s WiFi??</div>
<div class='p'>Další pokusy na chobě bez překážek bohužel byly k ničemu, protože jsem si nevšiml, že umřela powerbanka u kotvy
a následně jsem zapomněl vypnout kotvu na Eduru, takže každá komunikovala na jiném kanálu.</div>
<div class='p'>A teď ještě novinky od Jirky …</div>
<h3>Update 07-03-2022 11:30pm (Jirka)</h3>
<div class='p'>Dosáhl jsem několika milníků najednou:</div>
<ul>
<li>Přidal jsem jednoduché textové rozhraní přes sériák, včetně automatického doplňování příkazů a vyhledávání v historii na straně PC.</li>
<li>K použitému printf() přibylo sscanf(), takže se nevejdu do 64 kB flash a žiju i z těch druhých 64 kB, které oficiálně neexistují. Šlo by to udělat úsporněji, ale chtěl jsem to zkusit i takhle.</li>
<li>Moduly teď "blikají", takže si můžu vypsat seznam viditelných sousedů. Soused, který se nějakou dobu neozval, je ze seznamu odebrán.</li>
<li>Dohromady tak místo broadcastové adresy můžu při měření vzdálenosti měřit vůči konkrétnímu viditelnému sousedovi. Zatím nepodporuji měření, kdy iniciátorem není modul připojený k PC.</li>
</ul>
<div class='p'>"Blikání" je zárodek mesh protokolu - záblesk posílá routovací informace - ale mám toho ještě hodně k rozmyšlení. Statická spolehlivá síť je jednoduchá, ale mizení a roaming modulů to zesložiťují.</div>
<hr/>
<div class='p'><a id="220320"></a></div>
<h2>20. březen 2022 — BU01 mesh a Babel</h2>
<h3>Update 11-03-2022 1:49pm (Jirka)</h3>
<div class='p'>Mesh síť funguje, včetně roamingu, mizení a restartování uzlů. Můžu provádět traceroute na uzel mimo přímý dosah. Klíčové slovo je <a href='https://datatracker.ietf.org/doc/html/rfc8966' class='external'>Babel</a>, i když jsem ten algoritmus pro své účely hodně zjednodušil.</div>
<div class='p'>Teď je otázka, jestli budu nějak zobecňovat přeposílání traceroute packetů, nebo to řešit "case by case". Pokud začnu zobecňovat, skoro abych si nastudoval <a href='https://en.wikipedia.org/wiki/OSI_model' class='external'>OSI vrstvy</a>.</div>
<h3>Update 20-03-2022 9:50am (Jirka)</h3>
<div class='p'>Upravil jsem mesh protokol, aby fungovalo nejen restartování jednotlivých uzlů, ale i celých podsítí. To se například hodí, když jsou moduly v jedné místnosti napájené z jednoho zdroje. Teď se během pár sekund přisynchronizuje všechno a ne jen krajní uzel připojený do vnějšího světa.</div>
<div class='p'>A hlavně, přidal jsem schopnost uzlu A zeptat se uzlu B na jeho vzdálenost k uzlu C. V kombinaci s tou mesh sítí mohou být B a C kdekoli v síti. Jestli jsem to dobře pochopil, u Pozyxu musí být B v přímém rádiovém dosahu A.</div>
<div class='p'>Když už teď můžu z modulu připojeného k PC měřit vzdálenost mezi jinými moduly, je asi čas vrátit se ke kalibraci antén a provést ji nejen pro jednu konkrétní dvojici zařízení. Při té příležitosti asi vznikne na straně PC nějaká knihovna ke komunikaci moduly, abych nemusel všechno pořád zadávat a kopírovat ručně. A pak už snad dojde na lokalizaci …</div>
<hr/>
<div class='p'><a id="220330"></a></div>
<h2>30. březen 2022 — BU01 kalibrační čtverec</h2>
<h3>Update 29-03-2022 8:30pm (Jirka)</h3>
<div class='p'>Když umístím moduly do čtverce a změřím vzdálenost mezi všemi dvojicemi, dokážu z toho vypočítat zpoždění na jednotlivých anténách. Podle očekávání vyjde pro každý modul jiné.</div>
<div class='p'>Respektive, protože je double-sided two-way ranging lehce asymetrické, dokážu spočítat zvlášť zpoždění na anténě při vysílání a při příjmu. Nicméně pro všech pět modulů, které jsem zatím zkoušel, vychází obě hodnoty, až na drobné odchylky, stejně.</div>
<div class='p'>Teď musím přijít na to, jak vyrobit, nejspíš na flash, konfiguraci, abych mohl každý modul nastavit jinak, aniž bych překompilovával kód. Na "write once" paměť v DW1000 se mi moc sahat nechce. Jednak je to "once" a to nemám rád, jednak je to podle dokumentace podivné cvičení, ve kterém dokonce vystupuje vyšší napětí.</div>
<div class='p'>Abych mohl stavět velký kalibrační čtverec, začal jsem taky řešit napájení z baterie a plastové krabičky, abych nebyl omezený délkou USB kabelů. Dobrá zpráva je, že když zapojím Li-Ion článek s napětím 3.6 V na napájecí piny pro 5 V, modul funguje. Takže tam možná nemusím přidělávat vlastní step down z 3.6 V na 3.3 V. Připojovat těch 3.6 V, resp. až 4.2 V (?), rovnou na 3.3 V se mi nechce. Ještě musím vyzkoušet chování při téměř vybitém článku, kolem 3 V. Ten step down, který mám, je totiž zároveň step up, takže tady by mohl pomoct. Ale zase bude mít nějaké vlastní ztráty, takže se to celé vybije dřív. No nevím. Asi "keep it simple". Vlastně už při vyšších napětích to bude "zajímavé", protože palubní regulátor z 5 V na 3.3 V na výstupu klesne pod 3.3 V. Ještě je co zkoušet <span class='smile'></span></div>
<hr/>
<div class='p'><a id="220413"></a></div>
<h2>13. duben 2022 — BU01 zapouzdřeno jest</h2>
<h3>Update 4/4/22, 10:20 AM (Jirka)</h3>
<div class='p'>Zapouzdřeno jest. Viz příloha. Teď se můžu pustit do prostorově rozsáhlejších instalací a můžu zkoušet životnost na baterie.</div>
<div class='p'><table class='image_panel center' style='width: 506px;'><tr><td>
<a href='/articles/pozyx/bu01-enclosure.jpg'><img src='/articles/pozyx/bu01-enclosure_t.jpg' alt='Zapouzdření BU01' title='Zapouzdření BU01' class='border' width='500' height='375'/></a><br/>
<a href='/articles/pozyx/bu01-enclosure.jpg'>Zapouzdření BU01</a>
</td></tr></table></div>
<div class='p'>Dobrá zpráva: Modul přestane fungovat až někde mezi 3.25 - 3.3 V na 5V napájení, po téměř čtyřech hodinách běhu s 32 měřeními vzdálenosti za sekundu plus režie pro mesh síťování. V tu chvíli je baterie téměř vybitá. Nabíječka do ní pak dostane 670 mAh, při kapacitě baterie 700 mAh. Takže připojovat step down/up converter je zbytečné, déle to stejně nepoběží.</div>
<div class='p'>Špatná zpráva: Moduly, které vybijí baterii až do dna, po jejím nabití a opětovném spuštění "blbnou". Opraví to přeflashování kódu. Což mě vede k podezření, že při nízkém napětí se poruší data na flash. Takže se modul až do tak hlubokého stavu vybití dostat nesmí.</div>
<div class='p'>Dobrá zpráva: Palubní mikrokontrolér umí monitorovat vlastní napájecí napětí a umí se uspat. Jestli si dobře pamatuju, DW1000 je také možné uspat. Takže příští krok je naprogramovat pud sebezáchovy.</div>
<h3>Update 4/6/22, 3:49 PM (Jirka)</h3>
<div class='p'>Uspání při vybité baterii už funguje. Sledování napětí na mikrokontroléru jsem sice nerozchodil, ale to nevadí, protože DW1000 ho umí také, ve větším rozsahu a s jemnějším rozlišením. Za cenu další SPI komunikace.</div>
<div class='p'>Víte, co se stane, když si chcete ověřit sleep kontroléru tím, že ho dáte hned na začátek main()? Šípková Růženka! Takový sebeuspávající se modul se blbě flashuje novým kódem. <span class='wink'></span> No nic. Ponaučení pro příště.</div>
<div class='p'>Zajímavé debugování bylo na téma "jednou za čas se to zasekne." Když jsem zvýšil četnost komunikace po sériáku, pravděpodobnost záseku vzrostla. Když jsem povypínal okolní moduly, klesla. Abych tu detektivku zkrátil: Pokud seriák na mikrokontroléru nestíhá, nastane "overrun error", nastaví se error flag, zavolá se interrupt, ten zjistí, že nejsou k dispozici žádná data, ukončí se, mikrokontrolér najde nastavený error flag, zavolá interrupt, ehm. A zatímco se ten interrupt handler takhle krásně cyklí, všechno ostatní musí počkat. Na věky věků. Ámen. Mazání toho flagu jeho přečtením následovaným voláním recv() mi taky nepřijde zrovna intuitivní.</div>
<div class='p'>Kdyby ode mně někdo tohle chtěl koupit, tak by mi cena nastavená Pozyxem snad ani nepřišla nesmyslná. Pro jednohubku na ochutnávku. Takových "pitomostí", které je potřeba vyřešit, je docela hodně. A to to ještě vlastně ani nedělá nic užitečného. <b>reklama-begin</b> Potřebujete sledovat objekty ve vymezeném prostoru? Můžeme vám pomoct s řešením na míru! Ptejte se Martina, co a jak.<b>reklama-end</b> A tak <span class='wink'></span></div>
<hr/>
<div class='p'><a id="220420"></a></div>
<h2>20. duben 2022 — BU01 Follow Me</h2>
<div class='p'>Dal jsem tři moduly na Deedee, malého domácího robota, a zkouším jízdu za čtvrtým modulem, neseným v ruce. Takové malé "follow me". Jenže. Jak je ten robot úzký, pod 30 cm, tak 2d <a href='https://cs.wikipedia.org/wiki/Trilaterace' class='external'>trilaterace</a> protíná téměř soustředné kruhy. Takový výpočet je, jak by řekla dcera, hodně hodňácky citlivý na chybu měření vzdálenosti. Ať už systematickou, nebo nesystematickou. Empiricky vzato, odhad polohy majáčku neseného dva metry rovně před robotem poskakuje o půl metru na každou stranu a dost často trilaterace ani nenajde platné řešení. Ze zjednodušené simulace mi vychází šum s odchylkou do strany (1 sigma) 0.4 m, tj. většina odhadů Y, které je ve skutečnosti 0, někde mezi -1 m a +1m. To je na dvoumetrové vzdálenosti hodně. Robot se podle toho chová: zmateně.</div>
<div class='p'>Částečným řešením pro nesystematickou chybu bude co nejvíc zvýšit frekvenci měření a průměrovat polohu majáčku v čase. Dobrý den, <a href='/guide/filtering/cs'>pane Kálmáne</a>. Pro vyřešení systematické chyby je užitečný všechen ten předchozí čas investovaný do kalibrace modulů.</div>
<div class='p'>Jiným řešením by byl větší robot. Podle simulace alespoň půl metru široký. Metr by byl ještě lepší, ale to už by se robot ani nevešel do dveří. Každopádně nový robot na doma, natož větší, není na pořadu dne.</div>
<div class='p'>Další zajímavý zdroj potíží je umístění modulů na robotovi i majáčku nízko nad zemí. V závislosti na výšce majáčku nad zemí vzniká při trilateraci systematická (!) chyba do strany zhruba taky někde mezi 0.3 a 0.5 m. S tou asi nepůjde dělat nic. Jedině už opravdu pevná instalace "kotev" v prostředí, místo na robotovi, a víc krmit dítě, aby rychleji rostlo a mohlo držet majáček výš. Do dvou metrů nad zemí doporučených v dokumentaci dceři ještě "něco málo" zbývá.</div>
<hr/>
<div class='p'><a id="220426"></a></div>
<h2>26. duben 2022 — BU01 Follow Me obrázky</h2>
<h3>Update 4/21/22, 7:58 PM (Jirka)</h3>
<div class='p'>Chtěl jsi obrázek, máš ho mít. Červeně polohy robota, zeleně odhadnuté polohy majáčku. Je to dost smutný pohled.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/beacon.png'><img src='/articles/pozyx/beacon_t.png' alt='' title='' class='border' width='320' height='240'/></a>
</td></tr></table></div>
<div class='p'>p.s. No, nejel rovně. Navigoval na poskakující maják a vyhýbal se při tom překážkám. Ta červená trajektorie podle tracking kamery je asi dobře.</div>
<h3>Update 4/24/22, 7:41 PM (Jirka)</h3>
<div class='p'>Ale jo. Když lépe nastavím parametry antén a proženu odhad pozice majáčku Kalmanovým filtrem, něco to dělá.</div>
<div class='p'>Lépe to funguje na krátkou vzdálenost tak do tří metrů. A i tak to občas mívá několikasekundové výpadky. Budu se muset podívat, jestli nefunguje měření vzdálenosti, nebo chodí odhady, ze kterých je zmatená trilaterace.</div>
<div class='p'><table class='image_panel left' style='width: 256px;'><tr><td>
<a href='/articles/pozyx/followme-bella.jpg'><img src='/articles/pozyx/followme-bella_t.jpg' alt='' title='' class='border' width='250' height='333'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 256px;'><tr><td>
<a href='/articles/pozyx/followme-bella2.jpg'><img src='/articles/pozyx/followme-bella2_t.jpg' alt='' title='' class='border' width='250' height='348'/></a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="220504"></a></div>
<h2>4. květen 2022 —BU01 stavový automat</h2>
<h3>Update 4/30/22, 10:23 PM (Jirka)</h3>
<div class='p'>Ach, ten stavový automat. Výpadky při jízdách za majáčkem byly způsobené tím, že chodily nesmyslné vzdálenosti, řádově v kilometrech, a kód na PC je zahazoval. Nesmyslné vzdálenosti chodily, protože mikrokontrolér při měření vzdálenosti často používal časovou známku následující příchozí zprávy. Následující zpráva ale neměla ani přijít, protože DW1000 neměl ani být na příjmu. Jenže byl. Jak to? Protože ze stavu RX (příjem) po přijetí zprávy nejdříve (!) přejde do IDLE (nicnedělání) a až potom (!) ohlásí mikrokontroléru, že přišla zpráva. Na základě předchozí zkušenosti, že DW1000 přechází z RX do IDLE i při chybách při příjmu, mikrokontrolér monitoroval stav DW1000 a při IDLE okamžitě znovu aktivoval příjem. Když se to špatně sešlo, aktivoval příjem před zpracováním příchozí zprávy.</div>
<div class='p'>Řešením je aktivovat příjem až po zpracování příchozí zprávy, po ukončení vlastního vysílání a když nastane chyba při příjmu. Jenže ne všechny chyby při příjmu, ukazuje se, přepnou DW1000 z RX do IDLE. Když RX znovu aktivuji při všech chybách příjmu, nastane předchozí problém. Jenom v tom řetězci musí ještě těsně před přijetím zprávy nastat chyba příjmu, čímž se to stává vzácnějším. Takže jsem musel zjistit, co které chyby způsobují. Které přepnou do IDLE a které ne. Dokumentace je bohužel neúplná a, řekl bych, v tomhle bodě dokonce špatně. Takže jsem jsem strávil několik dní čekáním na každý jednotlivý typ chyby příjmu. Moc pěkné cvičení.</div>
<div class='p'>Teď už to vypadá, že race condition nenastává (přidal jsem její detekci) a že neplatné vzdálenosti jsou řádově v metrech, což může klidně být nějaký odražený signál. Tak snad to teď, ťuk ťuk na dřevo, bude lepší.</div>
<div class='p'><i>MD: o jaké dvě skupiny zpráv se tedy jedná?</i></div>
<h3>Update 5/1/22, 1:33 PM (Jirka)</h3>
<div class='p'>Z RX do IDLE přepíná Frame Wait Timeout (RFTO). V RX to zůstane po PHY Header Error (RPHE), CRC Error (RFCE), Sync Loss Error (RFSL), Preamble Timeout (RXPTO), SFD Timeout (SFDT) a Frame rejected due to filtering configuration (ARFE).</div>
<div class='p'>Podle dokumentace by to mělo přinejmenším při RXPTO, SFDT a RFTO přejít do IDLE. Ostatní nejsou dokumentované.</div>
<div class='p'>Až na ten Frame Wait Timeout se to chová, jako by bylo zapnuté RX-auto-reenable (RXAUTR), což ale nedělám. Asi bych se měl aspoň podívat, jestli tohle je zapnuté, nebo není. Podle dokumentace by default měl být "vypnuto", i když fráze typu "děje se X, pokud není zapnuté RXAUTR, pak Y", vlastně o defaultu, v matematickém smyslu, nic neříkají. Tak odvolávám: "The default value is 0." To zní jednoznačně.</div>
<hr/>
<div class='p'><a id="230108"></a></div>
<h2>8. leden 2023 — Pozyx digital I/O</h2>
<div class='p'>Přes vánoční prázdniny jsem měl <i>domácí úkol</i>, který jsem samozřejmě neudělal. :( V rámci příprav na <a href='/competitions/elrob/2024/cs'>ELROB 2024</a> Jirka navrhl,
že bychom mohli využít další z vlastnosti UWB modulů a to jejich digitálních vstupů a výstupů. Konkrétně po úvodní fázi „follow me” (následuj mne) je
třeba robotu „říci”, že má přepnout do módu „vrať se na start” a proč k tomu rovnou nepoužít UWB tag? <span class='smile'></span></div>
<div class='p'>Ano, Jirkova motivace je „oprášit všechny technologie co tu tak leží” a tak už samotný <i>follow me</i> by používal jak prastarý lidar (viz <a href='https://www.youtube.com/watch?v=c-SXdDgbi0s' class='external'>Eduro follow me</a> na Floriade 2012, tj. před deseti lety), <a href='/articles/oak-d-pro/cs'>RGBD kamery</a> a UWB tagy a kotvy. Jirka plánuje (resp. on na rozdíl
ode mne úkol přes vánoce samozřejmě udělal, takže bych měl použít už minulý čas) použít své čínské moduly s vlastním kódem, já pak Pozyx.</div>
<div class='p'>Pozyx digitální I/O moc popsané nejsou. Našel jsem zmínku v <i>developer tag_v1.5 datasheet.pdf</i>, ale tento dokument není veřejně dostupný, resp. jsem ho nenašel.
Tam píšou:
<i>A general purpose input/output pin. By default this pin is not configured and
it can be used for other purposes. When configured as an output pin, the
maximum output voltage is 3.3V (the operating voltage of the board). The
pin is 5V tolerant.</i> + tabulka:</div>
<pre>GPIO1 Pin 9
GPIO2 Pin 10
GPIO3 Pin 11
GPIO4 Pin 12</pre>
<div class='p'>Další indicie jsou <a href='https://github.com/pozyxLabs/Pozyx-Python-library/blob/master/pypozyx/definitions/constants.py#L62' class='external'>popisy Pozyx konstant</a>:</div>
<pre># The GPIO modes
GPIO_DIGITAL_INPUT = 0
GPIO_PUSH_PULL = 1
GPIO_OPEN_DRAIN = 1
ALL_GPIO_MODES = [GPIO_DIGITAL_INPUT, GPIO_PUSH_PULL, GPIO_OPEN_DRAIN]
# The GPIO pull resistor configuration
GPIO_NO_PULL = 0
GPIO_PULL_UP = 1
GPIO_PULL_DOWN = 2
ALL_GPIO_PULLS = [GPIO_NO_PULL, GPIO_PULL_UP, GPIO_PULL_DOWN]</pre>
<div class='p'>a konečně např. funkce <a href='https://github.com/pozyxLabs/Pozyx-Python-library/blob/master/pypozyx/lib.py#L174' class='external'>setConfigGPIO()</a>.</div>
<div class='p'>Kód asi nikoho neohromí, ale stejně <span class='wink'></span></div>
<pre>>>> import pypozyx
>>> pozyx = pypozyx.PozyxSerial('/dev/ttyACM0')
>>> reg = pypozyx.SingleRegister()
>>> pozyx.getConfigModeGPIO(1, reg)
1
>>> pypozyx.POZYX_SUCCESS
1
>>> pypozyx.POZYX_FAILURE
0
>>> pypozyx.POZYX_TIMEOUT
8
>>> mode = pypozyx.SingleRegister()
>>> pull = pypozyx.SingleRegister()
>>> mode.value = pypozyx.PozyxConstants.GPIO_DIGITAL_INPUT
>>> pull.value = pypozyx.PozyxConstants.GPIO_PULL_UP
>>> pozyx.setConfigGPIO(1, mode, pull, 0x6827)
/home/md/.virtualenvs/osgar/lib/python3.8/site-packages/pypozyx/lib.py:194: UserWarning: setConfigGPIO: 0 wrong GPIO mode
warn("setConfigGPIO: {} wrong GPIO mode".format(mode[0]))
/home/md/.virtualenvs/osgar/lib/python3.8/site-packages/pypozyx/lib.py:196: UserWarning: setConfigGPIO: 1 wrong GPIO pull
warn("setConfigGPIO: {} wrong GPIO pull".format(pull[0]))
1
>>> pozyx.setConfigGPIO(1, mode, pull, 0x6827)
1
>>> pozyx.getGPIO(2, reg, 0x6827)
1
>>> reg.value
0
>>> pozyx.getGPIO(1, reg, 0x6827)
1
>>> reg.value
1
>>>
>>> pozyx.getGPIO(1, reg, 0x6827)
1
>>> reg.value
0
>>> pozyx.getGPIO(1, reg, 0x6827)
1
>>> reg.value
1</pre>
<div class='p'>trošku omáčky — už jsem dost zapomněl, jak se Pozyx používá, takže na vše je třeba nějaký pomocný "register" (<i>pypozyx.SingleRegister()</i>),
co obsahuje vstupně-výstupní hodnoty. Funkce vrací úspěch, selhaní nebo timeout … co je co ale není zřejmé, tak proto ten výpis konstant
(1 je úspěch). Pak mne zmátlo, že konfigurace GPIO 1 jako vstup s <i>pull up</i>em generovalo varování?! Ale jak vidíte, tak pouze jednou.
Neodolal jsem a vytvořil <a href='https://github.com/pozyxLabs/Pozyx-Python-library/pull/78' class='external'>pull request #78</a> do jinak dost mrtvého projektu.
No a co není úplně vidět, tak po zapnutí pull-upu je vstup 1 (u GPIO 2 jsem to neudělal a tam zůstala 0) a když jsem spojil drátkem pin 9
a GND, tak jsem ze vzdáleného zařízení vyčetl 0. Hurá! <span class='smile'></span></div>
<div class='p'>A teď už to jenom celé udělat pořádně …</div>
<hr/>
<div class='p'><a id="230110"></a></div>
<h2>10. leden 2023 — Look-at-me ver0</h2>
<div class='p'>Dnešní pokusy s robotem <a href='/robots/eduro/cs'>Eduro</a>, třema Pozyx kotvama a jedním tagem bych úplně za úspěšné neprohlásil. Na druhou stranu je to
po několika měsících (na Eduru byl posledni git log z <i>Fri Mar 4 19:40:45 2022 +0100</i>), bylo fajn, že balíčky s Pozyxem už tam byly nainstalované
a tato část hned fungovala. Co tedy nefungovalo?</div>
<div class='p'>Rozhodl jsem se kopirovat Jirkův setup se třema kotvama na robotovi a pouze jedním tagem, který má být sledován. Plán byl rovnostranný trojúhelník
s tím, že jsem nejprve zvažoval jeden vrchol dopředu, ale pak mi přišlo snažší jen porovnávat měření z levé a pravé kotvy a zadní si nechat jen jako
„zálohu”, pokud by robot byl otočený o 180 stupňů, tak aby měl šanci to vůbec zjistit.</div>
<div class='p'>Skript se jmenuje <b>follome_uwb.py</b>, ale fakticky jsem skončil u nějakého <i>Look-at-me</i>, kdy dopřednou rychlost jsem dal 0 a manipuloval pouze
s úhlovou rychlostí (a robot se tedy pouze otáčel na místě). „Mrtvou zónu” jsem nechal pro rozdíl levého a pravého měření +/- 5cm a jinak se robot točil rychlostí
<b>math.degrees(10)</b> ve směru korekce. A ano, toto byla první chyba — stále se mi vracející. Toto převádí 10 radiánů na stupně, které pak interpretuji jako radiány!
Škoda mluvit i když po opravě ten assert naznačuje, jak moc jsem byl mimo. <span class='wink'></span></div>
<pre>AssertionError: ([0, 1000], [0, 3282806], datetime.timedelta(microseconds=907468))</pre>
<div class='p'>Je to hodně citlivé a ten mechanický setup si holt zaslouži revizi. Konstrukci je třeba dát výše, dál od všech železných divnosti, wifi anténa 15cm od UWB krabičky
také není ideální. Robot „tančil” i když tag byl položený na židli. Také mi přišlo, že 0 není uprostřed a bude třeba tam doplnit nějaký umělý offset,
ale to se pomalu dostáváme k ultra přesné kalibraci co dělal Jirka loni.</div>
<div class='p'><i>to be continued</i> (teď už timeout, než nás vyhodí ze školy) …</div>
<hr/>
<div class='p'><a id="230124"></a></div>
<h2>24. leden 2023 — Dva na jednoho</h2>
<div class='p'>Dnes to celkem šlo. Zapojil jsem dvě Pozyx kotvy přímo do počítače a oba moduly současně měřily vzdálenost na společný tag. Co mne trošku překvapilo
byly průběžné výsledky. Nejprve statistika měření s dotazem na vstupy a výstupy:</div>
<pre>k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>-
0 sys 458 | 5 | 0.3Hz
1 pozyx.range 10251 | 603 | 40.0Hz
2 pozyx.settings 158 | 2 | 0.1Hz
3 pozyx.gpio 3618 | 603 | 40.0Hz</pre>
<div class='p'>OK, tj. cca 40Hz (i když jak jsem později zjistil, z těchto měření může být netriviální zlomek nevalidních).</div>
<pre>k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>-
0 sys 497 | 5 | 0.5Hz
1 pozyx.range 10897 | 641 | 62.4Hz
2 pozyx.settings 158 | 2 | 0.2Hz
3 pozyx.gpio 0 | 0 | 0.0Hz</pre>
<div class='p'>Pak jsem GPIO vyhodil z konfigurace a frekvence se zvýšila. Prima, ale to bylo očekávané. A pak přišla to nečekané měření:</div>
<pre>k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>–
0 sys 996 | 8 | 0.8Hz
1 pozyx_left.range 15279 | 900 | 85.4Hz
2 pozyx_left.settings 78 | 1 | 0.1Hz
3 pozyx_left.gpio 0 | 0 | 0.0Hz
4 pozyx_right.range 15131 | 893 | 84.7Hz
5 pozyx_right.settings 158 | 2 | 0.2Hz
6 pozyx_right.gpio 0 | 0 | 0.0Hz</pre>
<div class='p'>Zapojil jsem dvě kotvy na dva různé seriové (resp. USB) porty a frekvence ještě více narostla?!</div>
<div class='p'>No zakopaný pes, velmi pravděpodobně, je v tom, že vždy i druhá kotva „slyší” komunikaci té první a reportuje to do PC.
Tj. jednotlivá měření nejsou pouze vlastní, ale i přeslechy. Tam jsem i viděl neplatné (status pro <i>doRanging()</i> je 0)
záznamy.</div>
<div class='p'>Asi nejlepší je tabulka se zapojeným <i>followme</i>, kde příkaz s rychlosti (<i>followme.desired_speed</i>) se odešle pouze pro
validní měření:</div>
<pre>k name bytes | count | freq Hz
<strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike><strike>-</strike>—-
0 sys 1504 | 9 | 0.9Hz
1 pozyx_left.range 15475 | 914 | 86.7Hz
2 pozyx_left.settings 158 | 2 | 0.2Hz
3 pozyx_left.gpio 0 | 0 | 0.0Hz
4 pozyx_right.range 15041 | 893 | 84.7Hz
5 pozyx_right.settings 158 | 2 | 0.2Hz
6 pozyx_right.gpio 0 | 0 | 0.0Hz
7 followme.desired_speed 2090 | 418 | 39.6Hz</pre>
<div class='p'>… zhruba tedy cca na 20Hz pro každou kotvu.</div>
<div class='p'>Zkoušel jsem to pak na Eduru a tam mne zase iritovalo, že záleží jakou kotvu připojím dříve, aby získala port 0.
Přimé dotazy jsou s <i>remote_id=None</i>, ale tím se ztrácí ID té přípojené kotvy. Řešení je identifikace na začátku:</div>
<pre>>>> pozyx = pypozyx.PozyxSerial('/dev/ttyACM0')
>>> pozyx.getNetworkId(network_id)
1
>>> hex(network_id.id)
'0xd67'
>>> pozyx = pypozyx.PozyxSerial('/dev/ttyACM1')
>>> network_id = pypozyx.NetworkID()
>>> pozyx.getNetworkId(network_id)
1
>>> hex(network_id.id)
'0xd53'</pre>
<div class='p'>Moc pokusů jsem pak už neudělal, tak alespoň jeden <a href='https://youtu.be/GZFPtOw0IT0' class='external'>vzorek</a>. Ono většina videí je obráceně,
což bych možná z pohledu <a href='/competitions/elrob/2024/cs'>ELROBu24</a> zvážil? Prostě na kameře nebude překážet osoba, které robota
vede.</div>
<div class='p'>p.s. zapomněl jsem napsat, že k řízení jsem používal <a href='https://docs.python.org/3/library/statistics.html' class='external'>statistics.median</a> pro okénko posledních deseti měření</div>
<hr/>
<div class='p'><a id="230131"></a></div>
<h2>31. leden 2023 — followme_uwb ver0</h2>
<div class='p'>OK, první pokus <a href='https://youtu.be/iLogETobEIQ' class='external'>Eduro sleduje UWB maják</a> … a stejně tak i první (ano, samozřejmá) pozorování:</div>
<ul>
<li>prohodím-li pravou a levou kotvu, tak je třeba i prohodit směr jízdy dopředu (za směr dozadu)</li>
<li>jezdí-li robot jenom dopředu a člověk je dál za robotem, tak vyrazí úplně špatným směrem</li>
<li>detekci nárazu moc neodkádat</li>
</ul>
<div class='p'>Možná jsem měl neprve zmínit ten primitivní algoritmus co robota řídí:</div>
<pre>diff = self.left_range - self.right_range
dist = (self.left_range + self.right_range)/2
speed = 0.0
if dist > 1.2:
speed = 0.1
angular_speed = math.radians(10)
if abs(diff) < 0.05:
self.send_speed_cmd(speed, 0.0)
elif diff > 0:
self.send_speed_cmd(speed, -angular_speed)
else:
self.send_speed_cmd(speed, angular_speed)</pre>
<div class='p'>Ano, tak primitivní, žádné počítání průsečíků kružnic … a ano, také teď používám jen dvě kotvy, takže ani nepoznám co je vpředu a co je vzadu.</div>
<div class='p'>Chtělo by to nějaké srovnání, tj. asi lidar data (když už je stejně mám). Na druhou stranu lidar vidí nohy a jak je vidět na videu, tak dost zuřivě
mávam rukama, abych robota nasměroval. Pak by se měl rychleji pohybovat a rychleji otáčet … ale tím spíše potřebuje <i>collision avoidance</i>.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/eduro-followme-uwb-230131.png'><img src='/articles/pozyx/eduro-followme-uwb-230131_t.png' alt='eduro-followme-dual-uwb-230131_175427.log' title='eduro-followme-dual-uwb-230131_175427.log' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/eduro-followme-uwb-230131.png'>eduro-followme-dual-uwb-230131_175427.log</a>
</td></tr></table></div>
<div class='p'>Úplně „růžově” ty data nevypadají, ale ještě je tam skrytý ten median na 10 prvků, který to snad trošku srovná…</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/eduro-pozyx-diff-230131.png'><img src='/articles/pozyx/eduro-pozyx-diff-230131_t.png' alt='diff mediánů' title='diff mediánů' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/eduro-pozyx-diff-230131.png'>diff mediánů</a>
</td></tr></table></div>
<div class='p'>No nesrovnal. Pokud jsou kotvy od sebe 25cm, tak rozdíl 80cm je fakt marnost. No nevím, zda mám z toho obrázku úplně radost, ale je asi očekávaný.
Další pokus bude s dřevěnou lištou od Standy a tedy se širší základnou.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/articles/pozyx/eduro-wide-arms.jpg'><img src='/articles/pozyx/eduro-wide-arms_t.jpg' alt='Eduro se širokýma (80cm) ramenama' title='Eduro se širokýma (80cm) ramenama' class='border' width='-1' height='-1'/></a><br/>
<a href='/articles/pozyx/eduro-wide-arms.jpg'>Eduro se širokýma (80cm) ramenama</a>
</td></tr></table></div>
<div class='p'>A také o trošku zábavnější <a href='https://youtu.be/zPMrLg4dfrQ' class='external'>video</a>. Ještě tam byla meziverze, ale ta byla pomalá/nudná, tak jsem zvedl rychlost:</div>
<pre>speed = 0.0
if dist > 1.2:
speed = min(0.5, 0.1 + (dist - 1.2) * 0.4)</pre>
<div class='p'>tj. max 0.5m/s, ale s těma širokýma ramenama a pomalou úhlovou rychlostí už to trošku adrenalin je. Jasný další krok je ověření bezpečnosti
a jak to teď je, tak si i myslím, že možná ta vysunutá ramena i vidí 270deg lidar … takže možná i uvidí ten okamžik, kdy si je urazí.</div>
<div class='p'>Další vylepšení bude třeba u rychlosti korekce směru, resp. omezení rychlosti když je směr pravděpodobně hodně špatně (např. kolmo vlevo).</div>
<hr/>
<div class='p'><a id="230207"></a></div>
<h2>7. únor 2023 — Bezpečnost především, časem …</h2>
<div class='p'>Dnešek byl celkem poučný. Opakoval jsem pokus na chodbě, jen jsem vyrazil na druhou stranu a šel poměrně daleko od robota (4 až 5 metrů). A najednou
se robot „zbláznil” a málem to napral plnou rychlostí do zdi:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/wall-direction.jpg'><img src='/articles/pozyx/wall-direction_t.jpg' alt='hurá do zdi' title='hurá do zdi' class='border' width='320' height='240'/></a><br/>
<a href='/articles/pozyx/wall-direction.jpg'>hurá do zdi</a>
</td></tr></table></div>
<div class='p'>No doběhl jsem ho a zastavil těsně před nárazem, ale … proč mi to dělá?!</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/pozyx/eduro-uwb-230207_193615.png'><img src='/articles/pozyx/eduro-uwb-230207_193615_t.png' alt='diff a potenciální náraz v čase 90s' title='diff a potenciální náraz v čase 90s' class='border' width='640' height='338'/></a><br/>
<a href='/articles/pozyx/eduro-uwb-230207_193615.png'>diff a potenciální náraz v čase 90s</a>
</td></tr></table></div>
<div class='p'>Prostě najednou bylo měření skoro o metr vedle. A ano, myslím si že už jsem minule sliboval, že tam bude třeba dodělat „collision avoidance”
a místo toho jsem přidal sběr senzorických dat z tagu (jak to dělat jsem našel <a href='/articles/pozyx/cs#211224'>tady</a>). To jsem zvědav, jestli tam
bude alespoň vidět, že jsem popoběhl?</div>
<div class='p'>V každém případě se ptám na stav senzorů jen na jedné straně robota a tak se tam snížil update na cca 10Hz, zatím co na druhé zůstal cca na 30Hz.
Nemyslím si, že tím to bylo, ale vyloučit to nemůžu.</div>
<div class='p'>Senzorická data tagu vypadají, že odpovídají <a href='https://github.com/pozyxLabs/Pozyx-Python-library/blob/master/pypozyx/definitions/registers.py#L67-L92' class='external'>tabulce registrů</a>:</div>
<pre>registers:
PRESSURE = 0x50 # Pressure data in mPa
ACCELERATION_X = 0x54 # Accelerometer data (in mg)
ACCELERATION_Y = 0x56
ACCELERATION_Z = 0x58
MAGNETIC_X = 0x5A # Magnemtometer data
MAGNETIC_Y = 0x5C
MAGNETIC_Z = 0x5E
GYRO_X = 0x60 # Gyroscope data
GYRO_Y = 0x62
GYRO_Z = 0x64
# Euler angles heading (or yaw) (1 degree = 16 LSB )
EULER_ANGLE_HEADING = 0x66
EULER_ANGLE_YAW = 0x66
EULER_ANGLE_ROLL = 0x68 # Euler angles roll ( 1 degree = 16 LSB )
EULER_ANGLE_PITCH = 0x6A # Euler angles pitch ( 1 degree = 16 LSB )
QUATERNION_W = 0x6C # Weight of quaternion.
QUATERNION_X = 0x6E # x of quaternion
QUATERNION_Y = 0x70 # y of quaternion
QUATERNION_Z = 0x72 # z of quaternion
LINEAR_ACCELERATION_X = 0x74 # Linear acceleration in x-direction
LINEAR_ACCELERATION_Y = 0x76 # Linear acceleration in y-direction
LINEAR_ACCELERATION_Z = 0x78 # Linear acceleration in z-direction
GRAVITY_VECTOR_X = 0x7A # x-component of gravity vector
GRAVITY_VECTOR_Y = 0x7C # y-component of gravity vector
GRAVITY_VECTOR_Z = 0x7E # z-component of gravity vector
TEMPERATURE = 0x80 # Temperature</pre>
<div class='p'>je to 24 čísel s tím, že první asi opravdu je tlak, poslední teplota (ta odpovídá i startu ve studené hale a pak po třetí minutě návrat)
a aktivita před 90s je trošku vidět na „linear acceleration”:</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/pozyx/pressure.png'><img src='/articles/pozyx/pressure_t.png' alt='tlak' title='tlak' class='border' width='220' height='116'/></a><br/>
<a href='/articles/pozyx/pressure.png'>tlak</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/articles/pozyx/linear-acceleration.png'><img src='/articles/pozyx/linear-acceleration_t.png' alt='lineární zrychleni' title='lineární zrychleni' class='border' width='220' height='116'/></a><br/>
<a href='/articles/pozyx/linear-acceleration.png'>lineární zrychleni</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/articles/pozyx/temperature.png'><img src='/articles/pozyx/temperature_t.png' alt='teplota' title='teplota' class='border' width='220' height='165'/></a><br/>
<a href='/articles/pozyx/temperature.png'>teplota</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230214"></a></div>
<h2>14. únor 2023 — Follow me UWB on/off</h2>
<div class='p'>Na posledním callu Jirka říkal, že ještě před vyhybáním se překážkam nejprve zapojí ten digitální vypínač. A to bych nebyl já, abych se hned
neopičil. Tímto tedy děkuji TomášoviP za připájení konektoru a tlačítka — mini demo můžete vidět na <a href='https://youtu.be/jeDxVSeiWCw' class='external'>mini-videu</a>.
Po minulých zkušenostech jsem tam také rovnou přidal test na volný prostor — pokud je překážka blíž jak 1m, tak dovol pouze otáčení. To se ukázalo
až moc opatrné, tak půlením intervalu a přeměřováním robota, kdy 50cm je málo, jsme skončili na 70cm.</div>
<div class='p'>Další kousek je rychlost otáčení odpovídající chybě natočení robota. Zatím jsem to ignoroval a byl „pyšný” na kód, kdy detekuje tag vlevo/uprostřed/vpravo
a neřeší jak moc … tak teď by mne to celkem zajímalo a jestli jsem neudělal chybu ve výpočtu, tak by to mělo být relativně jednoduché. Nechť je robot v pozici
(0, 0) a kouká ve směru osy X. Kotvy nechť jsou od sebe daleko B, jako base, a tak jejich pozice je (0, B/2) a (0, -B/2). Pak změřím dvě vzdálenosti L a R. Pro
pozici tagu na (x, y) platí, že</div>
<pre>L = sqrt(x^2 + (y-B/2)^2)
R = sqrt(x^2 + (y+B/2)^2)
L^2 - R^2 = x^2 + (y-B/2)^2 - x^2 - (y+B/2)^2
L^2 - R^2 = -2*y*B*/2 - 2*y*B*/2 = -2*y*B
y = (R^2 - L^2)/(2*B)</pre>
<div class='p'>Jak se znám, tak tam bude určitě nějaká „drobná numerická chybička” … hlavně by to nemělo fungovat, když R bude větší než L + B, není-liž pravda?!
Nevidím to, tak opravu nechám zkušenému čtenáři. <span class='wink'></span></div>
<div class='p'>p.s. jestě jedna drobnost z dnešního testování — ty USB konektory nejsou nějak super spolehlivé a při „ťuknutí” o zeď nejspíše částečně vypadly.
Po opětném zapojení se ale detekovaly jako nová zařízení <i>/dev/ttyACM2</i> a <i>/dev/ttyACM3</i> … no asi by to chtělo ta USB pravidla.</div>
<hr/>
<div class='p'><a id="230221"></a></div>
<h2>21. únor 2023 — Pull request #953</h2>
<div class='p'>Dneska jsem to do limitu (22h) nedal. A ani není žádný velký posun, kterým bych se mohl pochlubit. Jirka už minulou středu říkal, že řeší návrat po
trase a problém s průjezdem úzkými dveřmi … no holt se mi pomalu ztrácí za horizontem, sigh. <span class='wink'></span></div>
<div class='p'>Tak co je nového? Říkal jsem si, že bych si měl odložit skoro-použitelné <i>UWB follow me</i> demo a tak jsem vytvořil <a href='https://github.com/robotika/osgar/pull/953' class='external'>pull request do OSGARa</a>. Tedy nejprve jsem asi 10 minut hledal, jak se sakra pull requesty vytváří, než mi došlo, že nejsem přihlášený a tak tam tlačítko <i>create pull request</i> chybí. V druhém kroku všechny testy na linuxu (<i>Ubuntu 18.04</i>) byly ve stavu <i>canceled</i> s odkazem na <a href='https://github.com/actions/runner-images/issues/6002' class='external'>github issue</a>, že nebude tato vykopávka dále v CI podporovaná. Po domluvě s Jakubem jsem tedy zvedl na poslední stabilní <i>Ubuntu 22.04</i>, ale tam jsem zase narazil na nepodporovaný <i>Python 3.6</i>. Ten jsem tedy nahradil za <i>Python 3.9</i> (OSGAR byl testovaný pro linux a windows s Python 3.6, 3.7 a 3.8), ale to zase kolidovalo s prastarými balíčky a … vzdal jsem to a teď je tam pouze <i>Python 3.7</i> a <i>Python 3.8</i>. TODO. … nějak pomalu tuším, kde jsem propálil trošku toho času …</div>
<div class='p'>Vznikla nová větev <i>feature/follow-uwb-path</i> a pokusil jsem se o první „návrat na základnu”. Původní název dnešního zápisu měl být „červená a modrá” (tlačítka na Eduru) nebo „Freudovo nabájení” (když chcete zároveň říci napájení a nabíjení, to byla zase řeč o Spiderovi) … ale to by asi bylo kryptické i pro mne. <span class='wink'></span> Jo, tak ty tlačítka červené mi evokuje <i>nahrávání</i>, tj. <i>follow me mode</i> a zbylé modré je tedy <i>follow recorded path</i>. Nejjednodušší varianta, co mne napadla, bylo si průběžně ukládat <i>pose2d</i>, tj. (x, y, heading) do pole a když se měl po trase vrátit domu, tak pokud o 180 stupňů otočený heading robota z první pozice od startu bližší než 20cm byl menší než jeden stupeň, tak jeď jinak se pomalu otáčej, aby rozdíl nahraného a současného (převráceného) headingu byl menší. Možná kód bude srozumitelnější:</div>
<pre>elif self.navigation_mode == MODE_FOLLOW_PATH:
for i, p in enumerate(self.path):
d = math.hypot(data[0] - p[0], data[1] - p[1]) / 1000.0
if d < DIST_STEP:
break
if i == 0 or not self.follow_enabled:
self.send_speed_cmd(0, 0)
else:
speed = 0.0
diff = (data[2] - p[2]) % 36000 - 18000
if abs(diff) < 100:
angular_speed = 0
speed = 0.1
elif diff < 0:
angular_speed = math.radians(10)
else:
angular_speed = -math.radians(10)
self.send_speed_cmd(speed, angular_speed)</pre>
<div class='p'>V prvním pokusu jsem špatně odhadl singularitu na 360deg, ve druhém zapomněl robota zastavovat, když UWB tlačítko je ve stavu off … a pak to vlastně zhruba dělalo co mělo. <span class='smile'></span> … no resp. ne úplně, viz
např. poslední <a href='https://youtu.be/ixIo1xJDO3Y' class='external'>video</a>. Vybral jsem ho, že je tam vidět Spider, což byl ještě další bod na seznamu a ten skončil s</div>
<pre>File "/home/md/git/osgar/osgar/drivers/spider.py", line 186, in update
assert False, channel # unsupported channel
AssertionError: move</pre>
<div class='p'>takže je jasné, kde budeme navazovat příště. Jinak i u Spidera jsem uvažoval o aplikaci <i>follow me</i> (možná se čtyřma kotvami, každá v jednom rohu … ve <i>spider módu</i> totiž může jet libovolným směrem), ale po dnešních pokusech s oživením bych udělal opak, že ten tag by uživatele chránil a pokud bude blíže jak 3 metry, tak se Spider automaticky zastaví až už jede jakýmkoliv směrem!</div>
<div class='p'>Ještě jsem chtěl napsat doplnění k minulému záznamu … teď vím, že mám alespoň dva čtenáře <span class='wink'></span>. Ano, ten problém s počítáním pozice tagu nastane, když se pokusím vedle <i>y</i> ještě zjistit <i>x</i> a tam mohu mít odmocninu ze záporného čísla … díky ML za potvrzeni. <span class='smile'></span></div>
<div class='p'>p.s. koukám, že ani do 00:00 limitu jsem to nedal :(</div>
<div class='p'>p.s.2 ono vlastně není překvapivé, že Eduro do Spidera narazilo, protože algoritmus výše řeže zatáčky o 20cm …</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/pozyx/eduro-follow-path.png'><img src='/articles/pozyx/eduro-follow-path_t.png' alt='sledování cesty zpět' title='sledování cesty zpět' class='border' width='320' height='263'/></a><br/>
<a href='/articles/pozyx/eduro-follow-path.png'>sledování cesty zpět</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="230301"></a></div>
<h2>1. březen 2023 — pypozyx.SingleRegister(size=2)</h2>
<div class='p'>Včera se toho na poli Pozyxu moc nedělo. TomášP mi vytvořil druhé tlačítko na UWB tag, takže teď můžu (stejně jako Jirka) přepínat vzdáleně mód sledování
a návratu po trase. Motivace byla přechod z robota <a href='/robots/eduro/cs'>Eduro</a> na <a href='/robots/kloubak/cs'>Kloubáka K2</a>, který žádný přepínač přímo na robotovi nemá.</div>
<div class='p'>Koukal jsem do kódu <i>pypozyx</i> knihovny, protože jsem odmítal kvúli vyčítání druhého bitu posílat extra dotaz. Implementace je taková, že
<a href='https://github.com/pozyxLabs/Pozyx-Python-library/blob/master/pypozyx/definitions/registers.py#L45-L48' class='external'>každý GPIO má vlastní registr</a>:</div>
<pre>GPIO_1 = 0x85 # Value of the GPIO pin 1
GPIO_2 = 0x86 # Value of the GPIO pin 2
GPIO_3 = 0x87 # Value of the GPIO pin 3
GPIO_4 = 0x88 # Value of the GPIO pin 4</pre>
<div class='p'>a pro dotaz se pak používá funkce <i>getGPIO()</i>, která je implementovaná následovně:</div>
<pre>def getGPIO(self, gpio_num, value, remote_id=None):
gpio_register = PozyxRegisters.GPIO_1 + gpio_num - 1
return self.getRead(gpio_register, value, remote_id)</pre>
<div class='p'><i>getRead</i> už je pak obecné čtení spojené s komunikací s dalším zařízením pokud <i>remote_id</i> není <i>None</i>. Co s tím? No trik je v tom, že volání toho čtení
neobsahuje (tedy na první pohled) informaci, kolik se toho má přečíst?! Toto je dané typem vstupně/výstupní struktury předávané ve <i>value</i>. Zde je použitý <i>SingleRegister</i>,
tedy jeden bajt. Ale … registry můžou být i 2 a 4 bajtové, takže pokud změníte defaultní <i>size=1</i> na 2, tak vyčtete stavy obou pinů najednou. Ano, mají pak třeba hodnotu
257 = 0x101 … ale to už se dá. <span class='smile'></span></div>
<div class='p'>Na K2 jsme <i>popozyx</i> doinstalovali, ale vlastně jsem ho už nestihl vyzkoušet. USB by měla být k dispozici, ale vše je „pod kapotou”.</div>
<div class='p'>Ještě jsem udělal pár pokusů s Edurem s testem návratu po trase (stejný kód jako minule) a moc slavné to nebylo, tj. dnes bez videa.</div>
<hr/>
<div class='p'><a href='/articles/pozyx/cs#email'>kontaktní formulář</a></div>
MDEK1001https://robotika.cz/articles/mdek1001/cs2022-03-09T00:00:00ZMartin Dlouhý, Jiří Iša
MDEK1001 (Module Development & Evaluation Kit) je další příklad zařízení s Decawave DW1000 čipem, který pomocí UWB (Ultra Wide Band)
technologie umožnuje lokalizaci a komunikaci. Cena je zhruba 200USD, což vychází cca 5x levněji než Pozyx. Co je lepší?
<b>Blog update:</b> 17/1/2023 — <a href='/articles/mdek1001/cs#230117'>OSGAR driver a rychlost měření</a>
<div class='p'><table class='image_panel center' style='width: 446px;'><tr><td>
<span><img src='/articles/mdek1001/mdek1001.jpg' alt='MDEK1001 (zdroj Mouser.com)' title='MDEK1001 (zdroj Mouser.com)' class='border' width='440' height='334'/></span><br/>
<span>MDEK1001 (zdroj Mouser.com)</span>
</td></tr></table></div>
<div class='p'>Toto je vlastně druhý článek věnovaný UWB technologii. První část najdete v <a href='/articles/pozyx/cs'>blogu o Pozyxu</a>.</div>
<h2>Obsah</h2>
<ul>
<li><a href='/articles/mdek1001/cs#220309'>220309 - Balíček dorazil</a></li>
<li><a href='/articles/mdek1001/cs#220311'>220311 - Android a Bluetooth</a></li>
<li><a href='/articles/mdek1001/cs#220313'>220313 - uwg, uwt, uwi a les</a></li>
<li><a href='/articles/mdek1001/cs#220317'>220317 - Bridge node, panid a IoT data</a></li>
<li><a href='/articles/mdek1001/cs#230117'>230117 - OSGAR driver a rychlost měření</a></li>
</ul>
<hr/>
<hr/>
<h1>Blog</h1>
<div class='p'><a id="220309"></a></div>
<h2>9. březen 2022 — Balíček dorazil</h2>
<div class='p'><a href='https://www.decawave.com/product/mdek1001-deployment-kit/' class='external'>MDEK1001</a> jsme si koupili s Jirkou přes <a href='https://cz.mouser.com/ProductDetail/Qorvo/MDEK1001?qs=TiOZkKH1s2TlRZBi6MtMNg%3D%3D' class='external'>Mouser</a> (ještě tam mají 184 sad, tj. za týden zhruba podobné číslo prodali). Není to úplně levné (s posláním z USA, daněma
a clem to stálo 6 576,55Kč (na webu 5 480,46 Kč), ale stále je to řádově levnější než <a href='/articles/pozyx/cs'>Pozyx</a> (<a href='https://store.pozyx.io/creator-kit-65?_ga=2.151149433.1919396223.1646841475-490974699.1639763609#attr=85' class='external'>1,050.00 EUR+doprava</a>). V čem se tady obě sady liší? Častečnou odpověď jsme dostali
<a href='/articles/pozyx/cs#220104'>před časem od Pozyx podpory</a>, kde k jednotlivým bodům se budeme postupně vracet.</div>
<div class='p'>První pozorování je, že Pozyx krabiček je 10 (oprava 9) 5x kotva/anchor a 4x tag (ty jsem po pravdě ještě moc nepoužíval). MDEK1001 obsahuje 12 krabiček
bez rolišení role. Pozyx tagy mají na sobě ještě IMU (<i>9-axis inertial measurement unit</i>), kotvy nemají nic. MDEK1001 by měl mít všude akcelerometry,
pro detekci pohybu, a Bluetooth pro konfiguraci. Pozyx má krabičky pouze pro tagy, MDEK1001 je má pro všech 12 zařízení.</div>
<div class='p'><a href='https://www.decawave.com/mdek1001/quickstart/' class='external'>MDEK1001 Quick Start Guide</a> doporučuje zapojit 4 kotvy v jedné rovině do obdélníka na zdroje, tag na baterku
nebo USB powerbanku, stáhnout si Android aplikaci a můžete začít konfigurovat přes Bluetooth. Zatímco Pozyx s kabely fakt nešetří (5 zdrojů s kabely, 3 malé
powerbanky, extra komunikační USB kabel), tak MDEK1001 obsahuje jediný USB kabel, 4x L-kové propojky a to je vše. S Pozyxem si tedy můžete začít hrát hned,
ale pro MDEK1001 potřebujete ještě „zajít do obchodu” nebo „znárodnit” Pozyx.</div>
<div class='p'>Co se stane, když nebudu postupovat podle návodu a prostě tím jediným kabelem na flashování firmware DMW1001C modul zapnu? Vidim disco čtyř LEDek a <i>dmesg</i>
říká:</div>
<pre>[131295.467222] usb 1-6: new full-speed USB device number 13 using xhci_hcd
[131295.619237] usb 1-6: New USB device found, idVendor=1366, idProduct=0105, bcdDevice= 1.00
[131295.619243] usb 1-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[131295.619246] usb 1-6: Product: J-Link
[131295.619249] usb 1-6: Manufacturer: SEGGER
[131295.619251] usb 1-6: SerialNumber: 000760154093
[131295.626959] cdc_acm 1-6:1.0: ttyACM0: USB ACM device</pre>
<div class='p'>A teď kde je (sakra) ten příklad s terminálem pro komunikaci přes USB?
<a href='https://medium.com/garage-inside-garage/getting-started-with-ultra-wide-band-3d-positioning-dwm1000-and-dwm1001-modules-ba2f64e572b6' class='external'>Toto</a>
vypadá užitečně i když je to článek z roku 2018: <i>minicom -D /dev/ttyACM0</i></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/mdek1001/dwm-console.png'><img src='/articles/mdek1001/dwm-console_t.png' alt='DWM console' title='DWM console' class='border' width='640' height='382'/></a><br/>
<a href='/articles/mdek1001/dwm-console.png'>DWM console</a>
</td></tr></table></div>
<div class='p'><span class='smile'></span> … i když se to se mnou začalo rozumně bavit až když jsem dal <i>Hangup</i> … a nebo to nějakou dobu nabíhá, nevím …
ale na druhé straně je <i>chatbot</i> se kterým se dá pokecat. <span class='wink'></span></div>
<pre>dwm> si
[001155.990 INF] sys: fw2 fw_ver=x01030001 cfg_ver=x00010700
[001155.990 INF] uwb0: panid=x0000 addr=xDECAB827E225DC19
[001156.000 INF] mode: tn (pasv,twr,np,le)
[001156.000 INF] uwbmac: disconnected
[001156.000 INF] uwbmac: bh disconnected
[001156.010 INF] cfg: sync=0 fwup=0 ble=1 leds=1 le=1 lp=0 stat_det=1 (sens=1) mode=0
upd_rate_norm=1 upd_rate_stat=100 label=DWDC19
[001156.020 INF] enc: off
[001156.020 INF] ble: addr=EF:24:D0:2E:0F:B3
dwm> ut
[001294.240 INF] uptime: 00:21:34.240 0 days (1294240 ms)
dwm> av
acc: x = -1776, y = 4160, z = 6608
dwm> utpg
utpg: pg_delay=xB5 tx_power=x456585A5 (pg_delay=xB8 tx_power=x446484A4)
dwm> nmg
mode: tn (pasv,twr,np,le)</pre>
<div class='p'>Možná vhodný okamžik první iteraci přerušit.</div>
<div class='p'>p.s. jo jo, je tam příkaz <i>help</i> nebo jen <b>?</b>, který vypíše asi 20+ příkazů „na hraní” <span class='smile'></span></div>
<hr/>
<div class='p'><a id="220311"></a></div>
<h2>11. březen 2022 — Android a Bluetooth</h2>
<div class='p'>Potvrzuji, že začátky s <a href='https://www.decawave.com/product/mdek1001-deployment-kit/' class='external'>MDEK1001</a>
úplně hladké nejsou. Rozhodl jsem se tedy postupovat podle
<a href='https://www.decawave.com/mdek1001/quickstart/' class='external'>návodu</a>, věřte nevěřte. Stáhl jsem si tedy
<a href='https://www.decawave.com/wp-content/uploads/2019/03/DRTLS_Manager_R2.apk' class='external'>DRTLS_Manager_R2.apk</a>
(z Google Play byla odstraněna) a pokusil se to nainstalovat na starší Android telefon:
<i>There was a problem parsing the package</i>. Hmm. Povolil jsem instalaci z jiných zdrojů, ale výsledek stejný.</div>
<div class='p'>Pak jsem si včera hrál s Bluetooth (jak z konzole přes USB nastavit tag/kotvu jsem úplně nepochopil a přes
BT by to jít mělo). Existuje několik wrapperů jako <a href='https://pypi.org/project/decawave-ble/' class='external'>decawave-ble</a>,
ale tam instalace skončila <i>ERROR: Failed building wheel for bluepy</i>.</div>
<div class='p'>Tak jsem přešel na nápovědu od Jirky:
<i>K tématu Bluetooth & Python:</i>
<a href='https://github.com/hbldh/bleak' class='external'>https://github.com/hbldh/bleak</a> a <a href='https://github.com/pybluez/pybluez' class='external'>https://github.com/pybluez/pybluez</a>
<i>Jiné možnosti dost možná ani nejsou. Rozhodující nejspíš bude, co ti bude fungovat na Windows. Teoreticky obojí, prakticky možná ani jedno. Když jsem to zkoumal kolem Vánoc, vyšlo mi, tuším, "radši Bleak." Argumenty si úplně nepamatuji. Něco kolem API a něco kolem pybluez "not being maintained" a se souvistlostí se zastaralými tooly (hcitool).</i></div>
<div class='p'><a href='https://github.com/hbldh/bleak' class='external'>Bleak</a> opravdu vypadal „živější”, příklad fungoval, jen jsem pro UUID používal
kódy z <a href='https://github.com/WildflowerSchools/decawave_ble/blob/master/decawave_ble/__init__.py#L29-L44' class='external'>decawave_ble init tabulky</a>.</div>
<pre>import asyncio
from bleak import BleakScanner
async def main():
devices = await BleakScanner.discover()
for d in devices:
print(d)
asyncio.run(main())</pre>
<div class='p'>při zapnutém jednom zařízení ukázal:</div>
<pre>5C:FB:7C:C6:B2:13: JBL Flip 4
24:FC:E5:6F:B2:C7: 24-FC-E5-6F-B2-C7
D6:DC:77:A5:C8:61: DW4D37
8C:79:F5:10:A5:E5: [TV] Samsung 7 Series (43)
53:62:1A:F4:32:35: 53-62-1A-F4-32-35
05:84:BC:18:E2:FB: 05-84-BC-18-E2-FB
F0:27:F0:09:B0:B8: F0-27-F0-09-B0-B8
6B:76:00:1B:A4:E6: 6B-76-00-1B-A4-E6
78:BD:BC:40:5B:BD: 78-BD-BC-40-5B-BD</pre>
<div class='p'>jj, skoro to vypadá, že bych mohl sousedům vypnout televizi. <span class='smile'></span> A ano, to co hledáme, je <b>DW4D37</b>.
Zatím asi nejzajímavější zpráva byla <i>Device Info</i>:
<b>bytearray(b'7M3\xfb\x08\xf3\xca\xde*\x00\xca\xde\x00\x00\x03\x01\x01\x00\x03\x01>\x97pQ\t\x1e\xaf\xce\x00')</b>
což v HEX vypadá lepší a prvních 8 bajtů je <i>Node ID = 374d 33fb 08f3 cade</i>. Nějaké indicie? Vypadá to
na malé „indiány” a spodní/první bajty odpovídají identifikaci zařízení. Ale o moc dále jsem se nedostal.</div>
<div class='p'>A teď „Androidí rozuzlení” — oni to vlastně je v tom <a href='https://www.decawave.com/mdek1001/quickstart/' class='external'>MDEK1001 Quick Start Guide</a>:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/mdek1001/android-ver.png'><img src='/articles/mdek1001/android-ver_t.png' alt='podporovaná Android APK MDEK1001 verze' title='podporovaná Android APK MDEK1001 verze' class='border' width='640' height='181'/></a><br/>
<a href='/articles/mdek1001/android-ver.png'>podporovaná Android APK MDEK1001 verze</a>
</td></tr></table></div>
<div class='p'>No můj starší telefon je Android 4.4, žena měla 5.0 a poslední na testování UWB má verzi 12. Tak úplně není divu,
že s nabízenou verzi 6 a 7 to nemá žádný průnik …</div>
<h3>Update 11-03-2022 9:53pm (Jirka)</h3>
<div class='p'>Na mém když-to-funguje-tak-to-neupdatuj tabletu ta aplikace pustit jde.</div>
<div class='p'>První poznatek je, že Auto Positioning kotev při dvou kotvách nefunguje. Ta aplikace to ale neví, takže jí několik minut trvá, než vytimeoutuje. Naštěstí je tam i Cancel.</div>
<div class='p'>Druhý poznatek je, že při třech kotvách to trvá více než půl minuty.</div>
<div class='p'>Třetí poznatek je, že při třech kotvách v trojúhelníku se stranou lehce nad dva metry jsou vzdálenosti z Auto Positioning o deset až patnáct centimetrů špatně. To je na výstavní systém přímo od zdroje, s kalibrovanými zpožděními na anténách, podle mě docela slabota. Na druhou stranu, bylo to o několik týdnů rychlejší, než moje hrátky s BU01.</div>
<div class='p'>Na ovládání z tabletu přes Bluetooth, bez natahování propojovacích kablíků z konvertoru USB<->sériák, bych si taky zvykl docela rychle. Vlastně asi úplně nejvíc by se mi líbilo, kdyby ten DW1000 byl přímo v noteboku a měl bych k němu nízkoúrovňový přístup. Pak bych nemusel řešit ani kabely, ani dvě souběžné bezdrátové sítě vysávající baterky.</div>
<hr/>
<div class='p'><a id="220313"></a></div>
<h2>13. březen 2022 — uwg, uwt, uwi a les</h2>
<div class='p'>Včera mne Jirka motivoval to zase zkusit, když jemu to vše hned fungovalo. <span class='wink'></span> Ty tajemné zkratky z názvu
jsou skoro všechny příkazy ze skupiny <b>UWBMAC</b> a pokud je použijete, tak konzole začne vypisovat vzdálenost
dvou krabiček. <span class='smile'></span></div>
<div class='p'>Ale postupně. Nejprve přehled nápovědy z konzolové aplikace (nevím, zda už jsem zmiňoval, že je třeba pro
přepnutí 2x po sobě stisknout Enter, viz <a href='https://www.decawave.com/sites/default/files/dwm1001-api-guide.pdf' class='external'>dokumentace</a>), sekce <i>UWBMAC</i>:</div>
<pre>** Command group: UWBMAC **
nmg: Get node mode
nmp: Set UWB mode to passive
nmo: Set UWB mode to off
nma: Set mode to AN
nmi: Set mode to ANI
nmt: Set mode to TN
nmtl: Set mode to TN-LP
nmb: Set mode to BN
la: Show AN list
lb: Show BN list
nis: Set Network ID
nls: Set node label
udi: Show incoming IoT data
uui: Send IoT data
stg: Get stats
stc: Clear stats</pre>
<div class='p'><b>nmg</b> už jsem zmiňoval v <a href='/articles/mdek1001/cs#220309'>prvním příspěvku</a>, kde všechny krabičky vracely
<b>mode: tn (pasv,twr,np,le)</b>. Ne že bych tomu rozumněl, ale <i>pasv</i> zní dost <i>pasivně</i>, <i>twr</i> by mohlo
být <i>Two Way Ranging</i>, zbytek netuším. Také to <i>tn</i> něco znamená a na <a href='https://tn.cz' class='external'>tn.cz</a> to asi
nenajdete.</div>
<div class='p'>Teorie byla taková, že když doporučený postup přes Android a Bluetooth nakonfiguruje nejprve kotvy (AN bude nejspíše <i>Anchor Node</i>,
takže to <i>TN</i> bude <i>Tag Node</i>, konec „záhady”), tak pak je možné lokalizovat <i>tag</i> vůči <i>kotvám</i>. To <b>I</b>
my přišlo jako <i>inicializační</i>, jako kdo diriguje všechny kotvy v dané podsíti … ale to si budu muset znova nastudovat
ať vás nematu. V každém případě po <b>nmt</b> se změnil stav na <b>tn (act,twr,np,le)</b> (aktivní tag?) a u druhé krabičky
<b>nmi</b> byla odpověď <b>ani (act,real)</b>. Pokud jsem tag znova zapojil do USB a napsal <i>les</i> (<i>les: Show meas. and pos.</i>)
tak jsem získal tento výpis:</div>
<pre>dwm> les
dwm> 4D37[0.00,0.00,0.00]=0.54
4D37[0.00,0.00,0.00]=0.49
4D37[0.00,0.00,0.00]=0.44
4D37[0.00,0.00,0.00]=0.56
4D37[0.00,0.00,0.00]=0.48
4D37[0.00,0.00,0.00]=0.49
4D37[0.00,0.00,0.00]=0.52
4D37[0.00,0.00,0.00]=0.42</pre>
<div class='p'>Také <b>la</b> (výpis kotev) už něco začal dělat:</div>
<pre>dwm> la
[000034.780 INF] AN: cnt=1 seq=x01
[000034.780 INF] 0) id=0000000000004D37 seat=0 seens=98 map=0000 pos=0.00:0.00:0.00
[000034.790 INF]</pre>
<div class='p'>A ano, potvrzuji Jirkovu „předtuchu”, že se Pozyx s MDEK1001 nebude chtít vůbec bavit, minimálně
zapnutou Pozyx kotvu to nevypisuje (i když si myslím, že po startu oba systémy používaji kanál 5
a preambuli velikosti 64) … ale to možná někdy později.</div>
<div class='p'>Mohl bych sem alespoň doplnit první fotky z rozbalování Qorvo (fakt se to čte <i>kurvo</i>?)</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/articles/mdek1001/qorvo-box.jpg'><img src='/articles/mdek1001/qorvo-box_t.jpg' alt='Qorvo krabice' title='Qorvo krabice' class='border' width='320' height='180'/></a><br/>
<a href='/articles/mdek1001/qorvo-box.jpg'>Qorvo krabice</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/articles/mdek1001/qorvo-content.jpg'><img src='/articles/mdek1001/qorvo-content_t.jpg' alt='tucet lokalizátorů' title='tucet lokalizátorů' class='border' width='320' height='180'/></a><br/>
<a href='/articles/mdek1001/qorvo-content.jpg'>tucet lokalizátorů</a>
</td></tr></table></div>
<div class='p'>p.s. ještě jsem měl říci, že to nastavení tag/kotva/init zůstává platné i po vypnutí napájení</div>
<div class='p'>p.s.2 potvrzuji, že v tom <a href='https://www.decawave.com/wp-content/uploads/2019/01/MDEK1001_Quick_Start_Guide_1.1.pdf' class='external'>návodu (quick start)</a> vidím:</div>
<ul>
<li>All RTLS units will initially appear as tags in "passive" UWB mode</li>
<li>Set "UWB" to "Active"</li>
<li>For any one of the anchors, check the "Initiator" box (there must always be one initiator in the network)</li>
</ul>
<hr/>
<div class='p'><a id="220317"></a></div>
<h2>17. březen 2022 — Bridge node, panid a IoT data</h2>
<div class='p'>V rámci včerejšího <i>robotického callu</i> jsme se trošku posunuli, resp. mne zase Jirka kousek poposunul. <span class='wink'></span>
Sice výsledek je částečně z kategorie „Cimrmanovského foukání tabákového dýmu do vody”, ve smyslu „tudy ne přátelé”,
ale uvidíme.</div>
<div class='p'>Pro mne první objev byl, co je to: B-node z nápovědy:</div>
<pre>nmb: Set mode to BN
lb: Show BN list</pre>
<div class='p'>Je k tomu totiž potřeba <a href='https://www.decawave.com/wp-content/uploads/2019/03/DWM1001_Gateway_Quick_Deployment_Guide.pdf' class='external'>novější dokumentace (DWM1001_Gateway_Quick_Deployment_Guide.pdf)</a>, kde zmiňují nový typ nodu/uzlu a to <i>bridge node</i>.
Je to krabička, která by měla umožnit napojení UWB sítě na klasický internet.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/mdek1001/uwb-gateway.png'><img src='/articles/mdek1001/uwb-gateway_t.png' alt='Příklad vícero gateway napojení' title='Příklad vícero gateway napojení' class='border' width='640' height='276'/></a><br/>
<a href='/articles/mdek1001/uwb-gateway.png'>Příklad vícero gateway napojení</a>
</td></tr></table></div>
<div class='p'>Bohužel se to nedá úplně snadno vyzkoušet, protože je k tomu třeba RaspberryPi3 a DWM1001 modul je třeba
připojit přes piny. Nakonfigurovat ale <i>node</i> jako <i>bridge node</i> pomocí <b>nmb</b> jde a pak se objeví i při výpisu
pomocí <b>lb</b>. Divné ale je, že tento výpis funguje pouze pro kotvy ale už ne pro tagy a přitom převzatý obrázek
zmiňuje UWB link s tagem …</div>
<div class='p'>Možná jsem měl začít motivací, jak jsem se k tomu vůbec dostal? No chtěl jsem poslat pár bajtů z jedné krabičky
do druhé a příkazy:</div>
<pre>udi: Show incoming IoT data
uui: Send IoT data</pre>
<div class='p'>vypadaly zprvu nadějně. Nikde o nich nebyla zmínka, tak znova Google a ta novější dokumentace:</div>
<div class='p'><i>Adding a gateway to a PANS network enables the possibility to exchange data other than location between gateways and nodes within the systems. This non-location data is called "IoT Data". From the web-manager, it is possible to send IoT data to a node under the node properties window, in the "messages" tab. The data sent to the tag can be observed on the UART shell after using the "udi" command. Data is sent as hexadecimal.</i></div>
<div class='p'>Tady si Jirka všiml klíčového slova <i>tag</i> (prostě pro <i>anchors</i> to nejspíše fungovat ani nemá). Bohužel z různých diskuzí (<a href='https://decaforum.decawave.com/t/receiving-tag-position-using-a-bridge/6139/3' class='external'>Receiving Tag position using a bridge</a>, <a href='https://decaforum.decawave.com/t/bridge-node-and-web-manager/4442/8' class='external'>Bridge node and web manager</a>)
to vypadá, že bez HW úpravy <i>bridge node</i> nic poslat nepůjde.</div>
<div class='p'>Jirka našel ještě <a href='https://decaforum.decawave.com/t/pans-r2-some-questions-on-the-gateway-application-of-dwm1001/4395/2' class='external'>PANS R2: Some questions on the Gateway application of DWM1001</a> a <a href='https://decaforum.decawave.com/t/how-to-communicate-with-listener-without-using-raspberry/10761/10' class='external'>How to communicate with listener (without using raspberry)</a>, tj. možná cesta existuje, ale bude poměrně trnitá …</div>
<div class='p'>A na závěr bych ještě zmínil tu <b>panid</b> (<i>Personal Area Network ID</i>), které lze nastavit pomocí příkazu <i>nis</i> a je součástí <i>si</i> (system info):</div>
<pre>dwm> si
[000116.510 INF] sys: fw2 fw_ver=x01030001 cfg_ver=x00010700
[000116.510 INF] uwb0: panid=x0000 addr=xDECA2B75F6248207
[000116.520 INF] mode: tn (pasv,twr,np,le)
[000116.520 INF] uwbmac: disconnected
[000116.520 INF] uwbmac: bh disconnected
[000116.530 INF] cfg: sync=0 fwup=0 ble=1 leds=1 le=1 lp=0 stat_det=1
(sens=1) mode=0 upd_rate_norm=1 upd_rate_stat=100 label=DW8207
[000116.540 INF] enc: off
[000116.540 INF] ble: addr=E2:47:07:28:12:6E</pre>
<div class='p'>… tj. zatím se držím defaultu=0.</div>
<hr/>
<div class='p'><a id="230117"></a></div>
<h2>17. leden 2023 — OSGAR driver a rychlost měření</h2>
<div class='p'>Dnes to bude opravdu stručné — mám 10 minut, než to tady budeme muset opustit. Testoval jsem skoro po roce Qorvo UWB krabičky. Důvod? Pozyx mám doma a tam jsem se
nestavoval, ale Qorvo balíček jsem měl při ruce. První pozorování: <b>nic si nepamatuji!</b> … tj. opět se potvrdilo, že není nad to si to někam (třeba sem) napsat.</div>
<div class='p'>Test přes <i>minicom</i> fungoval a relativně rychle jsem zjistil, co znamená modrá nálepka (tag) a co červená (kotva). Na vzdálenost je třeba se ptát tagů a to příkazem <i>les</i>. To také fungovalo, ale občas mi došla trpělivost a možná jsem výpisy zastavil. Ono se tím příkazem to jak zapíná tak vypíná a extra <i>Enter</i> zopakuje minulý příkaz.</div>
<div class='p'>Myslím, že stav dobře vystihla Jakubova hláška: „ono je to live?!” … když jsem se chtěl pochlubit, jak to pěkně funguje. Jak moc je to tedy "živé" lze nejlépe poznat
z timestamp a k tomu máme <a href='https://github.com/robotika/osgar/' class='external'>OSGARa</a> přeci …</div>
<pre>0:00:06.547920 4 b'4D37[0.00,0.00,0.00]=0.37 \r\n'
0:00:16.545517 4 b'4D37[0.00,0.'
0:00:16.555737 4 b'00,0.00]=0.34 \r\n'
0:00:26.552047 4 b'4D37[0.00,0.00,0.00]=0.37 \r\n'
0:00:36.547780 4 b'4D37[0.00,0.00,0.00]=0.43 \r\n'
0:00:46.553412 4 b'4D37[0.00,0.00,0.00]=0.40 \r\n'
0:00:56.550504 4 b'4D37[0.00,0.00,0.00]=0.34 \r\n'</pre>
<div class='p'>Myslím si, že tento výpis mluví za vše. <span class='wink'></span> … na jedno měření potřebuji 10 sekund! To moc na <i>follow me</i>, kde by se hodilo spíše 10Hz (jen dva řády rozdíl)
úplně není …</div>
<div class='p'>Tak rychle, <i>git commit</i>, <i>git push</i> a opustit budovu …</div>
<hr/>
<div class='p'><a href='/articles/mdek1001/cs#email'>kontaktní formulář</a></div>
Kybernoid 2022https://robotika.cz/competitions/kybernoid-22/cs2022-10-26T00:00:00ZMartin Locker
Cílem letošní <b>soutěže Kybernoid 22</b>
je sestavit a naprogramovat robota tak, aby v časovém limitu samostatně bez jakékoliv další pomoci
našel cestu z bludiště postaveného z kartonových krabic. Robot by neměl do překážek narážet,
kontakt je časově penalizován.
O vítězství rozhoduje výsledný čas pro dosažení cíle se započítáním případných penalizací.
<ul>
<li><a href='https://future-forces-forum.org/download/pozvanka-kybernoid-22.pdf' class='external'>Oficiální link soutěže Kybernoid 22</a></li>
</ul>
<h2> Pravidla</h2>
<div class='p'>Pravidla pro první ročník této soutěže byla poněkud strohá. Úkolem robota je
dostat se během časového limitu 25 minut z bludiště, které je vytvořené
z lepenkových krabic. Jediným zásadním údajem je minimální šířka uliček 80 až 100 cm.</div>
<div class='p'><table class='image_panel center' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/hriste.jpg'><img src='/competitions/kybernoid-22/hriste_t.jpg' alt=' Příprava bludiště' title=' Příprava bludiště' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/kybernoid-22/hriste.jpg'> Příprava bludiště</a>
</td></tr></table></div>
<hr/>
<h2>Náš robot</h2>
<div class='p'>Robota pro soutěž stavěli Klára Tománková (konstrukce a mechanika) a Tomáš Červený (software).
Slušivý design mu dodal Kamil Hylák.
Vzhledem k ne úplně jasnému zadání byla prosazena cesta maximální jednoduchosti
hardwaru i softwaru.</div>
<div class='p'>Robot má diferenciální podvozek. Základem je deska vyříznutá z překližky, původně o šířce 40 cm,
ale po vyzkoušení v uličce šířky 80 cm zmenšena na 30 cm a upravena do
tvaru kruhu pro jednodušší otáčení v rozích.</div>
<div class='p'><table class='image_panel center' style='width: 171px;'><tr><td>
<a href='/competitions/kybernoid-22/robot.jpg'><img src='/competitions/kybernoid-22/robot_t.jpg' alt=' Náš robot' title=' Náš robot' class='border' width='165' height='220'/></a><br/>
<a href='/competitions/kybernoid-22/robot.jpg'> Náš robot</a>
</td></tr></table></div>
<div class='p'>Pohon zajišťují dva stejnosměrné elektromotory s převodovkou 50:1 s modelářskými
koly s mechovkou o průměru 70 mm. Třetí opěrný bod původně zajišťovalo pevné
ostruhové kolo. Ale po zveřejnění fotek podlahy (beton s dělícími drážkami) bylo
nahrazeno otočným ostruhovým kolem.</div>
<div class='p'>Mozkem robota je arduino Uno, které ovládá motory přes dvojitý H-můstek. Pro detekci
stěny jsou použity čtyři sonary. Nejdůležitější informace jsou zobrazovány
na LCD displeji. Napájení zajišťují tři články LiON 18650.</div>
<div class='p'>Protože nebylo jasné, jak může soutěžní hřiště vypadat, zvolili jsme nejjednodušší
algoritmus pro procházení bludištěm, tj. sledování stěny. Ten je sice jednoduchý
a spolehlivý, ale není funkční v bludišti se smyčkami (ostrůvky). Nakonec bylo
implementováno jednoduché rozšíření. Pokud je robot v bludišti déle než by trvalo
jeho opuštění, pokud by v bludišti smyčka nebyla, robot se otočí o 180° a tím vymění
stěnu a pokračuje dále. To by za "dobrých" podmínek mohlo vyřešit problém
smyčky v bludišti. Díky tomuto řešení se využily jen 2 sonary, levý boční pro
měření vzdálenosti od stěny a levý přední pro detekci zdi před robotem.</div>
<hr/>
<h2>Naše účast</h2>
<div class='p'>Samotná soutěž probíhala v jedné z výstavních hal v Letňanech. Do soutěže bylo
přihlášeno 16 středoškolských týmů. Nakonec se dostavilo 7 týmů, avšak jednomu
se robota nepovedlo oživit a tak do vlastní soutěže nastoupilo pouze 6 robotů.</div>
<div class='p'>Původně bylo avizováno, že budou dvě stejná hřiště o rozměrech 8 x 8 metrů, na
kterých pojedou vždy dva roboty paralelně, aby soutěž probíhala rychleji. Nakonec
díky malému počtu soutěžících bylo rozhodnuto, že hřiště bude pouze jedno, ale
větší cca 15 x 10 m.
Před stavbou vlastního bludiště museli týmy předat roboty do "depa" a nesměli
už na nich provádět žádné změny. Pořadí startu robotů bylo nalosováno, startujeme jako
pátí (předposlední).</div>
<div class='p'>Postavené bludiště je průjezdné sledováním stěny. Ale díky tomu, že má bludiště
dvojnásobnou velikost, budeme mít problém. Pro velikost bludiště 8 x 8 m jsme
kvalifikovaně odhadli, že i při nejhorší cestě, to robotovi nebude trvat více než
5 minut, aby se dostal ven. To je i nastavený limit pro otočení a změnu sledované
stěny. Bohužel ještě cesta podél levé stěny je skoro dvojnásobně delší než podle
pravé stěny a náš robot sleduje levou stěnu. A tedy téměř jistě to za 5 minut
ve z bludiště nestihne.</div>
<div class='p'>Při vystoupení prvních čtyř týmů se ukazuje, že úkol není tak jednoduchý, jak
na první pohled vypadá. Žádný z robotů se nedostává dále než do poloviny cesty.
Většina soutěžících implementovala nějaké složitější algoritmy pro procházení
bludištěm většinou s tím, že předpokládali pravoúhlé cesty v bludišti. Cesty byly
různě křivolaké (však se to také v pravidlech neuvádělo, že by měly být pravoúhlé).</div>
<div class='p'>Nastává čas startu našeho robota. Tomáš ho přináší do startovního místa a spouští.
Robot se bez problémů vydává na svoji cestu. Sleduje levou stěnu a tak projde
téměř celé bludiště. Sem tam do nějaké krabice narazí, detekce sonarem není
stoprocentní. Většinou se tak stává, když je proti sonaru hrana krabice.
Tím získáváme nějaké trestné sekundy.</div>
<div class='p'>Zhruba po 2 minutách se robot vrací do místa
startu (projel dvě slepé cesty). Je jasné, že to za 5 minut nestihne. Nakonec máme
víc štěstí než bychom čekali. V páté minutě je robot ve slepé uličce, provede přesně otočku o 180°
a chytá se protilehlé stěny a projíždí tak slepou cestu znovu, ale po stejné stěně!
Kdyby se to nestalo ve slepé uličce, tak by se robot začal vracet zpět.
Díky této šťasné náhodě dosahuje cíle v čase 6:23. Po připočtení 6 penalizací
za dotek (6 x 10s) je výsledný čas 7:23.</div>
<div class='p'><center>
<br>
<iframe width="560" height="315" src="//www.youtube.com/embed/dIeLXnrZ01A" frameborder="0" allowfullscreen></iframe>
<br>
Část jízdy našeho vítězného robota
</center></div>
<div class='p'>Už je na řadě jen jeden soupeř, tým z SPŠ Ječná. Podle rozhovoru před soutěží
měli obrovské plány, ale nakonec prý to nestihli, a tak vzali mBota (hotový
výukový robot) a napsali sledování stěny stejně jako my. Zvolili však pravou
stěnu, která je v tomto bludišti výrazně výhodnější, ale malý robotek je zase
oproti našemu pomalejší. I tak do cíle dorazí v čase 6:36. Po započtení penalizací
(7 x 10s) je výsledný čas 7:46.
Vítězíme.</div>
<div class='p'>Soutěž proběhla ve velmi příjemné atmosféře. Byla to premiéra jak pro soutěžící,
tak i pro pořádající Univerzitu obrany v Brně. My jsme si to prima užili a opět se
ukázalo, že lepší je jednodušší, ale spolehlivé řešení.</div>
<div class='p'>Jako cenu jsme si odvezli 3D tiskárnu od Průši (tedy až po té, co jsme odmítli 1. cenu -
elektrický skateboard - co s ním).</div>
<hr/>
<h3>Stránky soutěže</h3>
<div class='p'>[1] <a href='https://future-forces-forum.org/events/97_kybernoid-22-high-school-robotics-competition?lang=en' class='external'>Kybernoid22</a></div>
<div class='p'>[2] <a href='https://unob.cz/roboticka-soutez-strednich-skol-kybernoid-22/' class='external'>Článek na webu Univerzity obrany</a></div>
<div class='p'>[3] <a href='https://drive.google.com/file/d/1fq0YHmAZzY0-LRuKJl-JCnrmStZHB98k/view' class='external'>Video - FFF 2022 - sestřih soutěž robotů</a></div>
<hr/>
<h3>Foto (zdroj Univerzita obrany Brno)</h3>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/depo.jpg'><img src='/competitions/kybernoid-22/depo_t.jpg' alt=' Depo soutěžních robotů' title=' Depo soutěžních robotů' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/kybernoid-22/depo.jpg'> Depo soutěžních robotů</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/depo2.jpg'><img src='/competitions/kybernoid-22/depo2_t.jpg' alt=' Depo soutěžních robotů' title=' Depo soutěžních robotů' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/kybernoid-22/depo2.jpg'> Depo soutěžních robotů</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/nastartu.jpg'><img src='/competitions/kybernoid-22/nastartu_t.jpg' alt=' Příprava robota před startem' title=' Příprava robota před startem' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/kybernoid-22/nastartu.jpg'> Příprava robota před startem</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/natrati.jpg'><img src='/competitions/kybernoid-22/natrati_t.jpg' alt=' Robot soupeřů na trati' title=' Robot soupeřů na trati' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/kybernoid-22/natrati.jpg'> Robot soupeřů na trati</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/vyhlaseni.jpg'><img src='/competitions/kybernoid-22/vyhlaseni_t.jpg' alt=' Vyhlášení vítězného týmu' title=' Vyhlášení vítězného týmu' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/kybernoid-22/vyhlaseni.jpg'> Vyhlášení vítězného týmu</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/kybernoid-22/ukonceni.jpg'><img src='/competitions/kybernoid-22/ukonceni_t.jpg' alt=' Závěrečný ceremoniál' title=' Závěrečný ceremoniál' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/kybernoid-22/ukonceni.jpg'> Závěrečný ceremoniál</a>
</td></tr></table></div>
<hr/>
<div class='p'>p.s. se souhlasem Martina Lockera byl článek převzat z <a href='https://robotika.vosrk.cz/competitions/kybernoid/2022/cs' class='external'>https://robotika.vosrk.cz/competitions/kybernoid/2022/cs</a></div>
Robotour 2022https://robotika.cz/competitions/robotour/2022/cs2022-06-27T00:00:00ZMartin Dlouhý
The 17th year of Robotour contest for autonomous outdoor robots will take place
in the garden of <b>castle Vrchlabí</b> in Czech Republic on <b>17th September 2022</b>.
There are 5 teams registered (CZ, DE, SK) and "registration" is still open.
The park is open to public and there will be 4 rounds as previous years
(at 10, 11:30, 14 and 15:30). <b>Update:</b> 19/10/2022 — <a href='/competitions/robotour/2022/cs#221019'>Webinar Video</a>
<hr/>
<h2>Rules</h2>
<div class='p'>The rules are the same as last year. They are available on GitHub with tag
ROBOTOUR2019RC1:
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2019RC1/rules/rules.md' class='external'>English</a>.
and
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2019RC1/rules/pravidla.md' class='external'>Czech</a></div>
<h2>Registration</h2>
<div class='p'>There is no registration form for this year - simply send us email (ideally till the <b>end of July 2022</b>) to <i>webmaster-at-robotika.cz</i>
with subject <i>Robotour 2022 - TEAM NAME</i></div>
<h2>Location</h2>
<ul>
<li><a href='https://vejacv.rajce.idnes.cz/Krkonose_Zamek_a_zamecky_park_ve_Vrchlabi/' class='external'>Zámek Vrchlabí</a> <a href='https://en.mapy.cz/zakladni?x=15.6083080&y=50.6262301&z=17&q=vrchlabi%20zamek&source=stre&id=134366&ds=2' class='external'>map</a></li>
</ul>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/vrchlabi-castle-small.jpg'><img src='/competitions/robotour/2022/vrchlabi-castle-small_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></div>
<ul>
<li><a href='https://www.openstreetmap.org/relation/440100#map=17/50.62623/15.60920' class='external'>OpenStreetMap</a></li>
</ul>
<div class='p'><table class='image_panel center' style='width: 369px;'><tr><td>
<a href='/competitions/robotour/2022/vrchlabi-osm.jpg'><img src='/competitions/robotour/2022/vrchlabi-osm_t.jpg' alt='' title='' class='border' width='363' height='394'/></a>
</td></tr></table></div>
<h2>Teams</h2>
<ul>
<li><a href='http://www.jecc.de/' class='external'>JECC Lois (DE)</a></li>
<li><a href='http://www.arbot.cz' class='external'>ARBot (CZ)</a> — <a href='https://youtu.be/qnoJ0maecdU' class='external'>registration video</a></li>
<li><a href='https://www.openstreetmap.org/user/pablosksk/traces' class='external'>Istrobotics (SK)</a></li>
<li><a href='https://kempelen.dai.fmph.uniba.sk:4000/smely-zajko' class='external'>Smelý Zajko (SK)</a> — <a href='https://youtu.be/cIsstnnIpFg' class='external'>registration video</a></li>
<li><a href='https://www.prorobot.cz/' class='external'>ProRobot (CZ)</a></li>
</ul>
<hr/>
<div class='p'><a id="220908"></a></div>
<h2>OSM map update and pictures</h2>
<div class='p'>Team <i>Istrobotics</i> reported inconsistency between Google maps and OpenStreetMap:</div>
<div class='p'><table class='image_panel left' style='width: 246px;'><tr><td>
<span><img src='/competitions/robotour/2022/osm-map.png' alt='OpenStreetMap' title='OpenStreetMap' class='border' width='240' height='224'/></span><br/>
<span>OpenStreetMap</span>
</td></tr></table>
<table class='image_panel ' style='width: 372px;'><tr><td>
<span><img src='/competitions/robotour/2022/google-maps.png' alt='Google Maps' title='Google Maps' class='border' width='366' height='360'/></span><br/>
<span>Google Maps</span>
</td></tr></table></div>
<div class='p'>We can confirm this — there is a narrow sand path and the inner circle is even for bare feet only! <span class='smile'></span> so not for robots.
Nevertheless the outer circle is interesting as it contains tunnel, see the pictures. The OSM map was updated
accordingly.</div>
<div class='p'><center>
<table>
<tr>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/park-path.jpg'><img src='/competitions/robotour/2022/park-path_t.jpg' alt='Sand path' title='Sand path' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/park-path.jpg'>Sand path</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/junction.jpg'><img src='/competitions/robotour/2022/junction_t.jpg' alt='Junction' title='Junction' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/junction.jpg'>Junction</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/altan.jpg'><img src='/competitions/robotour/2022/altan_t.jpg' alt='Altan' title='Altan' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/altan.jpg'>Altan</a>
</td></tr></table></th>
</tr></div>
<div class='p'><tr>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/tunnel.jpg'><img src='/competitions/robotour/2022/tunnel_t.jpg' alt='Tunnel' title='Tunnel' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/tunnel.jpg'>Tunnel</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/in-tunnel.jpg'><img src='/competitions/robotour/2022/in-tunnel_t.jpg' alt='Inside tunnel' title='Inside tunnel' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/in-tunnel.jpg'>Inside tunnel</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/castle.jpg'><img src='/competitions/robotour/2022/castle_t.jpg' alt='Castle with lake' title='Castle with lake' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/castle.jpg'>Castle with lake</a>
</td></tr></table></th>
</tr>
</table>
</center></div>
<hr/>
<div class='p'><a id="220915"></a></div>
<h1><a href='http://live.robotour.cz' class='external'>live.robotour.cz</a></h1>
<hr/>
<hr/>
<div class='p'><a id="220918"></a></div>
<h1>Robotour 2022 - Resuls</h1>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/competitions/robotour/2022/robotour2022-results.jpg' alt='Robotour 2022 - results' title='Robotour 2022 - results' class='border' width='640' height='250'/></span><br/>
<span>Robotour 2022 - results</span>
</td></tr></table></div>
<div class='p'>The winner of <i>Robotour 2022</i> in Vrchlabí is the Czech team <b>ARBot</b> which scored 84 points!
The 2nd team <i>Istrobotics</i> from Slovakia was comparable competitor but had bad luck couple of
times. <i>Smely Zajko</i> was fighting to „undust” their robot (rather the software as it was almost
permanently raining this year), and during the last round they managed to autonomously navigate to <i>the pick-up area</i>.
This was already unofficial run, as the batteries died "on the bridge" and after fitting new ones
the laptop battery died when robot was navigating to <i>delivery area</i> around the lake.</div>
<h2>0th round</h2>
<div class='p'>The testing round was not only testing for the teams but also the whole contest organization.
And it failed. <span class='wink'></span> The good news was all 3 robots were able to read the QR code directly from the phone.
It was very cold and rainy and the paper would quickly be unusable anyway, but this was better.
Unfortunately this year I was the only organizator and there are people needed on pickup and delivery
areas to show robots next destinations … and it is hard to be at 3 places at once. Yeah,
so we had to hack it a bit with partial success. Finally the automation server on <a href='https://live.robotour.cz' class='external'>live.robotour.cz</a>
does not present testing round as other rounds (it is just for testing and the results are not counted)
so we used instead of delivery directly HOME (<i>service area</i>) location and thus 21 was the maximal
number of points. Both ARBot and Istrobotics performed without any mistakes.</div>
<h2>1st round</h2>
<div class='p'>The first round had a pickup point near the lake and delivery near the south exit from the park. Again
both ARBot and Istrobotics performed very well and scored maximum points (31). At this stage I was wondering
what I will do if both teams will have the same maximal total score …</div>
<div class='p'><center>
<table>
<tr>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/arbot.jpg'><img src='/competitions/robotour/2022/arbot_t.jpg' alt='ARBot' title='ARBot' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/arbot.jpg'>ARBot</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/istrobotics.jpg'><img src='/competitions/robotour/2022/istrobotics_t.jpg' alt='Istrobotics' title='Istrobotics' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/istrobotics.jpg'>Istrobotics</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/smely-zajko.jpg'><img src='/competitions/robotour/2022/smely-zajko_t.jpg' alt='Smely Zajko' title='Smely Zajko' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/smely-zajko.jpg'>Smely Zajko</a>
</td></tr></table></th>
</tr>
</table>
</center></div>
<h2>2nd round</h2>
<div class='p'>I would call it the „formule 1 race” as both leading teams started in similar time and were really racing on
the park roads. This was already on the way to delivery point (pickup was on the slope of one of side roads).
At one moment ARBot got too close to Istrobotics, trying to pass it, but suddenly the other robot was in blind
zone (later I was told that not for sensors but for empty road evaluation polygon), and hit the other robot
with right wheel. ARBot stopped and Istrobotics continued but with warning beeping of <b>battery low</b>. The agreement
was that they will switch the battery on delivery point (50 meters to go?) but they never reached it. The robot
was a couple of meters ahead of the group of observers when suddenly I heard a loud crash sound, and I expected that
some branch from the old oak trees fell down. No, it was Istrobot lying on the back side due to sudden battery cut-off,
where the computer was turned off but the controller had still a moment to speed up to max … but with the payload
it did not have enough balance. So again ARBot scored as Istrobotics 11 points.</div>
<h2>3rd round</h2>
<div class='p'>There was relatively long pause for lunch and recovery, but would it help? The next pickup zone was more to the
west forcing the robots to second road from the start. There was a short pavement and cca 10cm drop. It was still
in <i>semi-autonomous</i> area, where the team can restart their robot if needed, but still. ARBot had hard time to
find the narrow spot, where it was possible to leave the pavement. On the other hand Istrobotics managed this part
without any issue.</div>
<div class='p'>The pickup was close to „Krtek building” and it was hard to select the road from police parking lot. Istrobotics
chosen rough road with wet stones and bits of grass and the robot was really not happy about that. It decided to
turn (car-like vehicle, so you have to do several maneuvers to turn 180 degrees), and still did not like the
road until it backed up into the grass, scoring only 1 point for successfully leaving the start area.</div>
<div class='p'>ARBot was more lucky, choosing a different road and managed both pickup and delivery. But the return to the start
was hard again. Yes, the pavement and narrow place where the robot could climb up back to continue. The robot was
running there around for 15 minutes(?) when suddenly the orientation was good and it did it — 31 points, so
this was the decision moment when the two leading teams scored differently.</div>
<div class='p'><center>
<table>
<tr>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/on-start.jpg'><img src='/competitions/robotour/2022/on-start_t.jpg' alt='Smely Zajko and Istrobotics on start' title='Smely Zajko and Istrobotics on start' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/on-start.jpg'>Smely Zajko and Istrobotics on start</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/rough-road.jpg'><img src='/competitions/robotour/2022/rough-road_t.jpg' alt='Rough road - end for Istrobotics' title='Rough road - end for Istrobotics' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/rough-road.jpg'>Rough road - end for Istrobotics</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/shelter.jpg'><img src='/competitions/robotour/2022/shelter_t.jpg' alt='Shelter - Bethlem' title='Shelter - Bethlem' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/shelter.jpg'>Shelter - Bethlem</a>
</td></tr></table></th>
</tr>
</table>
</center></div>
<h2>4th round</h2>
<div class='p'>The last round was supposed to be across the whole park to the northest point near the monastery. I am still not
sure if I made a mistake or simply overlooked that the pickup point is very close to the delivery point from the 2nd round.
The experience for the robots was not the same — the weather changed and there was strong sun casting sharp
shadows and reflections from the wet surfaces. All robots hate it! OTOH almost all 3 robots reached the pickup
area and scored first 11 points. But then Istrobotics went to check the entrance to the police station with an
access ramp for wheelchairs. The first circle looked like fun, but the second finished with hard crash. It is surely
on the police security camera but there is also at least one video from team members (to be published later).
This run was bad also for ARBot which lost direction and ended outside the park road.</div>
<div class='p'><center>
<table>
<tr>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/bridge.jpg'><img src='/competitions/robotour/2022/bridge_t.jpg' alt='Smely Zajko and Istrobotics near bridge' title='Smely Zajko and Istrobotics near bridge' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/bridge.jpg'>Smely Zajko and Istrobotics near bridge</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/sun-shadows.jpg'><img src='/competitions/robotour/2022/sun-shadows_t.jpg' alt='Bright sun and shadows' title='Bright sun and shadows' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/sun-shadows.jpg'>Bright sun and shadows</a>
</td></tr></table></th>
<th><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/robotour/2022/robot-and-castle.jpg'><img src='/competitions/robotour/2022/robot-and-castle_t.jpg' alt='Happy End' title='Happy End' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/robotour/2022/robot-and-castle.jpg'>Happy End</a>
</td></tr></table></th>
</tr>
</table>
</center></div>
<div class='p'><center>
<iframe width="853" height="480" src="https://www.youtube.com/embed/2PrLwnnSB3w" title="Robotour 2022 - snapshot" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a id="220921"></a>
<a id="221005"></a></div>
<div class='p'><a id="221019"></a></div>
<h1>Robotika.SK Webinar Robotour 2022</h1>
<div class='p'><center>
<iframe width="652" height="367" src="https://www.youtube.com/embed/HN-VQu_TLEg" title="Seminár Robotika.SK, 57. Minikonferencia Robotour 2022 (ArBot, Istrobotics, a Smely zajko)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'>If you would like to somehow support this contest or you have some
comments/question, please use our standard <a href='/competitions/robotour/2022/cs#email'>contact form</a>.</div>
Ardusimple simpleRTK3Bhttps://robotika.cz/articles/ardusimple-rtk3b/cs2022-09-12T00:00:00ZJiří Iša
SimpleRTK3b boards by Ardusimple provide millimeter level GPS/GNSS localization. In a pair, one can easily work as an RTK base station for the other. But not only that, SimpleRTK3b Heading has two antennas and can report its, as the name suggests, heading! Let's figure out how well it works.
<b>Blog update:</b> 28/9/2022 — <a href='/articles/ardusimple-rtk3b/cs#220928'>Time to go</a>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/mosaic-h.jpg'><img src='/articles/ardusimple-rtk3b/mosaic-h_t.jpg' alt='SimpleRTK3B Heading board' title='SimpleRTK3B Heading board' class='border' width='320' height='320'/></a><br/>
<a href='/articles/ardusimple-rtk3b/mosaic-h.jpg'>SimpleRTK3B Heading board</a>
</td></tr></table></div>
<hr/>
<hr/>
<h1>Blog</h1>
<div class='p'><a id="220912"></a></div>
<h2>September 12th, 2022 - What are these boards and what makes them interesting?</h2>
<div class='p'><a href='http://ardusimple.com' class='external'>Ardusimple</a> <a href='https://www.ardusimple.com/simplertk3b-receivers/' class='external'>simpleRTK3B receivers</a> are triple band high precision GNSS RTK boards based on <a href='https://www.septentrio.com/en/products/gnss-receivers/receivers-module/mosaic-t' class='external'>Septentrio Mosaic-T</a> and <a href='https://www.septentrio.com/en/products/gnss-receivers/gnss-modules/mosaic-h' class='external'>Septentrio Mosaic-H</a> modules. They promise millimeter-level accuracy. Two Ardusimple boards can easily provide, resp. consume, RTK corrections over <a href='https://www.ardusimple.com/radio-links/' class='external'>different radio channels</a>, such as XBee, Bluetooth, Wifi, 4G/3G/2G or Ethernet. They can also receive <a href='https://www.septentrio.com/en/learn-more/insights/gnss-corrections-demystified' class='external'>PPP-RTK</a> corrections from satellites (paid service).</div>
<div class='p'><a href='https://www.ardusimple.com/product/simplertk3b-x5/' class='external'>SimpleRTK3B Pro</a>, using Mosaic-T, is an Ardusimple GNSS solution that is to be used either as an <a href='https://en.wikipedia.org/wiki/Real-time_kinematic_positioning' class='external'>RTK</a> base station, or for "normal" localization in a <i>rover</i>, i.e. moving, mode. With a triple band antenna, it receives signals from GPS (L1C/A, L1PY, L2C, L2P, L5), GLONASS (L1CA, L2CA, L2P, L3 CDMA), Beidou (B1I, B1C, B2a, B2I, B3), Galileo (E1, E5a, E5b, E5 AltBoc), QZSS (L1C/A, L2C, L5) and NavIC (L5).</div>
<div class='p'><a href='https://www.ardusimple.com/product/simplertk3b-heading/' class='external'>SimpleRTK3B Heading</a> is what caught my attention. Although it supports fewer technologies (GPS: L1, L2, GLONASS: L1, L2, BeiDou: B1, B2, Galileo: E1, E5b, QZSS: L1, L2, NavIC: L5), it has two antennas and uses them to report not only location, <b>but also heading</b>.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/module-in-hand.jpg'><img src='/articles/ardusimple-rtk3b/module-in-hand_t.jpg' alt='Module in hand' title='Module in hand' class='border' width='320' height='240'/></a><br/>
<a href='/articles/ardusimple-rtk3b/module-in-hand.jpg'>Module in hand</a>
</td></tr></table></div>
<div class='p'>For robotic applications, such as autonomous transportation in <a href='http://robotour.cz' class='external'>Robotour</a>, it is vital for a robot to not only know where it is, but also where it is going. Most current robots rely on a combination of a magnetic compass with IMUs (gyroscopes, accelerometers), optical odometry and/or with GPS/GNSS. IMUs and optical odometry cannot provide heading relative to an absolute reference and GPS/GNSS only provides a point estimate and direction needs to be estimated from measurements distant both in space and time, which makes magnetic compasses critical at least for initialization of the heading estimate, but typically also while the robot is moving to correct accumulated errors in the estimate. However, in a typical city environment, a magnetic compass gets easily disturbed. For example, during <a href='/competitions/robotour/2016/cs'>Robotour in Deggendorf</a> many teams observed compasses pointing in wrong direction all the way along a train track. In other Robotours, we were also able to detect underground power cables to street lamps this way. Altogether, magnetic compasses are an unreliable source of information.</div>
<div class='p'>In the past, I have also tried putting two <a href='https://www.ardusimple.com/simplertk2b-receivers/' class='external'>SimpleRTK2B</a> boards on a robot and, optionally, a third one on the ground. The stationary one on the ground served as a static RTK base station, one on the robot as a moving RTK base station corrected from the static base station (optionally), the second one on the robot used in the RTK rover mode and corrected from the moving base "station" on the robot (strictly necessary). The idea was that relative position between the "rover" board and the "moving base station" board on the robot gives heading. Alas, it did not work. The rover board did not, most of the time, achieve a full RTK fix and the relative position between the two boards on the robot, resp. their antennas, was too noisy to be useful. The leading hypothesis is high level of RF interference all around the robot. In our experience, this is mostly coming from USB3 cameras such as RealSense, Luxonis/DepthAI or MyntEYE. Alternatively, it is also possible I was not passing RTK corrections between the two boards on the robot fast enough. I could not use the radio link, because it was reserved to receive corrections from the stationary base station.</div>
<div class='p'>So, does putting two antennas onto a single board, like SimpleRTK3B Heading, solve the problem? Let's see next time!</div>
<hr/>
<div class='p'><a id="220915"></a></div>
<h2>September 15th, 2022 - Hardware and software setup</h2>
<div class='p'>Before I go into measurements, let me share what hardware I am using and what software I use to interact with it.</div>
<div class='p'>I have equipped <a href='https://www.ardusimple.com/product/simplertk3b-heading/' class='external'>SimpleRTK3B Heading</a> with two <a href='https://www.ardusimple.com/product/lightweight-helical-tripleband-l-band-antenna-ip67/' class='external'>helical tripleband antennas</a>. They are easy to mount on a robot without taking much space. <a href='https://www.ardusimple.com/product/simplertk3b-x5/' class='external'>SimpleRTK3B Pro</a> as a base station has much more space and therefore I got <a href='https://www.ardusimple.com/product/calibrated-survey-gnss-quadband-antenna-ip67/' class='external'>a survey antenna</a> for it. Save yourself some troubles and <b>do not buy</b> <a href='https://www.ardusimple.com/product/antenna-cable-extender/' class='external'>the antenna cables</a> from Ardusimple. Mine fell apart immediately after it arrived. <a href='https://www.mouser.ch/ProductDetail/530-415-0031-M1.0' class='external'>Other</a> <a href='https://www.mouser.ch/ProductDetail/523-095-902-514-024' class='external'>cables</a> work fine.</div>
<div class='p'>On the software side, I was very worried about my ability to configure the boards from Linux. Instructions say that after connecting the device to my computer, an external drive will show up and I can install drivers for Windows from there. Not very useful for my case. After I install them, I will get a web interface, they say. But what about without them? The good news is that Septentrio, the producer of the GNSS modules used on the Ardusimple boards, provides <a href='https://www.septentrio.com/en/products/software/rxtools' class='external'>RxTools</a> also for Linux. Even better news is that it works on my system (Debian Testing). The bests news of them all is that even without installing anything, a virtual network card (usb0) shows up with a pre-set IP address and the web configuration interface on http://192.168.3.1/ becomes available.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/mosaic-web-server.jpg'><img src='/articles/ardusimple-rtk3b/mosaic-web-server_t.jpg' alt='Septentrio web server' title='Septentrio web server' class='border' width='640' height='427'/></a><br/>
<a href='/articles/ardusimple-rtk3b/mosaic-web-server.jpg'>Septentrio web server</a>
</td></tr></table></div>
<div class='p'>I use <a href='https://www.ardusimple.com/product/radio-module-long-range/' class='external'>XBee Long Range</a> to pass RTK corrections from the base station to the rover. It comes preconfigured from Ardusimple to Just Work. Nevertheless, you may want to reconfigure it or at least change the network id to reduce interactions with other teams during a robotic competitions. For that, you need <a href='https://hub.digi.com/support/products/xctu/' class='external'>XCTU</a> by Digi. It also comes with a binary installer for different systems.</div>
<div class='p'>SimpleRTK3B Heading provides the heading information in an <a href='https://gpsd.gitlab.io/gpsd/NMEA.html#_hdt_heading_true' class='external'>NMEA HDT</a> sentence. Your processing software needs to understand it. If you want even more, such as tilt or position relative to the RTK base station, you need to parse proprietary NMEA messages described in the <a href='https://www.septentrio.com/system/files/support/mosaic-h_firmware_v4.12.1_reference_guide.pdf' class='external'>Reference Guide</a> (sign-up needed). You may need to write the parsing software yourself.</div>
<div class='p'>Hardware is ready, everything is set up, does it work? I cannot wait to see the results!</div>
<hr/>
<div class='p'><a id="220918"></a></div>
<h2>September 18th, 2022 - Measuring direction, without RTK</h2>
<div class='p'>It is time to measure the heading! Let me start with an important note: <b>I did not use RTK corrections for this</b> to make the situation more difficult. Nevertheless, there was a reasonably good view of the sky.</div>
<div class='p'>First, a measurement with antennas two meters away from each other shows that the SimpleRTK3B Heading board has an initial warmup period, which is noticeable across multiple measurements, and that after the warmup, the measurement is very stable. It fluctuates with standard deviation of 0.04 degrees, which I find amazing.</div>
<div class='p'><table class='image_panel center' style='width: 544px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/heading_histogram_two_meters.png'><img src='/articles/ardusimple-rtk3b/heading_histogram_two_meters_t.png' alt='Histogram of measurements with antennas two meters apart' title='Histogram of measurements with antennas two meters apart' class='border' width='538' height='270'/></a><br/>
<a href='/articles/ardusimple-rtk3b/heading_histogram_two_meters.png'>Histogram of measurements with antennas two meters apart</a>
</td></tr></table></div>
<div class='p'>When I place the antennas closer to each other, about 1 meter apart, which is the minimum distance recommended by Septentrio, I see fluctuations in the heading estimate with standard deviation of 0.11 degrees.</div>
<div class='p'><table class='image_panel center' style='width: 544px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/heading_histogram_three_feet.png'><img src='/articles/ardusimple-rtk3b/heading_histogram_three_feet_t.png' alt='Histogram of measurements with antennas three feet, or rather three shoe lengths, apart' title='Histogram of measurements with antennas three feet, or rather three shoe lengths, apart' class='border' width='538' height='270'/></a><br/>
<a href='/articles/ardusimple-rtk3b/heading_histogram_three_feet.png'>Histogram of measurements with antennas three feet, or rather three shoe lengths, apart</a>
</td></tr></table></div>
<div class='p'>On my robot, it is more convenient to place the antennas even closer to each other. So what if I put them two feet apart? Standard deviation of 0.3 degrees. It is getting worse, but I still like it.</div>
<div class='p'><table class='image_panel center' style='width: 544px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/heading_histogram_two_feet.png'><img src='/articles/ardusimple-rtk3b/heading_histogram_two_feet_t.png' alt='Histogram of measurements with antennas two shoe lengths apart' title='Histogram of measurements with antennas two shoe lengths apart' class='border' width='538' height='270'/></a><br/>
<a href='/articles/ardusimple-rtk3b/heading_histogram_two_feet.png'>Histogram of measurements with antennas two shoe lengths apart</a>
</td></tr></table></div>
<div class='p'>With the length of my shoe as a secret ingredient into a rough estimate, I am getting relative placement of the two antennas within two millimeters precision (standard deviation), i.e. four millimeters for two sigmas (95 % of the data). Millimeter level GPS/GNSS indeed.</div>
<div class='p'>All this while the position estimate itself is floating around. During the measurement with antennas two meters apart, the position estimate for the main antenna was moving back and forth by several meters in all directions.</div>
<div class='p'><table class='image_panel center' style='width: 398px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/heading_position_two_meters.png'><img src='/articles/ardusimple-rtk3b/heading_position_two_meters_t.png' alt='Position estimate without RTK corrections moved by several meters in all directions' title='Position estimate without RTK corrections moved by several meters in all directions' class='border' width='392' height='370'/></a><br/>
<a href='/articles/ardusimple-rtk3b/heading_position_two_meters.png'>Position estimate without RTK corrections moved by several meters in all directions</a>
</td></tr></table></div>
<div class='p'>This leads me to believe that the board locates, very precisely, the heading antenna <i>relative</i> to the main antenna and it does not really need an accurate estimate of the position of the main antenna. Therefore I do not expect that enabling RTK would change the results.</div>
<hr/>
<div class='p'><a id="220920"></a></div>
<h2>September 20th, 2022 - Round and round</h2>
<div class='p'>Martin asked, if the GPS/GNSS, with RTK, is reliable enough to have the robot going back and forth on the same path for very long. That sounds boring. Eww! But what about a carousel? Let's go round and round!</div>
<div class='p'>In the video below, you can see how I initially struggled with the task, figured out the weak point* (hint: not the GPS/GNSS), fixed it and nailed it.</div>
<ul>
<li>Hey kids, do you know why logging everything is important? This is why. I can DEBUG ISSUES. OMG, A SUPERPOWER!!!</li>
</ul>
<div class='p'>Anyway, let's go to the video …</div>
<div class='p'><center>
<iframe width="652" height="367" src="https://www.youtube.com/embed/NjvHmyJD6u4" title="Round and round - a GPS/GNSS + RTK test" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<div class='p'>In case you are wondering if this could work without RTK: Not with this stateless control algorithm at this diameter of the circle. With the fluctuations of the position estimate by two meters within minutes that I showed previously, the robot does not know at which side of the circle it is. I can imagine it would work after fusing GPS/GNSS with odometry and/or IMU, but that would not be saying much about the GPS/GNSS boards, would it?</div>
<hr/>
<div class='p'><a id="220925"></a></div>
<h2>September 25th, 2022 - Not going anywhere</h2>
<div class='p'>There is one more basic measurement that I should have done in the very beginning. How stable is the GPS/GNSS position estimate when using RTK base station?</div>
<div class='p'>When I keep the SimpleRTK3B Heading board stationary, use SimpleRTK3B Pro as the RTK base station and ignore the first ten or so warm up seconds, I see 4 millimeters of standard deviation. I.e. 95 % of measurements should be within 8 millimeters of the mean value.</div>
<div class='p'><table class='image_panel center' style='width: 412px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/rtk_position.png'><img src='/articles/ardusimple-rtk3b/rtk_position_t.png' alt='With RTK corrections, SimpleRTK3B Heading achieves stability within few millimeters' title='With RTK corrections, SimpleRTK3B Heading achieves stability within few millimeters' class='border' width='406' height='370'/></a><br/>
<a href='/articles/ardusimple-rtk3b/rtk_position.png'>With RTK corrections, SimpleRTK3B Heading achieves stability within few millimeters</a>
</td></tr></table></div>
<div class='p'>In case you like the results so far, there are also lower budget alternatives to SimpleRTK3B Heading, such as <a href='https://www.gnss.store/zed-f9p-gnss-modules/126-ublox-zed-f9p-rtk-gnss-receiver-board-with-sma-base-or-rover.html' class='external'>part 1</a> plus <a href='https://www.gnss.store/zed-f9h-gnss-modules/127-ublox-zed-f9p-rtk-gnss-receiver-board-with-sma-base-or-rover.html' class='external'>part 2</a>. You may need one more module like that as a base station and you will likely be on your own with passing the RTK corrections from base to rover. I haven't tried these, but ZED-F9 comes from U-blox, a Swiss company, and we all know that what comes from Switzerland is perfect, don't we?</div>
<div class='p'>In case the results so far are not good enough for you and you are willing to invest more, solutions like <a href='https://www.vectornav.com/products/detail/vn-300' class='external'>Vectornav VN-300</a> combine dual antenna GNSS with accelerometers and gyroscopes in one calibrated package. Vectornav's estimate of GNSS heading precision matches mine with SimpleRTK3B Heading and I expect Vectornav's IMU part of the package to stabilize position estimates when there are no RTK corrections.</div>
<hr/>
<div class='p'><a id="220928"></a></div>
<h2>September 28th, 2022 - Time to go</h2>
<div class='p'>Before I dive into more data from the robot, I would like to share few practical considerations. First, the screw holes on the board are weirdly placed and, as far as I know, CAD drawings of the boards are not available. Have fun making a case for it. Second, if the board does not work on your robot, turn the USB3 camera, most likely the depth camera, off. If this helps, you need to move the GPS/GNSS antennas as far as possible from everything related to USB3 and/or put a metal plate under the antennas. This is <a href='https://www.usb.org/sites/default/files/327216.pdf' class='external'>a known issue</a>. You may benefit from <a href='/articles/oak-d-pro/cs#220907'>new USB cables</a>.</div>
<div class='p'>Now to the new data: I took the robot for a drive on a street I know is difficult for GPS/GNSS. There is a high concrete wall on one side, with a building just above it and there is a tall building on the other side. The visibility of sky is limited. I did not enable RTK corrections, because I was in a mood for pushing the limits again.</div>
<div class='p'>In the picture below, look at the light blue line. This is a position estimate from SimpleRTK3B Heading on a robot moving pretty much straight, within the limits of what manual control by joystick and the street allow. Reminder, without RTK. What you can see is that at some point the estimate started drifting sideways. What you cannot see is that the heading estimate continued pointing in the correct direction. This is physically impossible for the robot. At least until we get ice on the road. This is actually good news! It means it should be possible to use the heading estimate to correct the estimate of the position! While at it, I fused the GPS/GNSS position and heading with odometry. You can see the combined result as a red line in the picture.</div>
<div class='p'><table class='image_panel center' style='width: 500px;'><tr><td>
<a href='/articles/ardusimple-rtk3b/fusion_with_odometry.png'><img src='/articles/ardusimple-rtk3b/fusion_with_odometry_t.png' alt='Sideways drift of GPS/GNSS position corrected by fusing position, heading and odometry with a Kalman Filter' title='Sideways drift of GPS/GNSS position corrected by fusing position, heading and odometry with a Kalman Filter' class='border' width='494' height='309'/></a><br/>
<a href='/articles/ardusimple-rtk3b/fusion_with_odometry.png'>Sideways drift of GPS/GNSS position corrected by fusing position, heading and odometry with a Kalman Filter</a>
</td></tr></table></div>
<div class='p'>You could argue that I should be able to get a straight line like this from the odometry alone. Yes I should. But that's not the whole story. The white part of the street at the top of the picture is a traffic-slowing surface relief. It shakes the robot heavily. Enough to temporarily lose full contact to the ground when I drive the robot fast enough, which I did. Altogether, the odometry alone, after finishing a 440 meters long loop, ends up reporting a position 124 meters away from the starting position. The fused localization reports position just below two meters from the starting position. Some of it being because of me not finishing on exactly the same spot, even though I tried.</div>
<div class='p'>While I still see room for improvement of the localization in case of unavailable RTK, it will mostly come from other sources, such as IMU or visual odometry, and not from the GPS/GNSS. So with that, I am going to conclude the series: The heading estimate works very well, even when the position itself is unstable. Without RTK corrections, I find the position estimate to be OK, but not impressive. The robot cannot stay on the road just using that alone. With RTK, in the neighborhood of the base station and with unobstructed view of the sky, the robot can achieve subcentimeter "robotic" precision. The Ardusimple boards are easy to use and are configurable even on Linux.</div>
<hr/>
<div class='p'><a href='/articles/ardusimple-rtk3b/cs#email'>contact form</a></div>
Robotour 2021https://robotika.cz/competitions/robotour/2021/cs2021-07-25T00:00:00ZMartin Dlouhý
Šestnáctý ročník soutěže outdoorových autonomních robotů se bude konat
<b>18. září 2021</b> v jednom z Bratislavských parků. Soutěž letos bude
organizovat spřátelená <b>robotika.sk</b>. <b>Update:</b> <a href='/competitions/robotour/2021/cs#220117'>2/2/2022 - Robotour minikonferencia (záznam)</a>
<hr/>
<h1>Pravidla</h1>
<div class='p'>Pravidla jsou stejná jako loni a naleznete je GitHubu s tagem ROBOTOUR2019RC1:
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2019RC1/rules/pravidla.md' class='external'>česky</a>
a
<a href='https://github.com/robotika/robotour/blob/ROBOTOUR2019RC1/rules/rules.md' class='external'>anglicky</a>.</div>
<h2>Lokalita</h2>
<div class='p'>Soutěž bude probíhat v parku Mlynská dolina. Aktuální informace naleznete na webu:
<a href='http://www.robotika.sk/robotour' class='external'>http://www.robotika.sk/robotour</a></div>
<div class='p'><table class='image_panel left' style='width: 726px;'><tr><td>
<a href='http://www.robotika.sk/robotour '><img src='/competitions/robotour/2021/robotour-logo.png' alt='' title='' class='border' width='720' height='171'/></a><br/>
<a href='http://www.robotika.sk/robotour '></a>
</td></tr></table></div>
<div class='p'>Online cíle zadání robotů pak naleznete: <a href='http://live.robotour.cz/' class='external'>http://live.robotour.cz/</a></div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/robotour/2021/prize.jpg'><img src='/competitions/robotour/2021/prize_t.jpg' alt='Ceny Robotour 2021' title='Ceny Robotour 2021' class='border' width='320' height='427'/></a><br/>
<a href='/competitions/robotour/2021/prize.jpg'>Ceny Robotour 2021</a>
</td></tr></table></div>
<h2>Výsledky</h2>
<div class='p'><table class='image_panel center' style='width: 719px;'><tr><td>
<span><img src='/competitions/robotour/2021/robotour2021-results.png' alt='Výsledky Robotour 2021' title='Výsledky Robotour 2021' class='border' width='713' height='426'/></span><br/>
<span>Výsledky Robotour 2021</span>
</td></tr></table></div>
<div class='p'>Gratulujeme <b>Istrobotics</b>!!!</div>
<hr/>
<div class='p'><a id="220117"></a></div>
<h2>Robotour minikonferencia (online)</h2>
<h3>2. 2. 2022, 17:30-19:00, on-line (52. prednáška, <a href='http://www.robotika.sk/mains.php' class='external'>Robotika.SK</a>)</h3>
<div class='p'>Robotour je už tradičná outdoorová súťaž autonómnych robotov, ktorí by mali dokázať odviezť v niektorom parku užitočný náklad z bodu A do bodu B. Na tomto pravidelnom seminári Robotika.SK uvidíte prezentácie zúčastnených tímov z uplynulého roka, v ktorých vám ukážu, ako ten ich robot funguje a aký software používa. Privítame tímy Istrobotics (prednáša Rado Kováč), Smelý Zajko (Pavel Petrovič) a Sĺňava (Andrej Lúčny) z Bratislavy a ARBot (Aleš Ruda) z Prahy. Dozviete sa mnoho informácií, ktoré inde nenájdete, či už o konštrukcii robota do vonkajšieho prostredia, o softvéroch na spracovanie obrazu a navigáciu, ale aj množstvo praktických skúseností a riešenia stoviek malých praktických problémov, ktoré sa popritom vyskytli.
Viac informácií: <a href='http://www.robotika.sk/robotour/2021/index.html' class='external'>http://www.robotika.sk/robotour/2021/index.html</a></div>
<div class='p'><center>
<iframe width="652" height="367" src="https://www.youtube.com/embed/GmdJeHWqzmc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'>Pokud chcete soutěž nějakým způsobem podpořit nebo máte nějaké doplnění/dotaz,
tak se nám prosím ozvěte pomocí <a href='/competitions/robotour/2021/cs#email'>kontaktního formuláře</a>.</div>
SubT Finalshttps://robotika.cz/competitions/subtchallenge/finals/cs2021-02-12T00:00:00ZMartin Dlouhý
After three years of development, DARPA Subterranean (SubT) Challenge teams will
get the chance to compete in the Final Event being held at the Louisville
Mega Cavern in Louisville, Kentucky on September 21-23, 2021.
All teams have to re-qualify for both System and Virtual competition.
Is <i>Robotika Team</i> going to be one of the 15 System teams and
10 Virtual teams? <b>Update:</b> 30/11/2021 —
<a href='/competitions/subtchallenge/finals/cs#211130'>Invitation to DARPA SubT Summit 2021 and webinar</a>
<div class='p'><table class='image_panel center' style='width: 625px;'><tr><td>
<span><img src='/competitions/subtchallenge/finals/subt-finals.jpg' alt='' title='' class='border' width='619' height='316'/></span>
</td></tr></table></div>
<ul>
<li><a href='/competitions/subtchallenge/finals/cs#210212'>210212 - Final Event rules and schedule</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210304'>210304 - Virtual qualification world released</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210318'>210318 - 10th artifact type?</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210325'>210325 - Finals Practice Worlds</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210403'>210403 - Virtual Fog</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210506'>210506 - Eight teams have qualified for Systems Final Event</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210616'>210616 - Kloubák and Skiddy in Cave Výpustek</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210624'>210624 - Czech STIX Býčí Skála</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210629'>210629 - Team Robotika qualified for the Virtual Competition</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210802'>210802 - Finals Preliminary Round</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210812'>210812 - Advancing to the Prize Round</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210827'>210827 - 2C or not 2C?</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210917'>210917 - Robotika in USA (-4days)</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210918'>210918 - Mega Cavern (-3days)</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210919'>210919 - Mega Trouble (-2days)</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210921'>210921 - Robotika scores first point</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210922'>210922 - Virtual Finals - partial results</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210923'>210923 - Game Over</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210924'>210924 - And the winner is ...</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#210927'>210927 - Pictures and videos</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#211003'>211003 - 8x 1hour Finals Videos</a></li>
<li><a href='/competitions/subtchallenge/finals/cs#211130'>211130 - Invitation to DARPA SubT Summit 2021 and webinar</a></li>
</ul>
<hr/>
<div class='p'><a id="210212"></a></div>
<h2>12th February 2021 — Final Event rules and schedule</h2>
<div class='p'>DARPA announced on Wednesday 10th the rules for the final event, see
<a href='https://www.subtchallenge.com/resources/SubT_Challenge_Finals_Rules.pdf' class='external'>Final Event Competition Rules (pdf)</a>.
All teams have to qualify and the requirements are stronger, so see also new
<a href='https://www.subtchallenge.com/resources/SubT_Qualification_Guide.pdf' class='external'>Qualification Guilde (pdf)</a>.
Note, that there is not much time left — The Systems Competition qualification deadline is
<b>April 21, 2021</b> and the Virtual Competition qualification deadline is <b>June 29, 2021</b>.</div>
<div class='p'>So what is new? The robots have to be able to recognize 10 types of artifacts: 3 common (Survivor,
Backpack, Phone), from tunnel (Fire Extinguisher, Drill), from urban (Gas, Vent) and from cave
(Rope, Helmet). Moreover there will be 10th, so far unknown, artifact type.
In order to qualify at least one robot has to demonstrate autonomous detection of
<b>all types of artifacts</b>!</div>
<div class='p'>For the System there will be two <i>Preliminary Rounds</i>, each 30 minutes long.
There will be 20 artifacts but teams will have only 25 reports. Only six best
teams will compete in the finals. There the limit is going to be 60 minutes
and number of artifact 40 with 45 allowed report attempts.</div>
<div class='p'>The Final Event of the Virtual Competition will consist of a Preliminary Round
and a Prize Round each with a separate solution submission window. The submissions
to the Preliminary Round will be evaluated and the results are expected to be
announced the week of August 9-13, 2021. The top 10 teams from the Preliminary
Round will be invited to submit solutions to the Prize Round to compete
for monetary prizes. The results and winners of the Prize Round will be
announced at the Final Event being held September 21-23, 2021.</div>
<hr/>
<div class='p'><a id="210304"></a></div>
<h2>4th March 2021 — Virtual qualification world released</h2>
<div class='p'>Last night was released the <i>Finals Qualification World</i> for virtual SubT. In
Czech I would call it „kočkopes” as it combines tunnel, urban and cave into
one world. Simply from the very first crossing you can go to <i>Urban</i> to the
left, or to <i>Cave</i> to the right, or straight to <i>Tunnel</i>:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/qualification-world.jpg'><img src='/competitions/subtchallenge/finals/qualification-world_t.jpg' alt='Finals Qualification World' title='Finals Qualification World' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/qualification-world.jpg'>Finals Qualification World</a>
</td></tr></table></div>
<div class='p'>The qualification task is easy — just correctly report <b>at least one
artifact</b>. But is is hard, or it at least seems to be. The robots did not move
at all in the first two attempts due to a small bug
(<a href='https://github.com/osrf/subt/issues/807' class='external'>#807</a>, fixed). But the score is
still 00 …</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/leaderboard-210304.jpg'><img src='/competitions/subtchallenge/finals/leaderboard-210304_t.jpg' alt='Zeros on leaderboard 4th Marth 2021' title='Zeros on leaderboard 4th Marth 2021' class='border' width='640' height='321'/></a><br/>
<a href='/competitions/subtchallenge/finals/leaderboard-210304.jpg'>Zeros on leaderboard 4th Marth 2021</a>
</td></tr></table></div>
<div class='p'>I do not mind leading the empty table, but 1 point would be nicer. <span class='wink'></span></div>
<div class='p'>The robots have seen <i>backpack</i> in urban area, but it is „slightly
different” to what was robot used to see in <i>Cave</i>, so they did not recognize
it tonight. So hopefully tomorrow.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/finals-backpack.jpg'><img src='/competitions/subtchallenge/finals/finals-backpack_t.jpg' alt='Not recognized backpack' title='Not recognized backpack' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/finals-backpack.jpg'>Not recognized backpack</a>
</td></tr></table></div>
<div class='p'>Two Freyja robots were capable to follow the world boundary in 15 minutes
(simulated, it took almost 3 hours on CloudSim) but they both met <i>under the
hill</i> and start talking how it would be great to have some snow and ski … no
that was another story.</div>
<div class='p'><center>
<iframe width="640" height="360" src="https://www.youtube.com/embed/In4lPI9VRR4?list=PL2gPpyBs1e215Vwe70uouol3iawMNUhJG" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<div class='p'>p.s. after another fix on OSRF side
(<a href='https://github.com/osrf/subt/pull/809' class='external'>#809</a>, it looks like the base was not
covered by signal) Robotika scored the first point and is
<a href='https://subtchallenge.world/leaderboard' class='external'>the first qualified team</a> to Virtual
SubT Finals! <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/robotika-qualified.jpg'><img src='/competitions/subtchallenge/finals/robotika-qualified_t.jpg' alt='Robotika qualified in Finals!' title='Robotika qualified in Finals!' class='border' width='640' height='382'/></a><br/>
<a href='/competitions/subtchallenge/finals/robotika-qualified.jpg'>Robotika qualified in Finals!</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210318"></a></div>
<h2>18th March 2021 — 10th artifact type?</h2>
<div class='p'>Well, it is still not official but thanks to <a href='https://github.com/osrf/subt/pull/826' class='external'>leak in Virtual SubT - PR826</a>
it looks like that the mysterious 10th artifact is going to be some kind of treasure <span class='smile'></span></div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/cube-artifact.jpg'><img src='/competitions/subtchallenge/finals/cube-artifact_t.jpg' alt='Cube SubT as 10th artifact?' title='Cube SubT as 10th artifact?' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/subtchallenge/finals/cube-artifact.jpg'>Cube SubT as 10th artifact?</a>
</td></tr></table></div>
<div class='p'>I guess that by Friday this will be official but I am really curious how they want to
force the System teams to detect it — well, they can force it but how to handle it?
So I am looking forward for official info!</div>
<hr/>
<div class='p'><a id="210325"></a></div>
<h2>25th March 2021 — Finals Practice Worlds</h2>
<div class='p'>OK, <a href='https://app.ignitionrobotics.org/OpenRobotics/fuel/models/SubT%20Challenge%20Cube' class='external'>The Cube</a>
was really officially announced on Friday but I somehow overlooked it (as usual).
So now there is a new <a href='https://github.com/osrf/subt/wiki/release_notes' class='external'>CloudSim release</a> not only with
the 10th artifact but also the <a href='https://subtchallenge.world/leaderboard' class='external'>leaderboard</a>
contains <b>Finals Practice 1, 2, 3</b> worlds.</div>
<div class='p'>Yes, you can see team <b>robotika</b> now, sometimes leading with zeros. <span class='smile'></span>
But on the other hand the worlds were a little bit disappointing — they reflect
old circuits: tunnel, urban and cave.</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/finals-practice1.jpg'><img src='/competitions/subtchallenge/finals/finals-practice1_t.jpg' alt='Finals Practice 1 - Tunnel' title='Finals Practice 1 - Tunnel' class='border' width='220' height='124'/></a><br/>
<a href='/competitions/subtchallenge/finals/finals-practice1.jpg'>Finals Practice 1 - Tunnel</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/finals-practice2.jpg'><img src='/competitions/subtchallenge/finals/finals-practice2_t.jpg' alt='Finals Practice 2 - Urban' title='Finals Practice 2 - Urban' class='border' width='220' height='124'/></a><br/>
<a href='/competitions/subtchallenge/finals/finals-practice2.jpg'>Finals Practice 2 - Urban</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/finals-practice3.jpg'><img src='/competitions/subtchallenge/finals/finals-practice3_t.jpg' alt='Finals Practice 3 - Cave' title='Finals Practice 3 - Cave' class='border' width='220' height='124'/></a><br/>
<a href='/competitions/subtchallenge/finals/finals-practice3.jpg'>Finals Practice 3 - Cave</a>
</td></tr></table></div>
<div class='p'>There is also new feature — <b>fog</b>! And that is going to be fun:
<table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/tunnel-fog.jpg'><img src='/competitions/subtchallenge/finals/tunnel-fog_t.jpg' alt='Fog in tunnel' title='Fog in tunnel' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/subtchallenge/finals/tunnel-fog.jpg'>Fog in tunnel</a>
</td></tr></table></div>
<div class='p'>If you are curious what LIDAR sees in the fog then the answer is simple — nothing.
Both Freyja as X4 drone turned around and returned.</div>
<hr/>
<div class='p'><a id="210403"></a></div>
<h2>3rd April — Virtual Fog</h2>
<div class='p'>I must admit that the new feature <i>fog emitter</i> is a lot of fun. <span class='smile'></span> Camera does not see anything
except white image, lidar readings are random and there are no sonars available on the virtual robots.
A little bit promising are data from depth camera:</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/rgb-fog.jpg'><img src='/competitions/subtchallenge/finals/rgb-fog_t.jpg' alt='Fog recorded by RGB camera' title='Fog recorded by RGB camera' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/subtchallenge/finals/rgb-fog.jpg'>Fog recorded by RGB camera</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/depth-fog.jpg'><img src='/competitions/subtchallenge/finals/depth-fog_t.jpg' alt='Fog seen by depth camera' title='Fog seen by depth camera' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/subtchallenge/finals/depth-fog.jpg'>Fog seen by depth camera</a>
</td></tr></table></div>
<div class='p'>so now I am running simulation with suggested filter. We will see if robot Freya will
navigate through <i>fog dense so much you could cut it</i> (Rakosníček) and discover
<i>drill</i> artefact and score at lease one point in <i>Finals Practice World 1</i>. It
is nice that this trap is very close to the start (follow the right wall for 1 minute),
and it probably worked … unfortunately you cannot see fog in web-view.
It just scored the point, so no longer
<a href='https://subtchallenge.world/leaderboard' class='external'>leading with zero points</a> in Finals Practice 1!</div>
<div class='p'>Here is the <a href='https://youtu.be/iDFf2BjvjeE?t=245' class='external'>video of Freyja in fog</a> in the <i>Finals Qualification</i> world …
or, if you want, you can watch it <a href='https://youtu.be/iDFf2BjvjeE' class='external'>from the beginning</a>. How many artifacts you
have you discovered? Backpack in Urban? What about the helmet in Cave?? No? Well, check the fog again. <span class='smile'></span>
Yeah, you can see meeting of two robots which caused switch to alternative route … and a little bit of
looping. The exploration was limited to 15 minutes (<i>A900L</i>) and then the robot returned to base.</div>
<div class='p'><table class='image_panel center' style='width: 406px;'><tr><td>
<a href='/competitions/subtchallenge/finals/fq-fog-overview-map.png'><img src='/competitions/subtchallenge/finals/fq-fog-overview-map_t.png' alt='Overview map from state.log' title='Overview map from state.log' class='border' width='400' height='450'/></a><br/>
<a href='/competitions/subtchallenge/finals/fq-fog-overview-map.png'>Overview map from state.log</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210506"></a></div>
<h2>6th May 2021 — Eight teams have qualified for Systems Final Event</h2>
<div class='p'>… and <i>Robotika</i> is among them! <span class='smile'></span></div>
<ul>
<li><a href='https://www.darpa.mil/news-events/2021-05-03' class='external'>https://www.darpa.mil/news-events/2021-05-03</a></li>
</ul>
<div class='p'>Yes, we were also surprised that only eight teams (instead of fifteen) made it
to the Finals. On the other hand it is the elite (yeah, except us <span class='wink'></span> … but
you never know. This is surely related to the pandemic + if everything can be
canceled and the chance to win $2M is low …</div>
<div class='p'>So who are the competitors:</div>
<ul>
<li><a href='https://www.subt-cerberus.org/' class='external'>CERBERUS</a></li>
<li>Coordinated Robotics</li>
<li><a href='https://costar.jpl.nasa.gov/' class='external'>CoSTAR</a></li>
<li><a href='https://research.csiro.au/robotics/' class='external'>CSIRO Data61</a></li>
<li><a href='https://robotics.fel.cvut.cz/cras/darpa-subt/' class='external'>CTU-CRAS-NORLAB</a></li>
<li><a href='https://www.subt-explorer.com/' class='external'>Explorer</a></li>
<li>MARBLE</li>
<li><a href='https://robotika.cz/competitions/subtchallenge/' class='external'>Robotika</a></li>
</ul>
<div class='p'>Note, that the registration to <i>Virtual</i> competition is still open, but you
can already guess from the
<a href='https://subtchallenge.world/leaderboard' class='external'>leaderboard</a> who is qualified:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/leaderboard-210506.jpg'><img src='/competitions/subtchallenge/finals/leaderboard-210506_t.jpg' alt='Finals Qualification Leaderboard 2021-05-06' title='Finals Qualification Leaderboard 2021-05-06' class='border' width='640' height='442'/></a><br/>
<a href='/competitions/subtchallenge/finals/leaderboard-210506.jpg'>Finals Qualification Leaderboard 2021-05-06</a>
</td></tr></table></div>
<div class='p'>One point is enough to qualify … if you check both lists you will see that
this time at least 4 teams will compete in both categories!</div>
<hr/>
<div class='p'><a id="210616"></a></div>
<h2>16th June 2021 — Kloubák and Skiddy in Cave Výpustek</h2>
<div class='p'>Last weekend we had our first Robotika STIX (SubT/System Test Integration
Exercise) for SubT System Finals. <span class='smile'></span> And it was a very nice change after
almost a year (in some sense even more = since we returned from Urban Circuits)
of virtual live only.</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/kloubak-k2.jpg'><img src='/competitions/subtchallenge/finals/kloubak-k2_t.jpg' alt='Kloubak K2' title='Kloubak K2' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/subtchallenge/finals/kloubak-k2.jpg'>Kloubak K2</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/skiddy.jpg'><img src='/competitions/subtchallenge/finals/skiddy_t.jpg' alt='Skiddy' title='Skiddy' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/subtchallenge/finals/skiddy.jpg'>Skiddy</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/cave-ghost.jpg'><img src='/competitions/subtchallenge/finals/cave-ghost_t.jpg' alt='cave ghost' title='cave ghost' class='border' width='220' height='147'/></a><br/>
<a href='/competitions/subtchallenge/finals/cave-ghost.jpg'>cave ghost</a>
</td></tr></table></div>
<div class='p'>The meeting place was cave
<a href='https://visit.caves.cz/en/cave/jeskyne-vypustek' class='external'>Výpustek</a> in
<a href='https://moravsky-kras.caves.cz/en' class='external'>Moravia Karst</a> with other famous caves
like Macocha and Býčí Skála nearby. Cave Výpustek was formerly used as a
hidden factory during war and later as a nuclear shelter. The main space is
relatively easy for our robots because the original natural cave was modified
to serve humans: the floor has hard flat concrete, lights are built in the
walls and are used for tourists excursions, and the ceiling is high enough so
you can walk around without a helmet. The most difficult elements were small
chain guardrails saying "do not enter", which was not correctly interpreted by
robots.</div>
<div class='p'>The software integration was difficult as expected. Since the last year, when
System Cave Circuit was canceled, the focus was Virtual competition only and
some hardware dependent pieces were no longer supported (or at least definitely
not retested on real hardware). In time the basic operating system shifted
forward to newer versions and the device drivers (RealSense tracking and depth
cameras) too. Yes and it also took a while to remember all the "minor details"
necessary to have everything smoothly running. But at the end both robots
Kloubak K2 and Skiddy moved and autonomously navigated and explored the cave
— the primary goal was reached. Note, that we were still rather recovering
the old strategy from last year Urban Circuit than the latest algorithms from
Virtual world (mainly terrain traversability and octomap mapping and
exploration). This is going to be our next step.</div>
<div class='p'>Skiddy — this is our newest robot built by Pavel Skotak. It is a relatively
small (0.4m x 0.56m x 0.35m) robot capable of entering narrow spaces. It is not
the lightest (18kg) because it is based on four hoverboard motors (BLDC motors
built in the wheels) which each weighs ~3kg. The robot was still "too fresh",
not all sensors were mounted (so far front RGBD and tracking camera only, the
rear depth camera was not integrated yet). Never-the-less robot was driving
around, demonstrating its driving capabilities and also the weak points
(connectors). The STIX was very important for the whole team to align and see
the complete status first hand.</div>
<div class='p'>p.s. There were a couple visitors including MartinL — and now there is a
slight chance that Skiddy won't be the last robot in the list for Platform
Qualification which ends on 21st June 2021 (5days).</div>
<ul>
<li><a href='https://youtu.be/6ykdNAqelQQ' class='external'>Kloubak K2 exploring cave</a></li>
<li><a href='https://www.youtube.com/watch?v=AgJ0dreY87U' class='external'>Skiddy entering doors</a></li>
<li><a href='https://youtu.be/Cn5eBB3DwPM' class='external'>Skiddy mapping Výpustek</a></li>
<li><a href='https://youtu.be/Q1zHx4SmSwM' class='external'>Kloubák K2 view of Výpustek</a></li>
</ul>
<hr/>
<div class='p'><a id="210624"></a></div>
<h2>24th June 2021 — Czech STIX Býčí Skála</h2>
<div class='p'>If you thing that subterranean robotics is only about robots, broken wheels,
fried motor controllers and loose connectors then you are wrong. It is also
about logistics, team coordination, catering etc. <span class='smile'></span> The last night was a
perfect example. We were at the university testing communication between
Jetson Nano modules with the main control computer, finished at 9pm, bought
some groceries before the shop closed at 10pm and then drove "highway" D1 to
Brno and cave Býčí skála. We arrived at 1am the next day and surely several
people from CTU-CRAS-NORLAB team were still discussing ROS topics by the fire.
<span class='smile'></span></div>
<div class='p'>SubT is also about exciting (not necessarily positive) experiences. That
come about 30 minutes after we arrived and evaluated options where to sleep.
The best option (I would vote for it again!) was large open cave on tourist
hike, about 300 meters away. Shortly after we entered (and probably woke up
several competitors) the storm started to be much closer. It was fun, we could
see the walls from "the large windows" with each lightning … but then very
heavy rain started, which looked also OK, until I realized that I sleep in a
stream bed. It was the beginning so still OK, moved to higher dry place. But
then, about 15 minutes later opened waterfall directly on my sleeping bag.
"Fun." These are experiences you will never get sitting behind computer at home
and playing SubT Virtual track. <span class='smile'></span> (I can easily imagine Bilbo saying "we do
not want any adventure here").</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/robot-lily.jpg'><img src='/competitions/subtchallenge/finals/robot-lily_t.jpg' alt='Walking robot Lily' title='Walking robot Lily' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/subtchallenge/finals/robot-lily.jpg'>Walking robot Lily</a>
</td></tr></table></div>
<div class='p'>The cave is very nice - large, spacious, a great playground for all kinds of
robots. Outside was temperature around 28C degrees and inside 8C degrees, so
the very first „surprise” we have seen was LIDAR blindness, again:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/k2-lidar-blindness-byci-skala.jpg'><img src='/competitions/subtchallenge/finals/k2-lidar-blindness-byci-skala_t.jpg' alt='Blind front LIDAR' title='Blind front LIDAR' class='border' width='320' height='191'/></a><br/>
<a href='/competitions/subtchallenge/finals/k2-lidar-blindness-byci-skala.jpg'>Blind front LIDAR</a>
</td></tr></table></div>
<div class='p'>And here are the views from front and rear cameras:</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-entry-front.jpg'><img src='/competitions/subtchallenge/finals/k2-byci-skala-entry-front_t.jpg' alt='Camera front' title='Camera front' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-entry-front.jpg'>Camera front</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-front-depth.jpg'><img src='/competitions/subtchallenge/finals/k2-byci-skala-front-depth_t.jpg' alt='Front depth camera' title='Front depth camera' class='border' width='220' height='125'/></a><br/>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-front-depth.jpg'>Front depth camera</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-entry-rear.jpg'><img src='/competitions/subtchallenge/finals/k2-byci-skala-entry-rear_t.jpg' alt='Camera rear' title='Camera rear' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-entry-rear.jpg'>Camera rear</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/byci-skala-lake.jpg'><img src='/competitions/subtchallenge/finals/byci-skala-lake_t.jpg' alt='Underground lake' title='Underground lake' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/byci-skala-lake.jpg'>Underground lake</a>
</td></tr></table></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-outside.jpg'><img src='/competitions/subtchallenge/finals/k2-byci-skala-outside_t.jpg' alt='Kloubák K2 outside' title='Kloubák K2 outside' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/subtchallenge/finals/k2-byci-skala-outside.jpg'>Kloubák K2 outside</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/cube.jpg'><img src='/competitions/subtchallenge/finals/cube_t.jpg' alt='Cube artifact' title='Cube artifact' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/subtchallenge/finals/cube.jpg'>Cube artifact</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/subtchallenge/finals/skiddy-byci-skala.jpg'><img src='/competitions/subtchallenge/finals/skiddy-byci-skala_t.jpg' alt='Skiddy and Vent artifact' title='Skiddy and Vent artifact' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/subtchallenge/finals/skiddy-byci-skala.jpg'>Skiddy and Vent artifact</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210629"></a></div>
<h2>29th June 2021 — Team Robotika qualified for the Virtual Competition</h2>
<div class='p'>We just received mail:</div>
<div class='p'><i>Team Robotika, Congratulations! After careful review of your submission, we
are pleased to inform you that you are now qualified to compete in the Final
Event of the SubT Challenge Virtual Competition.</i></div>
<div class='p'><span class='smile'></span></div>
<div class='p'>So now the question is if all 12 teams now listed in
<a href='https://subtchallenge.world/leaderboard' class='external'>Finals Qualification World</a> will be
accepted.</div>
<div class='p'><table class='image_panel center' style='width: 456px;'><tr><td>
<a href='/competitions/subtchallenge/finals/leaderboard-210629.jpg'><img src='/competitions/subtchallenge/finals/leaderboard-210629_t.jpg' alt='Leaderboard shortly before qualification deadline' title='Leaderboard shortly before qualification deadline' class='border' width='450' height='393'/></a><br/>
<a href='/competitions/subtchallenge/finals/leaderboard-210629.jpg'>Leaderboard shortly before qualification deadline</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 534px;'><tr><td>
<span><img src='/competitions/subtchallenge/finals/subt-virtual-deadlines.jpg' alt='SubT Virtual competition deadlines' title='SubT Virtual competition deadlines' class='border' width='528' height='86'/></span><br/>
<span>SubT Virtual competition deadlines</span>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210802"></a></div>
<h2>2nd August 2021 — Finals Preliminary Round</h2>
<div class='p'>It is over, at least the submission. There were many changes you could still track
<a href='https://github.com/robotika/osgar' class='external'>GitHub</a> including the <a href='https://github.com/robotika/osgar/releases/tag/SUBT_CHALLENGE_FINALS_PRELIMINARY_ROUND_2021' class='external'>FPR release</a> (ver115) and team of 8 robots trying to score and push <i>Robotika</i> in the Top 10.</div>
<div class='p'>The evaluation is running now and according to <a href='https://github.com/osrf/subt/wiki' class='external'>SubT Wiki</a>
the next deadline is</div>
<ul>
<li>26 AUG - Prize Round Submission Deadline
(there is no info when preliminary round should be completed … but I have seen it somewhere)</li>
</ul>
<div class='p'>I see that I even did not publish link to the <a href='https://www.darpa.mil/news-events/2021-07-14' class='external'>official announcement of 12 qualified teams</a>.
And there it is: <i>Results from these initial runs will be announced by August 13.</i> <span class='smile'></span></div>
<hr/>
<div class='p'><a id="210812"></a></div>
<h2>12th August 2021 — Advancing to the Prize Round</h2>
<div class='p'>Good morning,</div>
<div class='p'>The Subterranean (SubT) Challenge Team would like to congratulate you on placing in the top 10 of the Preliminary Round and advancing to the Prize Round of the Virtual Competition in the SubT Challenge Final Event!</div>
<div class='p'>With your team advancing, we would like to extend a friendly reminder that Prize Round submissions for the Final Event are due <b>August 26th, 2021</b>.</div>
<div class='p'>Please see a further reminder of dates of importance to keep in mind for the SubT Challenge Final Event:</div>
<ul>
<li>Prize Round submissions are due August 26th</li>
<li>SubT Challenge Final Event will be broadcasted September 21st-24th on <a href='https://subtchallenge.com/subtv.html' class='external'>SubTv</a></li>
<li>The Awards Ceremony will be held on September 24th, where the winners of both the Systems and Virtual Competition will be announced</li>
</ul>
<div class='p'>We will be following up in the coming days with an email providing further logistics regarding in-person attendance at the Final Event for you and your team. We look forward to seeing your Prize Round submissions!</div>
<div class='p'>Sincerely,
The SubT Challenge Team</div>
<hr/>
<div class='p'>p.s. the official results are published here <a href='https://www.darpa.mil/news-events/2021-08-12' class='external'>https://www.darpa.mil/news-events/2021-08-12</a></div>
<hr/>
<div class='p'><a id="210827"></a></div>
<h2>27th August 2021 — 2C or not 2C?</h2>
<div class='p'>That is a question! Shakespeare would probably use different letter like <i>2B or not 2B?</i> …</div>
<div class='p'>You can tell that my mind is kind of broken after recent (and still running) SubT Virtual coding/testing
marathon. Today is the <b>Virtual D-Day</b>, i.e. in 5 hours (not sure if I will finish this text any soon)
<a href='https://github.com/osrf/subt/wiki' class='external'>26 AUG - Prize Round Submission Deadline</a>. It is AoE (Anywhere on Earth)
which means 2pm CET time. And that should be noted even this blog is so silent this year …</div>
<div class='p'><a href='https://youtu.be/wv-nXkhr5Sk?t=8078' class='external'>Stress test, nice, I like that</a> comes to my mind quite often, recently.
It is phrase Camryn used in Cave Circuit (actually around 1year ago). If you forgot who she is then here is
refreshing picture from the video:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/camryn.jpg'><img src='/competitions/subtchallenge/finals/camryn_t.jpg' alt='Stress test, nice, I like that!' title='Stress test, nice, I like that!' class='border' width='320' height='180'/></a><br/>
<a href='/competitions/subtchallenge/finals/camryn.jpg'>Stress test, nice, I like that!</a>
</td></tr></table></div>
<div class='p'>So what happened last month(s)? I would start with nice pictures — feature I was against (it
is optional to provide map data to the DARPA server) but it did not stop Jirka.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/xmas-freyja.jpg'><img src='/competitions/subtchallenge/finals/xmas-freyja_t.jpg' alt='Christmas lights near Freyja - point cloud' title='Christmas lights near Freyja - point cloud' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/xmas-freyja.jpg'>Christmas lights near Freyja - point cloud</a>
</td></tr></table></div>
<div class='p'>Even funnier was the „patching” when the browser did not display some tiles:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/patchwork.jpg'><img src='/competitions/subtchallenge/finals/patchwork_t.jpg' alt='Patching missing visualization via local map point cloud' title='Patching missing visualization via local map point cloud' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/patchwork.jpg'>Patching missing visualization via local map point cloud</a>
</td></tr></table></div>
<div class='p'>Timeout - switch to (regular) work and do the final release (SubT) …</div>
<div class='p'>p.s. C stands for <i>center</i> used in robot code names and "2C" meas prefer center for 2 seconds …
and now the question is if to help Freyja robots to leave the starting area with this
<a href='https://github.com/robotika/osgar/pull/891' class='external'>extra push</a> …</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/freyja-pam-stairs.jpg'><img src='/competitions/subtchallenge/finals/freyja-pam-stairs_t.jpg' alt='One of the action moments, Freyja on stairs with Pam drone and an artifact in background' title='One of the action moments, Freyja on stairs with Pam drone and an artifact in background' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/freyja-pam-stairs.jpg'>One of the action moments, Freyja on stairs with Pam drone and an artifact in background</a>
</td></tr></table></div>
<hr/>
<h2>Game is Over</h2>
<div class='p'>… so just to add (for myself) some reference pointers:</div>
<ul>
<li><a href='https://github.com/robotika/osgar/releases/tag/SUBT_CHALLENGE_FINALS_ROUND_2021' class='external'>SUBT_CHALLENGE_FINALS_ROUND_2021</a> - tag for final ver133</li>
</ul>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/robotika-final-config.jpg'><img src='/competitions/subtchallenge/finals/robotika-final-config_t.jpg' alt='Final configuration - 4x Freyja, 4x Pam, Teambase' title='Final configuration - 4x Freyja, 4x Pam, Teambase' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/robotika-final-config.jpg'>Final configuration - 4x Freyja, 4x Pam, Teambase</a>
</td></tr></table></div>
<pre>world: Final Prize Round
image: 138467776890.dkr.ecr.us-east-1.amazonaws.com/subt/robotika:ver133
simname: ver133frr1
robots:
D390W2C1500LH3600W: ROBOTIKA_FREYJA_SENSOR_CONFIG_2
B90W2C2400LH3600W: ROBOTIKA_FREYJA_SENSOR_CONFIG_2
A0W2C2400RH3600W: ROBOTIKA_FREYJA_SENSOR_CONFIG_2
C300W2C1500RH3600W: ROBOTIKA_FREYJA_SENSOR_CONFIG_2
E600W900LH3600W: CORO_PAM_SENSOR_CONFIG_1
H1980W600RH3600W: CORO_PAM_SENSOR_CONFIG_1
G1920W600LH3600W: CORO_PAM_SENSOR_CONFIG_1
F660W900RH3600W: CORO_PAM_SENSOR_CONFIG_1
T4000: TEAMBASE</pre>
<hr/>
<div class='p'><a id="210917"></a></div>
<h2>17th September 2021 — Robotika in USA (-4days)</h2>
<div class='p'>Believe it or not, Robotika team is now in Louisville, KY, United States. <span class='smile'></span></div>
<div class='p'>It was not straightforward as all travel from EU to USA is prohibited.
You have to ask for an exception (NIE - National Interest Exception), which
you may or may not get. We got DARPA invitation letter, which surely helped. Nevertheless confirmation that we could
go we received on Aug 18th less then a month ago (<i>We are pleased to notify you that a national interest waiver to Presidential Proclamation
10143 has been approved for your travel to the United States. ... Please note that an approval of a national interest exception
does not guarantee entry into the United States.</i> Yeap. Plane tickets, accomodation, car rental, robots, batteries, …
no time for relax.</div>
<div class='p'>Who will fly over the Atlantic? Which robot we should take? What SW we should run on it? These questions
were the most pressing while we were still finishing Virtual Finals. The member list self-reduced to 5 people from
Czech Republic (Jakub, Standa, TomasP, MartinS and me) and Frantisek flying over from Maryland.</div>
<div class='p'>Most of the robots we left at home. Promising are <b>Kloubak K2</b> and new <b>Skiddy</b>. We dropped even
Maria living in U.S. as Frantisek is going to <a href='/competitions/space-robotics-challenge/finals/cs'>NASA Space Robotics Challenge</a>
awards next week (the day after DARPA SubT) and there is nobody who could take care of her.</div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/subtchallenge/finals/selfie-dulles-airport.jpg'><img src='/competitions/subtchallenge/finals/selfie-dulles-airport_t.jpg' alt='Robotika Team selfie in Dulles Airport/Washington D.C.' title='Robotika Team selfie in Dulles Airport/Washington D.C.' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/subtchallenge/finals/selfie-dulles-airport.jpg'>Robotika Team selfie in Dulles Airport/Washington D.C.</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210918"></a></div>
<h2>18th September 2021 — Mega Cavern (-3days)</h2>
<div class='p'>Well it was yesterday, we have seen it for the first time … and it is huge! (as expected)</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/entrance.jpg'><img src='/competitions/subtchallenge/finals/entrance_t.jpg' alt='Entrance to the cave' title='Entrance to the cave' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/entrance.jpg'>Entrance to the cave</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/empty-room.jpg'><img src='/competitions/subtchallenge/finals/empty-room_t.jpg' alt='Is anybody home?' title='Is anybody home?' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/empty-room.jpg'>Is anybody home?</a>
</td></tr></table></div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/ship.jpg'><img src='/competitions/subtchallenge/finals/ship_t.jpg' alt='Does your robot swim?' title='Does your robot swim?' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/ship.jpg'>Does your robot swim?</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/teams-list.jpg'><img src='/competitions/subtchallenge/finals/teams-list_t.jpg' alt='List of teams' title='List of teams' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/teams-list.jpg'>List of teams</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210919"></a></div>
<h2>19th September 2021 — Mega Trouble (-2days)</h2>
<div class='p'>I am not really sure if it is a good idea to write down any report today, but … if not now when etc.</div>
<div class='p'>We are having troubles with rear motors and motor driver on robot Skiddy. As we have only 2 robots
it is almost 50% of our robo-team, sigh. We spent non-trivial time because of</div>
<pre>fw_version_major: 0 (uint8)
fw_version_minor: 5 (uint8)
fw_version_revision: 1 (uint8)
fw_version_unreleased: 1 (uint8)</pre>
<div class='p'>vs.</div>
<pre>fw_version_major: 0 (uint8)
fw_version_minor: 5 (uint8)
fw_version_revision: 1 (uint8)
fw_version_unreleased: 0 (uint8)</pre>
<div class='p'>Thanks to Beda from CTU CRAS NORLAB team we have new 56V driver (replacement for fried(?) 24V version),
but are the firmware versions above the same? What <i>unreleased</i> means? And what exactly is this version?
Currious? It was 0.5.2!!! The configuration and API changed between these two versions which means more
trouble.</div>
<div class='p'>OTOH there were also some good news — we passed E-stop check qualification and also the network test
on staging area worked fine. We have also see the entrance for the robots. Deadly — steep curved turn left, so it
will be the very first tests if robots are properly braking! BTW the mapping server worked too. The only
detail was that when we were testing it with docker mapping server we could not see anything, because there
was only one testing point. Even the corridor map from logfile was recognized by DARPA people, but we have
not seen it …</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/darpa-scoring-server.jpg'><img src='/competitions/subtchallenge/finals/darpa-scoring-server_t.jpg' alt='DARPA scoring server' title='DARPA scoring server' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/darpa-scoring-server.jpg'>DARPA scoring server</a>
</td></tr></table></div>
<div class='p'>What else? We defined internal "rule" how to select the one unlucky(?) person, who will stay in the garage.
There are only 1+4 people alloweed in staging area and we are 6.</div>
<hr/>
<div class='p'><a id="210921"></a></div>
<h2>21th September 2021 — Robotika scores first point</h2>
<div class='p'>Today (or better to say yesterday, it is 3am here now) we went through the first preliminary round. It was
hard from the very beginning (as expected) as behind the gate is already steep (about 20 degrees) downhill
slope terminated with sharp turn left. That is all you can see from the staging area. Surely enough also
the WiFi signal even for strong directed antenae ends on the crossing just behind the turn. Unfortunately
it holds also for LoRa (long range radio) device we use.</div>
<div class='p'>We are not allowed to publish any pictures from the internal course yet. The official recapitulation of
the day will be broadcasted today (22nd September 2021) on DARPA SubTv:</div>
<ul>
<li><a href='https://subtchallenge.com/SubTv.html' class='external'>https://subtchallenge.com/SubTv.html</a></li>
</ul>
<div class='p'>(so I will put pictures here say in 24 hours once this official part is over … just for you to have an
idea what to expect underground)</div>
<div class='p'>Kloubak K2 definitely did not want to go downhill (six times?). The good news was that although K2 did not like the
slope (maybe also the transformations in the map?) it always returned back to the staging area so that we could
try again. The robot may easily block the whole passage and no other robot (in our case only one — Skiddy)
could pass it. After tweaking some parameters we "push" it down, it managed to navigate narrow spaces and
picked <i>urban entrance</i> … it was funny to see crossing similar to
<a href='https://youtu.be/In4lPI9VRR4?list=PL2gPpyBs1e215Vwe70uouol3iawMNUhJG' class='external'>Virtual Qualification</a> … yes this
sentence is maybe already leak, but it will be surely revealed soon and all teams already have seen it.</div>
<div class='p'>Skiddy remained at home — we wanted at least one robot to survive. More over Skiddy has broken rear right
wheel:</div>
<pre>In [43]: dump_errors(odrv0)
system: no error
axis0
axis: no error
motor: Error(s):
MOTOR_ERROR_UNKNOWN_TORQUE
MOTOR_ERROR_UNKNOWN_VOLTAGE_COMMAND
sensorless_estimator: no error
encoder: Error(s):
ENCODER_ERROR_ILLEGAL_HALL_STATE
controller: no error
axis1
axis: no error
motor: no error
sensorless_estimator: no error
encoder: no error
controller: no error</pre>
<div class='p'>… we suppose HW issues on wheel/cables/hall sensors … and hopefully it will be fixed today (the components were
delayed by one day :(.</div>
<div class='p'>And how far K2 managed to go? It died in 9 minutes of 16 remaining (the preliminary rounds are only 30 minutes long, or
short, and most of the time we spend convincing our robot to really go there):</div>
<pre>0:07:57.612168 16 [2, b'\t', 0]
0:07:57.612415 16 [1, b'\x00', 0]
0:07:57.612754 16 [146, b'\x00\x00\x00\xc1\x001\xff\xbe', 0]
0:07:57.612943 16 [145, b'\x00\x00\x01C\x00J\x00\x84', 0]
0:07:57.613157 16 [148, b'\x00\x00\x00m\x00\x0f\x00\x1b', 0]
0:07:57.623772 18 b'\x10h&\xc1!3%\xd9\x1f\xf9\x12h\x00\x00\x01=\x00\x04\x00?'
0:07:57.624101 16 [131, b'&\xc1!3%\xd9\x1f\xf9', 0]
0:07:57.628947 16 [147, b'\x00\x00\x01=\x00\x04\x00?', 0]
0:07:57.639438 18 b'\x10<i>\x00\x00-\x80\x10D\x00\x00\x89{\x10\x04\x00\x00\x03\x11'
0:07:57.639733 16 [129, b'\x00\x00-\x80', 0]
0:07:57.640092 16 [130, b'\x00\x00\x89{', 0]
0:07:57.640376 16 [128, b'\x00\x00\x03\x11', 0] ... chybi 131, 147 = 2x 8bytes ... tj. chybi cca 18 bytes
0:07:57.652187 18 b'\x00 \x00A\n \x00!\x00\x12H \x00\x00\x00\xa0\x00\x18\x00:\x12\x88\x00\x00\x00k\x00(\xff\x8f'
0:07:57.652359 16 [0, b'', 0]
0:07:57.652590 16 [520, b'\x00!\x00\x12H\x00\x00\x00\xa0\x00', 0]
0:07:57.652765 16 [192, b'', 0]
0:07:57.652934 16 [464, b'', 0]
0:07:57.653134 16 [1088, b'', 0]
0:07:57.653329 16 [0, b'', 0]
0:07:57.653496 16 [856, b'', 0]
0:07:57.653685 16 [327, b'', 0]
0:07:57.668018 18 b'\x10h&\xc3!3%\xdb\x1f\xf9\x12h\x00\x00\x01T\x00\x0e\x00:'
0:07:57.668202 16 [1144, b'', 0]
0:07:57.668572 16 [833, b'\xc3!3%\xdb\x1f', 0]
0:07:57.668748 16 [1992, b'', 0]
0:07:57.668990 16 [832, b'', 0]
0:07:57.669227 16 [0, b'T', 0]
0:07:57.690521 18 b'\x10</i>\x00\x00-\x90\x10D\x00\x00\x89\x8b\x10\x04\x00\x00\x03\n\x00
A\x0b \x00!\x00 \x12H \x00\x00\x00\xe7\x00\x08\x002'
0:07:57.690757 16 [0, b'\x00:\x10$\x00\x00-\x90\x10D\x00\x00\x89\x8b', 0]
0:07:57.691058 16 [128, b'\x00\x00\x03\n', 0]
0:07:57.691859 16 [2, b'\x0b', 0]
0:07:57.692100 16 [1, b'\x00', 0]
0:07:57.692335 16 [146, b'\x00\x00\x00\xe7\x00\x08\x002', 0]</pre>
<div class='p'>… Jirka already pointed out yesterday, that I should not share these cryptic messages even within the team but …
maybe somebody will like the puzzle too <span class='wink'></span>. In other words there are about 18bytes missing in the stream which then
causes wrong parsing of CAN messages, triggering parsing asserts and terminating.</div>
<div class='p'>As side effect we reviewed that messages 0x11, 0x12, 0x13 and 0x14 release the wheels and for command <i>desired_speed = (0, 0)</i>
it actually releases the wheels! It is nice for transition of moving states but for <i>flip()</i> (K2 and Skiddy are symmetrical
so you can virtually flip front and rear instead of turn 180 degrees) with 2 seconds(?) wait in steep downhill it is deadly.</div>
<div class='p'>Other detail is to fix reporting of Z-coordinate, which was not that important for us in Urban and Tunnel as the place was
on one level (if we did not go up/down stairs or fly). Yeah, a lot of fun.</div>
<div class='p'>Today (22nd Sept) should be more or less copy of yesterday and tomorrow (23rd, Finals Prize Round) too as we will
probably start from the last place (no big deal). Note, that results of other teams are not secret but they are also not
official yet. One colleague went and ask most of the teams, so Explorer, CoSTAR and Cerberus all have 7 points,
CRAS CTU NORLAB 5 points, Coordinated Robotics 2 points and Robotika 1 point. If you want to see pictures and some details
about all competitors have a look at:</div>
<ul>
<li><a href='https://spectrum.ieee.org/amp/darpa-subterranean-challenge-2655065656' class='external'>IEEE Spectrum: DARPA SubT Finals: Meet the Teams
How the eight Systems Track teams are approaching the final event</a></li>
</ul>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/finals-all-teams.jpg'><img src='/competitions/subtchallenge/finals/finals-all-teams_t.jpg' alt='SubT Finals System teams and robots (photo from IEEE Spectrum article)' title='SubT Finals System teams and robots (photo from IEEE Spectrum article)' class='border' width='640' height='480'/></a><br/>
<a href='/competitions/subtchallenge/finals/finals-all-teams.jpg'>SubT Finals System teams and robots (photo from IEEE Spectrum article)</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210922"></a></div>
<h2>22nd September 2021 — Virtual Finals - partial results</h2>
<div class='p'>If you watched <a href='https://subtchallenge.com/SubTv.html' class='external'>DARPA SubTv</a> today you already know the preliminary results for
Virtual Finals. There were simulations for the Tunnel, Urban and Cave running each 3 times. Here are the drafts.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/virtual-worlds-123.jpg'><img src='/competitions/subtchallenge/finals/virtual-worlds-123_t.jpg' alt='Virtual World' title='Virtual World' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/virtual-worlds-123.jpg'>Virtual World</a>
</td></tr></table></div>
<div class='p'>And here are the partial results:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/virtual-score-world1.jpg'><img src='/competitions/subtchallenge/finals/virtual-score-world1_t.jpg' alt='01 - Tunnel World' title='01 - Tunnel World' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/virtual-score-world1.jpg'>01 - Tunnel World</a>
</td></tr></table>
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/virtual-score-world2.jpg'><img src='/competitions/subtchallenge/finals/virtual-score-world2_t.jpg' alt='02 - Urban World' title='02 - Urban World' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/virtual-score-world2.jpg'>02 - Urban World</a>
</td></tr></table>
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/virtual-score-world3.jpg'><img src='/competitions/subtchallenge/finals/virtual-score-world3_t.jpg' alt='03 - Cave World' title='03 - Cave World' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/virtual-score-world3.jpg'>03 - Cave World</a>
</td></tr></table></div>
<div class='p'>and finally intermediate cumulative results:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/virtual-score-123.jpg'><img src='/competitions/subtchallenge/finals/virtual-score-123_t.jpg' alt='Total score 01+02+03' title='Total score 01+02+03' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/virtual-score-123.jpg'>Total score 01+02+03</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210923"></a></div>
<h2>23rd September 2021 — Game Over</h2>
<div class='p'>It is over now. At least for <i>Robotika</i>. We started at early morning at 6:30am, E-stop check, move to the stage.
There was basically no time to test the last HW/SW changes. Yesterday even encoders on K2 stopped working —
the CAN module got lose probably as Kloubak tried to overcome some of the obstacles. Yes, we also fried couple of
fuses. It started with 20A, then 30A and for the finals TomasP and MartinS changed it to 50A.</div>
<div class='p'>Skiddy got overnight new board filtering signals from the Hall sensors. It seemed to work OK in the morning (4am).
These were all good news <span class='wink'></span>.</div>
<div class='p'>The run was similar to preliminary rounds — there was an artifact on the junction (Jakub would got the lottery
prize, because he guess it in advance correctly). Nice surprise was view to Cave where was another artifact.</div>
<pre>b'{"score":2,"remaining_reports":43,"current_team":"robotika","run_clock":727.3}'</pre>
<div class='p'>… maybe we should stop here and go home. <span class='wink'></span> Actually Kloubak did and showed up in the staging area again.</div>
<div class='p'>For the next attempt we just re-run it, K2 properly picked left way to the Urban area, nicely navigated in the coridor
to the left where we have never been before. Suprisingly it was available on LoRa all the time — not sure what
changed for the finals.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/control-center-finals-overview.jpg'><img src='/competitions/subtchallenge/finals/control-center-finals-overview_t.jpg' alt='Control Center Finals overview' title='Control Center Finals overview' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/control-center-finals-overview.jpg'>Control Center Finals overview</a>
</td></tr></table></div>
<div class='p'>You can see that K2 was moving back and fourth:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/control-center-finals-detail.jpg'><img src='/competitions/subtchallenge/finals/control-center-finals-detail_t.jpg' alt='Detail' title='Detail' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/control-center-finals-detail.jpg'>Detail</a>
</td></tr></table></div>
<div class='p'>Now we are in the „jail” = Sequester area, that we would not be able to share with anybody the secrest we discovered
in the cave. On the other hand information worth $2M … I understand them … we just do not have it <span class='wink'></span>.</div>
<hr/>
<div class='p'><a id="210924"></a></div>
<h2>24th September 2021 — And the winner is …</h2>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/accurate-report.jpg'><img src='/competitions/subtchallenge/finals/accurate-report_t.jpg' alt='Robotika award' title='Robotika award' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/accurate-report.jpg'>Robotika award</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/virtual-results.jpg'><img src='/competitions/subtchallenge/finals/virtual-results_t.jpg' alt='Virtual results' title='Virtual results' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/virtual-results.jpg'>Virtual results</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/mapping-results.jpg'><img src='/competitions/subtchallenge/finals/mapping-results_t.jpg' alt='System Mapping results' title='System Mapping results' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/mapping-results.jpg'>System Mapping results</a>
</td></tr></table>
Note, that Robotika mapping was available only offline after the robot returned and the WiFi signal ended on the first
junction.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/subtchallenge/finals/system-results.jpg'><img src='/competitions/subtchallenge/finals/system-results_t.jpg' alt='System results' title='System results' class='border' width='640' height='360'/></a><br/>
<a href='/competitions/subtchallenge/finals/system-results.jpg'>System results</a>
</td></tr></table></div>
<div class='p'><center>
<iframe width="640" height="240" src="https://www.youtube.com/embed/nW0dNE599CY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a id="210927"></a></div>
<h2>27th September 2021 — Pictures and videos</h2>
<div class='p'><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/subtchallenge/finals/robotika-garage.jpg'><img src='/competitions/subtchallenge/finals/robotika-garage_t.jpg' alt='Robotika garage' title='Robotika garage' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/subtchallenge/finals/robotika-garage.jpg'>Robotika garage</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/subtchallenge/finals/downhill-test.jpg'><img src='/competitions/subtchallenge/finals/downhill-test_t.jpg' alt='Downhill test' title='Downhill test' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/subtchallenge/finals/downhill-test.jpg'>Downhill test</a>
</td></tr></table></div>
<div class='p'><table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/subtchallenge/finals/kloubak.jpg'><img src='/competitions/subtchallenge/finals/kloubak_t.jpg' alt='Kloubak K2' title='Kloubak K2' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/subtchallenge/finals/kloubak.jpg'>Kloubak K2</a>
</td></tr></table>
<table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/subtchallenge/finals/k2-on-stage.jpg'><img src='/competitions/subtchallenge/finals/k2-on-stage_t.jpg' alt='Kloubak on stage' title='Kloubak on stage' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/subtchallenge/finals/k2-on-stage.jpg'>Kloubak on stage</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 5px;'><tr><td>
<a href='/competitions/subtchallenge/finals/robotika-team.jpg'><img src='/competitions/subtchallenge/finals/robotika-team_t.jpg' alt='Robotika Team' title='Robotika Team' class='border' width='-1' height='-1'/></a><br/>
<a href='/competitions/subtchallenge/finals/robotika-team.jpg'>Robotika Team</a>
</td></tr></table></div>
<h3>DARPA Videos</h3>
<ul>
<li><a href='https://youtu.be/BTwBne2kxNg?t=1796' class='external'>DARPA Subterranean Challenge Final Event Day 1- Introduction to the SubT Challenge</a></li>
<li><a href='https://youtu.be/8Y_6p_jhmCA?t=1798' class='external'>DARPA Subterranean Challenge Final Event - Day 2 - Competition Coverage</a></li>
<li><a href='https://youtu.be/jNb6vf89q-M?t=1794' class='external'>DARPA Subterranean Challenge Final Event - Day 3 - Competition Coverage</a></li>
<li><a href='https://youtu.be/jNb6vf89q-M?t=5526' class='external'>Day 3 - System</a></li>
<li><a href='https://www.youtube.com/watch?v=EAPSm7udG3Q' class='external'>DARPA Subterranean Challenge Final Event Day 4 - Prize Round Coverage</a></li>
<li><a href='https://www.youtube.com/watch?v=SyjeIGCHnrU' class='external'>DARPA Subterranean Challenge Final Event Day 4 - Awards Ceremony and SubT Summit</a></li>
</ul>
<h4>Selected video seek</h4>
<ul>
<li><a href='https://youtu.be/EAPSm7udG3Q?t=7553' class='external'>Explorer fall from the clif</a></li>
<li><a href='https://youtu.be/EAPSm7udG3Q?t=6120' class='external'>Robotika - Kloubak entering</a></li>
<li><a href='https://youtu.be/EAPSm7udG3Q?t=7230' class='external'>Robotika - K2 in warehouse</a></li>
<li><a href='https://youtu.be/EAPSm7udG3Q?t=7869' class='external'>Robotika - K2 still in warehouse</a></li>
<li><a href='https://youtu.be/EAPSm7udG3Q?t=4510' class='external'>Virtual - drones graveyard</a> — <a href='https://github.com/osrf/subt/issues/1001' class='external'>Issue #1001</a></li>
</ul>
<hr/>
<div class='p'><a id="211003"></a></div>
<h2>3rd October 2021 — 8x 1hour Finals Videos</h2>
<div class='p'>DARPA published all recordings of all 8 teams (1 hour competition time + few minutes of preparation). You can see there many
details which were not in the official presentation. Unfortunately there is always selection of one camera and in case there
are 5 and more active robots you miss something … but still something to do for long winter nights. <span class='wink'></span></div>
<div class='p'>(the order is given by the score table)</div>
<h3><a href='https://www.youtube.com/watch?v=ufvDtnscQgA' class='external'>CERBERUS</a></h3>
<ul>
<li>23 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=Zz7KEutptjk' class='external'>CSIRO Data61</a></h3>
<ul>
<li>23 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=OkmVQVSHaGI' class='external'>MARBLE</a></h3>
<ul>
<li>18 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=7lxR0XIwdcM' class='external'>Explorer</a></h3>
<ul>
<li>17 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=4CEQ814UhGY' class='external'>CoSTAR</a></h3>
<ul>
<li>13 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=zUFofmnJ7pc' class='external'>CTU-CRAS-NORLAB</a></h3>
<ul>
<li>7 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=m3zuqGjp8OA' class='external'>Coordinated Robotics</a></h3>
<ul>
<li>2 points</li>
</ul>
<h3><a href='https://www.youtube.com/watch?v=aWwNqYRwSUA&list=RDCMUCOIHBHRbvncMo7Bf0Vx1zEQ&index=1' class='external'>Robotika</a></h3>
<ul>
<li>2 points</li>
</ul>
<h3><a href='https://youtu.be/6Fte0KipSfk' class='external'>DARPA Subterranean Challenge Final Event Course Walkthrough - Artifact Configuration 3</a></h3>
<div class='p'>p.s. <a href='https://www.popsci.com/technology/darpa-subterranean-challenge-robot-winners/' class='external'>Popular Science</a> — nice picture of Kloubak K2 <span class='smile'></span></div>
<hr/>
<div class='p'><a id="211130"></a></div>
<h2>30th November 2021 — Invitation to DARPA SubT Summit 2021 and webinar</h2>
<div class='p'>There will be <b>DARPA SubT Summit 2021</b> organized by australian team CSIRO Data 61 on <b>10th December 2021</b>.</div>
<div class='p'><a href='https://research.csiro.au/robotics/our-work/darpa-subt-challenge-2018/darpa-subt-summit-2021/' class='external'>https://research.csiro.au/robotics/our-work/darpa-subt-challenge-2018/darpa-subt-summit-2021/</a></div>
<div class='p'>Note, that you have to register (participation is for free) in order to get access to pre-recorded videos
and later to discussion panel. The preliminary schedule is:</div>
<h3>Date</h3>
<pre>Friday 10 December 2021</pre>
<h3>Time</h3>
<pre>0530-1430hrs PST (Los Angeles)
0630-1530hrs MST (Denver)
0830-1730hrs EST (Arlington/Pittsburgh)
1430-2330hrs CEST (Oslo/Prague)
2330-0830hrs AEST (Brisbane)</pre>
<h3>Program</h3>
<pre>0830-0840 EDT – Welcome and introduction
Session 1 – Competitor Summaries
0840-0920 EDT – Team summaries
Session 2 – Mapping
0920-1040 EDT – Panel discussion with each team to present up to 5mins of slides/videos
1040-1100 EDT – Break /Breakout rooms
Session 3 – Mobility
1100-1220 EDT – Panel discussion with each team (optional slides/videos)
1220-1300 EDT – Break /Breakout rooms
Session 4 – Autonomy
1300-1420 EDT – Panel discussion with each team (optional slides/videos)
Session 5 – Comms
1420-1540 EDT – Panel discussion with each team (optional slides/videos)
1540-1600 – Break /Breakout rooms
Session 6 – Object detection
1600-1720 EDT – Panel discussion with each team (optional slides/videos)
1720-1730 EDT – Closing remarks</pre>
<div class='p'>If you prefer Czech language then tomorrow (1st December 2021) is going to be presentation on robotika.sk:
<a href='http://www.robotika.sk/mains.php' class='external'>Tomáš Krajník a Tomáš Rouček: Roboti pod zemou - DARPA Subterranean Challenge</a>
<b>1. 12. 2021, 17:30-19:00, on-line (51. prednáška)</b></div>
<div class='p'>Finally Tomáš Pícha created <a href='https://youtu.be/VQvxgw0YdPQ' class='external'>Robotika at DARPA SubT Challenge - Urban Circuit</a> as a side-effect of Kloubak K2
mobility video for the DARPA summit. Enjoy <span class='wink'></span></div>
<hr/>
<div class='p'><a name="partners"></a></div>
<h1>Partners</h1>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='https://www.tf.czu.cz/en/'><img src='/competitions/subtchallenge/stix/czu-tf-logo.png' alt='https://www.tf.czu.cz/en/' title='https://www.tf.czu.cz/en/' class='border' width='640' height='172'/></a><br/>
<a href='https://www.tf.czu.cz/en/'>https://www.tf.czu.cz/en/</a>
</td></tr></table></div>
<hr/>
<div class='p'><a name="supporters"></a></div>
<h1>Supporters</h1>
<div class='p'><table class='image_panel left' style='width: 306px;'><tr><td>
<a href='https://www.lord.com/'><img src='/competitions/subtchallenge/stix/lord-logo.png' alt='https://www.lord.com/' title='https://www.lord.com/' class='border' width='300' height='300'/></a><br/>
<a href='https://www.lord.com/'>https://www.lord.com/</a>
</td></tr></table>
<table class='image_panel ' style='width: 306px;'><tr><td>
<a href='https://www.sick.com/'><img src='/competitions/subtchallenge/stix/sick-logo.png' alt='https://www.sick.com/' title='https://www.sick.com/' class='border' width='300' height='300'/></a><br/>
<a href='https://www.sick.com/'>https://www.sick.com/</a>
</td></tr></table></div>
<div class='p'><table class='image_panel center' style='width: 506px;'><tr><td>
<a href='https://odriverobotics.com/'><img src='/competitions/subtchallenge/stix/odrive-logo.png' alt='https://odriverobotics.com/' title='https://odriverobotics.com/' class='border' width='500' height='169'/></a><br/>
<a href='https://odriverobotics.com/'>https://odriverobotics.com/</a>
</td></tr></table></div>
<hr/>
<div class='p'><a href='/competitions/subtchallenge/finals/cs#email'>contact form</a></div>
NASA SRCP2 finálehttps://robotika.cz/competitions/space-robotics-challenge/finals/cs2021-05-02T00:00:00ZMartin Dlouhý
Do soutěžního kola <i>NASA Space Robotics Challenge Phase2</i> postoupilo 22 týmů
včetně týmu <b>Robotika</b>. Skupina robotů má za úkol hledat minerály, vytěžit
je pomocí bagru a dopravit nákladním roverem na základnu. Pokud vás zajímají
detaily, tak čtěte dále …
<b>Update:</b> 27/9/2021 —
<a href='/competitions/space-robotics-challenge/finals/cs#210927'>František Brabec získává pro tým Robotika 2. místo!</a>
<hr/>
<h1>Soutěžní úloha</h1>
<div class='p'>Soutěžní úloha je kombinací úkonů z
<a href='/competitions/space-robotics-challenge/cs'>kvalifikačního kola</a>:
nalezení a dopravení co největšího množství minerálů na základnu.</div>
<div class='p'>K dispozici je nově <b>6 robotů</b>, kde si můžete vybrat ze tří typů: <i>scout</i>,
<i>excavator</i> a <i>hauler</i>. Jednotlivé typy se liší vybavením: <i>scout</i> má
senzor na detekci minerálů, <i>excavator</i> lžíci na bagrování/dobývání nerostů
a konečně <i>hauler</i> má korbu a jeho úkolem je transport na základnu
(<i>processing plant</i>).</div>
<div class='p'>Jednotliví roboti se liší i rychlosti pohybu: <i>scout</i> jede max 1m/s,
<i>excavator</i> 0.5m/s a <i>hauler</i> 0.8m/s. Jakou kombinaci pro robotů použít pro
nalezení a dopravení co největšího množství minerálů na základnu je už na
řešiteli. Je jasné, že od každého typu potřebujete alespoň jednoho robota, ale
jestli mít dvě nezávislé skupiny nebo sdíleného průzkumníka je na vás.</div>
<ul>
<li><a href='http://www.spaceroboticschallenge.com' class='external'>http://www.spaceroboticschallenge.com</a></li>
</ul>
<h1>Blog / Přehled</h1>
<ul>
<li><a href='/competitions/space-robotics-challenge/finals/cs#210503'>210503 - Webinář 5/5/2021 v 17:30 na Robotika.SK</a></li>
</ul>
<hr/>
<hr/>
<div class='p'><a id="210503"></a></div>
<h2>Webinář 5/5/2021 v 17:30 na Robotika.SK</h2>
<div class='p'>Tuto středu bude František Brabec, autor kvalifikačního řešní/hlavní
vývojář/vedoucí týmu, atd, mít prezentaci v rámci
<a href='http://www.robotika.sk/seminar.php' class='external'>Robotika.sk webináře</a>. Dozvíte se tam jak
detaily o soutěži, tak i aktuální stav a otevřené problémy …</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/six-robots.jpg'><img src='/competitions/space-robotics-challenge/finals/six-robots_t.jpg' alt='6 robotů, základna a servisní modul' title='6 robotů, základna a servisní modul' class='border' width='640' height='416'/></a><br/>
<a href='/competitions/space-robotics-challenge/finals/six-robots.jpg'>6 robotů, základna a servisní modul</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="210506"></a></div>
<h2>Záznam z přednášky Františka Brabce</h2>
<div class='p'>V této prezentaci autor František Brabec představí řešení týmu <i>Robotika In
Space</i>, t.j. strategii kterou tým robotů implementuje, architekturu systému
který řídí každého robota a výsledky, kterých zatím dosahujeme.</div>
<div class='p'><center>
<iframe width="640" height="360" src="https://www.youtube.com/embed/Qo0ijAgvYmY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<ul>
<li><a href='http://www.robotika.sk/seminar/2021/prednaska46.pdf' class='external'>Slides z přednášky</a></li>
</ul>
<hr/>
<div class='p'><a id="210802"></a></div>
<h2>NASA Konec!</h2>
<div class='p'>A je po všem, resp. z pohledu soutěžícího. Jak vidíte třiměsíční mezeru, tak za mne nic nového nebylo.
SRCP2 se plně věnoval pouze František a ja bych nejspíše selhal i v roli „zálohy” pokud by se vše pokazilo.
Soutěžní docker image byl odeslán, vyplněno mnoho formulářů (včetně toho, co kdo chce v Houstonu 26. září 2021 k obědu)
a teď bude následovat skoro dvouměsíční čekání na výsledek. Držím Frantovi moc palce a s jeho svolením
zveřejňuji aktuální <i>Robotika in Space</i> playlist:</div>
<div class='p'><center>
<iframe width="800" height="550" src="https://www.youtube.com/embed/DICcrSCyBzA?list=PL3KtjefdzWVmwn2tKYIgEZvPk7yYgILaE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<hr/>
<div class='p'><a id="210926"></a></div>
<h2>NASA Houston</h2>
<div class='p'>Franta z <a href='/competitions/subtchallenge/finals/cs'>DARPA SubT Challenge</a> odletěl v sobotu na vyhlášení vítězů <i>Space Robotics Challenge Phase 2</i>
do Houstonu a zatím se s nama podělil o množství pěkných fotografií:</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/space-shutle.jpg'><img src='/competitions/space-robotics-challenge/finals/space-shutle_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/cockpit.jpg'><img src='/competitions/space-robotics-challenge/finals/cockpit_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/space-shutle-size.jpg'><img src='/competitions/space-robotics-challenge/finals/space-shutle-size_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/boeing747.jpg'><img src='/competitions/space-robotics-challenge/finals/boeing747_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/control-center.jpg'><img src='/competitions/space-robotics-challenge/finals/control-center_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 5px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/franta-at-nasa.jpg'><img src='/competitions/space-robotics-challenge/finals/franta-at-nasa_t.jpg' alt='' title='' class='border' width='-1' height='-1'/></a>
</td></tr></table></div>
<div class='p'><table class='image_panel ' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/modules.jpg'><img src='/competitions/space-robotics-challenge/finals/modules_t.jpg' alt='' title='' class='border' width='640' height='237'/></a>
</td></tr></table></div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/rocket.jpg'><img src='/competitions/space-robotics-challenge/finals/rocket_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/rocket-detail.jpg'><img src='/competitions/space-robotics-challenge/finals/rocket-detail_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/falcon9.jpg'><img src='/competitions/space-robotics-challenge/finals/falcon9_t.jpg' alt='' title='' class='border' width='220' height='165'/></a>
</td></tr></table></div>
<h3><a href='https://vimeo.com/611974702/672a60b083' class='external'>Link na online vyhlášení vítězů</a></h3>
<hr/>
<div class='p'><a id="210927"></a></div>
<h2>František Brabec získává pro tým Robotika 2. místo!</h2>
<div class='p'>Franta získává pro tým <i>Robotika in Space</i> skvělé 2. místo v soutěži <i>NASA Space Robotics Challenge Phase 2</i></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/finals/robotika-2nd-place.jpg'><img src='/competitions/space-robotics-challenge/finals/robotika-2nd-place_t.jpg' alt='2. místo - Robotika/František Brabec' title='2. místo - Robotika/František Brabec' class='border' width='640' height='362'/></a><br/>
<a href='/competitions/space-robotics-challenge/finals/robotika-2nd-place.jpg'>2. místo - Robotika/František Brabec</a>
</td></tr></table></div>
<div class='p'>Gratulujeme!!! <span class='smile'></span></div>
<ul>
<li><a href='https://www.nasa.gov/directorates/spacetech/centennial_challenges/space_robotics/teams-develop-code-to-coordinate-robots.html' class='external'>Teams Develop Code to Coordinate Robots, Win $535,000 in Space Robotics Challenge</a></li>
</ul>
<hr/>
<div class='p'><a href='/competitions/space-robotics-challenge/finals/cs#email'>kontaktní formulář</a></div>
Space Robotics Challengehttps://robotika.cz/competitions/space-robotics-challenge/cs2019-10-14T00:00:00ZMartin Dlouhý
NASA vyhlásila pokračování soutěže <i>Space Robotics Challenge</i>, která probíhá
v simulovaném prostředí Gazebo/ROS. Cílem SRC2 je realizovat plně autonomně
dlouhodobou ISRU (<i>in-situ resource utilization</i>) misi na Měsíci. Cílem
skupinky robotů je lokalizovat důležité minerály, sbírat je a neztratit se v
neznámém prostředí. <b>Update:</b> 17/1/2020 —
<a href='/competitions/space-robotics-challenge/cs#210117'>Robotika vítězí v kvalifikačním kole NASA Space Robotics Challenge</a>
<hr/>
<h1>Blog / Přehled</h1>
<ul>
<li><a href='/competitions/space-robotics-challenge/cs#191017'>191017 - NASA Webinář</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200118'>200118 - Informace o robotech</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200305'>200305 - NASA Webinář 2</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200317'>200317 - Kvalifikační kolo začalo</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200325'>200325 - První data z Měsíce</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200401'>200401 - První ujetý metr</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200406'>200406 - Zatáčení</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200408'>200408 - Našli jsme poklad!</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200412'>200412 - ROS Python vs. ROS C++</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200418'>200418 - Nuda na Měsíci</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200420'>200420 - Úloha číslo 3 a barevné fleky</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200425'>200425 - První body a první rvačka ...</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200501'>200501 - Verze 0, 4 body, proměnné světy</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200503'>200503 - 5 bodů v úloze číslo 3</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200613'>200613 - Měsíc po měsíci</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200615'>200615 - The threshold score is 86</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200618'>200618 - Arabské tržiště</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200714'>200714 - Seed, Bulk and Rock</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200825'>200825 - Shutdown for Hurricanes</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200913'>200913 - NASA update a R2 video</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#200919'>200919 - 15+ Qualification Submissions</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#201213'>201213 - NASA leak</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#201225'>201225 - A Holiday Gift from Us to You</a></li>
<li><a href='/competitions/space-robotics-challenge/cs#210117'>210117 - Robotika vítězí v kvalifikačním kole NASA Space Robotics Challenge</a></li>
</ul>
<hr/>
<ul>
<li><a href='http://www.spaceroboticschallenge.com' class='external'>http://www.spaceroboticschallenge.com</a></li>
<li><a href='https://www.nasa.gov/solve/space-robotics-challenge-phase-2/' class='external'>https://www.nasa.gov/solve/space-robotics-challenge-phase-2/</a></li>
</ul>
<div class='p'>Soutěžící mají za úkol vyvinout software, který si poradí s úlohami v
simulovaném prostředí na měsíčním povrchu. Dostanou k dispozici Gazebo
simulátor pro vývoj a testování a ROS API pro komunikaci mezi roboty ve
virtualním robotickém týmu.</div>
<div class='p'>Pro úspěšné bodování v kvalifikačním kole je třeba splnit všechny 3 úlohy na
vlastním domácím počítači. Průběžné výsledky bude možné po celou dobu
kvalifikace nahrávat na dedikovanou webovou stránku.</div>
<h2>Seznam hledaných zdrojů</h2>
<ol>
<li>Water Ice (H2O)</li>
<li>Hydrogen (H2)</li>
<li>Carbon Dioxide (CO2)</li>
<li>Carbon Monoxide (CO)</li>
<li>Ammonia (NH3)</li>
<li>Hydrogen Sulfite (H2S)</li>
<li>Ethene/Ethylene (C2H4)</li>
<li>Methane (CH4)</li>
</ol>
<h2>Úloha 1 - lokalizace zdrojů (<i>Task 1: Resource localization</i>)</h2>
<div class='p'>První úloha je vyhledat zdroje v daném prostoru měsíčního povrchu. Objekty se
mohou nacházet jak na povrchu, tak pod povrchem. Úkolem je určit polohu co
nejvíce objektů s přesností +/- 2 metry vůči startovní pozici robota.</div>
<div class='p'>K dispozici budou senzory pro vnímaní, detekci a identifikaci zdrojů. Časově
bude tato úloha omezena na 45 simulovaných minut.</div>
<h2>Úloha 2 - sběr vzorků (<i>Task 2: Resource collection</i>)</h2>
<div class='p'>V této úloze půjde o sběr již lokalizovaných objektů.</div>
<h2>Úloha 3 - určení vlastní polohy (<i>Task 3: Self-localization</i>)</h2>
<div class='p'>V poslední úloze má robot za úkol se lokalizovat vůči známé pozici zadaných
objektů. 5 bodů bude za určení relativní pozice objektů, 5 za návrat na
základnu a 3 za správnou orientaci robota.</div>
<hr/>
<div class='p'><a id="191017"></a></div>
<h2>17. října 2019 — NASA Webinář</h2>
<div class='p'>Včerejší „webinář” moc nepřekvapil — v zásadě šlo o zopakování seznamu
organizátorů a sponzorů, rychlý přehled pravidel a zdůraznění, že Číňané se za
žádných okolností (stejně tak ještě některé další národnosti) nesmí zúčastnit.
Asi tuší, že by vyhráli.</div>
<div class='p'>Asi jedině překvapení bylo, že každý člen týmu musí být pojištěn na $100000 na
období soutěže, resp. kvalifikačního kola. Na dotazy, co budou mít roboti za
senzory a pod odpovídali: „to se dozvíte až v lednu až se přihlásíte a pošleme
vám balík se simulátorem.”</div>
<div class='p'>Udělal jsem alespoň pár <i>motivačních snímků</i>, ale pro detaily bych odkázal na
<a href='https://ninesights.ninesigma.com/servlet/hype/IMT?userAction=Browse&documentId=d4414ecdb345e2190f661e20df641dee&templateName=' class='external'>anglická
pravidla</a>.</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/webinar-003.jpg'><img src='/competitions/space-robotics-challenge/webinar-003_t.jpg' alt='' title='' class='border' width='640' height='341'/></a>
</td></tr></table>
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/webinar-004.jpg'><img src='/competitions/space-robotics-challenge/webinar-004_t.jpg' alt='' title='' class='border' width='640' height='341'/></a>
</td></tr></table>
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/webinar-012.jpg'><img src='/competitions/space-robotics-challenge/webinar-012_t.jpg' alt='' title='' class='border' width='640' height='340'/></a>
</td></tr></table></div>
<div class='p'>p.s. možná ještě poznámka na kvalitu simulace … prý nebude tak dobrá jako u
<a href='https://www.nasa.gov/directorates/spacetech/centennial_challenges/space_robotics/nasa-awards-citizen-inventors-top-prizes-in-space-robotics-challenge' class='external'>Space
Robot Challenge Phase1</a> a že hlavně půjde o spolupráci více robotů …</div>
<hr/>
<div class='p'><a id="200118"></a></div>
<h2>18. ledna 2020 — Informace o robotech</h2>
<div class='p'>Utekly tři měsíce (hrůza jak to utíká), kdy registrace byla uzavřena 20. prosince
2019. Předpokládám, že jsme se úspěšně registrovali, jelikož včera přišel mail
<b>Access to the Space Center Houston / srcp2-competitors project was granted</b>.
<span class='smile'></span></div>
<div class='p'>Jediný problém je, že vám o tom zatím nesmím skoro nic říci resp. nevím,
co mohu a co je „top secret”. NASA zatím postupuje podle plánu popsaného v
revidovaných pravidlech
<a href='https://ninesights.ninesigma.com/apps/IMT/UploadedFiles/95/f_92d4216ee45cf41a6edf8c6ddba3cf70/SRCPhase2_Official_Rules_rev_01.2020.pdf?v=1579072409' class='external'>SRCPhase2_Official_Rules_rev_01.2020.pdf</a>.
Zde najdete informaci: <i>January 15, 2020 --- Packet of Robot Information
Delivered to Competitors</i>, tj. NASA již tento bod splnila. Další deadline je
<i>March 16, 2020 --- Qualification Round Opens</i>, kdy asi vydají oficiálně ROS
simulátor (ten momentálně k dispozici zatím není, resp. jsem ho nikde
nenašel).</div>
<div class='p'>Jak již bylo řečeno minule případně na
<a href='https://youtu.be/E3YgAVom2sY?t=685' class='external'>webináři</a> bude se jednat o spolupráci
více robotů. Vozítka jsou tří druhů a trošku připomínají Spider3:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/robotour/marathon-2018/spider3.jpg'><img src='/competitions/robotour/marathon-2018/spider3_t.jpg' alt='' title='' class='border' width='320' height='200'/></a>
</td></tr></table></div>
<div class='p'>Vozítka jsou pro hledání minerálů, jejich naložení, případně dokonce vykopání,
a transport materiálu na základnu.</div>
<div class='p'>Koukám, že
<a href='https://ninesights.ninesigma.com/servlet/hype/IMT?userAction=Browse&documentId=d4414ecdb345e2190f661e20df641dee&templateName=&documentTableId=3422744976202683190' class='external'>oficiální
stránka s dokumentací</a> (veřejná) obsahuje i
<a href='https://ninesights.ninesigma.com/apps/IMT/UploadedFiles/96/f_6c9d9a717c92446a8335802b58f69a0c/FAQ_Document_rev._2_-_01.13.2020.pdf?v=1579072409' class='external'>FAQ
(často kladené dotazy)</a>, kde píšou:</div>
<ul>
<li><i>Q: Regarding "Task 2: Resource collection": Will the robotic excavator be
equipped with a resource sensor, as is the prospecting robot? To perform
sensing in permanently shadowed regions, is the excavator equipped with a light
or LIDAR?</i></li>
<li><i>A: Only prospecting robot will have resource sensor. All robot model will be
equipped with a light source, LIDAR and depth camera</i></li>
</ul>
<div class='p'>Tak to vám asi prozradit můžu … tj. průzkumný robot má senzor na detekci a
jinak všichni roboti mají světlo, LIDAR (2D) a kameru. Měl jsem za to, že je
obyčejná, ale v této odpovědi tvrdí, že je hloubková (RGBD) … neuvěřím,
dokud neuvidím první data. Aha, už to vidím <i>... this is preliminary robot
information and they are subject to change without notice</i>, takže nakonec to
bude možná úplně jinak, ideálně jako byla oficiální odpověd.</div>
<ul>
<li><i>Q: In the qualifiers, is the sensor suite specified by each team, or is it
generic and the same for all teams?</i></li>
<li><i>A: Same for all teams.</i></li>
</ul>
<div class='p'>… tj. všichni budou mít stejnou sadu senzorů.</div>
<ul>
<li><i>Q: We'd like to know if we'll have to handle a handful of robots (3-5), or
we need to prepare for a fleet of 10-20 robots.</i></li>
<li><i>A: Handful of robots.</i></li>
</ul>
<div class='p'>… no že roboti budou alespoň tři je jasné už teď, ale kolik jich bude celkem
moc jasné není. Je i možné, že počet robotů bude proměnný.</div>
<ul>
<li><i>Q: What kind of capabilities need to be developed to identify the regolith?
Do we need a computer vision expert, or will the robots have some sensor that
gives analyzes the environment for us?</i></li>
<li><i>A: Did you meant "volatile"? The simulation will be provided with volatile
sensor that detects different types of volatiles.</i></li>
</ul>
<div class='p'>… prostě průzkumný robot bude mít senzor schopný rozpoznat všechny druhy
minerálů.</div>
<ul>
<li><i>Q: When will the ROS simulation environment be available for download?</i></li>
<li><i>A: Qualification round opens on March 16th 2020.</i></li>
</ul>
<div class='p'>… <span class='smile'></span> už je jasné, proč jsem simulaci nikde nenašel. Pokračování v
březnu 2020.</div>
<div class='p'>p.s. v pravidlech vidím u popisu kvalifikačních kol:</div>
<ul>
<li><i>Competitors will be provided with</i> <b>a prospecting robot</b> <i>equipped with sensors
that allow for autonomous perception, as well as resource detection and
identification.</i></li>
<li><i>Competitors will be provided with</i> <b>a robotic excavator</b> <i>and multiple</i> <b>robotic
haulers</b> <i>that are equipped with sensors that allow for autonomous
perception.</i></li>
</ul>
<div class='p'>… prostě informace, že se v simulátoru budou používat 3 druhy robotů je oficiální.</div>
<div class='p'>p.s.2 <span class='wink'></span></div>
<pre>Date: Sat, Jan 25, 2020, 01:48
Subject: SRC2 - Insurance Approved</pre>
<div class='p'><i>This email is official acknowledgement that your insurance has been reviewed
and accepted by Space Center Houston and thus your team is officially accepted
into the Qualification Round.</i></div>
<div class='p'><i>Congratulations! Regards, The SRC2 Team</i></div>
<hr/>
<div class='p'><a id="200305"></a></div>
<h2>5. března 2020 — NASA Webinář 2</h2>
<div class='p'>Včera byl již druhý NASA webinář. V první části organizátoři procházeli
instrukce na wiki na GitLabu, kde od 16. března bude ke stažení simulátor a
testovací světy. Druhá část se pak věnovala dotazům.</div>
<div class='p'>Za nás bych řekl několik pozitivních zpráv:</div>
<ul>
<li>je možné o <i>SRC2</i> blogovat a publikovat screenshoty</li>
<li>je podporováno nahrávání a publikování videí zajímavých simulací</li>
<li>kód může být Open Source včetně soutěžního kódu a je to náš problém, pokud
by ho použili soupeři</li>
</ul>
<div class='p'>Co mne trošku zklamalo byl fakt, že <i>rover</i> byl pouze inspirován reálným
vozítkem a odpovídající platforma tedy v reálu neexistuje.</div>
<div class='p'>Pro zajímavost, NASA má v plánu pravidelné týdenní updates a stejně tak plánuje
„dávkově” reagovat na dotazy a reporty chyb.</div>
<div class='p'>p.s. ještě před seminářem jsem si pročítal pravidla a zaujala mne věta: <i>BHP
is a resources company based in Melbourne, Australia ... (an mining company).</i>
… prostě někoho zajímá autonomní dolování natolik, aby soutěž sponzoroval.</div>
<hr/>
<div class='p'><a id="200317"></a></div>
<h2>17. března 2020 — Kvalifikační kolo začalo</h2>
<div class='p'>Včera večer začalo <i>kvalifikační kolo</i>, které končí až někdy v srpnu 2020,
tj. relativně dost času. Vzhledem k situaci je to možná dobré téma jak trávit
večery. <span class='wink'></span> … jediný problém je, že už README začíná <b>Unauthorized
Distribution Strictly Prohibited</b>, takže to budou jenom drobné střípky. :-(</div>
<div class='p'>Nemám u sebe stroj, kde bych simulaci mohl snadno pustit (Ubuntu s NVidia GPU)
a pro vzdálený přístup to nemám úplně připravené. Franta to doma ale již
rozchodil a přislíbil nějaké screenshoty (ty podle posledního webináře povolené
jsou). Založil jsem tedy i první <i>Issue</i> (#44) a to jestli jde obejít stisk
„Play” tlačítka v simulačním okně. Píšu, že času je dost, ale termín je
zhruba stejný jako <a href='/competitions/subtchallenge/cs'>DARPA Cave Circuit</a>, takže
čím dříve kvalifikaci sfoukneme, tím lépe.</div>
<div class='p'>Ptáte se, co bude první krok? <span class='smile'></span> samozřejmě <b>Go 1 meter!</b> aneb
<a href='/competitions/robotem-rovne/cs'>Robotem Rovně</a> (asi další z akcí, která letos
nebude). Očekávám pád do kráteru nebo náraz na hranici světa … a ano, je
třeba z toho natočit video a to zde pak zveřejnit. (<i>nechápu, kde teď beru tu
dobrou náladu, ale možná je to tím, že zrovna nekoukám na zprávy...</i>)</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/screenshot-2020-03-17.jpg'><img src='/competitions/space-robotics-challenge/screenshot-2020-03-17_t.jpg' alt='Screenshot' title='Screenshot' class='border' width='640' height='268'/></a><br/>
<a href='/competitions/space-robotics-challenge/screenshot-2020-03-17.jpg'>Screenshot</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="200325"></a></div>
<h2>25. března 2020 — První data z Měsíce</h2>
<div class='p'>No asi to nikoho extra nenadchne, ale toto je první RGB obrázek z
<b>scout_1</b>:</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/first-image.jpg'><img src='/competitions/space-robotics-challenge/first-image_t.jpg' alt='První obrázek z Měsíce' title='První obrázek z Měsíce' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/space-robotics-challenge/first-image.jpg'>První obrázek z Měsíce</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/second-image.jpg'><img src='/competitions/space-robotics-challenge/second-image_t.jpg' alt='Obrázek z druhého přistání' title='Obrázek z druhého přistání' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/space-robotics-challenge/second-image.jpg'>Obrázek z druhého přistání</a>
</td></tr></table></div>
<div class='p'>Trošku mne mrzí, že jsem měl
<a href='/competitions/space-robotics-challenge/cs#200118'>před dvěma měsíci pravdu</a>:
<i>... neuvěřím, dokud neuvidím první data.</i>, takže to opravdu budou pouze RGB
data a nikoliv hloubková data: <i>They are supposed to be RGB. They are stereo
cameras, so you can use this to compute depth-from-stereo if you wish</i></div>
<div class='p'>Jinak s pořádnou GPU kartou ty obrázky budou asi hezčí (já byl vděčný za CPU
verzi dokud <i>No GUI</i> automaticky nepouští simulaci … <i>known bug</i>).</div>
<div class='p'>A tady je ještě pohled z <i>lidarview</i>:</div>
<div class='p'><table class='image_panel center' style='width: 256px;'><tr><td>
<a href='/competitions/space-robotics-challenge/lidarview-2nd-landing.jpg'><img src='/competitions/space-robotics-challenge/lidarview-2nd-landing_t.jpg' alt='Lidarview z druhého přistání' title='Lidarview z druhého přistání' class='border' width='250' height='259'/></a><br/>
<a href='/competitions/space-robotics-challenge/lidarview-2nd-landing.jpg'>Lidarview z druhého přistání</a>
</td></tr></table></div>
<div class='p'>Laser scan má rozsah záběr +/- 75 stupňů s rozlišením 1.5 stupně (tj. 100
měření). Dosah zatím nevím, ale ten „šutr” vpředu je zhruba v 15 metrech.</div>
<hr/>
<div class='p'><a id="200401"></a></div>
<h2>1. dubna 2020 — První ujetý metr</h2>
<div class='p'>No není to žádný velký odvaz, ale rover <i>scout_1</i> se konečně pohnul z místa a
ujel slibovaný metr (viz <a href='https://youtu.be/EUCP-GQQ7Wk' class='external'>video</a>). Ono to
vypadá, že tam není žádný <i>watchdog</i>, tj. když přestaneme posílat příkazy,
tak jede dál podle posledního …</div>
<div class='p'>Jinak řízení je pomocí <b>třinácti kloubů</b>, u kterých se nastavuje točivý
moment (torque) v Nm. 10Nm bylo málo, ale pro 100Nm to už jelo jak vidíte.</div>
<div class='p'>Na druhou stranu těchto 13 kloubů má
<a href='http://docs.ros.org/melodic/api/sensor_msgs/html/msg/JointState.html' class='external'>JointState</a>,
který obsahuje vedle jména, pozice a rychlosti i <i>effort</i> … tak možná půjde
poznat, že se rover zrovna pere s překážkou.</div>
<div class='p'>Ještě přidám jedno mini-video, kde je hezky vidět jak kamera „šumí” a
robotovi se podaří asi mírným couváním udělat kotrmelec do kráteru. <span class='wink'></span></div>
<div class='p'><center>
<iframe width="549" height="412" src="https://www.youtube.com/embed/NNmFVI9i7DM?list=PL2gPpyBs1e22ypIBFMnJkjijqhRGzdXTd" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<div class='p'>p.s. přidal jsem ještě do playlitu <a href='https://youtu.be/eUkWX82KPd0' class='external'>video od
Franty</a> nahrané přímo z GUI Gazeba … přeci jenom člověk získá lepší
představu, jak to okolí vypadá (mimochodem, počáteční pozice robota je pokaždé
náhodná).</div>
<hr/>
<div class='p'><a id="200406"></a></div>
<h2>6. dubna 2020 — Zatáčení</h2>
<div class='p'>Organizátorům se podařil pěkný bug, který už je ale teď možná odstraněn —
obě kamery jsou otočené o 90 stupňů vlevo a tak máme pěkné záběry levého kola:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='https://youtu.be/53hUZVnANTs'><img src='/competitions/space-robotics-challenge/left-wheel.jpg' alt='' title='' class='border' width='640' height='480'/></a><br/>
<a href='https://youtu.be/53hUZVnANTs'></a>
</td></tr></table></div>
<div class='p'>V posledním release už jsou k dispozici kompresované JPEG obrázky, takže
něco s čím si náš OSGAR lépe rozumí a umí snadno vygenerovat
<a href='https://youtu.be/53hUZVnANTs' class='external'>video ze dvou kamer</a>.</div>
<div class='p'>Zároveň to beru jako jasný důkaz, že už zatáčíme. <span class='wink'></span> Ale pokud rover náhodný
generátor umístí do kráteru, tak jsou překážky všude kolem a robot trošku
propadá klaustrofobii …</div>
<hr/>
<div class='p'><a id="200408"></a></div>
<h2>8. dubna 2020 — Našli jsme poklad!</h2>
<div class='p'>Přiznám se, že včera jsem měl zase „slabší chvilku”. Proč? No řešil jsem proč
mi nechodí měření z detektoru minerálů:</div>
<pre>root@gpu-desktop:/osgar# rostopic echo /scout_1/volatile_sensor
WARNING: no messages received and simulated time is active.
Is /clock being published?</pre>
<div class='p'>A pak mi došlo, že možná to posílá data <b>pouze v přítomnosti minerálů(!)</b> (což
mi následně potvrdili organizátoři i jeden další tým). No super … takže abych
ověřil, že mi funguje dobře zpracování dat ze senzoru, tak nejprve musím nějaký
vzorek nalézt.</div>
<div class='p'>Ale ono to má více rovin (viz <i>Pohádka o slepičce a kohoutkovi</i> <span class='wink'></span>). Protože
pokud chcete zkusit report nalezeného <i>pokladu</i>, tak:</div>
<pre>root@gpu-desktop:/# rosservice call /vol_detected_service "pose:
> x: 60.0
> y: -7.0
> z: 0.0
> vol_type: 'ethene'"
ERROR: service [/vol_detected_service] responded with an error:</pre>
<div class='p'>… jo ten error je prázdný.</div>
<div class='p'>Tentokrát jsem si prošel většinu z 100 issues této soutěže na gitlabu a Chris
(také soutěží v SubT) se tam ptal na podobnou věc …
<i>volatile</i>/poklad/minerál lze reportovat pouze pokud je robot v jeho
blízkosti a detekoval ho jeho senzor. A aby to nebylo moc jednoduché, tak pro
každý běh je startovní pozice robota náhodná a mám pocit, že i rozložení
<i>pokladů</i> je pokaždé jiné. Prostě jedna velká radost …</div>
<div class='p'>Tak k tomu dnešnímu titulku — poklad vypadá takto:</div>
<pre>root@gpu-desktop:/osgar# python3 -m osgar.logger /scout1-200408_100943.log
0 sys 6527 | 25 | 0.3Hz
1 app.desired_speed 3817 | 439 | 5.0Hz
2 app.artf_xyz 0 | 0 | 0.0Hz
3 app.artf_cmd 0 | 0 | 0.0Hz
4 app.pose2d 4343 | 658 | 7.5Hz
5 app.pose3d 0 | 0 | 0.0Hz
6 app.request_origin 0 | 0 | 0.0Hz
7 transmitter.raw 0 | 0 | 0.0Hz
8 receiver.raw 34957762 | 20990 | 238.3Hz
9 rosmsg.rot 79492 | 8528 | 96.8Hz
10 rosmsg.acc 79949 | 8528 | 96.8Hz
11 rosmsg.scan 134207 | 439 | 5.0Hz
12 rosmsg.image 0 | 0 | 0.0Hz
13 rosmsg.pose2d 3944 | 658 | 7.5Hz
14 rosmsg.sim_time_sec 0 | 0 | 0.0Hz
15 rosmsg.cmd 17864 | 659 | 7.5Hz
16 rosmsg.origin 0 | 0 | 0.0Hz
17 rosmsg.gas_detected 0 | 0 | 0.0Hz
18 rosmsg.depth 0 | 0 | 0.0Hz
19 rosmsg.t265_rot 0 | 0 | 0.0Hz
20 rosmsg./qual_1_score 26334 | 8778 | 99.6Hz
21 rosmsg./scout_1/volatile_sensor 398 | 398 | 4.5Hz
22 rosmsg./scout_1/camera/left/image_raw/compressed 17606034 | 875 | 9.9Hz
23 rosmsg./scout_1/camera/right/image_raw/compressed 17228123 | 874 | 9.9Hz
Total time 0:01:28.095461</pre>
<div class='p'>Vlastně dost pochybuji, že by to ocenil ještě někdo jiný než já <span class='wink'></span>, ale
klíčový řádek s nenulovýma hodnotama je: <b>rosmsg./scout_1/volatile_sensor
398 | 398 | 4.5Hz</b>. Ona radost mne asi rychle přejde, protože 398 zpráv
mělo dohromady 398 bajtů, což bude <i>None</i> … ale snad to půjde extrahovat z
nahraných <i>receiver.raw</i>.</div>
<div class='p'>OK, tak je to <b>methanol</b>:</div>
<pre>('methanol', 1.9950698614120483)
('methanol', 1.986070156097412)
…
('methanol', 0.688122034072876)
…
('methanol', 1.9825676679611206)
('methanol', 1.9922877550125122)</pre>
<div class='p'>… tj. v okamžiku vzdálenosti menší než 2 metry od <i>volatile</i> se dozvíme
vzdálenost a typ. Jinak na kameře není vidět vůbec nic, takže ten <i>methanol</i>
je pod povrchem.</div>
<div class='p'>p.s. poslední týden byl opravdu pěkný pohled na <i>reálný</i> Měsíc <span class='smile'></span></div>
<div class='p'>p.s.2
<a href='https://www.theguardian.com/us-news/2020/apr/07/trump-mining-moon-executive-order' class='external'>Trump
order encourages US to mine the moon</a></div>
<hr/>
<div class='p'><a id="200412"></a></div>
<h2>12. dubna 2020 — ROS Python vs. ROS C++</h2>
<div class='p'>Tuto zprávičku jsem chtěl zapsat už během naší pravidelné středeční
telekonference … ale nestalo se tak. Rozhodně si však zaslouží být
„zaprotokolována” a spadá do přihrádky <i>proč nemám rád ROS</i>.</div>
<div class='p'><a href='/competitions/space-robotics-challenge/cs'>NASA Space Robotics Challenge</a> se
liší od <a href='/competitions/subtchallenge/cs'>DARPA Subterannean Challenge</a> tím, že
pro komunikaci s ROS simulátorem lze přímo použít <i>rospy</i>, tedy Pythonovské
rozhraní. DARPA tam má navíc binární knihovny, které je třeba přilinkovat a to
už je celé snazší udělat v malém C++ wrapperu. V obou soutěžích používáme
stejnou strategii: OSGAR běží v Python3 a tak přes <i>ZeroMQ</i> komunikujeme buď
s Python2 (NASA podporuje pouze starší Ubuntu 18.x) nebo C++. Vše je ještě
takové neusazené a na simulátoru se stále pracuje, ale následující výpisy mne
rozhodně vyděsily:</div>
<pre>double free or corruption (out)
…
Assertion failed: check () (src/msg.cpp:347)</pre>
<div class='p'>Původně jsem si myslel, že je to <i>rospy</i>, resp. ROS hláška, ale po hledání na
Google vyskočilo <i>ZeroMQ</i> pokud se používá z více vláken?! Jak je to možné,
vždyť tam máme jenom jedno hlavní?? Odpověď je možná horší, než by programátor
čekal: <b>implementace stejného API je v Pythonu a C++ zásadně odlišná!!!</b>. Teď
už chápu, proč některé příklady v jednom jazyce nefungují v jiném. Je to jak
když dáte dětem na hraní zápalky … na tady máš <i>vlákna</i> a užij si to! <span class='wink'></span></div>
<div class='p'>V C++ je dost zásadní volat <i>spin()</i> nebo <i>spinOnce()</i>. Kupodivu
<i>spinOnce()</i> (odbav jednu zprávu) v Pythonu vůbec není a teď konečně chápeme
proč … ona totiž implementace <i>spin()</i> v Pythonu vůbec nic nedělá — je to
pouze hodně složitý sleep na několik řádek. Sigh. Zkrátím to: pokud <b>v
Pythonu</b> si vyžádáte čtení nového <i>topicu</i> (<i>rospy.Subscriber()</i>), tak
<b>pro každý subscriber vznikne nové vlákno</b>. Pokud toto uděláte <b>v C++</b>, tak
se žádné vlákno nevytváří a <b>nový subscriber se pouze zařadí do fronty</b>.</div>
<div class='p'>Pokud v tom velký rozdíl nevidíte, tak ROS je pro vás jak stvořený. Pokud však
používáte oba programovací jazyky, tak berte toto jako varování, že v ROSu
některé základní (programátorské) předpoklady splněné nejsou …</div>
<hr/>
<div class='p'><a id="200418"></a></div>
<h2>18. dubna 2020 — Nuda na Měsíci</h2>
<div class='p'>Nečekal bych to, ale už to je skoro nuda, když to „srovnám s výletem na
Kokořín ... co je tady? Prd. Tam byly alespoň stánky” (kdo nezná viz
<a href='https://cs.wikipedia.org/wiki/Dobyt%C3%AD_severn%C3%ADho_p%C3%B3lu' class='external'>Dobytí
severního pólu</a> nebo <a href='https://www.youtube.com/watch?v=HFGyQNKH7TY' class='external'>youtube
shot</a>). Ono to asi bude i tím, že jsem se zatím moc daleko nedostal a to už
teď byl druhý <i>milestone</i> pro <i>task2</i> (bagrování), který jsem zatím ještě
ani nezprovoznil. :-(</div>
<div class='p'>Tak alespoň malý status report. Zkouším řízení s tím, že měřená rychlost kol je
„nějaká divná” (strašně osciluje). Issue
<a href='https://gitlab.com/scheducation/srcp2-competitors/-/issues/110' class='external'>#110</a>
(private)):</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/variable-speed-80Nm.jpg'><img src='/competitions/space-robotics-challenge/variable-speed-80Nm_t.jpg' alt='oscilace měřené rychlosti' title='oscilace měřené rychlosti' class='border' width='640' height='357'/></a><br/>
<a href='/competitions/space-robotics-challenge/variable-speed-80Nm.jpg'>oscilace měřené rychlosti</a>
</td></tr></table></div>
<div class='p'>Na všechna kola posílám <b>80Nm</b>, tj. teoreticky se to muže rozkmitat, ale i
organizátoři to považují spíše za chybu simulace.</div>
<div class='p'>Vyřadil jsem <i>LocalPlanner</i> a už zase jezdím jenom rovně, dokud se nějak
nezaseknu a zjišťuji, zda jsem schopen ten stav poznat. Přešel jsem na řízení
jako u <a href='/robots/kloubak/cs'>kloubáků</a> s pohonem pouze na přední a měření
„odometrie” na pasivních zadních (v závislosti na směru pohybu) … ono je
tam totiž pěkně vidět kolize s <i>monolitem</i> nebo příliš strmý kráter. Pak si
couvnu a smykově zatáčím (zase lenost, není tam třeba nic počítat). A tak
jezdím, bourám, zatáčím, jezdím … a nic extra zajímavého tam není … „na
sever a na jih!”. <span class='wink'></span></div>
<div class='p'>Asi jediná vtipnější epizoda byla, když jsem rover převrátil na záda a přišlo
mi, že kamera s laserem je stále nějak stabilizovaná a po převrácení, že má
divný úhel. Na to jeden z vývojářů odpověděl: <i>if you flip the rover, all bets
are off. In reality, US Congress would then want to know why you've totaled
their shiny, multi-million dollar robot, assuming the Ames and JPL teams don't
get you first!</i></div>
<div class='p'>No nevím, zda to tu můžu zveřejňovat, ale myslím, že je to výstižné! <span class='smile'></span></div>
<hr/>
<div class='p'><a id="200420"></a></div>
<h2>20. dubna 2020 — Úloha číslo 3 a barevné fleky</h2>
<div class='p'>Už asi tuším co je na tom Měsíci tak fádní … ta šedivá „barva”! <span class='wink'></span></div>
<div class='p'>Přeskočil jsem teď na úlohu číslo 3, kdy je třeba přesně (tolerance 5 metrů)
lokalizovat satelit:</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/cube-run3.jpg'><img src='/competitions/space-robotics-challenge/cube-run3_t.jpg' alt='CubeSat a ProcessingPlant' title='CubeSat a ProcessingPlant' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/space-robotics-challenge/cube-run3.jpg'>CubeSat a ProcessingPlant</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/processing-plant.jpg'><img src='/competitions/space-robotics-challenge/processing-plant_t.jpg' alt='parkování u Processing Plant' title='parkování u Processing Plant' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/space-robotics-challenge/processing-plant.jpg'>parkování u Processing Plant</a>
</td></tr></table></div>
<div class='p'>Jedná se o žlutý krychlový satelit
<a href='https://www.nasa.gov/content/about-cubesat-launch-initiative' class='external'>CubSat</a> …
jenom ta velikost mi nějak nesedí :-( … rozhodně to není <i>10 cm x 10 cm x 10
cm</i>, ale při druhém přečtení toto je pouze <i>unit</i> a <b>The cube-shaped
satellites are spacecraft size in units or U’s, typically up to 12 U</b>, kde
krychle o straně 1.2m už by pravda být mohla. V každém případě visí někde mezi
5 až 25 metrů nad povrchem.</div>
<div class='p'>Po určení polohy satelitu (za 5 bodů) je třeba dojet na základnu (<i>Processing
Plant</i>), ohlásit se do vzdálenosti 5 metrů od vchodu (zase 5 bodů) a konečně
se zarovnat na značku s přesnosti do 10 stupňů (3 body).</div>
<div class='p'>Včera Franta natočil <a href='https://youtu.be/7d9Ks0QC5Hk' class='external'>externí video</a> (no jo no, je to normální uživatel, který má
GUI) a člověk si pak udělá o tom povrchu Měsíce lepší představu:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='https://youtu.be/7d9Ks0QC5Hk'><img src='/competitions/space-robotics-challenge/boring-moon-video.jpg' alt='' title='' class='border' width='640' height='472'/></a><br/>
<a href='https://youtu.be/7d9Ks0QC5Hk'></a>
</td></tr></table></div>
<div class='p'>p.s. no nečekal bych, že se mi po tom černobílém světe bude ještě stýskat!</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/color-noise.jpg'><img src='/competitions/space-robotics-challenge/color-noise_t.jpg' alt='Barevný šum' title='Barevný šum' class='border' width='320' height='240'/></a><br/>
<a href='/competitions/space-robotics-challenge/color-noise.jpg'>Barevný šum</a>
</td></tr></table></div>
<div class='p'>a ani nekomentuji, že JPEG se mi jinak rozbaluje v ROS Linuxovém dockeru a
Win7, tj. nesedí mi „počty žlutých pixelů”</div>
<div class='p'>p.s.2 tak jo, ještě jedno <a href='https://youtu.be/CrENbvFamW4' class='external'>vtipné video
robotického tělocviku</a> <span class='wink'></span> (<i>jak to celé stojí za houby, tak toto mi zase
vrátilo chuť pokračovat</i> … plus mail od NASA, že našli důvod resetu
kontrolleru, ale oscilace stále zkoumají)</div>
<hr/>
<div class='p'><a id="200425"></a></div>
<h2>25. dubna 2020 — První body a první rvačka …</h2>
<div class='p'>Není nad tým! <span class='smile'></span> Koukal jsem, kam jsem to
<a href='/competitions/fieldrobot/2012/technology/cs'>robotické desatero</a> psal a na
<a href='/competitions/fieldrobot/2012/cs'>Field Robot 2012</a> bych to rozhodně nehledal.
Ale Ctrl+F fungovalo <span class='wink'></span></div>
<div class='p'>Zpět k tématu … nějak to na mne padlo (neschopnost získat po více jak měsíci
snažení na Měsíci jediný bod) a v tomto okamžiku to převzal Franta. A výsledek?</div>
<pre>Requesting true pose
Volatile detection, getting closer: 1.935847
origin scout_1 43.153003 33.652192 0.129002 -0.172170 -0.117561 -0.419139 -0.883662
Origin received, internal position updated
Loc: 2.283263 -0.596569 -0.111458; Score: 0
Volatile detection, getting closer: 0.885438
…
Volatile detection, getting closer: 0.873248
Volatile detection, starting to go further, reporting 44.673080 33.116856
Reporting artefact carbon_dio at position 44.670000 33.120000 0.000000
Volatile report result: True
Loc: 4.313170 -1.963797 -0.193626; Score: 2
Loc: 6.051630 -3.997004 -0.260722; Score: 2</pre>
<div class='p'>Z tohoto pohledu <b>Verze 0 pro úlohu 1 je hotová!</b>. Byla tam ještě zrada, že
aby rover mohl bodovat, tak <i>střed robota</i> musel být do vzdálenosti 2 metrů
od <i>volatile</i>. Ten byl ale detekován senzorem, který je umístěn vpředu od
robota, tj. když došlo k první detekci na hranici 2m, tak střed robota byl
typicky ještě dál než požadovaná hranice.</div>
<div class='p'>Řešení, co Franta nakonec použil, je vyžádat si jednorázově informaci o pozici
robota v globální soustavě souřadné, ale reportovat detekovaný <i>volatile</i> až
při dosažení minimální vzdálenosti. Pozice z první detekce byla navíc
korigovaná a ten zhruba ujetý metr z dat z odometrie.</div>
<div class='p'>A než jsem se nadál, tak se Franta pustil do úlohy číslo 2, kde mají dva roboti
spolupracovat. Robotický bagr (<i>Excavator</i>) má nabrat horninu v blízkosti
získané pozice <i>volatile</i> a vysypat jí do robotického náklaďáku (<i>Houler</i>). Po
dosažení kritické hmotnosti tým získá bod.</div>
<div class='p'>Na rozdíl třeba od <a href='/competitions/subtchallenge/cs'>SubT</a> je zde možné řídit
všechny roboty z jednoho programu, aneb na problémy komunikace mezi roboty se
tady nehraje. Pro první kolo to Franta ale na mé přání stejně udělal
„postaru”, tj. pouští se dva nezávislé programy (navíc každý s vlastní ROS
proxy) a zbytek uvidíme. A už jedna z prvních jízd byla celkem ke koukání:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='https://youtu.be/ifgPuxl3lKw'><img src='/competitions/space-robotics-challenge/task2-fight.jpg' alt='' title='' class='border' width='640' height='484'/></a><br/>
<a href='https://youtu.be/ifgPuxl3lKw'></a>
</td></tr></table></div>
<div class='p'>Mě to přišlo, jako když se ti roboti perou, ale PavelS to komentoval slovy: <i>Mě
se spíše zdálo, že se pokoušejí o rozmnožování</i> <span class='smile'></span></div>
<div class='p'>Asi poznámka na okraj, že v soutěži samotné robotů bude daleko více, tj.
„rozmnoží se”…</div>
<hr/>
<div class='p'><a id="200501"></a></div>
<h2>1. května 2020 — Verze 0, 4 body, proměnné světy</h2>
<div class='p'>OK, tak <i>verze 0</i>, kdy rover jezdí náhodně a při první detekci se zeptá na
skutečnou pozici (tuto možnost má pouze jednou) a reportuje pozici při
nejbližším průjezdu, už je v
<a href='https://github.com/robotika/osgar/commit/4f16c8c9b535db3d99948c8704f512d77983dff9' class='external'>masteru</a>.
Při posledním testu jsem ho nechal jezdit 40 minut (reálného času a po pravdě
nevím, kolik to bylo simulovaného času — v pravidlech je <i>Time constraint:
45 simulation minutes for this task</i>) a dokonce dal celkem 4 body, tj.
podařilo se mu dostatečně dlouho držet platnou absolutní pozici. Jezdíme na
4WD, tj. klouže to a odometrie je nedostatečná, ale pro jednou to vyšlo. <span class='smile'></span></div>
<pre>…
0:14:27.685843 Volatile 7 detection at 0.185m, reporting 58.066348 -56.896968
0:14:30.666018 Loc: 55.43 -56.83 0.17; Score: [2, 1] 66.37 -76.02 1.89
…
0:14:46.584770 Volatile 25 detection at 2.000m, reporting 57.488306 -47.546196
0:14:50.676024 Loc: 57.94 -47.15 0.08; Score: [2, 1] 68.89 -66.33 1.80
0:14:57.949699 Volatile 1 detection at 1.867m, reporting 58.432105 -46.585204
0:15:00.679811 Loc: 58.58 -46.39 0.33; Score: [2, 2] 69.53 -65.57 2.05
…
0:15:24.390609 Volatile 25 detection at 1.748m, reporting 59.121294 -45.884399
0:15:24.451381 Volatile 1 detection at 1.749m, reporting 59.115627 -45.907418
0:15:30.693607 Loc: 59.06 -47.97 0.29; Score: [4, 3] 70.01 -67.15 2.01
0:15:40.697581 Loc: 59.94 -48.54 0.28; Score: [4, 3] 70.89 -67.72 2.00
…
0:29:38.361666 Volatile 0 detection at 1.717m, reporting 64.249616 18.268521
0:29:41.184570 Loc: 64.81 19.94 1.57; Score: [4, 3] 75.76 0.76 3.30
…
0:41:21.512480 Loc: 30.38 24.95 4.06; Score: [4, 3] 41.33 5.76 5.78
maximum delay: 0:00:00.003831</pre>
<div class='p'>Tak tady potkal čtyři „poklady” s indexy 7, 25, 1 a 0. První skoro krásně
přejel (18cm od středu), ostatní měl na hranici detekce dvou metrů.
Poznámka, že jenom kouká jestli něco neleží na cestě a k artefaktu aktivně
nezajíždí, zatím.</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/scout1-map.jpg'><img src='/competitions/space-robotics-challenge/scout1-map_t.jpg' alt='mapa po 40 minutách náhodné jízdy' title='mapa po 40 minutách náhodné jízdy' class='border' width='320' height='399'/></a><br/>
<a href='/competitions/space-robotics-challenge/scout1-map.jpg'>mapa po 40 minutách náhodné jízdy</a>
</td></tr></table></div>
<div class='p'>Ještě vás možná pobaví skutečnost, že rover jede rovně (100m s timeoutem 2
minuty), při nárazu si couvne, otočí se náhodně o 90 až 180 stupňů na místě a zase jede
rovně. Ale ty křivky úplně nevypadají rovné, není-liž pravda?! <span class='smile'></span> No to je
tím, že jezdíme v 3D terénu a není zde žádná regulace na směr z IMU … prostě
v kráteru to klidně bude jezdit dokolečka.</div>
<div class='p'>Ještě bych přidal „důkazový materiál” od Franty, že pozice „šutrů” se mezi
jednotlivými simulacemi mění:</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/stones-2020-04-26-09-56-00.jpg'><img src='/competitions/space-robotics-challenge/stones-2020-04-26-09-56-00_t.jpg' alt='svět v prvním běhu' title='svět v prvním běhu' class='border' width='640' height='268'/></a><br/>
<a href='/competitions/space-robotics-challenge/stones-2020-04-26-09-56-00.jpg'>svět v prvním běhu</a>
</td></tr></table>
<table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/stones-2020-04-26-09-56-40.jpg'><img src='/competitions/space-robotics-challenge/stones-2020-04-26-09-56-40_t.jpg' alt='svět v druhém běhu' title='svět v druhém běhu' class='border' width='640' height='268'/></a><br/>
<a href='/competitions/space-robotics-challenge/stones-2020-04-26-09-56-40.jpg'>svět v druhém běhu</a>
</td></tr></table></div>
<div class='p'>… skoro je to hra „najděte pět rozdílů” <span class='wink'></span></div>
<div class='p'>cbd (což bylo dokázati)</div>
<hr/>
<div class='p'><a id="200503"></a></div>
<h2>3. květen 2020 — 5 bodů v úloze číslo 3</h2>
<div class='p'>Včera psal Franta: <i>Teda nechci se nějak vytahovat</i> <span class='wink'></span></div>
<pre>Loc: [-21.366298 22.239406 -0.522004] [-0.002443 -0.028798 1.969255]; Score: 0
Starting to track cubesat
Someone else is driving True
1100
1101
Loc: [-17.641294 29.011444 -0.891152] [-3.119078 0.000175 1.038995]; Score: 0
1200
1201
Loc: [-12.882595 37.612236 -0.894276] [0.018675 -0.048695 1.081231]; Score: 0
Someone else is driving False
Requesting true pose
origin scout_1 3.415957 -7.723545 0.907761 0.014314 -0.028405 0.523845 0.851219
Origin received, internal position updated
Calculated angles roll=-0.005402, pitch=-0.063397, yaw=1.103511
Set camera angle to: 0.780000
1300
1301
Final frame x=234 y=227 w=45 h=45
Using pose: xyz=[3.415957 -7.723545 0.907761] orientation=[-0.005402 -0.063397 1.103511]
In combination with view angle 1.380944 0.809511 and distance 23.000000
Object offset calculated at: [2.994253 15.581522 16.650844]
Reporting estimated object location at: [6.410210,7.857977,17.558605]
Reporting artefact cubesat at position 6.410000 7.860000 17.560000
result: True
Loc: [3.457205 -7.635774 0.919047] [0.001396 0.153764 1.078963]; Score: 5
0:01:32.597836 turn - timeout at -63.9deg
1400
1401
0:01:34.662325 stop at 0:00:02.064489
Sleep and finish</pre>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='https://youtu.be/NQyPWMIA5k4'><img src='/competitions/space-robotics-challenge/round3-5pts.jpg' alt='' title='' class='border' width='640' height='480'/></a><br/>
<a href='https://youtu.be/NQyPWMIA5k4'></a>
</td></tr></table></div>
<div class='p'>Ptal jsem se, co se skrývá za <i>Someone else is driving</i> a jedná se přepínání
režimu náhodné procházky a navigaci směrem na detekovaný artefakt.</div>
<div class='p'>Je to prý opakovatelné, tak si to zkusím pustit také. <span class='smile'></span></div>
<div class='p'>p.s. víte, že mají na Měsíci kanalizaci? Po dnešní projížďce na kole jsem už
pochopil, co mi ty <i>volatiles</i> nejvíce připomínají … poklopy u kanálů!</div>
<div class='p'><table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/volatile1.jpg'><img src='/competitions/space-robotics-challenge/volatile1_t.jpg' alt='poklop 1' title='poklop 1' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/space-robotics-challenge/volatile1.jpg'>poklop 1</a>
</td></tr></table>
<table class='image_panel left' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/volatile2.jpg'><img src='/competitions/space-robotics-challenge/volatile2_t.jpg' alt='poklop 2' title='poklop 2' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/space-robotics-challenge/volatile2.jpg'>poklop 2</a>
</td></tr></table>
<table class='image_panel ' style='width: 226px;'><tr><td>
<a href='/competitions/space-robotics-challenge/plant.jpg'><img src='/competitions/space-robotics-challenge/plant_t.jpg' alt='Processing plant' title='Processing plant' class='border' width='220' height='165'/></a><br/>
<a href='/competitions/space-robotics-challenge/plant.jpg'>Processing plant</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="200613"></a></div>
<h2>13. červen 2020 — Měsíc po měsíci</h2>
<div class='p'>… na rovinu ono je to už měsíc a deset dní, co jsem psal poslední report a je
tam jistá korelace s tím, že projekt <i>Moon</i> systematicky posouval Franta sám
…</div>
<div class='p'>10. května 2020 — <i>Já jsem hotov, co děláš ty?</i> <span class='wink'></span> … tak toto poslal s
přiloženým obrázkem:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/round3-13pts.jpg'><img src='/competitions/space-robotics-challenge/round3-13pts_t.jpg' alt='Získání maxima bodu v úloze č. 3' title='Získání maxima bodu v úloze č. 3' class='border' width='320' height='235'/></a><br/>
<a href='/competitions/space-robotics-challenge/round3-13pts.jpg'>Získání maxima bodu v úloze č. 3</a>
</td></tr></table></div>
<div class='p'>Tj. po lokalizaci a úspěšném reportování pozice satelitu se robot vrátil na
základu, oznámil, že je doma (dalších 5 bodů) a pak vyhledal <i>basemarker</i> s
logem soutěže, upravil orientaci roveru a reportoval konec (poslední 3 body).
Celkem tedy 13 bodů, což je i maximum v této úloze.</div>
<div class='p'>Pak jsme trošku řešili infrastrukturu pro <i>request/response</i> požadavky. Ono
totiž poměrně hodně věcí je ve <i>Space Robotics Challenge Phase 2</i> řešeno
pomocí <i>ROS Services</i>: reporty, šlápnutí na brzdu, změna náklonu laseru s
kamerou, dotaz na globální souřadnici robota (je možné se zeptat nejvýše
jednou) a pod. No je to ještě na <i>TODO listu</i> … testovali jsme asi už tři
verze, ale stále to není „to ono” (za mne, tj. jsem navíc brzda :-(</div>
<div class='p'>2. června 2020 — <b>13 bodů za 30 sekund</b> … aneb Franta posunul
spolehlivost detekce modrého trojúhelníka a pak už je to na mne „skoro moc
rychlé” <span class='smile'></span></div>
<div class='p'>11. června 2020 — <b>R2 bod</b>, <i>Máš tam logy od prvního bodu v R2, ale byl to
boj. Nakládalo to jeden volatile asi 6 minut (čím jsi dále od středu, tím toho
nabereš míň a musíš to vícekrát opakovat).</i></div>
<div class='p'>Ona druhá úloha je možná nejtěžší, protože vyžaduje kooperaci dvou robotu. Bagr
(<i>excavator</i>) musí bagrovat dostatečně blízko pozice „naleziště” a pak
obsah lžíce vysypat na korbu náklaďáku (<i>hauler</i>) a to opakovat dokud
nenasbírá požadované množství. Viz <a href='https://youtu.be/kQFHpZ4TYnM' class='external'>video kopání
a nakládání</a>.</div>
<h3>Skyline Lokalizace</h3>
<div class='p'>Jedna z klíčových dovedností je schopnost robotů se lokalizovat (navíc v
systému NASA, protože jinak nezískáte body na nalezené artefakty ani nevíte kde
kopat v druhé úloze). Na
<a href='https://gitlab.com/scheducation/srcp2-competitors/-/issues/159' class='external'>gitlab issue
#159</a> (private) se poměrně široce diskutovalo téma o spolehlivosti odometrie a
penalizované „nápovědy” za dotaz „kde jsem?”. Výrazně jsem se tomu bránil
(a Franta nakonec souhlasil), jen zatím nemáme v kapse spolehlivé lokalizační
řešení … a rozhodně to není jednoduché.</div>
<div class='p'>Jeden návrh byl hledat vrcholy meteoritů (šutrů), které jsou při každém běhu
náhodně po testovacím prostoru rozmístěny.</div>
<div class='p'><table class='image_panel center' style='width: 663px;'><tr><td>
<span><img src='/competitions/space-robotics-challenge/skyline-peak.jpg' alt='Detekce vrcholu' title='Detekce vrcholu' class='border' width='657' height='519'/></span><br/>
<span>Detekce vrcholu</span>
</td></tr></table></div>
<div class='p'>On ten přechod nebe a povrchu Měsíce je relativně dobře definovaný, pokud není
obrázek úmyslně zašuměný.</div>
<div class='p'><table class='image_panel left' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/skyline-noise.jpg'><img src='/competitions/space-robotics-challenge/skyline-noise_t.jpg' alt='Jeden druh šumu' title='Jeden druh šumu' class='border' width='320' height='253'/></a><br/>
<a href='/competitions/space-robotics-challenge/skyline-noise.jpg'>Jeden druh šumu</a>
</td></tr></table>
<table class='image_panel ' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/skyline-noise2.jpg'><img src='/competitions/space-robotics-challenge/skyline-noise2_t.jpg' alt='Druhý typ šumu' title='Druhý typ šumu' class='border' width='320' height='253'/></a><br/>
<a href='/competitions/space-robotics-challenge/skyline-noise2.jpg'>Druhý typ šumu</a>
</td></tr></table></div>
<div class='p'>No daleko jsem se neposunul a ano, např. v kráteru, kde nic z okolí vidět není
je jediná možnost vyjet ven (<i>vylézt na strom</i>, „Jeníček a Mařenka TM”) a
rozhlédnout se tam. Robot nutně bude i v situacích, kdy opravdu nebude vědět,
kde se přesně nachází.</div>
<div class='p'>Nicméně jak vidíte, Frantu to nezastavilo a vlastně splnil všechny tři úlohy.
Pokud by k tomu byl již i <i>ROSbag</i>, tak možná splňujeme podmínky kvalifikace
… asi by to chtělo prověřit.</div>
<div class='p'>Ještě přikládám mapku meteoritů z Gazeba od Franty … jsou pouze tři druhy:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/rocks.jpg'><img src='/competitions/space-robotics-challenge/rocks_t.jpg' alt='Typy meteoritů' title='Typy meteoritů' class='border' width='320' height='283'/></a><br/>
<a href='/competitions/space-robotics-challenge/rocks.jpg'>Typy meteoritů</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="200615"></a></div>
<h2>15. červen 2020 — The threshold score is 86</h2>
<div class='p'>Necelých 24 hodin po té, co jsem zveřejnil „měsíční report” přišel mail od
<i>Automated Education Robot</i>:</div>
<div class='p'><i>Hello Team Leaders,</i></div>
<div class='p'><i>An update has been made to the Rules Document for the Qualification Round that
provides more clarification around scoring and tiebreakers. Attached, you will
find the current Rules Document, and it will also be posted in GitLab and the
Space Robotics Challenge site.</i></div>
<div class='p'><i>The specific changes to the doc are in section 4.0 and 8.1, but here's a quick
summary:</i></div>
<ul>
<li><i>In order to qualify for the Competition Round, you must meet a threshold of 86 points in the Qualifying Round across the three tasks as well as being in the top 25 teams</i></li>
<li><i>Each task will be worth $5,000, and you are eligible for all $5,000 if you have a score greater than 0</i></li>
<li><i>We added a second and third tiebreaker that we don't expect to use, but are happy to have in place.</i></li>
</ul>
<div class='p'><i>For complete details, please review the document. All updates are in red.
Best,
AER</i></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/prizes-ver4.jpg'><img src='/competitions/space-robotics-challenge/prizes-ver4_t.jpg' alt='Update pravidel (revize 06.2020b)' title='Update pravidel (revize 06.2020b)' class='border' width='640' height='279'/></a><br/>
<a href='/competitions/space-robotics-challenge/prizes-ver4.jpg'>Update pravidel (revize 06.2020b)</a>
</td></tr></table></div>
<div class='p'>Mimochodem, pravidla jsou volně ke stažení na <a href='http://www.spaceroboticschallenge.com' class='external'>http://www.spaceroboticschallenge.com</a>.</div>
<div class='p'>Neovládl jsem se a napsal NASA jestli si z nás dělají srandu?!
(<a href='https://gitlab.com/scheducation/srcp2-competitors/-/issues/175' class='external'>#175</a>, private
repo). A vypadá to, že to nebyl omyl: <i>The threshold of 86 is a function of
the total maximum points and our expectations of a minimum "passing" score for
the simulation to be valuable to NASA, thus the odd number.</i></div>
<div class='p'>Task 3 je za 13 bodů max a toho již Franta opakovaně dosáhl, tj. tam už toho
více nevymačkáme. 86-13=73 … za nalezeni <i>volatile</i> a reportovaní lokace s
toleranci 2 metry v tasku 1 jsou 2 body. Za vykopání a naložení pak jeden bod
na osvícené straně a dva body na odvrácené straně. Na rovinu si myslím, že
získání toho prvního bodu už je úspěch a většina týmů to nedá. Ale teď nově za
kvalifikaci NASA nikomu nedá ani cent, pokud nedosáhne nedosažitelné hranice
… i jeden soutěžící počítal, když bude mapovat prostor maximální rychlosti
jaká je šance, ze objeví 2/3 artefaktů (podle Franty je úplné maximum 110 bodů,
ale to je třeba vykopat i artefakty, které se nachází na strmých svazích
kráterů nebo pod meteority …</div>
<div class='p'><b>NO COMMENT</b></div>
<hr/>
<div class='p'><a id="200618"></a></div>
<h2>18. červen 2020 — Arabské tržiště</h2>
<div class='p'>No snad nikoho (zase) neurazím, ale trošku mi to dohadování s NASA připomnělo
<i>arabské tržiště</i>. Nejprve neuvěřitelně přepálená cena a když se zákazník
chvíli dohaduje, tak to postupně zkonverguje k nějaké rozumné částce: <i>After
taking another look, a threshold score of 20 seems fair for the Qualification
Round.</i>. Tak jo (*)</div>
<div class='p'>To nás vrací zpátky do hry, resp. to nám dává smysl pokračovat ve hře o $15k za
kvalifikaci. Franta mezi tím připravil
<a href='https://github.com/robotika/osgar/pull/551' class='external'>pull request</a> s verzi 0 pro
druhou úlohu, která získá 0 až 3 body. Suma sumárum 4 + 3 + 13 = 20 … ty jo,
oni nás snad vzali jako referenci. <span class='wink'></span></div>
<div class='p'>Ještě možná stránka ze včerejšího callu:
<a href='https://spacenews.com/astrobotic-wins-nasa-contract-to-deliver-viper-lunar-rover/' class='external'>Astrobotic
wins NASA contract to deliver VIPER lunar rover</a> … tak to možná má smysl dělat …</div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/astrobotic-viper.jpg'><img src='/competitions/space-robotics-challenge/astrobotic-viper_t.jpg' alt='Astrobotic will deliver the VIPER rover, seen in this
illustration atop the company's Griffin lunar lander, to the south polar region
of the moon in late 2023 under a CLPS task order valued at $199.5 million.
Credit: Astrobotic' title='Astrobotic will deliver the VIPER rover, seen in this
illustration atop the company's Griffin lunar lander, to the south polar region
of the moon in late 2023 under a CLPS task order valued at $199.5 million.
Credit: Astrobotic' class='border' width='640' height='353'/></a><br/>
<a href='/competitions/space-robotics-challenge/astrobotic-viper.jpg'>Astrobotic will deliver the VIPER rover, seen in this
illustration atop the company's Griffin lunar lander, to the south polar region
of the moon in late 2023 under a CLPS task order valued at $199.5 million.
Credit: Astrobotic</a>
</td></tr></table></div>
<div class='p'>(*) viz knížku <a href='https://www.databazeknih.cz/knihy/cesta-18' class='external'>Cesta/Cormac McCarthy</a></div>
<hr/>
<div class='p'><a id="200714"></a></div>
<h2>14. červenec 2020 — Seed, Bulk and Rock</h2>
<div class='p'>Několik lidí se mne nezávisle ptalo, jestli už jsme NASA challenge vzdali —
je to dobra indikace, že bych měl updateovat tento blog. Nevzdali, konec
update. <span class='wink'></span></div>
<div class='p'>Těma dvaceti body na kvalifikaci to neskončilo. Skoro bych to nazval
<a href='https://www.csfd.cz/film/5238-star-wars-epizoda-v-imperium-vraci-uder/prehled/' class='external'>Impérium
vrací úder</a> aneb když si soutěžící vyhádali snížení počtu bodů pro kvalifikaci,
tak pojďme změnit simulátor i celý princip vyhodnocovaní! Dobrý trik co?!
Myslím, že se máme ještě co učit … ale třeba nejsou tak zlí úmyslně <span class='wink'></span></div>
<div class='p'>Simulace je teď 10x rychlejší, resp. místo po 10ms se simuluje po 1ms. Všechny
senzory jsou zašuměné (to je prý motivace pro redukci simulačního kroku, aby
měl člověk zase šanci to „odšumět”), ale důsledek je ten, že simulace dříve
běžící skoro v reálném čase teď je až 10x pomalejší. Pak jeden 45min test na
starém stroji může zabrat skoro den … no prima.</div>
<div class='p'>Druhá zrada je ve změně tření — teď to všechno klouže jak na ledové ploše a
je třeba jezdit velmi opatrně. Na druhou stranu po integraci primitivního PID
kontroleru na motory už je to zase skoro použitelné. Změna byla i v kloubech u
bagru, ale to nevím, zda už opravili?</div>
<div class='p'>A pokud by toho bylo málo, tak se změnil i povrch samotný. Přibyly nové typy
kamenů, vše vypadá nějak texturovaně … má to pomoci vizuální odometrii, ale
nevím. Také dříve špičaté kameny jsou teď zaoblené, tj. hledání vrcholů, resp.
jejich pozice už tak stabilní není.</div>
<div class='p'>Proč název <i>Seed, Bulk and Rock</i> aneb <i>Semínko, Dávka a Kámen</i>?</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/robot-on-rock.jpg'><img src='/competitions/space-robotics-challenge/robot-on-rock_t.jpg' alt='Žába na kameni' title='Žába na kameni' class='border' width='320' height='236'/></a><br/>
<a href='/competitions/space-robotics-challenge/robot-on-rock.jpg'>Žába na kameni</a>
</td></tr></table></div>
<div class='p'>Tento obrázek mi poslal včera Franta, jako jeden z výstupů dávkového testování
(viz
<a href='https://github.com/robotika/osgar/blob/master/moon/bulk_test.sh' class='external'>moon/bulk_test.sh</a>).
Prostě to pouští dokola simulace s rozdílným <i>seed</i> pro náhodný generátor
Měsíčního světa. To je nová <i>feature</i>, za kterou bych NASA pochválil, i když
není 100% spolehlivá. Prostě než testovat na úplně náhodném světě, tak můžete
zadat <i>seed</i> parametr a pro stejné číslo by to měl být identický svět.
Simulace ale rozhodně stejná není, protože i při vypnutí šumu (další
<i>feature</i>) rover dopadne na jiné místo nebo se trošku sklouzne, než
nastartuje váš řídící program:</div>
<pre>M:\git\osgar>python -m osgar.logger moon-round1-200711_202050.log –stream rpc.response
0:00:00.625548 16 ['0xe3e70682c2094cac629f6fbed82c07cd',
'origin -1.603658 5.103922 1.096226 -0.182118 -0.014257 0.979283 -0.087379']
0:23:24.037823 16 ['0x1846d424c17c627923c6612f48268673',
'service [/vol_detected_service] responded with an error: ']
0:29:51.270197 16 ['0x12e0c8b2bad640fb19488dec4f65d4d9',
'service [/vol_detected_service] responded with an error: ']</pre>
<div class='p'>vs.</div>
<pre>M:\git\osgar>python -m osgar.logger moon-round1-200712_205451.log –stream rpc.response
0:00:00.278639 16 ['0xe3e70682c2094cac629f6fbed82c07cd',
'origin -1.831382 5.065773 0.974008 -0.167647 -0.008114 0.981975 -0.086912']
0:07:14.362503 16 ['0x7c65c1e582e2e662f728b4fa42485e3a',
'service [/vol_detected_service] responded with an error: ']
0:13:18.138290 16 ['0x37ebdcd9e87a1613e443df789558867f',
'service [/vol_detected_service] responded with an error: ']</pre>
<div class='p'>… prostě je tam rozdíl a naše „náhodná procházka” pak potká trošku jiné
„poklady” (volatiles), přestože jsou snad na stejných pozicích.</div>
<div class='p'>Co dál? Už se těšíme na zimu, resp. na <i>freeze</i> nebo lépe <i>NASA code
freeze</i>. Prostě okamžik, kdy už tu simulaci přestanou měnit a tak váš kód může
fungovat déle než týden do nového NASA release. Původně měl být 1. července a
nebyl. Další plán je 20. červenec, tak se necháme překvapit …</div>
<hr/>
<div class='p'><a id="200825"></a></div>
<h2>15. srpen 2020 — Shutdown for Hurricanes</h2>
<div class='p'>Včera přišel mail:</div>
<div class='p'><i>Due to impending weather as a result of Hurricanes Marco and Laura, NASA
JSC (located in Houston, TX, USA) needs to shut down power to the Center’s
servers.</i></div>
<div class='p'><i>As a result, the SRC Development Team will be unable to access the competition
servers until power is restored. Development, support and deployment is paused
until the storms pass.</i></div>
<div class='p'><i>We hope everyone in the path of this storm stays safe, and we will keep all of
the teams updated as we are able.</i></div>
<div class='p'>… jak člověk nechce sledovat zprávy, tak je pak občas překvapený …</div>
<div class='p'>V kontextu soutěže je asi ještě důležitější mail, co poslal NASA <i>Automated
Education Robot</i> před čtyřmi dny:</div>
<div class='p'><i>As we are nearing the qualification round deadline, and finalizing the
infrastructure to receive your submissions, we need the following pieces of
information from each team ...</i></div>
<div class='p'><i>We will be opening the submission repo for teams to push their submission
images on August 21, 2020, 4:00pm Central Time (ideally, as this email is being
sent). The submission scripts provided should push to this repo on command.</i></div>
<div class='p'><i>The Qualification Round closes to submissions on</i> <b>September 16, 2020</b><i>, at 5:00pm
Central Time. At this time, competitor access to this repo will be revoked.</i></div>
<div class='p'><i>We will be grading submissions over the remainder of the calendar year, with
results to be announced in early January 2021. Teams will receive their scores
at least two weeks prior to the announcement being made. From the moment scores
are sent to each team, the Team Leader has three days to submit an
appeal...</i></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<span><img src='/competitions/space-robotics-challenge/src-timeline-submission.jpg' alt='' title='' class='border' width='640' height='375'/></span>
</td></tr></table></div>
<div class='p'>tak už je to tady …</div>
<hr/>
<div class='p'><a id="200913"></a></div>
<h2>13. září 2020 — NASA update a R2 video</h2>
<div class='p'>Už mne pomalu přišlo líto času si stěžovat na vesmírnou agenturu … na druhou
stranu není jednoduché se všem zavděčit. Poslední „zářez” byl, když v rámci
<i>submission window</i> zablokovali přístup na jejich dockerhub, kam soutěžící
měli uploadovat svá řešení. Myslím si, že Frantova domněnka, že je to z důvodu
velmi špatné bezpečnosti — ostatní týmy mohly nejen vidět ostatní řešení,
ale nejspíše si je i stáhnout a „kouknout se dovnitř” (netestováno). To že
<i>submission script</i> ani teď nefunguje, už mne vůbec nevzrušuje … a
mimochodem konec měl být za dva dny. Výjimečně mne potěšil mail, že <i>We
recognize that this is an additional layer for your submission, and in the
spirit of supporting the teams, we are extending the submission deadline to
Friday, September 18th, 5pm Central Time.</i> Přidali tam možnost (nepovinnou)
šifrovat ten docker image — detaily jsem nestudoval a ani to nemáme v plánu,
když i zdrojové kódy jsou za nás k dispozici.</div>
<div class='p'>Minulý týden dělal Franta „testovací submission” a to jsme byli třetí tým,
který to na dockerhub nahrál. Teď už je to nepřístupné a je pouze vidět, že
někdo z <i>scheducation/srcp2_qualification_submissions</i> stahoval image 43x.</div>
<div class='p'>Aby tento „měsíční report” nevyzněl tak plně negativně, tak bych zveřejnil
Frantovo 45min video pro <i>Run 2</i>, kdy robotický bagr (<i>excavator</i>)
spolupracuje s robotickým náklaďáčkem (<i>hauler</i>) a společně se snaží vytěžit
co nejvíce <i>volatiles</i>, jejichž absolutní pozice dostanou jako vstup.</div>
<div class='p'><center>
<iframe width="800" height="570" src="https://www.youtube.com/embed/E9TK0aOlY_Q" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center></div>
<div class='p'>V tomto pokusu získali společně 6 bodů, což by na kvalifikaci stačilo (za
předpokladu 13 bodů z R3 a alespoň jednoho bodu v R1).</div>
<hr/>
<div class='p'><a id="200919"></a></div>
<h2>19. září 2020 — 15+ Qualification Submissions</h2>
<div class='p'><i>Game is over</i> — v pátek organizátoři uzavřeli „okénko pro odeslání
řešení” — <i>On 9/19/2020 2:01 AM, srcp2-dev-1 wrote: The submission window
for the SRCP2 Qualification Rounds is now closed. We would like to thank all
the teams who participated, and we look forward to assessing the results.</i></div>
<div class='p'>Den před uzávěrkou bylo pouze 7 podaných řešení, v pátek pak 15 a těsně před
uzávěrkou přibyly ještě další 2. Teď už jsou stránky nedostupné, takže jak to
bylo doopravdy se dozvíme asi až v lednu 2021.</div>
<div class='p'>Za sebe jsem zvědavý, jak to nakonec budou vyhodnocovat. Pokud pro každé kolo
zkusí tři různé světy a do bodování vezmou maximum, tak snad nějaká šance
získat nutných 20 bodů je, ale čert ví, co si ještě vymyslí. Co jsem psal
Frantovi — pokud bych tušil, jak se pravidla a simulátor od zahájení soutěže
změní, tak bych do toho nešel. Ale zase to byl dobrý protipól
<a href='/competitions/subtchallenge/cs'>DARPA SubT</a>, na který si už tak moc nestěžuji.
<span class='wink'></span></div>
<div class='p'>p.s. možná je tady teď vhodné místo veřejně poděkovat Frantovi, že to, na rozdíl
od mne, nevzdal a dotáhl to až do konce … díky!!!</div>
<hr/>
<div class='p'><a id="201213"></a></div>
<h2>13. prosinec 2020 — NASA leak</h2>
<div class='p'>Jak jsem psal v září, nějaké užitečné informace o soutěži se nejspíše dozvíme
až v lednu 2021. Na SRC2 fóru byl před měsícem dotaz, jestli alespoň nemůžou
prozradit jaké světy (<i>random seeds</i>) použili pro vyhodnocení? Zatím stále bez
odpovědi. Co jsem ale v daném příspěvku přehlédl byl
<a href='https://www.facebook.com/SpaceCenterHouston/videos/648662462419564/' class='external'>odkaz na
facebook</a>. Je tam video, kde už první náhled mne vytáčí <span class='wink'></span></div>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/rovers-swarm.jpg'><img src='/competitions/space-robotics-challenge/rovers-swarm_t.jpg' alt='SWARM roverů' title='SWARM roverů' class='border' width='640' height='400'/></a><br/>
<a href='/competitions/space-robotics-challenge/rovers-swarm.jpg'>SWARM roverů</a>
</td></tr></table></div>
<div class='p'>Proč? No připomíná vám to rovery z kvalifikačního kola? Případně ta základna?
Ani náhodou! Tj. všechny detektory bude třeba ladit znova (já vím, já to
nedělal, tak ať si nestěžuji). To samé původně výrazný přistávací modul je teď
sotva vidět, sigh. (jediný garantovaný <i>landmark</i>)</div>
<div class='p'>V textu je: <i>Our judges are currently reviewing the qualifying round
submissions for the Space Robotics Challenge, presented by BHP. We had 458
participants competing in 123 teams from around the world. We can’t wait to see
who qualifies for the next round!</i>, tj. 458 účastníků a <b>123 týmů</b> …
zpětně mi to přijde trošku nadsazené, ale je možné, že to jsou týmy, co
vyplnili registraci, ale fakticky nikdy nic neudělali.</div>
<div class='p'>No to jsem tedy zvědav, co si ještě vymysli!</div>
<div class='p'>Jo a ten <i>leak</i> — někdo si v tom videu na konzoli všiml, že to běží pod
jiným ROSem a jiným Gazebem:</div>
<div class='p'><table class='image_panel center' style='width: 326px;'><tr><td>
<a href='/competitions/space-robotics-challenge/nasa-finals-gazebo-11-2.jpg'><img src='/competitions/space-robotics-challenge/nasa-finals-gazebo-11-2_t.jpg' alt='ROS Noetic, Gazebo 11.2' title='ROS Noetic, Gazebo 11.2' class='border' width='320' height='454'/></a><br/>
<a href='/competitions/space-robotics-challenge/nasa-finals-gazebo-11-2.jpg'>ROS Noetic, Gazebo 11.2</a>
</td></tr></table></div>
<hr/>
<div class='p'><a id="201225"></a></div>
<h2>25. prosinec 2020 — A Holiday Gift from Us to You</h2>
<div class='p'>NASA jsou fakt vtipálci. <span class='wink'></span> Na vánoce psal <i>Automated Education Robot</i>:</div>
<div class='p'><i>If you are receiving this email, then we are excited to inform you that you
will be invited to participate in the Competition Round of the Space Robotics
Challenge starting in January! This is not the official announcement, but we
thought we'd share the good news with you during the holiday season as a
special gift.</i></div>
<div class='p'>tj. pokud jste dostali tento mail, tak to znamená, že se můžete účastnit
soutěžního kola SRC, které začíná v lednu! To zní dobře, protože to znamená, že
<b>Robotika In Space</b> skončila do dvacátého místa (postupuje pouze 20 týmů z
kvalifikace). <span class='smile'></span></div>
<div class='p'><i>On Sunday afternoon, a scheduled email will go out to each team leader
discussing their scores and any money that may be awarded. As a part of that
email, we will discuss an appeal process if you have evidence that your scores
may not reflect your work. In short, there will be a form through which you can
submit an appeal. The deadline for the appeal will be 5 pm CST, Wednesday,
December 30, 2020.</i></div>
<div class='p'>(ano, jsem si vědom, že tato informace nejspíše neměla být zveřejněná a tak jí
asi brzy nahradím)</div>
<div class='p'><i>That's all for now. Happy Holidays, and we look forward to the Competition
Round!</i></div>
<hr/>
<div class='p'><a id="210117"></a></div>
<h2>17. leden 2021 — Robotika vítězí v kvalifikačním kole NASA Space Robotics Challenge</h2>
<div class='p'><table class='image_panel center' style='width: 646px;'><tr><td>
<a href='/competitions/space-robotics-challenge/src-winners-map.jpg'><img src='/competitions/space-robotics-challenge/src-winners-map_t.jpg' alt='Kdo najde Robotiku?' title='Kdo najde Robotiku?' class='border' width='640' height='438'/></a><br/>
<a href='/competitions/space-robotics-challenge/src-winners-map.jpg'>Kdo najde Robotiku?</a>
</td></tr></table></div>
<ul>
<li><a href='https://www.nasa.gov/directorates/spacetech/centennial_challenges/space_robotics/22-teams-crack-code-qualify-for-final-stage-of-challenge.html' class='external'>oficiální výhlášení výsledků kvalifikace</a></li>
</ul>
<div class='p'><i>Six teams completed the three tasks or met the threshold score for the maximum award of $15,000:</i></div>
<ul>
<li>Olympus Mons, Barcelona, Spain (U.S. Citizen)</li>
<li><b>Robotika</b>, Annapolis, Maryland</li>
<li>Runaround Robots, Cedar Falls, Iowa</li>
<li>Team Capricorn, Worcester Polytechnic Institute, Worcester, Massachusetts</li>
<li>Team Mountaineers, West Virginia University, Morgantown</li>
<li>Walk Softly, Niskayuna, New York</li>
</ul>
<div class='p'><i>One team completed two tasks and qualified for a $10,000 award:</i></div>
<ul>
<li>Mingo Mountain Robotics, Kettle Falls, Washington</li>
</ul>
<div class='p'>Nine teams completed one task qualified for a $5,000 award:</div>
<ul>
<li>AMI Technologies LLC, Edina, Minnesota</li>
<li>Future Robotics, Franklin, North Carolina</li>
<li>God & Golem, Inc., New York</li>
<li>Lycanthropic Lunar Lunatics, Ramona, California</li>
<li>MoonrAlders, Johnstown, Colorado</li>
<li>Team Swarmathon, University of New Mexico, Albuquerque</li>
<li>The University of Adelaide, Australia (U.S. Citizen)</li>
<li>UHCL/SJC, University of Houston – Clear Lake and San Jacinto College, Texas</li>
<li>Whalers, Nantucket, Massachusetts</li>
</ul>
<div class='p'><i>Six additional teams qualified to compete in the competition round:</i></div>
<ul>
<li>Columbia Space Initiative, New York</li>
<li>Team Schmidty, Bridgeville, Pennsylvania</li>
<li>The Luminosity Lab, Tempe, Arizona</li>
<li>Team Olrun, Evansville, Indiana</li>
<li>PRIME, Cypress, Texas</li>
<li>Purdue-Hongik Team, West Lafayette, Indiana</li>
</ul>
<hr/>
<ul>
<li><a href='https://media.statler.wvu.edu/news/2021/01/15/shooting-for-the-moon-wvu-qualifies-for-final-round-of-nasa-centennial-challenge' class='external'>článek konkurenčního týmu West Virginia University</a> (35 bodů)</li>
</ul>
<hr/>
<div class='p'><a href='/competitions/space-robotics-challenge/cs#email'>kontaktní formulář</a></div>