Pixy (1) … učím se vidět

Snímání a zpracování obrazu v reálném čase patří mezi úlohy velmi náročné na výkon mikrokontroléru i na programování. Pixy je kamera, která tuto část práce, byť s jistými omezeními, udělá za vás, respektive za vašeho robota. Na něm už zbude se podle výstupů nějak zařídit, třeba najít objekt nebo jej sledovat.

Na počátku byla myšlenka spojit v jednom zařízení kameru, vyhodnocení obrazu a částečně i řízení (polohování) kamery. Současně co nejvíc zjednodušit předávání výstupů jinému mikrokontroléru, který může být i relativně velmi jednoduchý a pomalý. Dokonce pro některé projekty ani není potřeba další mikrokontrolér. Vše by mělo být ovladatelné jednoduše až intuitivně. Jako se to v poslední době stává často, záměr upoutal na Kickstarteru zákazníky a podařilo se jej realizovat.

Následující článek nemá suplovat komletní manuál ke kameře Pixy, má jen přiblížit možnosti, dát představu, jaké úlohy se pomocí ní dají nebo naopak nedají řešit, a usnadnit začáteční pokusy.

IMGP2505b

Vlastní modul s kamerou má rozměry 54×50 mm, z desky vystupuje na jednu stranu jen kamera (cca 20 mm) a na druhou připojovací konektory (cca 10 mm). Spolu s modulem se dodává kabel pro propojení s Arduinem, nicméně spolupráce není na Arduino vázaná, naopak.

IMGP2510bHodí se vědět, na jakém principu Pixy pracuje. Kamera snímá obraz a v něm jsou vyhledávány objekty, které se předem kamera naučí rozeznávat. Vodítkem je výhradně barva, na to je potřeba pamatovat. V obraze se naleznou oblasti, v nichž naučená barva je, a ty se označí jako objekty, dostanou přiřazení (reprezentované jménem), mají svou výšku a šířku a také souřadnice v obraze. Jestliže byl při učení objekt v přesně definované vzdálenosti od kamery, jeho velikost v obraze odpovídá vzdálenosti od objektivu, takže můžeme mít o informaci o vzdálenosti. Tyto parametry už lze s minimálním objemem dat rychle předávat dalšímu mikrokontroléru.

Pixy může „vidět“ i IR světlo, ale ne se standardně dodávanou optikou, ta má IR filtr. Výměnou optiky získáme možnost orientovat se částečně podle barev „v IR spektru“.

Daný způsob vyhodnocení obrazu není vhodný třeba k tomu, aby robot „viděl“ asfaltovou cestu, odlišil ji od okolního trávníku a jel po ní, aby se vyhýbal obecným překážkám v terénu. Výborně se hodí ke sledování zadaného objektu (zejména když má výraznou a unikátní barvu), k vyhýbání se předem zadanému typu překážek (dopravní kužely) nebo třeba k orientaci robota podle standarního barevného semaforu, k rozlišení robotů dvou týmů (odlišených barvou „dresu“), k navádění na dané místo (do nabíjecího doku) a podobně.

Pixy se může naučit 7 jednobarevných objektů, ale to není vše. Můžeme používat i objekty, které mají na sobě více barevných ploch těsně vedle sebe. Pixy pak pozná jen předmět, na němž uvidí všechny tyto barvy v daném pořadí (poloze), ale nezáleží přitom na orientaci předmětu v prostoru.

Zní to složitě, ale jde to vysvětlit na vlajkách. Bude-li mít vlajka pruhy v daných barvách a pořadí, Pixy ji pozná bez ohledu na natočení, budou-li ale pruhy prohozeny (jako například vlajky Německa a Belgie), není to stejná vlajka, Pixy ji nepřiřadí respektive vyhodnotí jako jinou.

Nejprve je vhodné seznámit se s tím, jak Pixy pracuje a komunikuje se svým ovládacím programem PixyMon, který lze volně stáhnout a je k dispozici ve verzích pro Windows, Mac i Linux. PixyMon je potřebný pro nastavení parametrů a naučení objektů, které si pak kamera pamatuje.

Po instalaci programu můžeme USB kabelem propojit Pixy s počítačem a program spustit. Jestliže se při automatické kontrole zjistí, že firmware Pixy není nejnovější verze, nabídne se aktualizace. Trvá jen několik sekund. Následující text a pokusy jsou popsány pro PixyMon verze 2.0.9 a firmware kamery 2.0.17.


Nejjednodušší způsob naučení předmětu spočívá v tom, že stiskneme a držíme tlačítko při horní straně kamery. Barevná LED na kameře za okamžik začne střídat barvy a tím vyjadřuje, do které z „pamětí“ se předmět uloží. Paměti mají následující barevné kódování, nejde o nic jiného než přiřazení pamětí, reálné barvy s tím nijak nesouvisí:

1/ červená
2/ oranžová (není moc odlišná od červené)
3/ žlutá
4/ zelená
5/ světle modrá
6/ sytě modrá
7/ fialová

Pro ilustraci je zde zvolena scéna, kdy je na bílém papíře uprostřed položené zelené plastové víčko od lahve. Osvětlení kompaktními zářivkami nebylo příliš intenzivní, takže se barvy jevily hodně tmavé.

pix01Jakmile tlačítkem navolíme jednu z pamětí (zde první paměť signalizovanou červenou barvou), vezme se barva ze středu obrazu (je zvýrazněn průsečík os v síti) a sítí se pokryje celý předmět (nebo více předmětů) stejné barvy. Toto nastavování předmětu do středu může trvat libovolně dlouho.

pix02Po krátkém stisku tlačítka je barva uložena. Nyní je možné zobrazit výstup z kamery ve třech režimech odpovídajících prostředním třem ikonám na horní liště programu. Druhá ikona zleva ukazuje obraz tak, jak ho vyhodnotila kamera, objekt bude jen obdélníkem v příslušné barvě a popsaný číslem paměti. Následně můžeme zadat a zobrazovat jména předmětů v paměti.

pix03Prostřední ikona ukazuje obraz tak, jak jej kamera snímá, bez jakéhokoli vyhodnocení nebo změny. Druhá ikona zprava mixuje oba režimy dohromady, obraz z kamery a vyznačení objektů obdélníky s popisem.

V konfiguraci (pravá ikona) najdeme názvy předmětů (signature) a popíšeme předmět jako „zelené víčko“. Obdobně můžeme postupovat dál, ale my se podíváme na druhý způsob zadání, při němž může být scéna složitější a žádný z předmětů nemusí být uprostřed obrazu. Ve scéně budeme mít pět předmětů, čtyři víčka a kousek modrého plastu.

Zadává se tak, že zvolíme v menu příslušnou paměť, a pak kdekoli v obraze vyznačíme kurzorem obdélníček přes barvu předmětu, který chceme.

pix05Výsledek vypadá nějak takto. Kvůli předvedení vícenásobné detekce přibylo ještě jedno oranžové a jedno žluté víčko, předměty jsou popsané názvy v mixovaném obrazu. Pro každý z objektů můžeme zjistit výšku a šířku v obraze (z toho usoudit na vzdálenost) a polohu jeho středu v obraze. Je-li předmětů jedné barvy víc (ani desítky stejných předmětů nedělají problémy), nevadí to, mezi nimi ovšem už kamera jednotlivě nerozlišuje, nejvýš je zvládne spočítat nebo dodat ke každému jeho velikost a polohu.

pix06


Chcete-li dosáhnout dobrých výsledků, je potřeba, aby scéna byla osvětlena dostatečně, rovnoměrně a stabilně, třeba snímání na slunci může v okamžiku, kdy slunce zakryje tmavý mrak nebo světlo zastíní člověk, který se snaží kameru prohlédnout, selhat. Kamera má sice automatickou regulaci jasu a vyvážení bílé (to pracuje jen po zapnutí), ale automaty nejsou všemocné. Je také vhodné, když je scéna nasvícena ze směru, z jakého ji snímá kamera, snažíme-li se dívat proti světlu, všechny předměty se budou jevit jako velmi tmavé a nevyhodnotí se. To je ostatně stejné, jako při fotografování automatem v protisvětle. Nevadí, když jsou předměty blízko u sebe a obdélníky na záběru se překrývají, každý předmět je vyhodnocen samostatně.

Opimální je, když předmět má matný povrch, například pletené svetry nebo klubíčka vlny se správně rozliší prakticky při jakémkoli osvětlení. Naopak velký problém dělají lesklé plochy, jakmile se v nich odrazí světlo, už se barva nedetekuje, případně se jeden předmět může v obraze rozpadnout na detekci několika malých.

Detekci je možné podstatně vylepšit nastavením parametrů pro každou ze zvolených barev zvlášť, zejména jde o to, aby se v okolních barvách (pozadí) nerozpoznávaly miniaturní plošky jako samostatné předměty. Vzhledem k tomu, že výsledek je při změně okamžitě vidět, je nastavení „zkusmo“ ryché a účinné.

pix07


Nakonec si vyzkoušíme detekci složitějších předmětů s více barvami respektive barevných kódů (odkaz zde). Při učení se postupuje podobně, ale využijeme paměti na barvy označené „CC signature“. Nejprve zrušíme všechny zadané barvy, abychom věděli s určitostí, že pracujeme s čistou pamětí.

Ve scéně, která je na fotografii, zadáme nejprve barvu červené plochy do paměti CC1. V obraze zatím není nic vidět, předmět, který má barvu v paměti CC, se nikdy samostatně nedetekuje. Pak přidáme do paměti CC2 barvu modré plochy. Jakmile to uděláme, detekuje se objekt (barevný kód) s označením s=12 a protože už můžeme ze dvou barev určit i orientaci, je informace doplněna o úhel. Pro rychlé vyzkoušení je na spodní straně krabičky barevný kód zelená/fialová, který může posloužit při pokusech.

pix08Dvě barvy definují jen jednu možnou kombinaci (12). Přidáme do paměti CC3 vzorek oranžové barvy. V tom okamžiku se detekuje kód s=123 (všechny tři barvy těsně sousedí). Tři barvy dovolují vytvořit tři různé tříbarevné kombinace (123, 132, 213) ale také tři kombinace dvoubarevné (12, 23, 31). Ty všechy nyní kamera už umí.

Kombinace 123 a 321 je jedna a tatáž, nerozliší se označením (vždy je to 123), ale dá se odlišit úhlem, takže pokud nejde o předmět, který by mohl mít obecnou polohu v prostoru, ale třeba o barevné plošky lepené na překážky, máme k dispozici v podstatě dvojnásobek kódů nebo i víc (kódy mohou ležet vodorovně nebo být v jiných úhlech). Přidáním další barvy do CC4 počet kombinací výrazně vzroste atd.

Důležité je, že jakmile jsme obsadili paměti CC1, CC2 a CC3, už nemůžeme obsadit paměti 1 , 2 a 3 (a naopak) !! Hodnoty by se přepsaly. Je možné kombinovat rozeznávání barevných kódů s rozeznáváním jednobarevných předmětů, ale výhradně tak, že se vyhneme obsazení paměti základní a CC se stejným číslem.

Jde tedy třeba hrát fotbal s červeným míčem, rozeznávat modré spoluhráče a zelené hráče protivníka, k tomu mít vyznačenou vlastní branku kódem fialová/žlutá (na jedné straně takto, na druhé otočený kód) a protivníkovu branku kódem oranžová/světle modrá (opět i s vyznačením pravého a levého okraje branky). Využili jsme všech 7 pamětí (3x základní, 4x CC) a nedošlo ke kolizi.

IMG_0431bK barevnému značení se hodí matné (to je důležité!) samolepicí PVC reklamní fólie (na obrázku je jednoduchý základní vzorník) nebo barevné papíry, ale i ty musí být nehlazené matné. Bílá barva, černá barva a všechny odstíny šedi se jako detekované barvy nehodí (s výjimkou případu, kdy by celé pozadí bylo výrazně jinak barevné).


 

Příště se podíváme na to, jak Pixy komunikuje s řídícím mikrokontrolérem.