12.10. Подведение итогов

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

12.10.1. Что было построено в этой главе

  • Четырёхуровневая ментальная модель стека: транспорт, формирование пакетов, надёжность, каналы. Каждый уровень решает одну задачу и игнорирует всё, что выше.

  • Формат пакета на линии – 10-байтовый заголовок с CRC, переменная полезная нагрузка, завершающий CRC. Достаточно маленький, чтобы пройти его байт за байтом.

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

  • Механизм надёжности поверх этого: порядковые номера, ACK, NAK, повторные передачи с экспоненциальной выдержкой, десять кодов состояния.

  • Модель каналов: до 32 именованных логических потоков на одной линии, со встроенными stdin / stdout / stream / profile и каналами приложения, зарегистрированными через класс Python.

  • Интерфейс бэкенда – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – и то, как библиотека протокола использует методы, присутствующие в бэкенде, чтобы решить, что поддерживает канал.

  • Сторона хоста: класс Camera из openmv-python SDK, магическая скорость 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 (графический интерфейс выравнивания 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 или ноутбуке общается с ней по последовательной линии для полевой настройки.

Формат данных на линии, уровень надёжности и абстракция каналов не меняются. Выбор транспорта, подходящего для развёртывания, и добавление канала для каждой вещи, которую хосту нужно видеть или задавать, – это вся инженерная работа отсюда и далее.