v3.3.0

v3.3.0 — это крупный выпуск. Он добавляет полную поддержку тепловизионной камеры FLIR Lepton с новым интерфейсом sensor.ioctl() и цветовыми палитрами, модуль вывода видео по SPI tv, режим триггерного захвата с глобальным затвором, большую партию новых методов рисования/анализа image (gamma_corr(), draw_ellipse(), draw_edges(), множество свойств блобов), а также новые библиотеки ToF / моторов / линейной алгебры. API cpufreq был переработан, а sensor.set_framesize() теперь вызывает исключение — читайте о ломающих изменениях ниже.

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

  • FLIR Lepton — полная поддержка тепловизионной камеры через новый интерфейс sensor.ioctl(), цветовые палитры и image.to_rainbow().

  • Модуль tv — вывод видео по SPI на телевизор / композитный выход.

  • Режим триггерного захвата с глобальным затвором — триггерный захват MT9V034 через sensor.ioctl().

  • Обработка изображенийgamma_corr(), draw_ellipse(), draw_edges(), альфа-смешивание в draw_image() и множество новых свойств блобов.

  • Новые библиотеки — измерение расстояния ToF VL53L1X, драйвер мотора TB6612, micro-linalg.

  • Ломающее изменение: API cpufreq был переработан, sensor.set_framesize() теперь вызывает исключение при неудаче, sensor.alloc_extra_fb() больше не поддерживает Bayer/JPEG, а позиционные аргументы image.replace() сдвинулись — см. раздел о ломающих изменениях.

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

  • FLIR Lepton — добавлены sensor.ioctl() для специфичного управления датчиком и полный набор ioctl для Lepton (радиометрия, частота обновления/разрешение, выполнение команд, установка/чтение атрибутов, температура FPA/AUX в °C, режим/диапазон измерения, ширина/высота), sensor.set_color_palette() / sensor.get_color_palette() с sensor.PALETTE_RAINBOW / PALETTE_IRONBOW, image.to_rainbow() и примеры скриптов для Lepton (27-Lepton).

  • Триггерный режимIOCTL_SET_TRIGGERED_MODE / IOCTL_GET_TRIGGERED_MODE для триггерного захвата MT9V034 с глобальным затвором, с примерами высокого FPS и триггерного режима.

  • Модуль tv — добавлены привязки для вывода видео по SPI на телевизор / композитный выход.

  • Обработка изображений — добавлены image.gamma_corr(), image.draw_ellipse(), image.draw_edges(), альфа-смешивание в draw_image(), ключевое слово mask= в clear(), повторно добавлены mask_rectangle() / mask_circle() / mask_ellipse(), ключевые слова поворота / hmirror / vflip в draw_string() / draw_text(), ключевое слово transpose (и псевдонимы assign / set) в replace(), параметры x_scale / y_scale в copy(), а также crop() / scale(), конструктор Image() из размеров, пиксельный формат sensor.BINARY, экспортируемые функции преобразования цветовых пространств и множество новых свойств блобов (corners, perimeter, roundness, elongation, extent, compactness, solidity, convexity, enclosing_circle, enclosed_ellipse, поворот).

  • Библиотеки — добавлены драйвер датчика расстояния ToF vl53l1x, драйвер мотора tb6612 (с примерами Motor-Shield для DC-моторов и шаговых двигателей) и библиотека micro-linalg (ulinalg / umatrix).

  • Обновлена FatFS до FF13C (с поддержкой exFAT).

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

  • Улучшено качество JPEG по умолчанию (середина диапазона между низким и высоким вместо жёстко заданного значения); операции над изображением на месте больше не требуют повторять изображение в качестве первого аргумента; draw_string() принимает нецелые значения масштаба.

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

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

  • Исправлены зависание при запуске Lepton 3.5 (тайм-аут + восстановление) и надёжность сброса, вызов MT9V034 set_framesize() до set_pixformat() (порядок вызовов больше не имеет значения), WVGA для MT9V034 на STM32H7, диапазон автоэкспозиции MT9V034 и обновления теневых регистров, а также ошибка ADC на H7.

Обработка изображений:

  • Исправлены недопустимый доступ к памяти в find_apriltags(), copy() при копировании масштабированного изображения в основной буфер кадра, выделение буфера кадра в to_grayscale() / to_rgb565(), len() объекта ключевой точки, обработка границ MCU в JPEG, разбор списка порогов в binary() и приём кортежей ключевых точек в draw_keypoints().

Система:

  • Исправлены утечки из-за дисбаланса mark/free в fb_alloc в методах image / fir / lcd / tv / nn, py_assert теперь освобождает память буфера кадра при перехваченных исключениях (#417), сбрасывается флаг переполнения UART (ORE), чтобы переполнения больше не блокировали чтение из UART, исправлен обработчик прерываний RTC, а также исправлен инструмент cascade_convert.py для Windows.

Поддержка оборудования и плат

  • Тепловизионная камера FLIR Lepton.

  • TV shield — вывод видео по SPI на телевизор / композитный выход.

  • Глобальный затвор (MT9V034) — триггерный режим.

Ломающие изменения API

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

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

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

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

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

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

API cpufreq переработан (major)

Модуль cpufreq был переработан для поддержки H7. Константы cpufreq.CPUFREQ_120MHZ / 144 / 168 / 192 / 216MHZ и cpufreq.get_frequency() были удалены. cpufreq.set_frequency() теперь принимает обычное целое число МГц (например, cpufreq.set_frequency(120)), а также добавлены cpufreq.get_current_frequencies() / cpufreq.get_supported_frequencies().

Коммиты: 6babf84a1

Позиционные аргументы image.replace() сдвинуты (minor)

image.replace() получил аргумент transpose, сдвинув позиционный аргумент mask с 4-й позиции на 5-ю. Код, передававший mask позиционно (например, img.replace(src, hmirror, vflip, mask)), должен перейти на форму с ключевым словом img.replace(src, mask=mask).

Коммиты: dbe7bf059

sensor.alloc_extra_fb() больше не принимает Bayer/JPEG (minor)

sensor.alloc_extra_fb() больше не принимает sensor.BAYER или sensor.JPEG (теперь он также поддерживает sensor.BINARY). Код, выделявший дополнительные буферы кадра в формате Bayer или JPEG, должен использовать GRAYSCALE / RGB565 (или выделять буфер другим способом).

Коммиты: f9e6b3fe0

sensor.set_framesize() вызывает исключение при неудаче (behavior)

sensor.set_framesize() теперь вызывает ValueError, когда размер кадра не поддерживается, вместо возврата False. Код, проверявший возвращаемое значение False, должен вместо этого перехватывать исключение ValueError.

Коммиты: b0442633e

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

Для чистого перехода на v3.3.0 типичный объём работ таков:

  1. Перенесите код cpufreq на set_frequency() с целым числом МГц и get_current_frequencies() / get_supported_frequencies() (переработка cpufreq).

  2. Передавайте mask в image.replace() как ключевое слово (изменение replace).

  3. Выделяйте дополнительные буферы кадра как GRAYSCALE / RGB565 вместо Bayer/JPEG (изменение alloc_extra_fb).

  4. Перехватывайте ValueError вокруг sensor.set_framesize() вместо проверки на False (изменение set_framesize).

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