v3.9.0

v3.9.0 ist ein Major-Release. Es fügt den nRF-Port mit dem Arduino Nano 33 BLE Sense (Kamera, PDM-audio-Modul, ulab, eingefrorene Sensortreiber) hinzu, bringt FLIR Lepton sowie MLX90641 / MLX90621-Thermalsensoren und ein stark überarbeitetes fir-Modul, OV5640-Autofokus-ioctls und den neuen Streaming-Typ image.ImageIO. Das alte CMSIS-NN-nn-Modul und die alten Klassen ImageReader / ImageWriter wurden entfernt — lesen Sie die nachstehenden Breaking Changes.

Höhepunkte

  • Arduino Nano 33 BLE Sense — neuer nRF52840-Port mit Kamera, einem PDM-audio-Modul, ulab und eingefrorenen Sensortreibern.

  • Thermal — FLIR Lepton-, MLX90641- und MLX90621-Unterstützung mit einem überarbeiteten fir-Modul (Paletten, Spiegelung, Skalierung, Radiometrie, FFC).

  • OV5640-Autofokus — neue sensor.IOCTL_*_AUTO_FOCUS-ioctls.

  • image.ImageIO — ein einheitlicher Bildstrom-Typ (Speicher oder Datei; read/write/seek/size/close), der ImageReader / ImageWriter ersetzt.

  • Breaking: das CMSIS-NN-nn-Modul und image.ImageReader / image.ImageWriter wurden entfernt, und das Verhalten von find_lines() / fir hat sich geändert — siehe die Breaking Changes.

Neue Funktionen

  • nRF-Port / Arduino Nano 33 BLE Sense — neuer nRF52840-Port und Board-Unterstützung, mit einem neuen audio-Modul (audio.init(), audio.start_streaming(), audio.stop_streaming()), aktiviertem ulab und eingefrorenen apds9960- / lps22h- / lsm9ds1- / hts221-Sensortreibern.

  • image.ImageIO — ein neuer Bildstrom-Typ, der sowohl Speicher- als auch Dateistreams mit read() / write() / seek() / size() / close() unterstützt, plus ImageIO-Lese-/Schreib-/Speicher-Beispiele.

  • FLIR LeptonFIR_LEPTON-Unterstützung mit fir.radiometric(), fir.trigger_ffc() und fir.register_vsync_cb() hinzugefügt.

  • Thermalsensoren — MLX90641 (FIR_MLX90641)- und MLX90621-Thermopile-Unterstützung hinzugefügt (offizielle Melexis-Treiber).

  • fir-Paletten / -Orientierung — die Konstanten fir.PALETTE_RAINBOW / PALETTE_IRONBOW / GRAYSCALE / RGB565 hinzugefügt, und fir.read_ir() akzeptiert nun hmirror / vflip / transpose.

  • OV5640-Autofokussensor.IOCTL_TRIGGER_AUTO_FOCUS / IOCTL_PAUSE_AUTO_FOCUS / IOCTL_RESET_AUTO_FOCUS / IOCTL_WAIT_ON_AUTO_FOCUS hinzugefügt (OpenMV 2/3/4/4 Plus/PT/Portenta).

  • Die Arduino-Beispiele wurden in Verzeichnisse pro Board reorganisiert.

Weitere Änderungen und Verbesserungen

  • Umstellung auf komprimierte MicroPython-Fehlermeldungen (kürzere Ausnahmezeichenketten); das type-Argument von fir.init() erkennt nun automatisch über einen I2C-Bus-Scan, wenn es weggelassen wird; die xalloc-Ausnahme meldet nun die Anzahl der angeforderten Bytes; UART 8 wurde auf dem Portenta aktiviert; die FIR-Beispiele wurden in thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py zusammengefasst. Um in den Flash zu passen, wurden image.get_similarity() und die selektive Suche im OpenMV-4-Build deaktiviert, und die Bildbibliothek kann nun ohne Dateisystem gebaut werden (für Boards ohne Dateisystem).

Fehlerbehebungen

Kamera und Sensoren:

  • Behoben: die OV5640-PCLK-Berechnung; fehlende I2C-IRQ-Handler hinzugefügt (behebt I2C-Übertragungs-Hänger); das cambus-I2C-Lesen/-Schreiben für Zuverlässigkeit überarbeitet; der Lepton-I2C-Bus auswählbar gemacht; die cambus-Bus-Wiederherstellungs-Pins in die Konfiguration pro Board verschoben; der cambus-Scan wird vor dem Fehlschlagen einmal erneut versucht; und das OpenMV PT (Lepton + Kamera mit gemeinsamem I2C) zum Laufen gebracht.

Thermal:

  • Behoben: die Maximalwert-Berechnung in fir get_ir() / draw_ir() und image.get_similarity() (FLT_MIN-FLT_MAX), die AMG8833-12→16-Bit-Verarbeitung und die MLX90621-Genauigkeit (offizieller Melexis-Treiber).

Anzeige, Audio und System:

  • STM32-SPI-LCD-Übertragungen auf HAL-SPI-Callbacks verschoben (Anzeigezuverlässigkeit); behoben: Nano 33 audio.init() (HF-Oszillator + PDM-Verhältnis, damit das Mikrofon funktioniert), der H7-Timer-Zustand mit der neuen HAL, nRF-gc_collect sowie die frühe Board-Initialisierung/-Deinitialisierung; und das Ausgeben der irreführenden Meldung „uh oh, no preference for overlapping detection“ während find_apriltags() / find_rects() wurde gestoppt.

Hardware- und Board-Unterstützung

  • Arduino Nano 33 BLE Sense — neues nRF52840-Board (Kamera, PDM-Audio, ulab, eingefrorene Sensortreiber).

  • FLIR Lepton-, MLX90641- und MLX90621-Thermalsensoren.

  • OV5640-Autofokus — OpenMV 2/3/4/4 Plus/PT/Portenta.

  • Portenta — UART 8 aktiviert.

Breaking-API-Änderungen

Für den Benutzer sichtbare API-Brüche zwischen v3.8.0 und v3.9.0. Umfang: Python-C-Module in modules/ und Python-Bibliotheken in scripts/libraries/.

Jede Änderung ist mit ihrer Auswirkung gekennzeichnet:

  • major — betrifft die meisten Skripte, die die Funktion verwendet haben; Sie müssen Code portieren.

  • minor — eng begrenzte API; betrifft nur Skripte, die sie verwendet haben.

  • behavior — gleiche API, andere Ergebnisse; überprüfen Sie abgestimmte Skripte erneut.

Die Änderungen sind in dieser Reihenfolge nach Auswirkung gruppiert. Wenn Sie lediglich Ihren Code portieren möchten, springen Sie zur Migrations-Checkliste am Ende. Jeder Commit-Hash verlinkt auf seinen Diff auf GitHub.

CMSIS-NN-nn-Modul entfernt (major)

Das CMSIS-NN-nn-Modul wurde entfernt, einschließlich nn.load(), net.forward(), net.search() und des nn_class-Helfers. Die Modell-Inferenz wechselt zum TensorFlow-Lite-(tf)-Modul. Skripte, die .network-Modelle mit nn geladen haben, müssen auf tf mit einem TensorFlow-Lite-Modell portiert werden.

Commits: fbc767b36

ImageReader / ImageWriter durch image.ImageIO ersetzt (major)

image.ImageReader / image.ImageWriter und ihre Methoden next_frame() / add_frame() wurden entfernt und durch den neuen Typ image.ImageIO ersetzt, der sowohl Speicher- als auch Dateistreams über read() / write() / seek() / size() / close() unterstützt. Code, der die alten Reader-/Writer-Klassen verwendet, muss auf image.ImageIO portiert werden (siehe die umbenannten Beispiele imageio_read.py / imageio_write.py).

Commits: 783a78754

Schlüsselwort scale von fir.draw_ir() entfernt (minor)

fir.draw_ir() wurde auf Basis der neuen Bildzeichnungs-Pipeline neu geschrieben. Das Schlüsselwort scale=(min, max) wurde entfernt, und hint, x_scale, y_scale, roi sowie positionsbasierte x/y-Offset-Argumente wurden hinzugefügt. Skripte, die scale=(min, max) an fir.draw_ir() übergeben haben, müssen es entfernen und die neuen Argumente verwenden.

Commits: 0a29103b1

find_lines()-Approximation (behavior)

image.find_lines() approximiert die Gradientenstärke nun als (abs(gx) + abs(gy)) / 2 und überspringt Stärken unter 126. Das ist schneller, ändert aber die Menge der erkannten Linien und die Akkumulatorwerte, überprüfen und justieren Sie also threshold / theta_margin / rho_margin erneut.

Commits: 902ae3c98

fir.snapshot() überarbeitet (behavior)

fir.snapshot() wurde mit einer neuen Schlüsselwort-API (hmirror, vflip, transpose, x_scale, y_scale, x_size, y_size, scale, rgb_channel, alpha, color_palette, hint, pixformat, copy_to_fb) wesentlich überarbeitet, und die mitgelieferten Beispiele wurden neu geschrieben. Das bisherige positionsbasierte / nur-pixformat-Verhalten hat sich geändert; portieren Sie FIR-Skripte auf die neue Schlüsselwort-Form (siehe die aktualisierten Thermopile-Shield-Beispiele).

Commits: 53f2248b8

fir.init() löst bei Fehler eine Ausnahme aus (behavior)

fir.init() löst nun eine Ausnahme aus (und de-initialisiert sauber), wenn der Thermalsensor nicht erkannt wird, statt stillschweigend fortzufahren. Umschließen Sie fir.init() mit try / except (oder stellen Sie sicher, dass der Sensor angeschlossen ist), wo Sie sich zuvor darauf verlassen haben, dass keine Ausnahme ausgelöst wird.

Commits: 4b2f972f3

Migrations-Checkliste

Für eine saubere Portierung auf v3.9.0 fällt typischerweise folgende Arbeit an:

  1. Portieren Sie die CMSIS-NN-nn-Modell-Inferenz auf das TensorFlow-Lite-tf-Modul (die nn-Entfernung).

  2. Ersetzen Sie image.ImageReader / image.ImageWriter durch image.ImageIO (die ImageIO-Änderung).

  3. Entfernen Sie das Schlüsselwort scale=(min, max) aus fir.draw_ir() und verwenden Sie die neuen Argumente (die draw_ir-Änderung).

  4. Justieren Sie die find_lines()-Parameter erneut gegen die approximierte Stärke-Metrik (die find_lines-Änderung).

  5. Portieren Sie FIR-Skripte auf die neue fir.snapshot()-Schlüsselwort-API (die fir.snapshot-Änderung) und behandeln Sie, dass fir.init() bei einem fehlenden Sensor eine Ausnahme auslöst (die fir.init-Änderung).

Alle anderen Skripte laufen unverändert.