12.10. Підсумок

Камера, підключена до USB-кабелю, яка передає кадри до хост-програми, приймає оновлення конфігурації від хоста і витримує відключення/підключення без втрати синхронізації — з прихованими повторними передачами, кількома логічними потоками, що спільно використовують один порт, і без жодного коду фреймінгу у застосунку — виходить приблизно з сорока рядків коду на стороні камери та аналогічної кількості на стороні хоста. Бібліотека протоколу перетворює байтовий канал на програмовану поверхню каналів і зберігає все, що нижче застосунку, невидимим.

12.10.1. Що побудовано у розділі

  • Чотирирівнева концептуальна модель стека: транспорт, фреймінг, надійність, канали. Кожен рівень вирішує одну задачу і ігнорує все вище.

  • Формат пакета в дроті — 10-байтний заголовок із CRC, змінне корисне навантаження, замикаючий CRC. Достатньо малий, щоб обійти байт за байтом.

  • Handshake, який запускають камера і хост при підключенні транспорту: PROTO_SYNC, обмін можливостями, виявлення каналів.

  • Механізм надійності поверх: порядкові номери, ACK, NAK, повторні передачі з експоненційним відкочуванням, десять кодів статусу.

  • Модель каналів: до 32 іменованих логічних потоків на одному дроті, з вбудованими stdin / stdout / stream / profile і каналами застосунку, зареєстрованими Python-класом.

  • Інтерфейс бекенда — size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active — і те, як бібліотека протоколу використовує методи, присутні у бекенді, щоб вирішити, що підтримує канал.

  • Сторона хоста: клас Camera SDK openmv-python, магічна швидкість 921600 бод, що перемикає USB-CDC у режим протоколу, та шаблон обертів channel_size / channel_read / channel_write.

  • Шаблон потокової передачі кадрів — однобуферне захоплення, readp із засувкою, send_event для сповіщень про новий кадр — і двонаправлений шаблон конфігурації (канал, доступний для запису хостом, обмін JSON), що разом утворюють основу для кожного інтерактивного інструменту з камерою.

12.10.2. Довідкова дорожня карта

Сторінки довідника бібліотеки — це місця пошуку, коли одна з цих функцій з’являється у реальному коді:

  • protocol — Канали протоколу OpenMV – модуль protocol, protocol.init(), protocol.register(), ProtocolChannel, константи прапорів каналу та таблиця максимального корисного навантаження для кожної камери.

  • SDK хоста – pip install openmv, openmv.camera.Camera. Методи, розглянуті у цьому розділі: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec() та stop().

  • Репозиторій openmv-projects — реальні інструменти, побудовані на бібліотеці протоколу. Каталог tools/ включає thermal-overlay-calibration (GUI вирівнювання RGB + теплового зображення), ccm-tuning (налаштовувач матриці корекції кольору), genx320-event-streaming і genx320-overlay-calibration (інструменти для подійних камер). Кожен із них використовує шаблони з цього розділу від початку до кінця.

12.10.3. Куди рухатися далі

Кілька напрямків, у яких рухаються проєкти з камерами:

  • Побудова GUI хоста. Канал кадрів, що живить відео-віджет, один або два канали конфігурації, що живлять повзунки та кнопки. Для самого GUI-шару DearPyGui — природний вибір: чистий Python, встановлюється через pip, достатньо швидкий для живого попереднього перегляду і те, до чого кожен існуючий інструмент хоста OpenMV звертається в першу чергу.

  • Багатоканальна телеметрична панель. Кілька каналів застосунку на одній камері (показання датчиків, лічильники, події статусу), кожен оновлюється у своєму зворотному виклику, і GUI хоста, що зчитує їх за таймером і відображає кожен окремо. Незалежне управління потоком каналів означає, що повільне читання одного не блокує інші.

  • Дистанційне налаштування через UART. Ті самі зворотні виклики каналів; застосунок викликає protocol.init для перемикання з USB на транспорт UART. Камера продовжує працювати без монітора, а Python-скрипт на Raspberry Pi або ноутбуці спілкується з нею по послідовній лінії для польового налаштування.

Дротовий формат, рівень надійності та абстракція каналів не змінюються. Вибір транспорту, що підходить для розгортання, і додавання каналу для кожного, що хост повинен бачити або змінювати, — це вся інженерна робота з цього моменту.