Saltar a contenido

Modo Sentry2MV (micropython)

Documentación basa en:

Manual de uso para el modo Sentry2MV

Introducción a SentryMV

El modo SentryMV se ha desarrollado a partir del firmware de código abierto CanMV de Canaan Technology. Este modo utiliza el lenguaje de programación MicroPython para programar e interactuar con el hardware. MicroPython es un intérprete de scripts de Python muy conocido en el sector por su bajo consumo de recursos, que se ejecuta directamente en el procesador integrado. Solo es necesario transmitir el script de Python al dispositivo de hardware a través del puerto serie para controlarlo y procesar su lógica (leer la cámara, ejecutar algoritmos, generar datos, etc.), sin necesidad de compilar el firmware, lo que lo hace sencillo y fácil de usar. CanMV IDE es un software de entorno de desarrollo visual proporcionado por Canaan Technology para escribir programas MicroPython.

CanMV IDE es un entorno de desarrollo integrado (IDE) que proporciona CanMV para escribir programas MicroPython, así como para realizar operaciones como cargar código e imprimir registros de depuración. El software incluye una gran cantidad de programas de ejemplo de código abierto para que los usuarios aprendan y los utilicen. El modelo SentryMV también se puede desarrollar a través de este software y ejecutar los programas de código abierto que contiene.

Desde el enlace puedes descargar canMV IDE. En concreto nosotros trabajaremos con la versión instalada a partir de canmv-ide-linux-x86_64-4.0.9.run

Descarga y actualización del firmware de SentryMV

Para utilizar el sensor Sentry2 en modo SentryMV, es necesario grabar el firmware sentry2mv, que ha sido adaptado al hardware correspondiente y optimizado en cuanto a funciones para el algoritmo del modelo, lo que lo hace más fácil de entender y utilizar.

Descarga del firmware

Actualmente, el firmware SentryMV se encuentra en fase de pruebas internas y se puede descargar a través de la nube inteligente Tongxin. Haz clic en el enlace para acceder a la nube o abre la URL https://pan.baidu.com/s/1Ur39pkhnL8yznRqGbX2tkA?pwd=1022. El código de extracción es 1022.

Navegando por las carpetas podemos llegar a la carpeta dedicada a la Sentry2 dentro de los sensores de visión AI. En esta carpeta nos encontramos con todo lo necesario para continuar.

A tener en cuenta:

Ten MUY PRESENTE que la URL con la información de la imagen está inicialmente en Chino. Si no controlas el idioma puede utilizar algún traductor para entender los contenidos.

Carpeta Sentry2
URL a la carpeta con la información de la imagen

Para Linux interesan las dos carpetas señaladas, la superior para descargar el firmware Sentr2MV y la inferior para tener a mano la versión actual del firmware normal para la Sentr2.

En "Firmware Sentry2MV" tenemos disponibles las dos versiones, la de consumidores y versión para empresas.

  • Versión empresarial: vs_sentry2mv_k210_vX_X_X_XXXXXXXX_enterprise_e.kfpkg
  • Versión de consumo: vs_sentry2mv_k210_vX_X_X_XXXXXXXX_consumer_e.kfpkg

En mi caso voy a trabajar con vs_sentry2mv_k210_v1_0_4_20250221_consumer_e.kfpkg que se puede descargar en línea, si desde la página anterior tenemos problemas, desde el enlace asociado al nombre del archivo.

Actualización del firmware

Los pasos a seguir están descritos en la entrada Actualización del firmware del apartado Sentry2 de esta web.

Después de actualizar el nuevo firmware se mostrará la siguiente pantalla de inicio:

Pantalla inicial Sentry2MV

Aviso:

Después de usar el firmware Sentry2MV, las funciones estándar de Sentry2 no estarán disponibles. Si deseas volver al modo estándar, deberás volver a grabar el firmware estándar.

Descarga e instalación del software CanMV IDE

Descarga del software

La versión de CanMV IDE es V2.9.2 y se puede descargar directamente desde Github: https://github.com/kendryte/canmv_ide/releases.

Versión cananMV a descargar

Instalación del software

El archivo descargado es una aplicación de tipo ejecutable y hay que darle permisos de ejecución, de manera idéntica a lo que se hace con programas tipo AppImage. Una vez que se abre el paquete de instalación basta seguir las instrucciones para instalarlo.

❶ Pantalla de bienvenida a la instalación

Pantalla de bienvenida a la instalación

❷ Opción de escoger el directorio de instalación o dejar el propuesto por defecto.

Directorio de instalación

❸ Hay que aceptar la licencia para poder continuar.

Licencia no aceptada
Licencia aceptada

Aviso:

Antes de aceptar la licencia, como es habitual, conviene leerla completa para saber que estamos aceptando.

❹ El programa de instalación está listo para realizar la misma.

Todo listo para la instalación
Progreso de la instalación

❺ Instalación finalizada. Por defecto está marcado el lanzamiento del programa.

Instalación finalizada

❻ Primera ejecución de canMV IDE 2.9.2:

Primera ejecución de canMV IDE 2.9.2

Si tienes algún problema, o quieres ampliar información, puede consultar la documentación oficial en línea en el Document Center - CanMV K210.

También puedes consultar la documentación oficial en línea: https://developer.canaan-creative.com/canmv/main/canmv/get-start/quickstart.html#canmv-ide.

Si te diriges a "Tools \(\rightarrow\) Options", en ""Enviroment" se puede poner la interfaz en Español:

canMV IDE 2.9.2 en Español

Cuando haces clic en el botón "Apply" se indica que el cambio tendrá efecto después de reiniciar el IDE:

canMV IDE 2.9.2 en Español - Apply

Ya se puede salir de CanMV y volver a iniciar para tener el entorno en Español.

Introducción a la interfaz

Al abrir CanMV IDE, verá la siguiente interfaz:

Interfaz de canMV IDE 2.9.2

Barra de menús.

Barra de botones. Accesos directos a algunas funciones.

Conexión de dispositivos y botón de control de ejecución del programa.

Editor de código.

Terminal serie, para mostrar de depuración de la información enviada al puerto serie.

Información del firmware y del puerto serie conectado.

Vista previa de la imagen de la cámara.

Conexión del dispositivo

Conecta Sentry2 al puerto USB del ordenador mediante un cable de datos tipo C, luego haz clic en el botón Conectar en la esquina inferior izquierda del IDE de CanMV.

Conexión del dispositivo

Aparecerá una ventana emergente para seleccionar el puerto serie. Selecciona el puerto serie correspondiente a Sentry2. Si hay varios puertos serie, confirma primero el que se corresponde con Sentry2 y luego haz clic en "Aceptar" para abrir la conexión.

Puerto para la conexión del dispositivo

Una conexión exitosa cambiará el ícono a un estado conectado y el botón de reproducción gris se volverá verde.

Conexión establecida

Guía de uso de Sentry2MV

Primer programa de muestra

CanMV IDE cuenta con un amplio conjunto de programas de ejemplo integrados, que incluyen operación de interfaz de hardware, procesamiento de imágenes, detección de características de bordes, dibujo de imágenes, salida de texto, reconocimiento de formas, reconocimiento de códigos de barras, reconocimiento de color, reconocimiento facial, etc. Puedes consultar us listado completo en https://www.kendryte.com/canmv/main/canmv/demo/index.html.

Después de instalar CanMV IDE, conecta Sentry2 a cualquier puerto USB de tu ordenador con un cable tipo C. Abre el software CanMV IDE y se mostrará la interfaz predeterminada con el programa "helloworld_1.py" cargado. Si no lo está lo tienes en "Archivo \(\rightarrow\) Ejemplos \(\rightarrow\) Basics". La interfaz debe verse así:

Interfaz por defecto

Haz clic en el icono de la esquina inferior izquierda marcado y el software se conectará automáticamente a la Sentry2. Si el ordenador ya está conectado a varios puertos serie, aparecerá un cuadro de diálogo para que selecciones el puerto serie correcto. Si no estás seguro de cuál es el correcto, verifícalo antes de continuar.

Una vez encontrado el correcto, el proceso de conexión suele tardar entre 10 y 20 segundos, y la placa podría reiniciarse una vez durante este tiempo. ¡Ten paciencia!

Hay cuatro configuraciones posibles. Por defecto, el IDE de CanMV utiliza el modo 3 para la conexión. Si la configuración de tu placa es diferente y no conecta, puedes probar diferentes configuraciones:

Modos de conexión

Haz clic en el botón verde para ejecutar el script activo. Normalmente, se puede ver la actividad de la cámara en tiempo real en el área de vista previa de la esquina superior derecha del IDE de CanMV, y también se mostrará en la pantalla LCD de la Sentry2.

Programa helloworld_1.py en ejecución

El terminal IDE de CanMV mostrará la salida del registro en tiempo real. Actualmente no se admite la entrada desde el terminal.

El código del programa "helloworld_1.py" es:

# Hello World Example
#
# Welcome to the CanMV IDE! Click on the green run arrow button below to run the script!

import sensor, image, time, lcd

lcd.init()                          # Init lcd display
lcd.clear(lcd.RED)                  # Clear lcd screen.

# sensor.reset(dual_buff=True) # improve fps
sensor.reset()                      # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000)     # Wait for settings take effect.
clock = time.clock()                # Create a clock object to track the FPS.

while(True):
    clock.tick()                    # Update the FPS clock.
    img = sensor.snapshot()         # Take a picture and return the image.
    lcd.display(img)                # Display image on lcd.
    print(clock.fps())              # Note: CanMV Cam runs about half as fast when connected
                                    # to the IDE. The FPS should increase once disconnected.

Si sobre el área de código dejas quieto el cursor sobre cualquier orden se mostrará una ventana con ayuda e información de la misma. En la imagen se ve dicha ventana al situar el cursor sobre sensor.

Ventana con ayuda e información

Seguimiento de color

Para reconocer bloques de un color específico con CanMV se dispone de un método denominado find_blobs que se invoca de la siguiente forma:

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

Umbral de color

La estructura del umbral de color se define de la siguiente manera:

red = (minL, maxL, minA, maxA, minB, maxB)

El espacio de color Lab utilizado aquí es un espacio de color cuya dimensión L representa el brillo y las dimensiones a y b representan la oposición de color. Se basa en las coordenadas del espacio de color CIE XYZ, comprimidas no linealmente. Los valores de la tupla son los valores máximo y mínimo del espacio de color Lab.

El sistema de color CIE XYZ

El sistema de color CIE XYZ, o espacio de color CIE 1931, es un modelo de color estándar que representa todos los colores visibles por el ojo humano utilizando tres primarios imaginarios (X, Y, Z) en lugar de colores reales como el rojo, verde y azul. El valor 'Y' representa la luminancia, mientras que los valores 'x' e 'y' (derivados de X, Y, Z) especifican un punto en un diagrama de cromaticidad bidimensional, proporcionando un marco de referencia para la medición y comparación de colores.

Configurar parámetros

Si ajustamos los parámetros de umbral a simple vista, la depuración es una tarea muy laboriosa. El editor de umbrales integrado en CanMV IDE facilita la configuración de los ajustes de umbral.

En primer lugar, ejecuta el programa para adquirir una imagen. Posteriormente, haz clic en "Herramientas \(\rightarrow\) Visión de máquina \(\rightarrow\) Editor de umbrales" y selecciona "Memoria intermedia de trama" en la ubicación de la imagen de origen.

Acceso al Editor de umbrales

Nos aparecerá la ventana "Editor de umbrales - CanMV IDE" en la que podemos arrastrar los controles deslizantes para ajustar el umbral y observar el área de vista previa hasta que el área de vista previa solo conserve el área que queremos detectar y registrar el valor en este momento.

Editor de umbrales - CanMV IDE

Es importante copiar y tener a mano los valores "Umbral de LAB": (13, 100, -6, 127, 18, 127)

Ejemplo de configurar parámetros

El siguiente ejemplo demuestra cómo CanMV detecta bloques rojos en un teléfono dibujando un rectángulo donde detecta el rojo establecido.

Ya usamos el "Editor de Umbrales" para determinar el valor de umbral adecuado y lo pegamos en el campo de umbrales del programa de ejemplo. Simplemente haz clic en Ejecutar para comenzar a rastrear los bloques. y en la pantalla del ordenador se verá algo como:

Ejemplo de configurar parámetros
Descargar el programa

El código del programa es el siguiente:

import sensor, image, time, math

# Cambiar el umbral

thresholds = [(13, 100, -6, 127, 18, 127)] # Valores obtenidos en el Editor de umbrales

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
    for blob in img.find_blobs(thresholds, pixels_threshold=100, area_threshold=100,
                               merge=True):
        if blob.code() == 1:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
            img.draw_keypoints([(blob.cx(), blob.cy(),
                                 int(math.degrees(blob.rotation())))], size=20)
    print(clock.fps())

Dibujo

Como hemos visto en el ejemplo anterior y en todo lo visto sobre Sentry2, suele ser necesario mostrar los resultados de detección o reconocimiento en tiempo real dentro de una imagen para proporcionar retroalimentación al usuario. CanMV también proporciona métodos para cumplir con este requisito.

Métodos

Están disponibles los siguientes métodos:

  • draw_line (dibujar línea). Dibuja una línea recta en la imagen.
image.draw_line(line_tuple, color=White)

El formato de line_tuple es (x0, y0, x1, y1), lo que dibuja una línea recta desde (x0, y0) a (x1, y1). El color puede ser un valor de escala de grises (0-255) o una tupla de valores de color (r, g, b). El valor predeterminado es blanco.

  • draw_rectangle (dibuja marco). Dibuja un cuadrado o rectangular en la imagen.
image.draw_rectangle(line_tuple, color=White)

El formato de line_tuple es (x0, y0, x1, y1), lo que dibuja una línea recta desde (x0, y0) a (x1, y1). El color puede ser un valor de escala de grises (0-255) o una tupla de valores de color (r, g, b). El valor predeterminado es blanco.

  • draw_circle (dibuja círculo). Dibuja un círculo en la imagen.
image.draw_circle(x, y, radius, color=White)

x,y son las coordenadas del centro del círculo y radius es el radio del círculo.

  • draw_cross (dibuja aspa). Dibuja un aspa o cruz en la imagen.
image.draw_string(x, y, text, color=White)

x,y son coordenadas y size es el tamaño de ambos lados de la cruz.

  • draw_string (escribir cadena). Dibuja una cadena de 8x10 píxeles comenzando en la posición (x,y) en la imagen.

x,y son las coordenadas iniciales. Text es el texto o cadena que se dibujará. Puedes usar \n, \r o \r\n para mover el cursor a la siguiente línea.

Ejemplo de dibujo

Ejemplo de dibujo
Descargar el programa

import sensor, image, time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(10)
while(True):
    img = sensor.snapshot()
    img.draw_line((20, 30, 40, 50), color=(255,200,0))
    img.draw_line((10, 45, 40, 70), color=(255,0,0))
    img.draw_rectangle((60, 30, 81, 61), color=(0,0,255))
    img.draw_circle(20, 90, 10, color=(0,255,0))
    img.draw_cross(100,60,size=5, color=(255,255,0))
    img.draw_string(10,10, "Ejemplo de dibujo", color=(255,255,255))

AprilTags

Generalidades

AprilTag es un sistema fiducial visual que se puede utilizar para una variedad de tareas, incluidas la robótica y la calibración de cámaras.

La etiqueta se puede imprimir directamente desde una impresora y el programa de detección AprilTag puede calcular la posición precisa, la orientación y la identificación en relación con la cámara.

Los tipos de etiquetas AprilTags se agrupan por familias y, en el caso de la edición Consumer, son las siguientes:

  • TAG16H5 → 0 a 29
  • TAG25H9 → 0 a 34
  • TAG36H11 → 0 a 586

Es decir, hay 30 etiquetas en la familia TAG16H5, cada una con un ID correspondiente, que va de 0 a 29. ¿Cuáles son las diferencias entre las distintas familias? Por ejemplo, en TAG16H5 el área efectiva es un cuadrado de 4x4, mientras que en TAG36H11 es un cuadrado de 6x6, por lo que puede verse desde más lejos. Sin embargo para la TAG16H5, la tasa de error es bastante mayor que la tasa de error de TAG36H11 porque esta última tiene más información para la suma de comprobación. Por lo tanto, a menos que exista una razón de peso, se recomienda usar la TAG36H11.

En el apartado Algoritmos \(\rightarrow\) Apriltag \(^{*}\) (etiquetas) se encuentra toda la información sobre el tema y como obtener y generar estas etiquetas.

En CanMV también disponemos de un generador de etiquetas April que se encuentra en:

Herramientas \(\rightarrow\) Visión de máquina \(\rightarrow\) Generador de Apriltag

Herramientas \(\rightarrow\) Visión de máquina \(\rightarrow\) Generador de Apriltag

Una vez escogida la familia tenemos la posibilidad de generar todas o las indicadas entre los valores y también podemos hacer que se incluya la familia y el ID de la etiqueta o que no se incluya.

Herramientas \(\rightarrow\) Visión de máquina \(\rightarrow\) Generador de Apriltag

Después de generarlo, puedes imprimirlo o usarlo en la pantalla para visualizarlo, aunque puede haber reflejos que impidan la lectura correcta.

Ejemplo de AprilTags

En la imagen podemos apreciar como se ha activado el "Terminal serie" para visualizar los resultados de la detección.

Ejemplo de AprilTags
Descargar el programa

# Ejemplo de AprilTags
#
# Ejemplo demostrativo del uso de AprilTags en CanMV

import sensor, image, time, math
from time import sleep
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # Si la resolución es mayor, nos quedamos sin memoria
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)  # Esta función debe desactivarse para evitar que el procesamiento de imágenes
sensor.set_auto_whitebal(False)
clock = time.clock()

# El código apriltag admite hasta 3 familias de etiquetas  (version Consumer) que pueden procesarse simultáneamente.
# El objeto etiquetado devuelto tendrá su familia etiquetada y su id dentro de la familia etiquetada

tag_families = 0
tag_families |= image.TAG16H5
tag_families |= image.TAG25H9
tag_families |= image.TAG36H11

def family_name(tag):
    if(tag.family() == image.TAG16H5):
        return "TAG16H5"
    if(tag.family() == image.TAG25H9):
        return "TAG25H9"
    if(tag.family() == image.TAG36H11):
        return "TAG36H11"

while(True):
    clock.tick()
    img = sensor.snapshot()
    for tag in img.find_apriltags(families=tag_families): # Si no se indica ninguna familia, por defecto TAG36H11
        img.draw_rectangle(tag.rect(), color = (255, 0, 0))
        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
        print_args = (family_name(tag), tag.id(), (180 * tag.rotation()) / math.pi)
        print("Familia Apriltag %s, ID de la tarjeta %d, rotacion %f (grados)" % print_args)
    sleep(3)
   # print(clock.fps())