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.