sábado, 27 de febrero de 2010

laberintos (IX): resultado

Mucha letra ... pero lo que más interesa es ver un video de todo esto que os he contado en funcionamiento.





Qué los disfruteis

Laberintos (VIII): Conclusiones y líneas de trabajo futuras

Ya habéis visto que el que no tiene un lego que escapa de laberintos es porque no quiere. Voy a intentar resumir aquí las conclusiones que he obtenido de este experimento.

- El lego sigue sin parecerme una herramienta de precisión. Obviamente es un juguete.

Esto lo he visto muy patente a la hora de realizar los giros, que prácticamente nunca eran de 90 grados justos. A veces te giraba más y a veces menos. A veces avanzaba hasta la mitad del cuadrado y otras veces hasta el final

Esos pequeños fallos se iban acumulando y no se obtenían resultados buenos. El robot se iba de la habitación, se quedaba dando vueltas sobre sí mismo.

- Roborealm es la repanocha !!! le veo muchas posibilidades y todas muy interesantes. Creo que no va ser el último proyecto en que lo utilice.

- He utilizado un montón de herramientas y he visto como colaboran todas en paz y armonía para obtener el resultado final. Cámara web -> Roborealm -> Telnet -> Java -> Matlab -> Lego.

Que buen integrador soy :D.

Como futuros trabajos quiero proponerme que sea el propio lego el que sin ayuda de ningún sistema externo salga del laberinto. Ya tengo algo en mente, pero utilizando NXC, así que dentro de poco ... mis aventuras y desventuras con NXC.

Espero que os haya gustado esta entrada. Ale, todos a hacer el Prison Break

laberintos (VI) : algoritmo de búsqueda A*

Esto si que es superior a mis fuerzas explicarlo ... así que aquí tenéis un enlace a la wikipedia, que seguro que lo explica mucho mejor que yo.

Lo que intento obtener del algoritmo, son las posiciones por las que tiene que pasar el robot para salir del laberinto. Y con qué acción se ha llegado a ellas.



Asi tenemos una lista de movimientos por ejemplo

AV, avanza
GT, gira 180 grados
GD, gira 90 grados a la derecha
GI, gira 90 grados a la izquierda

Para salir del laberinto hay que pasar por las siguientes posiciones

00,10,20,30,31,32,33,34,24,14,04,03,02,21

que son los siguientes movimientos del robot

GT,AV,AV,AV,GD,AV,AV,AV,AV,AV,GD,AV,AV,AV,GD,AV,AV,GD,AV

Estas son las instrucciones que le enviamos a Matlab. Las escribimos en un fichero de texto plano en un directorio en el que Matlab está escuchando constantemente en busca de instrucciones para enviar al robot.

Laberintos (V): ROBOREALM

Roborealm es, hablando muy por encima, una aplicación de visión artificial y procesamiento de imagenes. Roborealm podría llenar por sí sólo blogs y blogs, así que lo que voy a contar aquí, no hace más que arañar la superficie de la cantidad de cosas que se pueden hacer con él.

En este ejemplo vamos a proporcionar sentido de la vista a nuestro robot. Y hablando más técnicamente, vamos a transformar una imagen de un laberinto, en información que pueda entender el robot. En este caso, una matriz de dos dimensiones, que indique si hay pared o hay camino libre para moverse.



Como se puede ver, lo que voy a intentar conseguir en que posiciones de la matriz habrá pared o no. Que podría ser perfectamente una matriz de booleanos.

Empecemos a trabajar con RoboRealm. Recordar que tenéis que jugar con ello para obtener buenos resultados y que yo disto mucho de ser un experto en su uso. seguro que se os ocurren muchas y mejores maneras de hacer lo mismo que yo.

Información en bruto

El punto de partida en RoboRealm es un dispositivo capturador de imagenes, como puede ser una cámara web, o una imagen, como es el caso que nos ocupa.



Sobre estas imágenes se aplican una serie de filtros de manera consecutiva que van filtrando, extrayendo, modificando ... de modo que podamos extraer información útil de la misma.

Lo primero que vamos a realizar sobre la imagen es aplicar el filtro Affine. Este filtro modifica los límites de la imagen para cuadrarla. Y fingir que estamos mirando el laberinto desde arriba. De este modo queda mucho mejor delimitado el laberinto.



De todo lo que aparece en la foto, sólo nos interesa los papeles verdes. Vamos a filtrar utilizando el RGB Filter.





Ahora ya sólo tenemos en la imagen información interesante. Vamos a centrarnos en obtener tres cosas: dónde está la meta, dónde está la salida y dónde están las paredes.

Obtener la meta
Como se puede ver en la imagen inicial, la meta está representada con un triángulo. Luego deberemos buscar en la imagen objetos con forma de triángulo. Yo lo he resuelto de la siguiente manera.

Utilizando el Blob Filter, podemos buscar formar en la imagen. En este caso queremos sólo buscar formas que tengan un área triangular y pulsamos CREATE BLOBS VARIABLE. Esta variable almacena el centro de gravedad de todos los objetos devueltos por el filtro. De este modo tenemos el punto donde está la salida dentro de la imágen.



Y ahora con el lenguaje de script que tiene roborealm, introducimos la variable BLOBS en la variable TRIANGULO.



Tras esta serie de pasos, tenemos en la variable TRIANGULO de RoboRealm la posición de la salida.

Obtener la salida

El procedimiento es similar. Volvemos a la posición de partida, con el marcador de inicio. Aplicamos un nuevo Blob Filter, pero esta vez buscamos objetos que tengan forma circular. Marcamos "CREATE BLOBS ARRAY VARIABLE"

De forma similar a antes introducimos la variable BLOBS en una nueva variable CIRCULO. Tenemos que hacer esto, porque si no, la llegada, habría sobrescrito el valor de la llegada.



Tras esta serie de pasos, tenemos en la variable CIRCULO de RoboRealm la posición de la meta.

Obtener las paredes

Las paredes se obtienen de manera similar. La única salvedad es que ahora tendremos no sólo un punto, sino un array de los mismos. Esto es importante de cara a recuperar los valores desde aplicaciones fuera de roborealm.

Aquí podemos ver los pesos que tienen las figuras, el triángulo y el círculo han desaparecido porque hemos ajustado un valor muy alto. De este modo podemos ajustar los objetos "más cuadrados", "más redondos" ... Este filtro es muy interesante y creo que es el que más juego puede ofrecer.





Tras esta serie de pasos, tenemos en la variable PAREDES de RoboRealm la posición de las paredes.

Comunicación con otros sistemas

Ahora voy a mostraros otra característica bastante interesante de RoboRealm, que es la comunicación con otros sistemas a partir de su API. Vamos a facilitar toda la información que ha extraído RoboRealm a la imagen, a un pequeño programa escrito en java. Este programa será el encargado de encontrar una salida al laberinto. Pero eso será en otra entrada.

De este modo estoy separando el procesado de la imagen, con el procesado de la información extraida de la imagen. Así, detrás de RoboRealm, podemos tener cualquier otro sistema de resolución de problemas, más apropiado al caso que nos concierna.

El uso de la API es bastante sencillo. Roborealm disponibiliza un servidor de telnet al que podemos atacar, por ejemplo, solicitando variables con

 
<request>
<get_variables>VAR_1_NAME, VAR_2_NAME, etc.</get_variables>
</request>



y aquí podemos ver como Roborealm nos ha devuelto los puntos donde estaban las paredes.

Y con esto he dado una pequeña introducción a RoboRealm. Espero que haya quedado relativamente claro, y animaros una vez más a trastear por vuestra cuenta, porque con la visión artificial se amplían bastante los límites de los proyectos que podemos emprender con nuestro robot.

laberintos (IV): ¿Qué vamos a utilizar?

Todo esto está muy bien: tenemos un lego, un laberinto en el suelo ... pero nos falta algo. ¿Cómo vamos a hacer a lego inteligente para encontrar la salida? ¿Cómo va a ver el lego el laberinto? ... hay muchas preguntas, así que vamos a contestarlas por partes.

¿Cómo va el lego a interpretar el laberinto?
Vamos a utilizar Roborealm. Es un software de visión artificial. De este modo, podemos hacer que el lego "vea" a través de roborealm (mediante una foto del laberinto o una cámara web enfocada al laberinto), dónde está metido.

Una vez que ya sabe dónde está metido ¿Cómo va a saber salir?
Para esto vamos a usar inteligencia artificial. Vamos a aplicar algoritmos de búsqueda de soluciones sobre lo que ve Roborealm y dar una solución al problema.

Chuck Norris una vez tuvo un Lego Mindstorms. La televisión hizo documental sobre él, le llamó The Terminator.

Uff, muchas cosas ¿Cómo lo vamos a unir todo?
Es un poco lio la verdad, pero lo voy a intentar explicar lo mejor que pueda.

Roborealm va a reconocer la información del laberinto.

Esa información va a ser procesada por un algoritmo de búsqueda de soluciones implementado en java. De este algoritmo se obtienen una serie de movimientos que son los que tiene que hacer el robot para salir del laberinto.

Mediante matlab vamos a enviar esa serie de movimientos al robot para que salga del laberinto.

Es importante resaltar que no es el bloque el que sabe salir del laberinto, si no que se limita a escuchar los movimientos que le llegan.

Hay una entrada para cada una de estas partes, así que allí intentaré explicarlo un poco mejor

Vamos al lío !!!

Laberintos (II): el laberinto

Vamos a hablar de las partes de las que va a constar este experimento: un lego saliendo de un laberinto. Creo que a estas alturas todos sabemos lo que es un lego, así que no queda otra que hablar del laberinto.

Recortando trozos de papel cuadrados he dibujado en el suelo de mi habitación un laberinto cuadrado 5x5 como puede ver en la siguiente imagen. Los bordes no están limitados por otros cuadrados, si no por las dimensiones.




El robot se puede mover por el suelo que no está ocupado por cuadrados verdes.

La salida estará representada por un triángulo y el punto de llegada con un círculo.



Y aquí diferentes laberintos.








Si mi habitación fuera más grande ... pues podría hacer un laberinto enorme.


Lo que pretendo es que el robot situado en la entrada, vaya hacía la salida.


Con esto creo que ya está explicado el dominio del problema.

Laberintos (I)

Hola a todos,

Hace bastante bastante tiempo que no publico nada. No es que haya estado sin tocar estos temas, pero nada de lo que he intentado me ha salido bien.

Aunque hoy escribo porque tengo un nuevo tema, y he obtenido un bonito resultado. A lo largo de las siguientes entradas podréis ver como mi lego escapa de un laberinto dibujado en el suelo.

Un saludo y espero que la espera haya merecido la pena.