Butia reconocimiento marcas

De Proyecto Butiá
Revisión del 20:16 27 ene 2013 de Nfurquez (Discusión | contribuciones) (Actividad para agregar marcas)

Saltar a: navegación, buscar

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.

Ejemplos de marcas:
StopMark.png YieldMark.png

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: multiPatternRecognition

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.


Arquitectura de detección de patrones con ARToolKit

Paleta reconocimiento de marcas

Paleta: Paleta reco marcas.png 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.

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

Reconociendo seniales Ejemplo.png

Ejemplos usando la paleta y Butia

Usando la marca de Pare, el Butia detiene la marcha.

ButiaSenialesEjemplo1.png
<videoflash>vF9ZhQYIwVg</videoflash>

Usando la marca de Seda el paso, el Butia disminuye la velocidad.

ButiaSenialesEjemplo2.png
<videoflash>Mbs5GT8vuIM</videoflash>

Usando la marca de Contramano, el Butia gira hasta no ver la marca y luego sigue adelante.

ButiaSenialesEjemplo3.png
<videoflash>m04N9YJ7qd4</videoflash>

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: libglib-2.0-dev, freeglut3-dev, libgstreamer0.10-dev, libxi-dev

Generación de nuevas marcas

TODO: Generación de pdf con marca para imprimir.

Luego de generados los archivos para imprimir, se deberán generar los archivos de patrones. Para realizar esto:

  1. Acceder al Generador de patrones para plugin Reconocimento de marcas
  2. 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
  3. Seleccionar tamaño de patrón, por ejemplo, si el patrón (incluyendo el recuadro negro) mide 16x16 cm, seleccionar 16x16
  4. 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%.
  5. 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:

  1. Copiar archivo generado (extensión .patt) a la carpeta pattern_detection/library/multiPatternDetection/Data/
  2. Editar el archivo object_data en esa misma carpeta:
    1. Incrementar en 1 el número que aparece al principio (Cantidad de marcas a ser detectados).
    2. Agregar a continuación en el mismo archivo las líneas correspondientes al patrón, de la siguiente manera:
      1. Una línea representando el id de la marca
      2. Línea con el nombre de archivo .patt generado anteriormente
      3. Línea conteniendo tamaño en milímetros de la marca
      4. Línea conteniendo 2 decimales, separados por 1 espacio representando el punto medio de la marca.
    3. Guardar el archivo y cerrar.
  3. 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.

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 (Agregar link), 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.

NewPattersSegundaPestaña.png
Si existe un icono asociado se muestra a la derecha al seleccionarlo, si no lo tiene se muestra un icono general. TODO:Poner imagenes con ambos ejemplos NewPatternsListaConSeleccion.png

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. NewPattersSegundaPestaña.png

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.

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.