v3.9.0

v3.9.0 是一次重大发布。它新增了 nRF 移植,支持 Arduino Nano 33 BLE Sense(摄像头、PDM audio 模块、ulab、冻结的传感器驱动),带来了 FLIR Lepton 以及 MLX90641 / MLX90621 热成像传感器和大幅重构的 fir 模块、OV5640 自动对焦 ioctl,以及全新的 image.ImageIO 流式类型。旧版 CMSIS-NN nn 模块以及旧的 ImageReader / ImageWriter 类被移除——请阅读下方的不兼容变更。

亮点

  • Arduino Nano 33 BLE Sense —— 全新的 nRF52840 移植,带摄像头、PDM audio 模块、ulab 以及冻结的传感器驱动。

  • 热成像 —— 支持 FLIR Lepton、MLX90641 和 MLX90621,并配有重构的 fir 模块(调色板、镜像、缩放、辐射测量、FFC)。

  • OV5640 自动对焦 —— 全新的 sensor.IOCTL_*_AUTO_FOCUS ioctl。

  • 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 错误消息(更短的异常字符串);fir.init()type 参数在省略时现在会通过 I2C 总线扫描自动检测;xalloc 异常现在会报告所请求的字节数;Portenta 上启用了 UART 8;FIR 示例被整合到 thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py 中。为适配闪存空间,OpenMV 4 构建中禁用了 image.get_similarity() 和选择性搜索,并且图像库现在可以在没有文件系统的情况下构建(适用于无文件系统的开发板)。

缺陷修复

摄像头与传感器:

  • 修复了 OV5640 PCLK 计算,添加了缺失的 I2C IRQ 处理程序(修复 I2C 传输挂起),为可靠性重构了 cambus I2C 读/写,使 Lepton I2C 总线可选择,将 cambus 总线恢复引脚移到按开发板配置,在失败前重试一次 cambus 扫描,并使 OpenMV PT(Lepton + 摄像头共享 I2C)正常工作。

热成像:

  • 修复了 fir get_ir() / draw_ir()image.get_similarity() 中的最大值计算(FLT_MIN-FLT_MAX)、AMG8833 12→16 位处理,以及 MLX90621 精度(官方 Melexis 驱动)。

显示、音频与系统:

  • 将 STM32 SPI LCD 传输移至 HAL SPI 回调(提升显示可靠性),修复了 Nano 33 的 audio.init()(HF 振荡器 + PDM 比率以使麦克风工作)、新 HAL 下的 H7 定时器状态、nRF gc_collect 以及早期的开发板 init/deinit,并停止在 find_apriltags() / find_rects() 期间打印多余的 "uh oh, no preference for overlapping detection" 消息。

硬件与开发板支持

  • Arduino Nano 33 BLE Sense —— 全新的 nRF52840 开发板(摄像头、PDM 音频、ulab、冻结的传感器驱动)。

  • FLIR LeptonMLX90641MLX90621 热成像传感器。

  • OV5640 自动对焦 —— OpenMV 2/3/4/4 Plus/PT/Portenta。

  • Portenta —— 启用 UART 8。

不兼容的 API 变更

v3.8.0 与 v3.9.0 之间面向用户的 API 不兼容变更。范围:modules/ 中的 Python C 模块和 scripts/libraries/ 中的 Python 库。

每项变更均标注了其影响:

  • major —— 影响大多数使用该功能的脚本;你需要移植代码。

  • minor —— 影响范围窄的 API;仅影响使用了它的脚本。

  • behavior —— API 相同但结果不同;请重新检查调校过的脚本。

变更按影响程度依此顺序分组。如果你只想移植代码,请直接跳到末尾的 迁移检查清单。每个提交哈希都链接到其在 GitHub 上的差异。

CMSIS-NN nn 模块被移除 (major)

CMSIS-NN nn 模块被移除,包括 nn.load()net.forward()net.search() 以及 nn_class 辅助类。模型推理改用 TensorFlow Lite(tf)模块。使用 nn 加载 .network 模型的脚本必须移植到 tf 并使用 TensorFlow Lite 模型。

提交: fbc767b36

ImageReader / ImageWriterimage.ImageIO 取代 (major)

image.ImageReader / image.ImageWriter 及其 next_frame() / add_frame() 方法被移除,并由全新的 image.ImageIO 类型取代,后者通过 read() / write() / seek() / size() / close() 同时支持内存流和文件流。使用旧读取器/写入器类的代码必须移植到 image.ImageIO(参见重命名后的 imageio_read.py / imageio_write.py 示例)。

提交: 783a78754

fir.draw_ir()scale 关键字被移除 (minor)

fir.draw_ir() 在新的图像绘制管线之上进行了重写。scale=(min, max) 关键字被移除,并添加了 hintx_scaley_scaleroi 以及位置化的 x/y 偏移参数。向 fir.draw_ir() 传递 scale=(min, max) 的脚本必须删除它并改用新参数。

提交: 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(hmirrorvfliptransposex_scaley_scalex_sizey_sizescalergb_channelalphacolor_palettehintpixformatcopy_to_fb),内置示例也被重写。此前仅支持位置参数/pixformat 的行为已改变;请将 FIR 脚本移植到新的关键字形式(参见更新后的 thermopile-shield 示例)。

提交: 53f2248b8

fir.init() 在失败时抛出异常 (behavior)

fir.init() 现在在未检测到热成像传感器时会抛出异常(并干净地反初始化),而不再静默继续。在以前依赖它不抛异常的地方,请用 try / except 包裹 fir.init()(或确保传感器已连接)。

提交: 4b2f972f3

迁移检查清单

要顺利移植到 v3.9.0,通常需要做的工作是:

  1. 将 CMSIS-NN nn 的模型推理移植到 TensorFlow Lite tf 模块(nn 移除)。

  2. image.ImageIO 替换 image.ImageReader / image.ImageWriterImageIO 变更)。

  3. fir.draw_ir() 中删除 scale=(min, max) 关键字并改用新参数(draw_ir 变更)。

  4. 针对近似幅值度量重新调校 find_lines() 参数(find_lines 变更)。

  5. 将 FIR 脚本移植到新的 fir.snapshot() 关键字 API(fir.snapshot 变更),并处理传感器缺失时 fir.init() 抛出的异常(fir.init 变更)。

所有其他脚本无需改动即可运行。