v3.9.0

v3.9.0 — крупный релиз. Он добавляет порт nRF с Arduino Nano 33 BLE Sense (камера, PDM-модуль audio, ulab, замороженные драйверы датчиков), привносит тепловые датчики FLIR Lepton плюс MLX90641 / MLX90621 и значительно переработанный модуль fir, ioctl-вызовы автофокуса OV5640 и новый потоковый тип image.ImageIO. Устаревший модуль CMSIS-NN nn и старые классы ImageReader / ImageWriter были удалены — ознакомьтесь с критическими изменениями ниже.

Основные моменты

  • Arduino Nano 33 BLE Sense — новый порт nRF52840 с камерой, PDM-модулем audio, ulab и замороженными драйверами датчиков.

  • Тепловизор — поддержка FLIR Lepton, MLX90641 и MLX90621 с переработанным модулем fir (палитры, зеркалирование, масштабирование, радиометрия, FFC).

  • Автофокус OV5640 — новые ioctl-вызовы sensor.IOCTL_*_AUTO_FOCUS.

  • image.ImageIO — унифицированный тип потока изображений (память или файл; read/write/seek/size/close), заменяющий ImageReader / ImageWriter.

  • Критическое: модуль CMSIS-NN nn и image.ImageReader / image.ImageWriter были удалены, а поведение find_lines() / fir изменилось — см. критические изменения.

Новые возможности

  • Порт nRF / Arduino Nano 33 BLE Sense — новый порт nRF52840 и поддержка платы, с новым модулем audio (audio.init(), audio.start_streaming(), audio.stop_streaming()), включённым ulab и замороженными драйверами датчиков apds9960 / lps22h / lsm9ds1 / hts221.

  • image.ImageIO — новый тип потока изображений, поддерживающий как потоки в памяти, так и файловые потоки через read() / write() / seek() / size() / close(), плюс примеры чтения/записи/работы с памятью ImageIO.

  • FLIR Lepton — добавлена поддержка FIR_LEPTON с fir.radiometric(), fir.trigger_ffc() и fir.register_vsync_cb().

  • Тепловые датчики — добавлена поддержка термопар MLX90641 (FIR_MLX90641) и MLX90621 (официальные драйверы Melexis).

  • Палитры / ориентация fir — добавлены константы fir.PALETTE_RAINBOW / PALETTE_IRONBOW / GRAYSCALE / RGB565, а fir.read_ir() теперь принимает hmirror / vflip / transpose.

  • Автофокус OV5640 — добавлены sensor.IOCTL_TRIGGER_AUTO_FOCUS / IOCTL_PAUSE_AUTO_FOCUS / IOCTL_RESET_AUTO_FOCUS / IOCTL_WAIT_ON_AUTO_FOCUS (OpenMV 2/3/4/4 Plus/PT/Portenta).

  • Примеры для Arduino реорганизованы в каталоги по платам.

Прочие изменения и улучшения

  • Переход на сжатые сообщения об ошибках MicroPython (более короткие строки исключений); аргумент type функции fir.init() теперь автоматически определяется через сканирование шины I2C, если он опущен; исключение xalloc теперь сообщает количество запрошенных байтов; на Portenta включён UART 8; примеры FIR консолидированы в thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py. Чтобы уместиться во флеш-память, image.get_similarity() и выборочный поиск были отключены в сборке OpenMV 4, и библиотеку изображений теперь можно собирать без файловой системы (для плат без файловой системы).

Исправления ошибок

Камера и датчики:

  • Исправлен расчёт PCLK OV5640, добавлены отсутствующие обработчики IRQ I2C (устранены зависания передачи I2C), переработаны чтение/запись cambus I2C для надёжности, шина Lepton I2C сделана выбираемой, выводы восстановления шины cambus перенесены в конфигурацию по платам, добавлена однократная повторная попытка сканирования cambus перед сбоем и заставлен работать OpenMV PT (общая I2C для Lepton + камеры).

Тепловизор:

  • Исправлен расчёт максимального значения в fir get_ir() / draw_ir() и image.get_similarity() (FLT_MIN-FLT_MAX), обработка 12→16 бит для AMG8833 и точность MLX90621 (официальный драйвер Melexis).

Дисплей, аудио и система:

  • Передачи STM32 SPI LCD перенесены на функции обратного вызова HAL SPI (надёжность дисплея), исправлены audio.init() для Nano 33 (HF-генератор + соотношение PDM, чтобы микрофон работал), состояние таймера H7 с новым HAL, gc_collect для nRF и ранняя инициализация/деинициализация платы, а также прекращён вывод ложного сообщения «uh oh, no preference for overlapping detection» во время find_apriltags() / find_rects().

Аппаратное обеспечение и поддержка плат

  • Arduino Nano 33 BLE Sense — новая плата nRF52840 (камера, PDM-аудио, ulab, замороженные драйверы датчиков).

  • Тепловые датчики FLIR Lepton, MLX90641 и MLX90621.

  • Автофокус OV5640 — OpenMV 2/3/4/4 Plus/PT/Portenta.

  • Portenta — включён UART 8.

Критические изменения API

Видимые пользователю изменения API между v3.8.0 и v3.9.0. Область: C-модули Python в modules/ и библиотеки Python в scripts/libraries/.

Каждое изменение помечено по степени влияния:

  • major — затрагивает большинство скриптов, использовавших функцию; вам потребуется портировать код.

  • minor — узкий API; затрагивает только скрипты, которые его использовали.

  • behavior — тот же API, другие результаты; перепроверьте настроенные скрипты.

Изменения сгруппированы по влиянию в этом порядке. Если вы просто хотите портировать свой код, перейдите к контрольному списку миграции в конце. Каждый хеш коммита ссылается на свой diff на GitHub.

Модуль CMSIS-NN nn удалён (major)

Модуль CMSIS-NN nn был удалён, включая nn.load(), net.forward(), net.search() и вспомогательный nn_class. Вывод модели переходит в модуль TensorFlow Lite (tf). Скрипты, которые загружали модели .network с помощью nn, должны быть портированы на tf с моделью TensorFlow Lite.

Коммиты: fbc767b36

ImageReader / ImageWriter заменены на image.ImageIO (major)

image.ImageReader / image.ImageWriter и их методы next_frame() / add_frame() были удалены и заменены новым типом image.ImageIO, который поддерживает как потоки в памяти, так и файловые потоки через read() / write() / seek() / size() / close(). Код, использующий старые классы reader/writer, должен быть портирован на image.ImageIO (см. переименованные примеры imageio_read.py / imageio_write.py).

Коммиты: 783a78754

Ключевое слово scale функции fir.draw_ir() удалено (minor)

fir.draw_ir() была переписана поверх нового конвейера рисования изображений. Ключевое слово scale=(min, max) было удалено, а добавлены аргументы hint, x_scale, y_scale, roi и позиционные смещения x/y. Скрипты, которые передавали scale=(min, max) в fir.draw_ir(), должны убрать его и использовать новые аргументы.

Коммиты: 0a29103b1

Аппроксимация find_lines() (behavior)

image.find_lines() теперь аппроксимирует величину градиента как (abs(gx) + abs(gy)) / 2 и пропускает величины ниже 126. Это быстрее, но изменяет набор обнаруженных линий и значения аккумулятора, поэтому перепроверьте и перенастройте threshold / theta_margin / rho_margin.

Коммиты: 902ae3c98

fir.snapshot() переработана (behavior)

fir.snapshot() была существенно переработана с новым API ключевых слов (hmirror, vflip, transpose, x_scale, y_scale, x_size, y_size, scale, rgb_channel, alpha, color_palette, hint, pixformat, copy_to_fb), а встроенные примеры были переписаны. Прежнее поведение с позиционными аргументами / только pixformat изменилось; портируйте скрипты FIR на новую форму с ключевыми словами (см. обновлённые примеры для шилда thermopile).

Коммиты: 53f2248b8

fir.init() вызывает исключение при сбое (behavior)

fir.init() теперь вызывает исключение (и чисто деинициализируется), когда тепловой датчик не обнаружен, вместо тихого продолжения. Оберните fir.init() в try / except (или убедитесь, что датчик подключён) там, где вы ранее полагались на то, что она не вызывает исключений.

Коммиты: 4b2f972f3

Контрольный список миграции

Для чистого перехода на v3.9.0 типичная работа такова:

  1. Портируйте вывод модели CMSIS-NN nn на модуль TensorFlow Lite tf (удаление nn).

  2. Замените image.ImageReader / image.ImageWriter на image.ImageIO (изменение ImageIO).

  3. Уберите ключевое слово scale=(min, max) из fir.draw_ir() и используйте новые аргументы (изменение draw_ir).

  4. Перенастройте параметры find_lines() под приближённую метрику величины (изменение find_lines).

  5. Портируйте скрипты FIR на новый API ключевых слов fir.snapshot() (изменение fir.snapshot) и обработайте вызов исключения fir.init() при отсутствующем датчике (изменение fir.init).

Все остальные скрипты работают без изменений.