12.10. Shrnutí

Kamera připojená USB kabelem, která streamuje snímky do hostitelského programu, přijímá od hostitele zpět aktualizace konfigurace a přežije odpojení/opětovné připojení bez ztráty synchronizace – se skrytými opětovnými přenosy, s několika logickými streamy sdílejícími jeden port a s nulovým rámcovacím kódem v aplikaci – vychází z přibližně čtyřiceti řádků kódu na straně kamery a podobného množství na hostiteli. Knihovna protokolu mění bajtovou rouru na programovatelnou plochu kanálů a vše pod aplikací udržuje neviditelné.

12.10.1. Co kapitola vybudovala

  • Čtyřvrstvý mentální model zásobníku: transport, rámcování, spolehlivost, kanály. Každá vrstva řeší jeden problém a ignoruje vše nad sebou.

  • Formát paketu na drátě – 10bajtová hlavička s CRC, proměnný payload, koncové CRC. Dostatečně malý na to, aby se dal projít bajt po bajtu.

  • Handshake, který kamera a hostitel provedou, když se připojí transport: PROTO_SYNC, výměna schopností, objevení kanálů.

  • Mechanika spolehlivosti nad tím: pořadová čísla, ACK, NAK, opětovné přenosy s exponenciálním odstupem, deset stavových kódů.

  • Model kanálů: až 32 pojmenovaných logických streamů na jednom drátě, s vestavěnými stdin / stdout / stream / profile a aplikačními kanály registrovanými přes Python třídu.

  • Rozhraní backendu – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – a jak knihovna protokolu používá metody přítomné na backendu k rozhodnutí, co kanál podporuje.

  • Strana hostitele: třída Camera z SDK openmv-python, magická rychlost 921600 baud, která přepne USB-CDC do režimu protokolu, a vzor obrátky channel_size / channel_read / channel_write.

  • Vzor streamování snímků – snímání s jedním bufferem, readp se zámkem, send_event pro upozornění na nový snímek – a obousměrný konfigurační vzor (kanál zapisovatelný hostitelem, obrátka JSON), které společně tvoří základ pro každý interaktivní nástroj pro kameru.

12.10.2. Referenční rozcestník

Stránky referenční příručky knihovny jsou cílem vyhledávání, když se některá z těchto funkcí objeví v reálném kódu:

  • protocol — Kanály protokolu OpenMV – modul protocol, protocol.init(), protocol.register(), ProtocolChannel, konstanty příznaků kanálů a tabulka maximálního payloadu pro každou kameru.

  • Hostitelské SDK – pip install openmv, openmv.camera.Camera. Metody dotčené v této kapitole: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec() a stop().

  • Repozitář openmv-projects – reálné nástroje postavené na knihovně protokolu. Adresář tools/ obsahuje thermal-overlay-calibration (GUI pro zarovnání RGB + termo), ccm-tuning (ladič matice barevné korekce), genx320-event-streaming a genx320-overlay-calibration (nástroje pro událostní kameru). Každý z nich používá vzory z této kapitoly od začátku do konce.

12.10.3. Kam dál

Několik směrů, kterými se projekty s kamerou odsud ubírají:

  • Vytvoření hostitelského GUI. Kanál snímků napájející videowidget, jeden nebo dva konfigurační kanály napájející posuvníky a tlačítka. Pro samotnou vrstvu GUI je DearPyGui přirozenou volbou – čistě v Pythonu, instalovatelný přes pip, dostatečně rychlý pro živý náhled a to, po čem jako první sáhne každý existující hostitelský nástroj OpenMV.

  • Vícekanálový telemetrický panel. Několik aplikačních kanálů na téže kameře (hodnoty senzorů, čítače, stavové události), každý obnovovaný ve vlastním callbacku, a hostitelské GUI, které je čte na časovači a každý vykresluje samostatně. Nezávislé řízení toku vrstvy kanálů znamená, že jedno pomalé čtení neblokuje ostatní.

  • Vzdálené ladění přes UART. Stejné callbacky kanálů; aplikace volá protocol.init pro přepnutí z USB na transport UART. Kamera běží dál bezhlavě a Python skript na Raspberry Pi nebo notebooku s ní komunikuje přes sériovou linku za účelem ladění v terénu.

Formát na drátě, vrstva spolehlivosti a abstrakce kanálů se nemění. Výběr transportu, který odpovídá nasazení, a přidání kanálu pro každou věc, kterou hostitel potřebuje vidět nebo nastavit, je odsud celá inženýrská práce.