v3.9.0

A v3.9.0 é uma versão importante. Ela adiciona o port nRF com o Arduino Nano 33 BLE Sense (câmera, módulo audio PDM, ulab, drivers de sensores congelados), traz os sensores térmicos FLIR Lepton mais MLX90641 / MLX90621 e um módulo fir fortemente reformulado, ioctls de autofoco do OV5640 e o novo tipo de streaming image.ImageIO. O antigo módulo CMSIS-NN nn e as antigas classes ImageReader / ImageWriter foram removidos — leia as mudanças incompatíveis abaixo.

Destaques

  • Arduino Nano 33 BLE Sense — novo port nRF52840 com câmera, um módulo audio PDM, ulab e drivers de sensores congelados.

  • Térmico — suporte a FLIR Lepton, MLX90641 e MLX90621 com um módulo fir reformulado (paletas, espelhamento, escalonamento, radiometria, FFC).

  • Autofoco do OV5640 — novos ioctls sensor.IOCTL_*_AUTO_FOCUS.

  • image.ImageIO — um tipo unificado de stream de imagem (memória ou arquivo; read/write/seek/size/close) substituindo ImageReader / ImageWriter.

  • Incompatível: o módulo CMSIS-NN nn e image.ImageReader / image.ImageWriter foram removidos, e o comportamento de find_lines() / fir mudou — veja as mudanças incompatíveis.

Novos recursos

  • Port nRF / Arduino Nano 33 BLE Sense — novo port e suporte de placa nRF52840, com um novo módulo audio (audio.init(), audio.start_streaming(), audio.stop_streaming()), ulab habilitado e drivers de sensores apds9960 / lps22h / lsm9ds1 / hts221 congelados.

  • image.ImageIO — um novo tipo de stream de imagem que suporta tanto streams de memória quanto de arquivo com read() / write() / seek() / size() / close(), além de exemplos de leitura/escrita/memória do ImageIO.

  • FLIR Lepton — adicionado suporte a FIR_LEPTON com fir.radiometric(), fir.trigger_ffc() e fir.register_vsync_cb().

  • Sensores térmicos — adicionado suporte a termopilha MLX90641 (FIR_MLX90641) e MLX90621 (drivers oficiais da Melexis).

  • Paletas / orientação do fir — adicionadas as constantes fir.PALETTE_RAINBOW / PALETTE_IRONBOW / GRAYSCALE / RGB565, e fir.read_ir() agora aceita hmirror / vflip / transpose.

  • Autofoco do OV5640 — adicionados 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).

  • Reorganizados os exemplos do Arduino em diretórios por placa.

Outras mudanças e melhorias

  • Mudança para mensagens de erro comprimidas do MicroPython (strings de exceção mais curtas); o argumento type de fir.init() agora é detectado automaticamente por meio de uma varredura do barramento I2C quando omitido; a exceção xalloc agora informa o número de bytes solicitados; o UART 8 foi habilitado no Portenta; os exemplos de FIR foram consolidados em thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py. Para caber na flash, image.get_similarity() e a busca seletiva foram desabilitados no build do OpenMV 4, e a biblioteca de imagem agora pode ser compilada sem um sistema de arquivos (para placas sem sistema de arquivos).

Correções de bugs

Câmera e sensores:

  • Corrigido o cálculo do PCLK do OV5640, adicionados handlers de IRQ I2C ausentes (corrigindo travamentos em transferências I2C), reformulada a leitura/escrita I2C do cambus para maior confiabilidade, tornado selecionável o barramento I2C do Lepton, movidos os pinos de recuperação do barramento cambus para configuração por placa, nova tentativa da varredura do cambus uma vez antes de falhar e o OpenMV PT (Lepton + câmera compartilhando o I2C) passou a funcionar.

Térmico:

  • Corrigido o cálculo do valor máximo em fir get_ir() / draw_ir() e image.get_similarity() (FLT_MIN-FLT_MAX), o tratamento de 12→16 bits do AMG8833 e a precisão do MLX90621 (driver oficial da Melexis).

Display, áudio e sistema:

  • Movidas as transferências do LCD SPI do STM32 para callbacks SPI da HAL (confiabilidade do display), corrigidos o audio.init() do Nano 33 (oscilador HF + razão PDM para que o microfone funcione), o estado do timer do H7 com a nova HAL, o gc_collect do nRF e a inicialização/desinicialização inicial da placa, e interrompida a impressão da mensagem espúria “uh oh, no preference for overlapping detection” durante find_apriltags() / find_rects().

Hardware e suporte a placas

  • Arduino Nano 33 BLE Sense — nova placa nRF52840 (câmera, áudio PDM, ulab, drivers de sensores congelados).

  • Sensores térmicos FLIR Lepton, MLX90641 e MLX90621.

  • Autofoco do OV5640 — OpenMV 2/3/4/4 Plus/PT/Portenta.

  • Portenta — UART 8 habilitado.

Mudanças incompatíveis na API

Quebras de API visíveis ao usuário entre a v3.8.0 e a v3.9.0. Escopo: módulos C do Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada mudança é marcada com seu impacto:

  • major — afeta a maioria dos scripts que usaram o recurso; você precisará portar o código.

  • minor — API restrita; afeta apenas scripts que a usaram.

  • behavior — mesma API, resultados diferentes; reavalie scripts ajustados.

As mudanças são agrupadas por impacto nessa ordem. Se você só quer portar seu código, vá direto para o checklist de migração no final. Cada hash de commit possui um link para o seu diff no GitHub.

Módulo CMSIS-NN nn removido (major)

O módulo CMSIS-NN nn foi removido, incluindo nn.load(), net.forward(), net.search() e o auxiliar nn_class. A inferência de modelos passa para o módulo TensorFlow Lite (tf). Scripts que carregavam modelos .network com nn devem ser portados para tf com um modelo TensorFlow Lite.

Commits: fbc767b36

ImageReader / ImageWriter substituídos por image.ImageIO (major)

image.ImageReader / image.ImageWriter e seus métodos next_frame() / add_frame() foram removidos e substituídos pelo novo tipo image.ImageIO, que suporta tanto streams de memória quanto de arquivo via read() / write() / seek() / size() / close(). Código que usa as antigas classes reader/writer deve ser portado para image.ImageIO (veja os exemplos renomeados imageio_read.py / imageio_write.py).

Commits: 783a78754

Palavra-chave scale de fir.draw_ir() removida (minor)

fir.draw_ir() foi reescrita sobre o novo pipeline de desenho de imagem. A palavra-chave scale=(min, max) foi removida, e foram adicionados hint, x_scale, y_scale, roi e argumentos posicionais de deslocamento x/y. Scripts que passavam scale=(min, max) para fir.draw_ir() devem removê-la e usar os novos argumentos.

Commits: 0a29103b1

Aproximação de find_lines() (behavior)

image.find_lines() agora aproxima a magnitude do gradiente como (abs(gx) + abs(gy)) / 2 e ignora magnitudes abaixo de 126. Isso é mais rápido, mas altera o conjunto de linhas detectadas e os valores do acumulador, então reavalie e reajuste threshold / theta_margin / rho_margin.

Commits: 902ae3c98

fir.snapshot() reformulada (behavior)

fir.snapshot() foi substancialmente reformulada com uma nova API de palavras-chave (hmirror, vflip, transpose, x_scale, y_scale, x_size, y_size, scale, rgb_channel, alpha, color_palette, hint, pixformat, copy_to_fb), e os exemplos incluídos foram reescritos. O comportamento anterior posicional/somente-pixformat mudou; porte os scripts FIR para a nova forma de palavras-chave (veja os exemplos atualizados do shield termopilha).

Commits: 53f2248b8

fir.init() lança exceção em falha (behavior)

fir.init() agora lança uma exceção (e desinicializa de forma limpa) quando o sensor térmico não é detectado, em vez de continuar silenciosamente. Envolva fir.init() em try / except (ou garanta que o sensor esteja conectado) onde você antes dependia de ela não lançar exceção.

Commits: 4b2f972f3

Checklist de migração

Para um port limpo para a v3.9.0, o trabalho típico é:

  1. Porte a inferência de modelos CMSIS-NN nn para o módulo TensorFlow Lite tf (a remoção do nn).

  2. Substitua image.ImageReader / image.ImageWriter por image.ImageIO (a mudança do ImageIO).

  3. Remova a palavra-chave scale=(min, max) de fir.draw_ir() e use os novos argumentos (a mudança do draw_ir).

  4. Reajuste os parâmetros de find_lines() contra a métrica de magnitude aproximada (a mudança do find_lines).

  5. Porte os scripts FIR para a nova API de palavras-chave de fir.snapshot() (a mudança do fir.snapshot) e trate fir.init() lançando exceção em um sensor ausente (a mudança do fir.init).

Todos os outros scripts funcionam sem alterações.