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 / profile oraz 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 Camera z SDK openmv-python, magiczna szybkość 921600 baud, która przełącza USB-CDC w tryb protokołu, oraz wzorzec rundy channel_size / channel_read / channel_write.

  • Wzorzec strumieniowania ramek – przechwytywanie do pojedynczego bufora, readp z blokadą, send_event dla 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() oraz stop().

  • 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-streaming oraz genx320-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.