Navegación visual: mejoras I

Tras trabajar la cabeza y el código, he incluido las siguientes mejoras:

  1. He acotado la visión del robot, dado que a partir de una cierta distancia, las medidas son menos exactas. Con ello generamos menos segmentos imprecisos.
  2. He añadido una navegación sencilla, donde la aceleración (positiva / negativa) es progresiva, con lo que evitamos los movimientos bruscos del robot (y consecuentemente de la cámara) que nos daba coordenas incorrectas de los puntos.
  3. He afinado aún más las constantes de fusión, con lo que se fusionan más segmentos y por tanto se almacenan menos.

Aún cuento con dos problemas que explico en el foro de la asignatura y con la negativa de recordmydesktop para grabar los vídeos…

Una prueba de los resultados:

resultado11

En la imagen se ve al robot después de haber girado hacia el pasillo de la derecha. Se ve claramente el mapa en memoria generado desde su salida hasta que ha alcanzado la posición en la que se encuentra.

Otra imagen más, esta vez le he dado la vuelta al robot..

resultadoatras

Y en breve os colgaré un par de vídeos.

Navegación Visual: «viendo» obstáculos

Una de las aplicaciones interesantes de la navegación visual es la detección de obstáculos que no son detectados por el láser, dado que están en el suelo por debajo de este.

Veamos cómo se traduce esto en nuestro esquema.

El obstáculo utilizado es una puerta que he tirado (bueno, más bien ha sido el robot guiado por mi malicia) como terapia anti-stresss, tras pasar una hermosa tarde de verano frente al ordenador sin solucionar los problemas del movimiento (os lo recomiendo, te deja relajado y feliz!).

Bueno, vamos al tema. Os dejo una imagen donde podéis comprobar cómo el láser no detecta ningún obstáculo, mientras que el mapa me muestra el segmento que me impide pasar:

Navegación visual

Ya estamos de vuelta para ponernos manos a la obra con la última práctica (por fin!).

En esta ocasión el objetivo está en poder navegar por el mundo utilizando el pioneer (desde el simulador Gazebo) usando para ello sólo la información que nos da la cámara (nada de laser).

Las tareas a realizar serán las siguientes:

  1. Identificar el suelo en la imagen captada por la cámara (2D).
  2. Realizar una conversión de los puntos 2D a 3D (utilizando la biblioteca Progeo).
  3. Representarlo mediante segmentos.
  4. Utilizar esta información para navegar.

El mundo en el que se desarrolla esta práctica es el departamental de la URJC de Móstoles:

departamental

Construcción de mapas (final)

… o eso espero!

Por indicación de José María (el profe 😉 ), os muestro un último vídeo para que se pueda comprobar con detalle la eliminación de segmentos no válidos.

Para saber si un segmento es o no válido, por cada punto del laser detectado, comprobaremos si el segmento formado por la posición del robot y este punto tiene intersección con cualquiera de los segmentos que tenemos almacenados. En ese caso, si el segmento es «pequeño» lo eliminanos, mientras que si es grande lo acortamos por el punto de intersección.

Pero lo mejor es verlo:

Como podéis comprobar, al avanzar el robot azul, el rojo va detectando lo que había detrás de este, fusionando con los segmentos que ya teníamos e, igualmente, eliminando los segmentos «no válidos» (donde estaba el robot azul).

La calidad del video es peor que la de los anteriores, pero es que mi recordmydesktop se niega a trabajar (no se si es porque es fin de semana, porque no aguanta el player con los dos jde de cada robot, …) y he tenido que hacer uso de la cámara del móvil.

Hasta otra!

Siguelínea Versión Mejorada

Hace unos días nos llevamos una sorpresa al conocer que la velocidad máxima no eran 1000mm/seg, sino que para esta práctica el software de simulación no trunca los valores superiores a 1000.

Así que nos pusimos a trabajar para poder mejorar los tiempos de vuelta, y hemos conseguido un algoritmo que hace que el robot complete una vuelta en unos 72 segundos, alcanzando una velocidad máxima de 2000 mm/sg.

Aquí podéis ver el resultado:

Conectando con gazebo…

Ya tenemos gazebo instalado, pero ahora tenemos que conectarlo con jde para poder acceder a los parámetros del robot y controlarlo con nuestro software.

Pues manos a la obra… lo primero descargar todo lo necesario de la web de la asignatura:

  1. Fichero de configuración de jde que permita conectar con gazebo.
  2. Nuevos ficheros introrob para controlar el robot desde jde en gazebo.

Con todo esto bajado, lo primero que vamos a hacer es compilar e instalar el driver de gazebo para jde, que viene dentro del directorio «drivers» de jde (en mi caso la versión 4.2.1):

…./4.2.1.r174/drivers/gacebo$ make

…./4.2.1.r174/drivers/gacebo$ sudo make install

Tras lo cual tendría que haberse copiado el fichero gazebo.so al directorio de jde que estemos usando, en mi caso: /usr/local/share/jde-robot.

Con todo esto podemos hacer la prueba de que jde conecta correctamente con gazebo. Para ello desde un terminal iniciamos gazebo mediante el comando:

$ wxgazebo <fichero-configuración>

El fichero de configuración que tendremos que utilizar está incluido en  el siguiente archivo comprimido (el pioneer2dx.world), aunque en mi caso lo he tenido que modificar para que utilice la renderización glx, utilizando este.

Finalmente:

$ wxgazebo pioneer2dx-renderGlx.world

Tras lo cual tendremos gazebo funcionando.

gazebo1

El paso siguiente será iniciar el jde, pero con el fichero de configuración que nos descargamos al principio (para que conecte con gazebo).

$ jde jde-conf-siguelinea

Si recibes un error del graphics_gtk, edita el fichero de configuración anterior y lo comentas (anteponiendo # a las líneas: driver graphics_gtk y end_driver).

Si todo ha ido correctamente, tendremos lo siguiente:

gazebo_jde

En la siguiente entrada mostraremos el funcionamiento del chocagira en gazebo…

Mi primer programa: «ChocaGira»

Parece ser que el Chocagira es como el «HolaMundo» en la robótica… ¡pues mal empezamos!… a nosotros nos ha costado un poco más!!.

La mayoría de las cositas que nos frenaban eran tonterías, que si estás en clase, el profe (o un compañero) puede ayudarte y lo solucionas en un momento,  pero si estás sólo te bloqueas durante un buen rato.

Por ejemplo, tras modificar navegacion.c, hacemos el make y el make install de introrob, pero al ejecutar el entorno el robot sigue comportándose igual que antes.

– Ummmm, ¿qué pasa?

– No se debe haber modificado el introrob.so

– Sí, se ha modicado, la fecha es la actual.

– … Será que no se ha copiado el introrob.so al directorio jde_robot.

– Pues, a ver…., sí aquí está, sí se ha copiado.

– Es verdad, mira, el makefile hace el cp.

– ¿Entonces qué pasa?

Volvemos a modicar navegacion.c, make, make install, lanzamos el robot…nada! Se comporta igual que al principio. Hasta que descubrimos que la ruta no era la correcta. Modificamos el makefile para que haga el cp a la ruta correcta. Es probable que durante la instalación (como la realizamos en dos tardes) creáramos el otro directorio.

Vale, el robot ya se mueve hacia adelante. Comenzamos a plantearnos cómo hacer que se comporte según las especificaciones. Las indicaciones de Vicente y de José María nos vienen estupendamente.

Identificamos 3 estados: avanzando, retrocediendo, girando.

estados

Lo que nos queda por determinar son esos ‘cuando choque’, ‘cuando haya retrocedido suficiente’ o ‘cuando haya girado suficiente’, así que nos ponemos a hacer pruebas, de forma que se escriba en la salida el valor de laser(60),laser(90),laser(120) miestras el robot avanza, para hacernos una idea de los valores que contiene el array según se acerca el robot a los objetos.

Con unas cuantas pruebas fue suficiente para hacer que nuestro robot ejecute el chocagira sin problemas:

Instalación y Configuración del entorno: Player, Stage y Jde

Inhauguramos este foro con la instalación y configuración del entorno que vamos a utilizar en la asignatura de Robótica (Master de Sistemas Telemáticos e Informáticos – URJC Móstoles). En concreto la he realizado en un equipo Guadalinex V5 (basado en Ubuntu Hardy).

Inicialmente realicé la instalación siguiendo los pasos que describe Santiago en la web oficial de la asignatura (gracias por tu aportación!). Aunque no fue sencillo… tras mucho trastear (y haciendo uso del foro)  conseguí que todo funcionara.

Con el entorno correctamente instalado y configurado en mi portatil (Guadalinex V5) y junto con otro compañero (Jesús) intentamos rehacer los mismos pasos en el suyo (Debian) con el fin de escribir en nuestros blogs la secuencia de acciones realizadas.

Tenemos que admitir que, como buenos informáticos que somos, después de volvernos locos instalando paquetes dejamos de apuntar (y saber con exactitud) los pasos que habíamos realizado. Por ello no conseguimos más que lo mismo que con mi portatil, hacerlo funcionar sin poder establecer una lista de comandos necesarios para la instalación de todo.

Tras postear el problema en el foro, vimos que José María (el profe ;-)), proponía una receta para la instalación (y posteriormente para gazebo) en un Ubuntu 8.04, así que procedimos a la instalación del Sistema Operativo en una máquina virtual  y siguiendo los pasos al pie de la letra, conseguimos tener el entorno perfectamente instalado.

Después de todo esto comprenderéis la alegría que da al ver un escritorio lleno de ventanas como estas….

jde