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