czech english

OAK-D Pro

chytrá 3D OpenCV kamera

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. Ale to rozhodně není vše … Blog update: 8/10/2022 — SLAM na 6 řádek

Obsah



Blog

22. březen 2022 — Měsíc čekání

Jak začít? O OAK-D jsem poprvé slyšel od týmu Sĺňava (Robotour 2021). Pak jsem se cca před měsícem dozvěděl o existenci firmy Luxonis a rozhodl si udělat představu „z první ruky”. Doporučení jsem dostal na novou kameru OAK-D Pro, která je zatím zařazena v beta programu. Byl jsem i varován, že doručení bude nějaký čas trvat (expeduje se z Hong Kongu).
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” online sledování — člověk se může permanentně nervovat, místo aby počítal s dlouhou dobou 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.
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” dokumentací a narazil jsem na: Due to the large power consumption of dot projector/illumination LED, a Y-adapter is required when using these functions! F-slovo. Znamená to, že teď budu muset objednávat nějaky Y-adaptér, 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:
Obsah krabičky
Obsah krabičky
Vlastně tedy dobrá a špatná zpráva:
  • Y-adaptér je součástí balení
  • trošku to vypadá, že tam něco chybí, třeba kabel?
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ě.
A teď dobré zprávy — First steps with DepthAI … prostě návod co udělat od zapojení nové kamery do USB konektoru. A fungovalo to bezchybně!
p.s. a ano, na extra přísvit a extra zdroj dojde někdy později … tj. na první pokusy nebyl nutný.

25. březen 2022 — Druhý krok

První krok 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 dokumentace API a užitečný mi přijde tento obrázek:

Host je váš počítač a OAK Device je „chytrá kamera” … stále nevím, co OAK (v překladu dub) znamená? Node, connection a pipeline 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. XLink pak zajišťuje komunikaci tam a zpět.
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 XLink přeruší? Jede pipeline vesele dál? Pak by paradoxně Y-adaptér, 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á.
Koukal jsem tedy na standalone mode a chyba lávky: Standalone mode is only possible on OAKs that have on-board flash memory, which are currently OAK IOT and OAK POE camera models. Je tady asi na místě zdůraznit, že Luxonis nabízí několik řad zařízení a tak bych doporučil si to předem nastudovat a volit podle plánované aplikace.
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 RAM usage: 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. … teď jsem si říkal, co je ten 4 Gbit? Rychlost? Jiný model? Well … 8x 512MB = 4G bitu … asi.
Vypadá to, že můžu rovnou použít demo system_information.py:
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 %
Kód je kratký, jen si teď neumím představit, jak otevřít dai.Device bez pipeline, která pro nastartování obsahuje dva uzly: dai.node.SystemLogger a dai.node.XLinkOut. I to prolinkování sysLog.out.link(linkOut.input) vypadá přímočaře.
p.s. tak schválně, jestli mi někdo poradí: Reconnection to running OAK device?

28. březen 2022 — Standalone mode

Na odpověď jsem nemusel dlouho čekat — Hussain psal: What I understood is that you want to run the OAK in standalone mode. If that was the case, check this documentation.
A pak se ještě ozval Erik: ... 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.
Nešlo by to nějak obejít, když OAK IoT ani PoE nemám? Mimochodem „test komunity” bych považoval za úspěšný. Mám v plánu někdy revidovat úvodní odstavec a doplnit tam, např. že Luxonis má za sebou úspěšnou Kickstarterovou kampaň opencv-ai-kit-lite ($1,136,926 USD by 8,640 backers) [je tam takové množství projektů, až na mne zase padá depka a jestli se mám vůbec o něco snažit ] Také přemýšlím, jestli O=OpenCV, A=Ai, K=Kit??
No nic, zpět k Standalone modeyou first need to remove all XLinkOut and XLinkIn nodes. No jo, ale co dál? SPIOut nepoužiji, protože nemám SPI, a script node jede přes ten Ethernet.
Koukám, že OAK-D Pro má přímo dedikované issue … hledal jsem, jak se vypíná/zapíná podsvícení. Asi vyjímečně nemá cenu hledat přes Google, a je rychlejší proklikat dokumentaci, tj. v Device jsou funkce setIrFloodLightBrightness() a setIrLaserDotProjectorBrightness().
Ale to jsem se „trošku” odchýlil od tématu, ke kterému vlastně nemám více jak „tudy ne”.

29. březen 2022 — IMU a SLAM

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 Realsense T264 tracking kamery (Limited Lifetime Product) za OAK-D.
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ý self-test, jak jsou oba výstupy konzistentní. No asi jsem zase naivní, ale uvidíme.
Nejprve tedy IMU (Inertial Measurement Unit). K dispozici jsou hned dva příklady:
První bych viděl na raw data a druhý jako integraci. Píšou tam nějaké „nezdravé” Herzy (500Hz a 400Hz), ale to se může časem hodit.
Tak jo, první příklad fungoval bez problémů:
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
a druhý stejně tak:
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
SLAM (Simultaneous Localization And Mapping) jsem na stejné stránce mezi příklady nenašel, ale byl „hned vedle” na stránce věnované Spatial AI:
  • SLAM with OAK … tak to asi nebude jen „copy and paste”: 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.
Jsou tam ale odkazy na community projects: OAK-D ORB_SLAM3 Experiment a deptha-slam … (ještě tam byl ArduCam SLAM). 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. To be continued

7. září 2022 — FollowMe a USB kabel (Jirka)

Tentokrát blog posunul Jirka …
Jirka si koupil OAK-D W (Wide), tedy verzi s širokým záběrem a jako demo aplikaci si vymyslel starý dobrý FollowMe co před 10+ lety vylepšil (resp. udělal použitelný) na Eduru (viz staré video z Floriade … 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.
Jinak v tomto demo je OAK-D kamera použita pouze jako zdroj hloubkových dat (podobně jako dřive byl RealSense) 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í.
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:
Zdar, kdybyste potřebovali k OAK-D kabel, kolem kterého může fungovat GPS, mám teď dobrou zkušenost s: https://www.delock.com/produkt/84007/merkmale.html Koukám, že má i další sourozence: 83718, 84017, 84019]. Ty ale vyzkoušené nemám. 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ů".
… třeba se to bude někomu hodit např. na Robotour.

8. října 2022 — SLAM na 6 řádek

Na posledním robotickém callu 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?!
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 visual odometry, 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:
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())
Rozchození bylo přímočaré, ještě než mi vystydlo kafe:
mkvirtualenv slam
workon slam
pip install depthai
pip install spectacularAI
a pak už puštění skriptu výše:
(slam) md@md-ThinkPad-P50:~/git/slam$ python vio_slam.py
Traceback (most recent call last):
  File "vio_slam.py", line 10, in 
    with depthai.Device(pipeline) as device, \
RuntimeError: No available devices
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á”…
Na druhý pokus (s připojenou OAK-D PRO kamerou přes USB) už to vypadalo lépe:
(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}
}
…
Pak jsem si nechal vypisovat jen pozice a trošku mával kamerou nad stolem:
{'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}
hmm, to moc nevypadá jako v metrech?! No asi je třeba udělat ten první krok pořádně a nastudovat si readme. 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 vio_gnss.py, což by měla být kombinace GPS s vizuální odometrii a to má to blízko k jeho článku o Ardusimple RTK3B.