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.