Aruco Library

marker_2Pri akejkoľvek pokročilejšej robotickej aplikácii je večným problémom určovanie polohy, či už objektu voči robotovi alebo robota voči objektu. Na presnosti lokalizácie často závisí robustnosť celej aplikácie a aj preto sa na senzoriku vynakladá značná časť prostriedkov a vývojárskeho úsilia. Aj napriek tomu, že dnes je už na trhu 3D sensingu veľké množstvo rôznych senzorov od stereo kamier, cez Kinect, ToF snímače až po laserové skenery, s využitím jednoduchého triku je možné úplnú polohu objektu v priestore zistiť aj pomocou obyčajnej webkamery za pár eur. Keďže podobné low-cost riešenie by sa nám hodilo pre viacero aplikácií na ktorých v súčasnosti pracujeme, v priebehu posledných dvoch týždňov sme sa na túto problematiku pozreli bližšie…

Inšpiráciou nám bol známy matlabovský kalibračný toolbox od Jean-Yves Bougueta, a najmä výsledok excentrickej kalibrácie kamery. Podľa najpoužívanejšej Zhangovej metodiky je totiž pri kalibrácii kamery potrebné zosnímať kalibračnú mriežku z viacerých polôh a uhlov aby bolo možné jednoznačne určiť všetky parametre. Na základe takto získaných záberov a známych rozmerov kalibračnej mriežky sa následne vypočítajú nielen intristické ale čo je pre nás mimoriadne dôležité aj excentrické parametre kamery – body z ktorých boli jednotlivé zábery zosnímané – tzv. viewpointy. Príklad výsledku excentrickej kalibrácie je vidieť aj na obrázku nižšie:

extrinsic2Zobrazenie viewpointov v matlabovskom toolboxe od Jean-Yves Bougueta

Prečo je to zaujímavé? Z jednoduchého dôvodu – ak máme nakalibrovanú kameru a kalibračnú mriežku so známymi rozmermi, tak polohu kamery voči mriežke, (X,Y,Z, Roll, Pitch, Yaw) je možné týmto spôsobom určiť iba na základe obyčajného obrazu(!) – bez akýchkoľvek 3D senzorov, Kinectu, či lasera. V porovnaní s ostatnými technikami 3D sensingu je to mimoriadne lákavá možnosť, ktorá má využitie v širokom spektre nielen robotických aplikácií.

Nechali sme sa zlákať aj my a ako prvý krok sme sa pokúsili naprogramovať jednoduchý ROS node, ktorý by nám na základe zadaných kalibračných dát v reálnom čase počítal polohu kalibračnej mriežky voči kamere. Pri riešení tohto problému sa výborne hodia štandardné nástroje ROS, konkrétne „camera calibrator“ a jednoduché prepojenie s OpenCV knižnicou ponúkajúcou všetky potrebné funkcie na spracovanie obrazu a výpočet polohových súradníc.

Aby sme mali čo najvačší „záber“ pracovného priestoru, zadovážili sme si špeciálnu webkameru Genius WideCam F100 so snímacím uhlom 120°. Rozdiel v FOV (filed of view) oproti „štandardnej širokouhlej“ webkamere (Canyon FWC120) je obrovský a názorne ho vidieť na obrázkoch nižšie (obidva zábery snímané z rovnakého miesta).

Samozrejme obidve použité kamery majú manuálny focus, čo je základným predpokladom pre akúkoľvek zmysluplnú kalibráciu a využívajú USB2.0 interface. V ROS existuje pre usb webkamery viacero driverov, v tomto prípade sme zvolili usb_cam package, ktorý bez problémov fungoval s obidvoma zariadeniami.

Po splnení všetkých predpokladov už doprogramovať samotné rozpoznávanie kalibračnej mriežky v priestore nebolo až také komplikované, v OpenCV priamo na tento účel existuje solvePnP funkcia, ktorá je aj súčasťou OpenCV kalibračného procesu. Výsledok aj so zobrazením vzájomnej polohy súradnicových systémov je na videu nižšie:

Detekcia polohy kalibračnej mriežky voči statickej kamere

Rovnaký trik ako sme použili pri kalibračnej mriežke sa už roky úspešne využíva najmä v oblasti tzv. rozšírenej reality (augumented reality), akurát sa namiesto šachovnice používajú tzv. markre alebo „fiducials“ pripomínajúce známe QR kódy.

Rozšírená realita vo všeobecnosti spočíva v renderovaní virtuálnych objektov do zosnímaného obrazu. Má samozrejme aj svoje praktické využitie, veľká budúcnosť ju pravdepodobne čaká v kombinácii so smartphonovými prekladačmi ako vidieť napríklad na tomto videu ale zatiaľ má väčšina augumented reality aplikácií skôr zábavný charakter, viď nasledujúci príklad:

Augmented Reality Marble Game

Softwarových knižníc pre prácu s rozšírenou realitou je viacero ale keďže nám ide čisto iba o detekciu polohy markra v priestore a nepotrebujeme do výsledného obrazu renderovať žiadnych JEDI bojovníkov, úplne nám postačí jednuduchá ARUCO knižnica využívajúca funkcie OpenCV. Aruco je dielom malého tímu výskumníkov z univerzity v španielskej Cordobe, je vydaná pod BSD licenciou a funguje vo Windowse aj v Linuxe. S nalinkovaním do ROS sme mali ako tradične určité problémy ale nakoniec sa nám ju podarilo úspešne rozbehať.

Po úspechu s kalibračnou mriežkou sme rozšírili existujúci program o detekciu polohy markrov v priestore a skúšali ako sa to bude správať. Výsledok ako vidieť aj na videu nižšie bol celkom povzbudzujúci, ARUCO je vďaka využívaniu funkcií OpenCV mimoriadne svižná knižnica, určenie polohy markra netrvalo na našom hardwari viac ako 10ms, čiže pri 30fps nestíhala skôr kamera ako procesor.

 Detekcia polohy markra voči statickej kamere

Pre zvýšenie robustnosti sa v praxi často používajú celé tabule markrov (3×4, 5×6 a pod) aby ani strata jedného alebo dvoch markrov z poľa nespôsobila stratu informácie o polohe celého objektu. Zabezpečí sa tým zároveň stabilnejšia detekcia orientácie objektu v blízkosti kamery, kde často pri použití iba jedného markra vznikajú určité problémy.

Tak ako sme spomínali detekcia polohy markrov má v robotike široké využitie a aj v našom prípade sa ju chystáme použiť vo viacerých aplikáciách vrátane Motomana a multikoptérov. O tom ale až v ďalších článkoch…

František Ďurovský