Do hloubky s Kinectem v2

Kinect v2

První Kinect byl rozhodně zajímavým kusem hardwaru. I proto se před lety stal očima robotu TulBot. Vývoj v oblasti spotřebních Depth kamer ale značně pokročil, a proto nastal čas probádat druhou generaci tohoto pozoruhodného zařízení. I když Kinect už dávno není jedinou dostupnou depth kamerou na trhu, pro makery jde stále o velmi výhodnou volbu. Microsoft totiž provedl “geniální” věc – po uvedení na trh Kinect v2 povinně přibaloval ke každému XBoxu One, po 4 letech pak zařízení úplně odepsal. Tím vzniklo obrovské množství lidí s přebytečným Kinectem a sensor tak aktuálně zaplavuje eBay za velmi příznivé ceny. Kinect v2 se tak stal bezkonkurenčně nejdostupnější Time-of-Flight depth kamerou, přinejmenším v rámci maker využití.

Hardware

Nový Kinect se od starého modelu liší na první pohled. Výrazně kvádrovitější tvar reflektuje aktuální Microsoftí obdélníkovou obsesi. V tomhle případě ale není ničemu na škodu. Zařízení vypadá mohutněji, ve skutečnosti ale není zásadně větší než původní Kinect. Jediný zvětšený rozměr je hloubka – 60mm vs 68mm (tělo senzoru) plus další prostor nutný pro USB 3.0 konektor na zádi senzoru. Změnu prodělal mikrofonní systém, který nyní hnízdí v sekundárním kvádru pod tělem Kinectu a využívá hned čtveřici mikrofonů. To mu umožňuje určit směr přicházejícího zvuku měřením fázového posunu na jednotlivých mikrofonech. Kinect přišel o regulaci vertikálního sklonu pomocí vestavěného serva. Nyní lze sensor vertikálně polohovat jedině ručně. Hlavní a zásadní změnou je ovšem kompletní přepracování depth snímače. Dřívější systém využívající strukturované světlo byl totiž nahrazen Time-of-Flight (ToF) systémem.

Snímání s využitím strukturovaného světla na původním Kinectu přinášelo množství problémů. Rozlišení takové depth kamery je limitované tím, jak detailní obrazec lze spolehlivě před sensor promítnout. Promítaný obrazec musí být navíc navržený tak, aby po jeho opětovném sejmutí bylo možné určit která část původního obrazce je promítnutá ve které části scény a to i přes to, že obrazec je nyní deformovaný perspektivou a některé jeho části můžou chybět úplně. Nelze tedy pouze promítnout pravidelný rastr bodů. Kinect v1 promítal obrazec v rastru s rozlišením 633 x 495 z čehož ale pouze 34 749 bodů bylo aktivních (světlých)[1] a tedy triangulovatelných. Aktivováním pouze některých bodů v rastru vznikl před sensorem dobře zmapovatelný vzor, ale efektivní rozlišení depth obrazu bylo velmi nízké – ani zdaleka nedosahovalo deklarovaných 640x480px. Nepravidelné rozložení promítaných světlých bodů přepočítané do výstupního pravidelného rastru pak vedlo k tvorbě nedokonalého obrazu, charakteristicky tvořeného nepravidelnými “bloby” hloubkové informace. Nežádoucí efekt byl patrný hlavně na konturách objektů.

Kinect v2 problém řeší využitím zmíněné ToF depth kamery. Je zde tedy modulovaný IR emitor a speciální CMOS sensor. Emitor je modulovaný vysokou frekvencí (desítky MHz) a synchronizovaný s CMOS snímačem. CMOS snímač následně dovede určit vzdálenost pro každý pixel pomocí měření fázováho posunu příchozího světelného impulsu. Dvouportový CMOS snímač pak zajišťuje imunitu proti rušivému ambientnímu osvětlení (tedy do určité míry, Kinect v2 stejně jako Kinect v1 a přímém slunci nefunguje). Rozlišení hloubkového smínače je 512x424px.
Kromě snímače hloubky je Kinect v2 vybaven ještě klasickou RGB kamerou s rozlišením 1920×1080.

ToF senzor Kinectu v2

Napájení

ToF senzor je poměrně energeticky náročný a vyžaduje externí napájení. To vedlo výrobce k použití nestandardního přívodního kabelu s přidanou napájecí větví, který je připojitelný pouze k XBoxu One. Právě přítomnost specializovaného konektoru na přívodním kabelu se stala jedním z hlavních problémů při jakémkoliv alternativním využití Kinectu v2. Přívodní kabel a konektor na těle Kinectu v sobě sdružuje rozhraní USB 3.0 a 12V napájecí větev. Oficiální řešení připojení senzoru k PC představuje Kinect Adapter od MS. Ten je v celku nemotorně velký a s dostupností + cenu na tom bývá hůř než samotný sensor. Kabel by zřejmě šlo upravit, tak aby USB a 12V větev ústily do dvou různých konektorů. Nicméně konveční řešení internetových makerů je odstranit původní kabel a nahradit jej kabelem USB3.0 A -> USB3.0 B. Konektor přímo na těle Kinectu je totiž s USB3.0 B konektorem kompatibilní. Liší se jen přidanou trojicí napájecích (a zemnících) kontaktů.

Přidané piny na Kinect v2 USB konektoru

Při použití klasického USB3.0 B protikusu zůstane trojice kontaktů nepřipojená a napájecí linka je řešena přidaným kabelem, připájeným přímo na DPS uvnitř Kinectu. Není to nejelegantnější řeření, nicméně můžu potvrdit že funguje.

Připájená 12V větev

Kinect je z pohledu USB tzv. Složené zařízení, systém ho tedy vidí jako jedno zařízení s více USB rozhraními. V případě Kinectu v2 jsou rozhraní konkrétně čtyři:

Interface Druh přenosu Použití
1 Bulk Řídící data + RGB data
2 Isochronní Hlouková data
3 (bez endpointu) Audio Control
4 isochronní Audio Stream

Software

Kinect je oficiálně podporovaný pouze na Windows 8 až Windows 10 a pouze pro tyto systémy existuje oficiální ovladač. Jelikož nejsem fanoušek ani jednoho ze zmíněných OS a nestojím o implementaci oficiálního “Kinect for Windows SDK” (velmi pravděpodobně stejně nebude dál vyvíjeno, vzhledem k zaříznutí výroby senzoru), rozhodl jsem se jít open-source cestou a využít projekt OpenKinect. Díky tomuto projektu je možné Kinect využívat v rámci širokého spektra hardwarových platforem bez nutnosti klasického (kernel space) ovladače. Projekt nabízí jak ovladač pro první generaci Kinectu (Libfreenect), tak i druhou generaci (Libfreenect2).

Libfreenect2

Libfreenect2 představuje open-source, user-space ovladač pro Kinect v2. Senzor lze díky knihovně použít v prostředí Linuxu, MacOS, Windows 7, případně také na vývojářkém kitu nVidia Jetson TK1. V případě Windows, ovšem user-space ovladač sám o sobě nestačí. Aby Libfreenect2 mohl připojený Kinect ovládat je potřeba pro něj nainstalovat univerzální kernel-space ovladač. Zde je několik možností – nativní WinUSB, či open-source ovladače UsbDk, libusbK. Omezujícím faktorem je, že univerzální ovladač musí podporovat isochronní přenos – právě ten je totiž využit pro přenos hloubkové informace ze senzoru.
V případě Linuxu je situace s ovladači jednodušší. USB zařízení zde spravuje Udev a ten umožňuje user-space ovladačům fungovat bez nutnosti instalace čehokoliv do kernelu. Ve výchozím stavu nicméně Udev dá plný přístup k USB zařízení jen rootovi. Běžný, smrtelný non-root user dostane oprávnění jen ke čtení. Je tedy potřeba Udevu sdělit, že má USB zařízení zpřístupnit všem a to i pro zápis. Právě k tomu slouží udev rules, které lze nalézt v libfreenect2/platform/linux/udev/90-kinect2.rules:

SUBSYSTEM==”usb”, ATTR{idVendor}==”045e”, ATTR{idProduct}==”02c4″, MODE=”0666″
SUBSYSTEM==”usb”, ATTR{idVendor}==”045e”, ATTR{idProduct}==”02d8″, MODE=”0666″
SUBSYSTEM==”usb”, ATTR{idVendor}==”045e”, ATTR{idProduct}==”02d9″, MODE=”0666″

Z dostupné čtveřice USB rozhraní Libfreenect2 využije jen první dvě. Zbývající dvojice rozhraní je registrovaná jako klasické audio class zařízení a většina OS je spontánně nainstaluje jako externí mikrofon. Libfreenect2 tedy zvukové schopnosti Kinectu v2 nijak neřeší. Úlohou knihovny Libfreenect2 je interpretovat RGB, řídící a hloubková data přicházející ze senzoru. U RGB dat je situace v celku jednoduchá. Data jsou poskytovaná v jpeg formátu, takže je třeba je přijmout a převést na bitmapový obraz. Převod může být potenciálně časově náročný a tak Libfreenect2 nabízí několik možností jak dekompresy řešit s různou formou akcelerace:

  • TurboJpeg
  • VAAPI
  • TegraJpeg

S hloubkovými daty je situace opoznání komplikovanější. Je potřeba je přijmout, sparsovat, provést fázový unwrapping, filtrování. Proces je časově mnohem náročnější než jpeg dekomprese a tak Libfreenect2 opět nabízí více řešení a proces je možné optimalizovat podle hardwaru dostupného uživateli. V nabídce je:

  • CPU (bez akcelerace)
  • OpenGl
  • OpenCL
  • Cuda

Libfreenect2 je skutečně pouze ovladačem, pokročilejší úlohy jako je Skeleton tracking sám o sobě nezvládá. K tomu účelu lze využít například FusionKinectLib. Libfreenect2 ale umí namapování depth informace přes obraz z RGB kamery a obsahuje tedy intrinsic i extrinsic kalibraci pro oba snímače.

Závěr

Kvalita snímaného depth obrazu pro Kinect v2 je skutečně vysoká. Dle mých zkušeností s přehledem předčí nejen výstup první generace Kinectu ale i výstup depth kamery Intel PrimeSense (kteréhokoliv modelu) – byť jde o zařízení zásadně novější než Kinect v2. Kinect je nicméně ve stavu end-of-life a tedy není vhodný pro komerční nasazení. Nezbývá než doufat, že se standalone spotřební ToF kamery časem na trhu usadí a ideálně nebudou uzamčené v nějakém proprietárním ekosystému (přeloženo: vyrobí je někdo jiný než Apple nebo Microsoft). Takové zařízení má pak šanci stát se etalonem storojového vidění.

Reference

[1] https://azttm.wordpress.com/2011/04/03/kinect-pattern-uncovered/

Buďte první kdo přidá komentář

Napsat komentář

Vaše emailová adresa nebude nikde zveřejněna.


*