12.10. Podsumowanie¶
Kamera podłączona do kabla USB, która strumieniuje ramki do programu hosta, przyjmuje aktualizacje konfiguracji z powrotem od hosta i przeżywa odłączenie/ponowne podłączenie bez utraty synchronizacji – z ukrytymi retransmisjami, wieloma logicznymi strumieniami współdzielącymi jeden port i zerową ilością kodu ramkowania w aplikacji – wynika z około czterdziestu linii kodu po stronie kamery i podobnej ilości po stronie hosta. Biblioteka protokołu zamienia potok bajtów w programowalną powierzchnię kanałów i utrzymuje wszystko poniżej aplikacji niewidocznym.
12.10.1. Co zbudował ten rozdział¶
Czterowarstwowy model myślowy stosu: transport, ramkowanie, niezawodność, kanały. Każda warstwa rozwiązuje jeden problem i ignoruje wszystko powyżej.
Format pakietu w transmisji – 10-bajtowy nagłówek z CRC, zmienny ładunek, końcowe CRC. Wystarczająco mały, by prześledzić go bajt po bajcie.
Uzgadnianie (handshake), które kamera i host wykonują, gdy transport się łączy: PROTO_SYNC, wymiana zdolności, odkrywanie kanałów.
Maszyneria niezawodności na wierzchu: numery sekwencyjne, ACK, NAK, retransmisje z wykładniczym odczekiwaniem (backoff), dziesięć kodów statusu.
Model kanałów: do 32 nazwanych logicznych strumieni na jednym przewodzie, z wbudowanymi
stdin/stdout/stream/profileoraz kanałami aplikacyjnymi rejestrowanymi przez klasę Pythona.Interfejs backendu –
size,read,write,poll,lock/unlock,shape,ioctl,flush,is_active– oraz to, jak biblioteka protokołu wykorzystuje metody obecne w backendzie, aby zdecydować, co kanał obsługuje.Strona hosta: klasa
Cameraz SDK openmv-python, magiczna szybkość921600baud, która przełącza USB-CDC w tryb protokołu, oraz wzorzec rundychannel_size/channel_read/channel_write.Wzorzec strumieniowania ramek – przechwytywanie do pojedynczego bufora,
readpz blokadą,send_eventdla powiadomień o nowej ramce – oraz dwukierunkowy wzorzec konfiguracji (kanał zapisywalny przez host, runda JSON), które razem tworzą fundament dla każdego interaktywnego narzędzia kamery.
12.10.2. Mapa drogowa dokumentacji¶
Strony dokumentacji bibliotek są celami wyszukiwania, gdy jedna z tych funkcji pojawi się w rzeczywistym kodzie:
protocol — Kanały protokołu OpenMV – moduł
protocol,protocol.init(),protocol.register(),ProtocolChannel, stałe flag kanałów oraz tabela maksymalnego ładunku dla poszczególnych kamer.SDK hosta –
pip install openmv,openmv.camera.Camera. Metody poruszone w tym rozdziale:update_channels(),has_channel(),channel_size(),channel_read(),channel_write(),poll_events(),read_frame(),exec()orazstop().Repozytorium openmv-projects – rzeczywiste narzędzia zbudowane na bibliotece protokołu. Katalog tools/ zawiera
thermal-overlay-calibration(GUI do wyrównywania RGB + termowizji),ccm-tuning(tuner macierzy korekcji kolorów),genx320-event-streamingorazgenx320-overlay-calibration(oprzyrządowanie dla kamer zdarzeniowych). Każde z nich wykorzystuje wzorce z tego rozdziału od początku do końca.
12.10.3. Dokąd dalej¶
Kilka kierunków, w których projekty kamer poruszają się od tego miejsca:
Budowanie GUI hosta. Kanał ramek zasilający widżet wideo, jeden lub dwa kanały konfiguracji zasilające suwaki i przyciski. Dla samej warstwy GUI naturalnym wyborem jest DearPyGui – czysty Python, instalowalny przez pip, wystarczająco szybki do podglądu na żywo, i to po niego sięga w pierwszej kolejności każde istniejące narzędzie hosta OpenMV.
Wielokanałowy pulpit telemetryczny. Kilka kanałów aplikacyjnych na tej samej kamerze (odczyty sensorów, liczniki, zdarzenia statusu), każdy odświeżany we własnym wywołaniu zwrotnym, oraz GUI hosta, które odczytuje je za pomocą licznika czasu (timera) i renderuje każdy osobno. Niezależna kontrola przepływu w warstwie kanałów oznacza, że jeden wolny odczyt nie blokuje pozostałych.
Zdalne strojenie przez UART. Te same wywołania zwrotne kanałów; aplikacja wywołuje
protocol.init, aby przełączyć się z USB na transport UART. Kamera nadal działa bezgłowo, a skrypt Pythona na Raspberry Pi lub laptopie komunikuje się z nią po linii szeregowej w celu strojenia w terenie.
Format transmisji, warstwa niezawodności i abstrakcja kanałów nie zmieniają się. Wybranie transportu pasującego do wdrożenia i dodanie kanału dla każdej rzeczy, którą host musi widzieć lub ustawiać, to cała praca inżynierska od tego momentu.