Ir al contenido

ArUco

Los marcadores ArUco son patrones fiduciales 2D, similares a códigos de barras, que utilizan una matriz binaria interna para codificar un ID único y un borde negro para una detección rápida por algoritmos de visión artificial. Estos marcadores son fáciles de detectar, precisos y robustos, y se pueden imprimir a bajo costo para aplicaciones como la robótica, la realidad aumentada y el seguimiento de objetos.

  • Detección rápida: El borde negro grueso del marcador ayuda a los algoritmos a localizarlo rápidamente en una imagen.
  • Identificación única: Una matriz de bits internos codifica un identificador único para cada marcador.
  • Estimación de pose: Los marcadores no solo permiten la identificación, sino también la estimación de su posición (ubicación y orientación) en el espacio tridimensional.
  • Robustez: Están diseñados para ser resistentes al ruido, la rotación y la oclusión parcial, y el diseño del diccionario minimiza la posibilidad de confusión entre marcadores.
  • Versatilidad: Se pueden usar en una amplia gama de aplicaciones, desde el seguimiento de objetos en aplicaciones de realidad aumentada hasta la navegación de robots en entornos complejos.
  • Código abierto: La biblioteca ArUco, que incluye la implementación de estos marcadores, es de código abierto y está disponible en OpenCV, lo que facilita su uso y modificación.

En el siguiente video podemos ver un ejemplo del uso de marcadores en robótica para la navegación y localización de un robot móvil.

Paso 1 — Verificar el módulo ArUco

Los programas usan cv2.aruco, que viene en opencv-contrib-python (instalado en la práctica 1). Para comprobarlo:

Ventana de terminal
python -c "import cv2; print(cv2.__version__, hasattr(cv2, 'aruco'))"

Debe imprimir la versión y True.

Paso 2 — Imprimir los marcadores
  1. Descargue la cuadrícula de 48 marcadores del diccionario DICT_4X4_50.
  2. Imprímala en tamaño carta horizontal al 100 %. No use la opción “ajustar a la página”: cambia el tamaño de los marcadores.
  3. Mida con una regla el lado de un marcador, de borde negro a borde negro. Debería ser de una pulgada (2.54 cm); anote el valor que midió.
  4. Recorte algunos marcadores y anote su ID, que está impreso debajo de cada uno.
Paso 3 — Detectar marcadores con C06
  1. Descargue C06-aruco-reading-from-cam.py (detección de ArUco), llene IP, PUERTO e IPHONE al inicio, igual que en C01, y ajuste la rotación si es necesario.

  2. Ejecútelo y apunte la cámara del celular a estos marcadores en la pantalla del PC, y luego a sus marcadores impresos:

    ID 8ID 9ID 47
  3. Cada marcador detectado aparece con su contorno y su ID dibujados sobre el video.

  4. Pruebe y anote hasta dónde funciona la detección: a qué distancia deja de detectar, con qué inclinación, si tapa una esquina con el dedo y con poca luz.

Paso 4 — Configurar C07 para su marcador

C07-aruco-distance-from-center.py calcula cuánto le falta al centro de la cámara para llegar a un marcador ArUco. Para pasar de píxeles a metros necesita el tamaño real del marcador, es decir, la longitud de un lado.

Descárguelo y llene el bloque del inicio:

IP = '192.168.137.49'
PUERTO = 8080
IPHONE = False
ARUCO_ID = 47
MARKER_SIZE = 0.0254
  1. IP, PUERTO e IPHONE: los datos de la cámara, igual que en C01.
  2. ARUCO_ID: el ID del marcador que va a medir. El programa solo calcula distancias para ese marcador.
  3. MARKER_SIZE: el lado real del marcador en metros, con el valor que midió en el paso 2. Por ejemplo, 2.54 cm son 0.0254.
Paso 5 — Medir y comprobar con la regla
  1. Ponga el robot sobre una hoja con el marcador ARUCO_ID y ejecute C07. Sobre el video aparecen Dist X, Dist Y, Angle y Euclidean Dist, en píxeles y en metros.
  2. Mueva el marcador unos centímetros a la derecha del centro de la imagen, mida con la regla cuánto lo movió y compárelo con Dist X.
  3. Repita moviéndolo hacia adelante (Dist Y). Fíjese en el signo: en la imagen, y crece hacia abajo.
  4. Gire el marcador unos 30° y observe Angle.
  5. Anote en una tabla la distancia medida con la regla, la que da el programa y la diferencia.
Paso 6 — Medir distancias entre marcadores en una foto con C08

Ahora no usamos el video sino una foto del celular, que tiene mucha más resolución.

  1. Recorte 4 marcadores impresos y anote sus IDs.

  2. En el piso, ubíquelos en las esquinas de un cuadrado de 40 o 50 cm de lado, medido con el metro de centro a centro de los marcadores. Póngalos todos con la misma orientación.

  3. Mida con el metro los 4 lados y las 2 diagonales, y anótelos.

  4. Tome una foto desde arriba, a aproximadamente 1 m de altura, con el celular paralelo al piso, de modo que se vean los 4 marcadores. Pásela al computador.

  5. Descargue C08-aruco-distances-from-image.py y llene el bloque del inicio:

    IMAGEN = 'foto-cuadrado.jpg'
    MARKER_SIZE = 0.0254
    • IMAGEN: la ruta de su foto. Si la foto está en la misma carpeta del programa, basta con el nombre del archivo.
    • MARKER_SIZE: el lado real de los marcadores en metros, el que midió en el paso 2.
  6. Ejecútelo. El programa imprime las distancias entre todas las parejas de marcadores en metros, y guarda una copia de la foto con las líneas y las distancias dibujadas (foto-cuadrado-distancias.png). Si avisa que la foto está inclinada, tómela de nuevo más paralela al piso.

  7. Compare en una tabla las 6 distancias medidas con el metro y las que da el programa. Las diagonales deberían medir el lado por 2\sqrt{2}: 56.6 cm para un cuadrado de 40 cm y 70.7 cm para uno de 50 cm.

Opcional — Generar y leer marcadores desde archivos
  • I06-aruco.py genera imágenes de marcadores y las guarda en la carpeta desde donde se ejecuta.
  • I07-aruco-reading.py detecta marcadores en una imagen guardada (marker_DICT_4X4_50_42.png), sin cámara. Ejecútelo en la misma carpeta donde esté esa imagen.