v3.6.1

v3.6.1 es una versión importante. Introduce el módulo imu (LSM6DS3), un conjunto de nuevas APIs getter de sensor con rotación automática basada en la IMU, corrección de perspectiva de 4 puntos rotation_corr(), y pone en marcha la Arduino Portenta H7 con las cámaras HIMAX HM01B0 y OV7690. Varias APIs de sensor / image cambiaron y se eliminó TensorFlow en la M7 — lee los cambios incompatibles a continuación.

Aspectos destacados

  • imu módulo — acelerómetro / giroscopio / temperatura / alabeo / cabeceo en el LSM6DS3 (OpenMV 4 / Portenta).

  • Getters del sensor + rotación automáticaget_pixformat() / get_framesize() / get_hmirror() / get_vflip() / get_windowing(), set_transpose() / set_auto_rotation(), y rotación de la captura basada en la IMU.

  • Corrección de perspectivarotation_corr() incorpora las palabras clave fov y corners (4 puntos).

  • Nuevo hardware — Arduino Portenta H7, HIMAX HM01B0 y cámara OV7690.

  • Incompatible: set_pixformat() / set_framesize() ahora devuelven None, se eliminó sensor.set_framerate(), se descartó TensorFlow en la M7, y lens_corr() / linpolar() ahora requieren dimensiones pares — consulta los cambios incompatibles.

Nuevas funciones

  • imu — un nuevo módulo IMU: imu.acceleration_mg(), imu.angular_rate_mdps(), imu.temperature_c(), imu.roll(), imu.pitch() y imu.sleep() (LSM6DS3 en OpenMV 4 / Portenta).

  • Getters del sensor — se añadieron sensor.get_pixformat(), get_framesize(), get_hmirror(), get_vflip(), get_windowing(), set_transpose() / get_transpose() y set_auto_rotation() / get_auto_rotation().

  • Rotación automáticasensor.snapshot() usa la IMU para voltear / reflejar / transponer fotogramas cuando la rotación automática está habilitada.

  • rotation_corr() — se añadieron las palabras clave fov y corners (perspectiva de 4 puntos), con ejemplos de corrección de perspectiva.

  • lcd.init() — se añadió un argumento de palabra clave bgr.

  • collections.deque — habilitado en la compilación de MicroPython.

  • Se añadieron las constantes de id sensor.OV7690 y sensor.HM01B0 y un ejemplo de filtro de imagen al estilo numpy con ulab.

Otros cambios y mejoras

  • Se optimizaron significativamente los filtros de imagen (mediana / moda / media / …) y find_circles() y la corrección de lente; alloc_extra_fb ahora puede asignar cualquier número de bytes; el modelo de detección de personas se reconstruyó con una nueva operación de average-pool.

Corrección de errores

Cámara y sensores:

  • Se corrigió sleep() del OV2640 (ahora usa el registro de standby COM2 en lugar del pin de apagado), la configuración del pin FSYNC, las polaridades HSYNC/VSYNC del HM01B0 y la dirección/escaneo I2C, el GPIO de apagado del sensor de la Portenta y el pin de reset de la cámara, y se deshabilitó la rotación automática cuando el cabeceo de la IMU está cerca de 90°/270°.

Imagen y sistema:

  • Se corrigió un error de comprobación de límites en un filtro de imagen, un hardfault al deshabilitar la caché D, el arranque en placas sin tarjeta SD, un error de load_to_fb en tf.load(), el desbordamiento de pila de la detección de personas (la pila de la H7 se elevó a ≥12 KB), y los offsets del descriptor USB para el modo de alta velocidad en la OpenMV 4 Plus.

Hardware y compatibilidad con placas

  • Arduino Portenta H7 — puesta en marcha inicial de la placa (configuración de reloj/OSC/HSE del STM32H747, cabeceras CMSIS, ADC, SDRAM, PID USB de Arduino).

  • HIMAX HM01B0 — nuevo controlador de cámara monocromática (Bayer, reloj de oscilador externo).

  • OV7690 — nuevo controlador de cámara.

  • IMU LSM6DS3 — OpenMV 4 / Portenta.

Cambios incompatibles en la API

Cambios de API visibles para el usuario entre v3.6.0 y v3.6.1. Alcance: módulos C de Python en modules/ y bibliotecas de Python en scripts/libraries/.

Cada cambio está etiquetado según su impacto:

  • minor — API reducida; solo afecta a los scripts que la usaban.

  • behavior — misma API, resultados diferentes; vuelve a comprobar los scripts ajustados.

Los cambios se agrupan por impacto en ese orden. Si solo quieres portar tu código, salta a la lista de comprobación de migración al final. Cada hash de commit enlaza a su diff en GitHub.

sensor.set_framerate() eliminado (minor)

Se eliminó el stub sin efecto sensor.set_framerate(); llamarlo ahora genera AttributeError. Elimina la llamada y controla el tiempo de los fotogramas mediante framesize/exposición en su lugar. (Un set_framerate() funcional se reintroduce en v4.0.2.)

Commits: 705e98f91

TensorFlow eliminado en la OpenMV Cam M7 (minor)

TensorFlow (el módulo tf) se deshabilitó en la OpenMV Cam M7 / OpenMV 3 (ya no cabe). import tf en la M7 falla — usa una cámara de clase H7 para TensorFlow. (tf se vuelve a habilitar en la F7 en v3.6.3.)

Commits: 2ae875077

set_pixformat() / set_framesize() devuelven None (behavior)

sensor.set_pixformat() y sensor.set_framesize() ahora devuelven None en lugar de True, y un formato de píxel no soportado ahora genera un ValueError en lugar de una aserción. El código que comprobaba el valor de retorno (p. ej. if sensor.set_pixformat(...):) debe dejar de hacerlo, y el código que capturaba AssertionError para formatos no soportados debe capturar ValueError.

Commits: f314ac4e7

lens_corr() / linpolar() / logpolar() requieren dimensiones pares (behavior)

image.lens_corr() e image.linpolar() / image.logpolar() ahora requieren un ancho y alto de imagen pares y generan un error con dimensiones impares. Recorta o redimensiona la imagen a dimensiones pares antes de llamar a estos métodos.

Commits: b36460a36, 2b26ca17b

Lista de comprobación de migración

Para una migración limpia a v3.6.1 el trabajo típico es:

  1. Eliminar las llamadas a sensor.set_framerate() (la eliminación de set_framerate).

  2. Mover las cargas de trabajo de TensorFlow fuera de la OpenMV Cam M7 (el cambio de TensorFlow en la M7).

  3. Dejar de depender del valor de retorno de set_pixformat() / set_framesize() y capturar ValueError para formatos de píxel no soportados (el cambio del valor de retorno).

  4. Asegurar dimensiones de imagen pares antes de lens_corr() / linpolar() / logpolar() (el requisito de dimensiones pares).

Todos los demás scripts se ejecutan sin cambios.