12.10. Sammanfattning¶
En kamera inkopplad i en USB-kabel som strömmar bildrutor till ett värdprogram, tar emot konfigurationsuppdateringar tillbaka från värden och överlever urkoppling/återinkoppling utan att tappa synk – med omsändningar dolda, flera logiska strömmar som delar en port, och noll ramningskod i applikationen – kommer ur ungefär fyrtio rader kod på kamerasidan och en liknande mängd på värden. Protokollbiblioteket förvandlar en byte-pipe till en programmerbar kanalyta och håller allt under applikationen osynligt.
12.10.1. Vad kapitlet byggde¶
En mental modell av stacken i fyra lager: transport, ramning, tillförlitlighet, kanaler. Varje lager löser ett problem och ignorerar allt ovanför.
Paketformatet på ledningen – 10-byte-header med CRC, variabel nyttolast, avslutande CRC. Litet nog att gå igenom byte för byte.
Handskakningen som kameran och värden kör när en transport ansluter: PROTO_SYNC, förmågeutbyte, kanalupptäckt.
Tillförlitlighetsmaskineriet ovanpå: sekvensnummer, ACK:er, NAK:er, omsändningar med exponentiell backoff, de tio statuskoderna.
Kanalmodellen: upp till 32 namngivna logiska strömmar på en ledning, med inbyggda
stdin/stdout/stream/profileoch applikationskanaler registrerade per Python-klass.Backend-gränssnittet –
size,read,write,poll,lock/unlock,shape,ioctl,flush,is_active– och hur protokollbiblioteket använder de metoder som finns på en backend för att avgöra vad kanalen stöder.Värdsidan: openmv-python-SDK:ns
Camera-klass, den magiska921600-baudhastigheten som växlar USB-CDC till protokollläge, och tur-och-retur-mönstretchannel_size/channel_read/channel_write.Ett bildrutestrømningsmönster – enbuffert-infångning,
readpmed en spärr,send_eventför notifieringar om nya bildrutor – och ett dubbelriktat konfigurationsmönster (värdskrivbar kanal, JSON tur och retur) som tillsammans utgör grunden för varje interaktivt kameraverktyg.
12.10.2. Referensvägkarta¶
Bibliotekets referenssidor är uppslagsmålen när någon av dessa funktioner dyker upp i verklig kod:
protocol — OpenMV-protokollkanaler – modulen
protocol,protocol.init(),protocol.register(),ProtocolChannel, kanalflaggkonstanterna och tabellen över maximal nyttolast per kamera.Värd-SDK:n –
pip install openmv,openmv.camera.Camera. Metoder som berörs i detta kapitel:update_channels(),has_channel(),channel_size(),channel_read(),channel_write(),poll_events(),read_frame(),exec()ochstop().Förrådet openmv-projects – verkliga verktyg byggda på protokollbiblioteket. Katalogen tools/ innehåller
thermal-overlay-calibration(GUI för RGB- + termisk inriktning),ccm-tuning(justerare för färgkorrigeringsmatris),genx320-event-streamingochgenx320-overlay-calibration(verktyg för händelsekameror). Var och en använder mönstren från detta kapitel från början till slut.
12.10.3. Vart man tar det härnäst¶
Några riktningar som kameraprojekt rör sig i härifrån:
Bygga ett värd-GUI. En bildrutekanal som matar en videowidget, en eller två konfigurationskanaler som matar reglage och knappar. För själva GUI-lagret är DearPyGui det naturliga valet – ren Python, installerbart med pip, snabbt nog för förhandsgranskning i realtid, och det som varje befintligt OpenMV-värdverktyg griper efter först.
Flerkanalig telemetri-instrumentpanel. Flera applikationskanaler på samma kamera (sensoravläsningar, räknare, statushändelser) var och en uppdaterad i sitt eget återanrop, och ett värd-GUI som läser dem via en timer och renderar var och en separat. Kanallagrets oberoende flödeskontroll innebär att en långsam läsning inte stoppar de andra.
Fjärrjustering över UART. Samma kanalåteranrop; applikationen anropar
protocol.initför att växla från USB till en UART-transport. Kameran fortsätter köra utan skärm medan ett Python-skript på en Raspberry Pi eller laptop pratar med den över en seriell linje för fältjustering.
Ledningsformatet, tillförlitlighetslagret och kanalabstraktionen ändras inte. Att välja den transport som passar driftsättningen och lägga till en kanal för varje sak som värden behöver se eller ställa in är hela ingenjörsjobbet härifrån och framåt.