czech english

Lamia

Parrot Jumping Sumo v Pythonu

Jumping Sumo patří do rodinky MiniDrones, kterou Parrot představil loni. Na rozdíl od Rolling Spider (Jessica) a Bebop (Katarina) nelítá, ale pouze skáče. Robot dostal jméno Lamia a má stejný úkol jako Jessica loni: zdolat schody na Tour the Stairs … jen je na to tentokrát pouze týden! Blog update: 10/2 — END

Odkazy:

Obsah:



Blog

16. listopad 2015 — Předehra

Robota ještě nemám. Pokud vše dobře dopadne, tak si ho domu odnesu ve středu odpoledne … a slavnostní otevření festivalu bude ve čtvrtek, týden na to. Nebude to nuda . Chci se na to trošku připravit a hned první překvapení: link https://github.com/ARDroneSDK3 vede na stránku, kde se píše This organization has no public repositories. Hmm, to jsem zvědav, co se stalo.
Mám ještě staré klony repository, když jsem pracoval na Jessice a Katarině. OK, konec paniky. SDK je stále veřejná, jenom se změnilo jméno:
Tak co dál? Možná inspirativní video, co by Lamia měla umět. Skáče po schodech, do koše, na postel. Podle XML příkazů ale moc parametrů k dispozici nebude:
<cmd name="Jump">
    Request a jump
    <arg name="type" type="enum">
        Type of jump
        <enum name="long">
            Long jump.
        </enum>
        <enum name="high">
            High jump
        </enum>
    </arg>
</cmd>
Zaujalo mne, že Lamia by měla i vydávat zvuky (třída příkazů AudioSettings/Theme s hodnotami robot, insect a monster). Nabízí i jednoduché skriptování (asi příliš silné slovo) pomocí RoadPlan (viz tutoriál).
Dnešní záznam bych uzavřel odkazem na projekt Sumo Charge, který má v plánu autonomní dobíjení se vzdáleným přístupem přes internet. Odkazuje dále na JumpingSumo-Python, což by možná mohl být první start (i když jsem plánoval copy & paste Katariny).
p.s. jdu se koukat na televizi … nějaký seriál Já a robot (ano, obsahuje v názvu klíčové slovo a to mi teď stačí )

17. listopad 2015 — Pružiny

Robota ještě nemám, venku prší, tak zatím brouzdám po webu. Přes varovné hlášky typu I have a problem with jumping "wheel" in the center of the jumping sumo --- broke after a few uses. nebo drsnější I tried to show it off to my friends, and not only did it not jump again, after one minute after power one it started to burn with white flame and smoke . bych se začal trošku bát. Přeci jenom pro vylezení schodů bude třeba 21x skočit. Na druhou stranu uživatelů budou tisíce a toto je snad jenom „špička ledovce”.
Přes rozbité skákání jsem se dostal k videu How to replace Jump Mechanism on Parrot Jumping Sumo s detaily natahovacího kolečka:
A toto by mohlo být i mechanické řešení mého problému — Lamia by měla skákat cca 80cm, ale je nutné se dotknout všech schodů, takže bych potřeboval cca 1/4 výšku … a to by mohla řešit výměna pružiny za slabší. Mechanismus totiž vypadá jako nabít a pal, tj. žádné mezistavy.
Na téma pružin jsem pak zjistil, ze pérovna je hned „za rohem” (pruziny.cz), případně že Alcomex má na webu rovnou katalog s tabulkami. Počkal bych ale až jak bude Lamia vypadat ve skutečnosti. A ještě jeden odkaz na výpočet pružin.

23. listopad 2015 — Codility

Robota ještě nemám, abych parafrázoval své předešlé příspěvky. Není na skladě a minulé úterý nedorazil. Alternativa by byla si koupit novější model na Alze a pak ho vrátit, ale to se mi nějak příčí. A 4999Kč se mi za to také nechce dát (starší model byl za 2999Kč … i když teď tam vidím rozbalený za 4135Kč, tak to asi vánoce dělají paseku).
Co v mezičase dělat? Byl jsem „programátorsky nabuzený”, takže, když jsem narazil na Codility Challenge, jsem to po fyzicky náročném víkendu prubnul . Ještě to není nejhorší, něco naprogramovat asi umím. Povolený čas 3h na 3 úlohy asi byl OK (programovací jazyk si můžete zvolit, u mne to byl jednoznačně Python). Naštěstí nejsem amík, takže mne nemusí trápit, že jsem nevyhrál $2500 = 63000Kč = 21000Kč/h … to by šlo . Ono i druhá cena 3x drona Lily by nebyla špatná … minimálně by bylo zase o čem na robotice psát . No nic, na to by člověk, resp. programátor, musel mít hodnocení (100, 100, 100). Okurková sezóna snad zítra skončí …

25. listopad 2015 — První pohyb

Dnešní titulek už zní nadějně, není-liž pravda? Ale růžové to není, ostatně jak by mohlo … robot bude zítra ráno a zítra večer (18h, NTK Galegie) je slavnostní zahájení festivalu. Mezi tím normální pracovní den. Nevydržel jsem to a „zainvestoval” hotovost do ROZBALENO RC model Parrot Jumping Sumo White s tím, že je to předražené a že jim to zítra (?) vrátím. Na krabici bylo navíc napsáno „04 Zápůjčky”, což je můj případ, nebo ne? No balení nebylo kompletní — chyběl nabíjecí kabel! Tak jsem to chtěl vrátit hned a oni, že na to mám 14dní … OK.
Nabíjení trvá 2 hodiny. Ano, opravdu. Tj. ve 20h jsem přišel z práce a ve 22h udělal první test. Popojel jsem kousek vpřed, kousek vzad a zkusil skočit. Jezdilo to, ale neskáče. Ono by to bylo divné, kdyby to hned vše fungovalo … nic, zítra pokračování.
Ještě jeden vtipný (?) detail: po vložení baterie robůtek ožije, rozsvítí se mu oči a po chvíli začne tancovat! Měl jsem ho na stole, že ho připojím na nabíječku, tak jsem se trošku lekl.

27. listopad 2015 — FreeFlight 3

Včera večer jsem zkoušel Android aplikaci FreeFlight 3. Na pracovním testovacím telefonu byla ještě nainstalovaná z loňska (tehdy to byla minidrona Jessica) a bez problému se připojila, zobrazila pohled z kamery a mohl jsem hned popojíždět vpřed a vzad. Otáčet mi ale šlo jen o 90 a 180 stupňů. To mi chvilku trvalo, že musím mačkat display a naklánět telefon („mrtvá zóna” byla nastavena poměrně široce). A skákalo to! Tj. problém s pružinovým mechanismem není a je to čistě v „mém” software.
Co bylo trošku zklamání je výdrž baterie. Zkoušel jsem na dálkové ovládání zdolat soutěžní schody a mám vážnou obavu, že to baterie nevydrží ani když to budu brát po třech. Samotné skákání mne ale mile překvapilo. Lamia se po dopadu snaží okamžitě stabilizovat, podobně jako dvojkolka Segway, a tak v lepším případě jenom dosedne. V horším, hrana schodu, to po pružných kolečkách dopadne až daleko od schodiště. Mimochodem i pro Lamiu je dobré, že schodiště mají po obou stranách poměrně vysoké mantinely. A konečně se snaží udržet směr, takže jako program by mi stačil for-cyklus, ve kterém by byl jediný příkaz: skoč.
Druhé zklamání bylo, že video se dá nahrávat pouze do externí USB flashky (navíc s micro USB konektorem), která ale není součástí balení. Chtěl jsem vám ukázat jak to šlo, ale … sigh, je třeba rozchodit logování a z videopaketů bych to pak poskládal.
Jinak robůtky mám teď dva: „Lamia A” a „Lamia I” … toto označení jsem zvolil, aby si žádná nestěžovala „proč zrovna já jsem Béčko” (Cimrman). Libila se mi i AI kombinace a vlastně i písmeno ukazuje na zdroj (Alza, iCorner). Barevně by druhá vypadala spíše na Emmu Dax z Genetixu , ale nechť.
p.s. upravil jsem trošku README u haraisao/JumpingSumo-Python

28. listopad 2015 — Verze 0

Je doslova „za pět minut dvanáct” a konečně mám Verzi 0. Nevím, co jsem dělal špatně v tom japonském kódu, ale teď to upraveným kódem z Katariny skočilo.
Z detailů, na které jsem narazil a které později už nebudou zajímavé:
  • bílá Lamia se dala z notebooku připojit, ale hnědá nikoliv — problém byl v defaultní WiFi, která je na 5GHz a já potřeboval 2.4GHz. Lze vyřešit tak, že se podrží 3s zapínací tlačítko (u bílé jsem to možná včera udělal nechtěně, když jsem se jí snažil vypnout). Ano, dnes jsem klesl tak hluboko, že jsem si přečetl i manuál
  • Jumping Sumo používá jinou IP (192.168.2.1, Katarina měla 192.168.42.1)
  • základní příkazy pro pohyb jsou jiné (PCMD má teď jenom rychlost jízdy a zatáčení)
  • Sindy (náš pes) se, na rozdíl od dron, skákací potvory bojí (asi jak vydává zvuky)
  • Lamia skoro nic neposílá, jenom ping-pong časové známky (tj. změnil jsem vnitřní update() funkci)
  • video asi chodí po celých snímcích, protože původní 40960 bajtový buffer nestačil (teď jsem tam dal 240960)
  • zase jsem narazil na podraz s enum, který není bajt, ale čtyři bajty
Je čas jít spát. Zítra, resp. už dneska v 13h na viděnou v NTK Galerii …

5:30-7:30

Ještě pár poznatků, než vyrazím do NTK:
  • japonský kód stále neskáče … rezignoval jsem na něj a pokud se autor neozve, tak ho asi odstraním (i když jeho knihovna se mi líbí, že je celkem kompaktní)
  • zaujal mne identifikátor ARCOMMANDS_ID_JUMPINGSUMO_PILOTING_CMD_ADDCAPOFFSET a tak jsem ho společně s ovládáním hlasitosti (děsně to řvalo a v noci a brzy po ránu to není úplně chtěné) vyzkoušel (diff). Co to dělá? Otáčí robota o přesně definovaný úhel v radiánech a to by se na točitém schodišti mohlo hodit.
  • video není H264, ale sada klasických JPEG obrázků. Upravil jsem tedy video.py aby místo frame_XY.bin ukládal s koncovkou .jpg (diff). Včera jsem po skoku měl příliš krátkou pauzu, a tak let a dopad nebyl už logován. Dnešní „duch na židli” = snímek 0131 vypadá takto:
(omlouvám se za mizerné osvětlení)

29. listopad 2015 — Soutěž resp. přednášky

Včerejší soutěž dopadla nakonec celkem dobře, přestože jsem vynechal dopolední testování. Vedle totiž probíhala sekce robotických přednášek, které byly naprosto luxusní (!), a akustika v Galerii byla tak mizerná, že stačilo, aby se na druhé straně místnosti někdo bavil a už bylo špatně slyšet. Přednášky byly o evoluční robotice, robotech, kteří žijí v symbióze s rostlinami a směřují jejich růst, rekonfigurovatelní swarm roboti, roboti, kteří se vyrovnají s defekty svých částí, modulární stavebnice, kdy děti od osmi let jsou schopné postavit chodící nebo jezdící „tvory”, „genetický” drátový robot, který podle robotické DNA drát kombinovaný s motory zohýbá a výsledný „1D robot” se pohybuje v prostoru … fakt luxus a špičkoví přednášející! Bylo nás tam cca 15 a z toho 6 přednášejících — z tohoto pohledu bych plakal.
No nic, to jsem odbočil, ale co mne trošku znáte, tak pochopíte, že jsem si vedle prostě hrát nemohl. Zmíním k tomu alespoň pár odkazů, co jsem si napsal:
… nějak mi teď přijde nepatřičné psát dál o problémech s řízením podle stavu baterek. Asi až … časem.

1. prosinec 2015 — Soutěžní kód

Raději doplním alespoň krátkou zprávu o použitém kódu než to vše zapomenu …
Asi bych začal odkazem na github, kde je stav skriptu, pro který Lamia získala maximum bodů (10 na točitém schodišti v posledním kole). Robot skákal, otáčel se o 10 stupňů po každém skoku a couval, aby se dotknul přeskočených schodů (jinak by nezískal bod). A právě s couváním byl největší problém. Řízení robota je asi obyčejné PWM, tj. když jsou baterky nabité, tak na „padesátku” ujede řádově více než když baterky dochází.
Včera (?) jsem pustil git pull na libARCommands a zaujal mne commit Add command to let the JS report its speed. Je tedy možné, že pokud flashnu firmware, tak Lamia začne reportovat svoji skutečnou rychlost?! Myslím, že to rozhodně stojí za pokus a pak by to soutěžení bylo o něčem jiném … možná až moc nuda .
Jinak jestli jste neviděli Lamii v akci, tak viz ČT art (no je tam vidět vlastně jenom jeden skok, tak nic).

3. prosinec 2015 — telnet

Lamia, stejně jako Heidi nebo Katarina podporuje telnet:
Prapůvodně jsem chtěl nahrát pouze nový firmware, ale ono i nejnovější dostupná verze verze je 1.99.0 a ta je ze začátku roku, tj. velmi pravděpodobně stejně informace o ujeté vzdálenosti, resp. aktuální rychlosti v cm/s posílat nebude.
Co jsem našel? Řekl bych, že už standardně se hlavní řídící program jmenuje dragon, přesněji dragon-prog, kterého pouští DragonStarter.sh. Zajímavý je adresář /usr/bin, kde jsou pomocné nástroje jako:
[JS] $ ls | grep js_
js_PCA96n
js_adc
js_motors
js_vbat
Předpokládám, že je třeba nejprve „zabít draka” a pak je možné je používat. Příklady výpisů:
[JS] $ js_motors
*****
"js_motors": Version 1.1
 Build for Proto A3

*****
     js_motors Usage:
 js_motors –help
 js_motors –stopall
   ---
    Description:
  This program is made to command Jumping Sumo Motors
   ---
    Options:
  -h,   –help
                              Dislay this help
  -S,   –stopall
                              Stop all motors!
  -r,   –right  <cmdRight>
                              Right motor command (-255->255)
  -l,   –left  <cmdLeft>
                              Left motor command (-255->255)
  -j,   –jump  <cmdJump>
                              Jump motor command (-255->255) XXX TODO Add time out!
   ---
    Example:
 TODO
*****
[JS] $ js_vbat
JS_VBAT : Vbat = 3.614986 V
[JS] $ js_adc
 ### save_or_print_results_mode = 4
mmap phy@0x400ea000 cpu@ 0x402e0000

** INIT DONE **

wait 1 sec…
START CAPTURE: => Ok
 __________________________________________________
| N loop | I jump | R wheel | offset |   N cycle   |
|     39 |    518 |     521 |  49152 |  2623983794 |
OUT OF LOOP (40 loops)
#### The End ! err=0 ; nbLoopBeforeErr=-1
#### munmap…
#### close driver…
#### close files…
a konečně
[JS] $ js_PCA96n
"js_PCA96n": Version 1.0

*****
     js_PCA96n Usage:
 Read  reg : js_PCA96n <regAdd>
 Write reg : js_PCA96n <regAdd> <regVal>
*****
Nuže draka jsem nezabil a možná ho dotazem na stav baterky zmátl, tak se zuřivě rozblikaly červené LEDky a robot se vypnul. Je i možné, že už baterie byla opravdu vybitá — příště testovat na nabíječce!
p.s. myslíte, že I jump = 518 je čítač dosud provedených skoků? Jestli ano, tak potěš …

4. prosinec 2015 — dragon.conf

Dnes jsem se moc daleko neposunul. Prohlížel jsem si konfigurace a moc mne nenadchly:

dragon.conf

{
      "JumpingSumo" :
      {
              "audio_theme" : 0,
              "net_outdoor" : 0,
              "volume" : 10.0,
              "wifi_autoselect_mode" : "2.4GHz",
              "wifi_band" : 0,
              "wifi_channel" : 13
      },
      "network" :
      {
              "auto_country" : 1,
              "country_code" : "NL",
              "default_c2dport" : 54321,
              "default_d2cport" : 43210,
              "product_name" : "JumpingSumo-PI040318AB4H029718",
              "service_type" : "_arsdk-0902._udp"
      }
}

system.conf

{
    "CKCM":{
        "Enable":true,
        "DisplayTargetTime":true,
        "DisplayThreadId":true,
        "DisplayThreadName":true,
        "DisplayThreadPrio":true,
        "DisplayPC":false,
        "PortType":3,
        "DeviceName":"/data/ftp/ckcm.bin",
        "UartBaudRate":115200,
        "SocketPort":23000,
        "MaxFileSize":1000000,
        "Delay":500,
        "TcpPort":23059,
        "Libraries":
        [
            {
                "Name":"TANGO",
                "Verbosity":0
            },
            {
                "Name":"TALA",
                "Verbosity":0
            }
        ]
    }
}
Stále jsem doufal v nějaký debug, který nastavím na True a Lamia začne posílat debug hlášky, ale nevypadá to nadějně … zatím.
Ještě pár ukázek z pouštění „draka”:
[JS] $ /usr/bin/dragon-prog –help
posix init start build on : Aug  4 2014 17:34:44
Use ctrl+\ (SIGQUIT) to end the application
plog drop: RR time quantum 0s 0ns
tid=(nil), [I] POS: sup log : stack size 16144 is too small, setting to 16384
tid=(nil), [I] dragonprog:
Usage: /usr/bin/dragon-prog [options]
Options:
-h | –help                     Print this message
     –version                  Print version informations
-i | –ip         <IP>          host IP
-v | –verbose    <V>
[JS] $ /usr/bin/dragon-prog –version
posix init start build on : Aug  4 2014 17:34:44
Use ctrl+\ (SIGQUIT) to end the application
plog drop: RR time quantum 0s 0ns
tid=(nil), [I] POS: sup log : stack size 16144 is too small, setting to 16384
tid=(nil), [I] dragonprog:
tid=(nil), [I] dragonprog: ----------–
tid=(nil), [I] dragonprog:          Version Informations :
tid=(nil), [I] dragonprog: BUILD_DATE           = 2014-08-04
tid=(nil), [I] dragonprog: BUILD_TIME           = 17h27m27s
tid=(nil), [I] dragonprog: BUILD_COMPILER       = pimo
tid=(nil), [I] dragonprog: BUILD_COMPUTER       = pimoEliteDesk
tid=(nil), [I] dragonprog: BUILD_DRAGON_VERSION = 1.0.80
tid=(nil), [I] dragonprog: ----------–
tid=(nil), [I] dragonprog:
a konečně pokus o verbose
[JS] $ /usr/bin/dragon-prog -v 2
posix init start build on : Aug  4 2014 17:34:44
Use ctrl+\ (SIGQUIT) to end the application
plog drop: RR time quantum 0s 0ns
tid=(nil), [I] POS: sup log : stack size 16144 is too small, setting to 16384
Initialize PAL log
date=000000065711, tid=(nil), tname=init, [E] POS: The callback is NULL
CKCM config loaded and started.
Enable 0 for TANGO
Enable 0 for TALA

----------
     MPU FACTORY CALIB:
----------
sizeof (HAL_mpu6050_factory_file_calibration_t) = 54
 SIZE     =       52
 VERSION  =        1 = 0x    1
 CHECKSUM =    29574 = 0x 7386
 gyro_offset : +0.01827 ; -0.00863 ; -0.05359
 gyro_gain   : +0.99116 ; +1.00688 ; +0.99578
 acc_offset  : -0.10199 ; +0.57647 ; -0.23113
 acc_gain    : +0.99682 ; +0.98458 ; +0.99619
----------

pwm_requested_frequency_Hz: 50000, mode : "8 BITS MODE"
pwm_num 2 : pwm_actual_frequency_Hz = 54166
pwm_requested_frequency_Hz: 50000, mode : "8 BITS MODE"
pwm_num 3 : pwm_actual_frequency_Hz = 54166
pwm_requested_frequency_Hz: 50000, mode : "8 BITS MODE"
pwm_num 0 : pwm_actual_frequency_Hz = 54166
pwm_requested_frequency_Hz: 50000, mode : "8 BITS MODE"
pwm_num 1 : pwm_actual_frequency_Hz = 54166
libHAL's HAL_P6i_adc_jpsumo_init: mmap kernel_ptr@0x(nil) user_ptr@0x0x40a4d000
[libFSM ERROR] Duplicate stateID
[ESTIMATOR] Start estimator state machine
 state entry : init
[DRIVING CONTROLLER] Start control state machine
 jump state entry : init
[JUMP CONTROLLER] Start control state machine
 No high jump : phi is too low
File /tmp/run/init/etron_started already exists.
Unknown host
init OK !!!!
[ANIMATIONS] Start animations state machine :  state entry : start
 jump state entry : unknow
 jump state entry : stop detection init
 jump state entry : to_cam_stop
 cam stop detected
 jump state entry : learning
 jump state entry : to_cam_stop
[libFSM] stop
 state entry : driving normal
 cam stop detected
 jump state entry : unloaded
 state entry : stopping normal
 state entry : waiting
tak asi nic. Můj další cíl je prozkoumat Road Plan, což by měl být skipt popisující nějakou animaci, např. jeď 1m rovně, otoč se o 45 stupňů, skoč, udělej fotku atd. Bohužel popis formátu jsem nenašel, takže to bude delší cesta přes hackování s Free Flight 3. Mimochodem FF3 je i na Windows Store, ale na Windows 10 zatím upgradeovat nechci.

5. prosinec 2015 — Road Plan

Nedal jsem včera robota na nabíječku a to se mi teď samozřejmě vymstilo. Stihl jsem akorát zadat první příkaz „jeď 1 metr rovně”, přihlásit se telnem a podívat se, jak to vypadá:
[JS] $ pwd
/data/ftp/internal_000/Jumping_Sumo/scripts
[JS] $ ls
2e27a947-16cd-4e50-a181-4a3e0ee39d2d.json
[JS] $ cat 2e27a947-16cd-4e50-a181-4a3e0ee39d2d.json
{ "product": "902", "version": 1, "uuid":
"2e27a947-16cd-4e50-a181-4a3e0ee39d2d", "lastModified": 1449291081, "name":
"05\/12\/2015 05:51", "description": " ", "instructions": [ { "name":
"straight", "comment": " ", "distance": 1.000000, "maxSpeed": 1.000000 } ] }
To vypadá celkem srozumitelně, není-liž pravda? Žádné složité binární protokoly, jenom textový JSON. Asi bych si teď troufl změnit požadovanou ujetou vzdálenost a maximální rychlost. Ještě by mne zajímalo, zda funguje záporná vzdálenost (v té dělám snad vždycky chybu), protože na klávesnici Free Flight 3 jsem mínus neviděl. Pozn. do "description" a "comment" jsem teď vložil extra mezeru, aby to robotika-parser neinterpretoval jako kurzívu.
Robot se na nabíječce nechce nechat zapnout, tak to dnes bude holt asi jenom tento „štěk”.
p.s.
{ "product": "902", "version": 1, "uuid": "2e27a947-16cd-4e50-a181-4a3e0ee39d2d",
"lastModified": 1449296904, "name": "05\/12\/2015 05:51", "description": " ",
"instructions": [
  { "name": "straight", "comment": " ", "distance": 0.500000, "maxSpeed": 1.000000 },
  { "name": "arc", "comment": " ", "maxSpeed": 1.000000, "angle": 180.000000,
       "radius": 0.000000 },
  { "name": "animation", "comment": " ", "animation": "metronome" },
  { "name": "takePicture", "comment": " " },
  { "name": "straight", "comment": " ", "distance": 0.500000, "maxSpeed": 0.500000 },
  { "name": "ledRed", "comment": " ", "side": "right", "lit": true },
  { "name": "ledRed", "comment": " ", "side": "left", "lit": false },
  { "name": "ledGreen", "comment": " ", "side": "both", "value": 255 },
  { "name": "wait", "comment": " ", "duration": 1.000000 },
  { "name": "takePicture", "comment": " " },
  { "name": "posture", "comment": " ", "type": "jumper" }
 ] }

6. prosinec 2015 — Parrot Developer Fórum

Djavan mi odpověděl na dotaz ohledně odometrie a přesměroval mne na Parrot Developer Fórum (asi je nutné přihlášení). Nic přímo použitelného jsem tam zatím nenašel, snad jen poznámka ohledně firmware, kde 2.0 je určené pro nové Jumping Sumo Race. Jestli se tím dá ale flashnout staré Jumping Sumo netuším.
Narazil jsem ještě na Hacking the Parrot Jumping Sumo, kde mne zaujala nápověda Debug options at /etc/debug.conf, tak se na to jdu podívat … nic tam není :(. Je tedy možné, že v pozdějším firmware byl odstraněn???

8. prosinec 2015 — Panoramatické snímky?

Přemýšlel jsem co s robotem dál a trošku se nabízí „panoramatické snímky”. Lamia má mizernou, nebo bych spíše měl psát nedostupnou, odometrii, ale dokáže se velmi pěkně a přesně natáčet. Pravda, že jak moc přesně to je nezjistím, dokud to pořádně nezměřím, ale i to co jsem viděl bylo OK.
Dal jsem tedy do gitu jednoduché demo (diff), kdy se robot otočí o DEG_STEP, zastaví, uloží snímek a tak celých 360 stupňů.
def demo( robot ):
    "panoramatic picture"
    DEG_STEP = 30
    robot.setVideoCallback( keepLastImage )
    for absAngle in xrange(0, 360, DEG_STEP):
        robot.update( cmd=addCapOffsetCmd(math.radians(DEG_STEP)) )
        robot.wait(1.0)
        assert g_lastImage is not None
        open( "scan%03d.jpg" % absAngle, "wb" ).write( g_lastImage )
Pak jsem dal do Google "cv2 image stitching" a mimo jiné vypadl odkaz na Multiple Images/ Panorama Stitching with Python OpenCV i se zdrojovým kódem. Trošku jsem to upravil, aby to šlo vůbec pustit (pull request), ale možná jsem to špatně pochopil, nevím. V každém případě pro testovací sadu snímků to nefungovalo, ale pro první dva jsem nějaký výsledek dostal:
Ta distorze je neúnosná a je třeba jí nejprve kompenzovat. Ostatně jsem na tento problém narazil i na stránkách stitcheru.
Pokud by si někdo chtěl hrát nezávisle, tak tady je sada obrázků po 30 stupních:
Koukám, že posun křížení dlaždic je cca po 200 pixelech, obrázky jsou 640x480 a krok byl 30 stupňů, tj. hrubým odhadem má Lamia 90 stupňů FOV — to není špatné. Ono je to vlastně vidět i na té sekvenci, když se člověk podívá na sloupec místo na řádek.
Neodolal jsem, a od oka to bez kalibrace nařezal (diff, případně stitcher.py. Vyříznul jsem zhruba tu 1/3 (s těma pár pixelama by si asi chtělo pohrát) i na výšku z každé stranu ubral 100 pixelů a na těch 15min práce výsledek není až tak špatný:

5. leden 2016 — SICK Pink Cube

Je to už nějak hrozně dlouho, co jsem k Lamia nic nepřipsal — i jsem za tu dobu stačil zapomenout, jak se ten skokan jmenuje :-( … resp. pardón, skokanka. Alespoň bych tedy zmínil, co se za ty tři neděle dělo (vánoce a Nový rok trošku ignoruji).
Jednak mi kolega z práce přivezl z Německa kostičky pro SICK Robot Day 2016 (aktuální anglický externí odkaz je zde). V rámci „robotického semináře” měli studenti navrhnout nabírací mechanizmus a nejlepší by bylo ho rovnou vyzkoušet v akci, tj. detekovat kostku, přijet k ní a nabrat jí. A ta detekce by vlastně mohla být i pěkné cvičení na zpracování obrazu co posílá Lamia:
Druhý střípek byla oponentůra práce Martina Döflera spojená s článkem Vision-Based Pose Recognition, Application for Monocular Robot Navigation
bezdrátová nabíječka
bezdrátová nabíječka
(na webu zatím vidím jen placenou verzi). Je to nápad, jak rozšířit navigační algoritmus SURFnav o detekci konce segmentů z obrázku, bez použití odometrie. Jsem na toto téma trošku skeptický a nejlepší by bylo to vyzkoušet. A pokud občas budu potřebovat „panoramatický snímek”, tak Lamia ho v hrubých rysech poskladá (ano, otázka, jak moc by byl použitelný pro navigaci).
A třetí střípek je, že dorazil „čínský vánoční dárek”: bezdrátová nabíječka, nebo jak se tomu říká. Myšleno je to pro mobily, které pak stačí pouze položit na nabíjecí plošku. Chci to zkusit s Lamií a tak trošku experimentovat s Sumo Charge myšlenkou. Časem …

8. leden 2016 — Experiment s ORBou

Mám jen 15min, tak to bude jen takový „štek”. Jak jsem psal minule, rád bych si pohrál s detektory a matchováním obrázku. A ono je to v Pythonu krásně jednoduché , viz např. tutoriál py_surf_intro. Zaujalo mne varování SURF is good at handling images with blurring and rotation, but not good at handling viewpoint change and illumination change. Ale změna místa pohledu a osvětlení je jistá … čert to vem, nějak začít musím.
Pak jsem párkrát stiskl Next, Next, Next … a dostal se na ORB desriptory (mimochodem, už chápu proč vědecké články obsahují všechny možné typy deskriptorů — ono je to skoro zadarmo, stačí slovo SURF nahradit ORB, BRIEF, FAST a je to … no trošku zjednodušuji). A poznámka, co asi všichni víte: ORB: An efficient alternative to SIFT or SURF in 2011. SIFT and SURF are patented and you are supposed to pay them for its use. But ORB is not! Tak jsem místo SURFnavu začal rovnou experimentovat s ORBou.
Mám starší verzi OpenCV, tak mi nefungovalo zobrazování výsledného matchingu. Evidentně v tom nejsem sám a nejrychlejší funkční řešení bylo vzít si kousek kódu ze stackoverflow. Ještě zobrazení nefungovalo na barevné obrázky, tak jsem je narychlo transformoval na šedotónové.
Zde jsou dva úspěšné příklady:
a zdrojový kód je pak zde.
Ještě mi zbyly 4min, to bych nečekal … než to pushnu … timeout.

10. únor 2016 — END

Včera jsem Lamii vrátil. Předběžná domluva je, že si jí zase půjčím cca měsíc do soutěže Tour the Stairs (bude-li dost zájemců), protože tam přeci jenom pasovala lépe než minidrona Jessica.
Nechávám tomu tedy „otevřený konec”. Pokud by v experimentování někdo rád pokračoval, může si robota koupit na icorner dnes za 2408Kč (alza má jenom ty novější za 4000kč) a napsat mi zkušenosti, případně poslat odkaz, který bych zde doplnil.