Butia reconocimiento marcas
Contenido
Integrantes
- Nicolás Fúrquez
- Rafael Sisto
Objetivos
- Utilizando ARToolKit construir un plugin para Tortugarte/Tortublocks que permita reconocer las marcas. Esto puede ser utilizado para que el robot se localice y navegue en un entorno.
Una de las cosas que nos permite la librería (ARToolKit) es que las marcas no necesariamente tienen que estar en color, permitiendo así imprimirlas en cualquier impresora siempre y cuando se mantenga el tamaño.
Documentación de la solución
Se desarrolló un api que obtiene la información almacenada de las marcas y mediante la ayuda de ARToolKit se detectan las mismas en las capturas de la cámara.
El código fuente e instrucciones de instalación se pueden encontrar en el repositorio utilizado: [1]
Los archivos para imprimir las marcas, se encuentran en: [2]
Diagrama de componentes
En el siguiente diagrama pueden visualizarse los componentes y su interacción. pattern_detection funciona como plugin de TurtleBlocks, que a su vez utiliza la librería multiPatternDetection (a través de un binding de python a C). Esta última utiliza funciones de ARToolKit para la detección de marcas.
Paleta reconocimiento de marcas
Paleta:
La paleta posee botones fijos que son:
"Viendo Señal":Este icono recibe como parámetro un icono de señal (imagen o texto), y nos dice si la cámara lo esta viendo o no.
"Distancia Señal":Este icono devuelve la distancia trigonométrica desde la cámara hasta el centro de la señal, la magnitud utilizada son mm. Se asume un tamaño de marcas de 16x16cm, salvo que se configure de forma distinta.
El resto se autogenera leyendo el archivo pattern_detection/library/multiPatternDetection/Data/object_data, en este archivo están todos las marcas que se pueden ver con la paleta, uno de los datos que se ponen dentro es un identificador (nombre) que al iniciarse se lee y luego se busca en la carpeta pattern_detection/images/ si tiene el icono correspondiente, si está pone la imagen como aparece en la paleta, sino lo encuentra generara el icono pero con el texto del nombre. En la sección Butia_reconocimiento_marcas se puede ver las características de estos iconos.
En este ejemplo se puede ver como se utiliza, en el código de la izquierda si la cámara ve, la señal de curva, moverá 100 la tortuga hacia adelante y luego girara a la derecha un angulo aleatorio entre -30 y 30. En el ejemplo de la derecha si ve la señal de Contramano se movera hacia atras y cambiara la pluma a rojo, sino cambiara a azul y se movera 100 hacia adelante
Ejemplos usando la paleta y Butia
Usando la marca de Pare, el Butia detiene la marcha.
Usando la marca de Ceda el paso, el Butia disminuye la velocidad.
Usando la marca de Contramano, el Butia gira hasta no ver la marca y luego sigue adelante.
Desafíos y problemas encontrados
- La librería ARToolKit requiere la librería libglut.so.3 para funcionar, sin embargo en las XO no es posible instalar la librería en carpetas del sistema. Esto causa que al intentar cargar la librería con C types en python se devuelva el error OSError: libglut.so.3: cannot open shared object file: No such file or directory. Para evitar este problema, se adjunta la librería en la carpeta del plugin y se carga en python previo a cargar la librería de ARToolkit con el siguiente comando: cdll.LoadLibrary("lib/libglut.so.3").
Instalación de plugin
Compilar archivos
Son necesarias los siguientes paquetes debian para poder compilar: libglib2.0-dev, freeglut3-dev, libgstreamer0.10-dev, libxi-dev
Ejecución
Para la ejecución del plugin es necesario instalar el paquete gst-plugins-good.
Si se ejecuta en una máquina configurada en idioma inglés, es necesario substituir "0,0" por "0.0" en el archivo turtle_art_plugin/pattern_recognition/library/multiPatternRecognition/Data/object_data.
Correr script de prueba
Opcionalmente, es posible correr pruebas para asegurarse que la detección de marcas está funcionando correctamente.
En la carpeta turtle_art_plugin/pattern_recognition/doc del código butiá, hay un pdf con la marca NotEnter. Imprimir el pdf.
Luego, ejecutar turtle_art_plugin/pattern_recognition/library/apiTestDetectMarkers.py. Al posicionar la marca impresa frente a la cámara, debería imprimirse un número en consola, que representa la distancia a la marca detectada.
Generación de nuevas marcas
Es posible generar nuevas marcas utilizando una actividad creada para ese fin o de forma manual.
Actividad para agregar marcas
Se creo una actividad por la cual se puede agregar o quitar marcas, de una manera mas amena al usuario (docentes o educandos), se puede descargar la misma desde el sitio de Sugar Labs, La actividad se puede instalar sin tener el Plugin o Tortugarte/TortuBots, pero al abrirla avisa al usuario que no se encuentra alguno de estos elementos. En la primer pestaña se puede ver una lista con los identificadores de las señales que están instaladas.
Si existe un icono asociado se muestra a la derecha al seleccionarlo, si no lo tiene se muestra un icono general.
En la segunda pestaña se encuentran los campos para poder agregar una señal, Identificador, tamaño, ruta al archivo .patt y como opcional la ruta al archivo .svg que servirá de icono en la paleta.
En esta pestaña se encuentra el link a la wiki que dice como generar el .patt En el caso que se quiera poner una identificador de señal que ya exista, la actividad preguntara si se quiere sobrescribir.
Manualmente a partir de patrones impresos
Se debe generar un archivo de la marca con un recuadro negro. Al comienzo de este artículo pueden verse imágenes de ejemplo. Al imprimirlas, recordar dejar un margen blanco de al menos 1 cm.
Luego de generados los archivos para imprimir, se deberán generar los archivos de patrones. Para realizar esto:
- Acceder al Generador de patrones para plugin Reconocimento de marcas
- Seleccionar el origen de donde se generará el patrón. Si se utiliza la cámara, seleccionar Camera Mode. Si se carga la imagen del patrón (incluyendo el recuadro negro) desde un archivo, seleccionar Load marker Image
- Seleccionar tamaño de patrón, por ejemplo, si el patrón (incluyendo el recuadro negro) mide 16x16 cm, seleccionar 16x16
- Seleccionar porcentaje del recuadro que representa el patrón. Por ejemplo, si todo el recuadro mide 16cm y el borde negro mide 2cm, el patrón mide 12x12cm, por lo tanto 75%.
- Una vez que se vea un recuadro rojo alrededor de la marca con el rectángulo negro, presionar el botón Get Pattern. Aparecerá un recuadro con los patrones reconocidos, navegar con el botón next al deseado y presionar Save current. Darle un nombre al archivo en minúsculas, con la extensión .patt, por ejemplo mimarca.patt
En este punto se tiene el archivo .patt generado y como último paso se debe configurar el plugin para poder comenzar a utilizarlo. Para esto:
- Copiar archivo generado (extensión .patt) a la carpeta pattern_detection/library/multiPatternDetection/Data/
- Editar el archivo object_data en esa misma carpeta:
- Incrementar en 1 el número que aparece al principio (Cantidad de marcas a ser detectados).
- Agregar a continuación en el mismo archivo las líneas correspondientes al patrón, de la siguiente manera:
- Una línea representando el id de la marca
- Línea con el nombre de archivo .patt generado anteriormente
- Línea conteniendo tamaño en milímetros de la marca
- Línea conteniendo 2 decimales, separados por 1 espacio representando el punto medio de la marca.
- Guardar el archivo y cerrar.
- La marca está lista para ser utilizada y aparecerá en la paleta de Tortugarte luego de reiniciar. Por defecto aparecerá un texto con el id de la marca, pero es posible agregar un ícono, generando 1 imagen en formato svg y colocándola en la carpeta images/. Por ejemplo, para la marca con id Stop dentro del archivo object_data, se debe generar 2 imágenes, una nombrándola como Stopsmall.svg de 40x40px y creando una copia de la misma con el nombre Stopoff.svg pero de 70x70px.
Trabajos a Futuro
- Mayor versatilidad para marcas: El reconocimiento de marcas con ARToolKit facilitó el desarrollo de la solución, ya que al ser utilizado en otras actividades en las terminales XO acortaba el tiempo del proyecto, ya que no se tuvo que hacer un análisis de factibilidad y se tenía la librería ya compilada para los mismos, además que la generación de patrones ya viene resuelta. Sin embargo, al utilizar este API, las marcas están limitadas a una forma cuadrada y que estén contenidas dentro de un recuadro negro. Para poder evitar estas limitantes se sugiere utilizar un API de más bajo nivel como OpenCV para poder reconocer otros tipos de marcas, como por ejemplo, personas, caras, objetos, etc.
-
Bloque para obtener distancia a marca: La librería creada en C actualiza el estado de las marcas cuando detecta la presencia de las mismas. Entre esa información, se encuentra una matriz que tiene la posición de la marca respecto a la cámara. Se sugiere que con esta información se cree un nuevo bloque Distancia a la marca, similar al detectar marca, que reciba como parámetro el id de marca y devuelva la distancia a la marca. -
Internacionalización: La paleta desarrollada se realizó en idioma español, pero sería recomendable internacionalizar las etiquetas para que pueda ser localizado a otros idiomas de TurtleArt, por lo menos en inglés.