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/profilea 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
Cameraz SDK openmv-python, magická rychlost921600baud, která přepne USB-CDC do režimu protokolu, a vzor obrátkychannel_size/channel_read/channel_write.Vzor streamování snímků – snímání s jedním bufferem,
readpse zámkem,send_eventpro 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()astop().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-streamingagenx320-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.initpro 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.