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:

Anuncios

SigueLínea V2

En esta nueva versión hemos mejorado bastante  el funcionamiento de nuestro robot con respecto a la primera. Concretamente, hemos creado un navegacion.c completamente nuevo…

Para construirlo, en esta ocasión (y a petición del profe 😉 ), no hemos utilizado estados finitos, sino que hemos programado un par de controladores PD para que controlen el valor de la velocidad (v) y el giro (w).

Dichos controladores van calculando el error que existe entre lo esperado y lo realizado y modificando los valores de v y w en consecuencia.

En concreto, el error que hemos considerado es la distancia (en píxeles) entre el centro de la línea roja y la mitad de la imagen (píxel 120), todo ello medido en la última línea de la imagen capturada por la cámara.

Dicho error modifica el compartamiento del robot, afectando tanto a la velocidad como al giro, de forma que si es muy grande, el giro aumente considerablemente y la velocidad disminuya, y si el error es pequeño (porque estamos muy cerca de la línea roja) giramos menos y avanzamos más rápido, controlando que según nos acercamos al objetivo se suavicen los movimientos.

Igualmente controlamos que si ha perdido de vista la línea (porque la curva es pronunciada) se pare y siga girando (mantenemos la w anterior).

Resultado: Tras ajustar las constantes de los controladores PD hemos conseguido avanzar más rápido y con movimientos más suaves (se acabaron los zig-zags!!). En el siguiente vídeo podéis comprobarlo:

Si os fijáis, en la parte inferior se muestran los valores que van tomando la v (velocidad) y la w (el giro). En las rectas va muy estable, alcanzando normalmente la velocidad máxima (v=1000)…

Ahh y da una vuelta completa en 110 segundos!!

NOTA: el vídeo va un poco lento por las características de mi equipo.

SigueLínea con Gazebo

En este caso vamos a intentar programar el robot pioneer para que sea capaz de seguir una línea roja del suelo. Para ello tendremos que interpretar los datos recibidos a través de una cámara.

Lo primero, por tanto, será aprender a interpretar los datos recibidos de la cámara del robot y estudiar cómo tratarlos para conseguir nuestro objetivo.

En el manual de programación con jde encontramos la siguiente referencia:

La imagen obtenida por una cámara se almacena y refresca en el array colorA[3*320*240] . Dentro del array, con el índice creciente se va recorriendo la imagen de arriba a abajo y de derecha a izquierda. Se dedican 3 bytes por cada pixel, uno para la componente roja R, otro para la verde G, y otro para la azul B.

Perfecto, pero… cómo accedemos a ese array desde navegacion.c? En el fichero introrob.h comprobamos que el array se declara así:

extern char imagenRGB[SIFNTSC_COLUMNS*SIFNTSC_ROWS*3];

Con esta información podemos ver los valores que se almacenan en el array imagenRGB para cada byte de cada pixel, descubriendo cómo indentificar rojo y blanco. Modificamos nevegacion.c para que, con el robot quieto, se impriman por pantalla los valores de la primera línea de píxeles que ve el robot (que en el array sería de la posición 3*240*319 hasta el final), obteniendo los siguientes valores:

(Comenzando por la parte derecha de la imagen)

Del pixel 0 al pixel 58: r=255, g=255, b=255 -> Blanco
Del pixel 58 al pixel 88: r=252, g=73, b=73 -> Rojo claro
Del pixel 89 al pixel 115: r=251, g=7, b=7 -> Rojo oscuro
Del pixel 116 al pixel 142: r=251, g=49, b=49 -> Rojo claro
Del pixel 143 al pixel 239: r=255, g=255, b=255 -> Blanco

camara

A continuación tendremos que ver cómo tratar dichos valores para que nuestro robot no se pierda 😉

Aquí podéis comprobar nuestra solución. Además os  pongo otro vídeo con el resultado:

Esta es la primera versión, que tendremos que afinar…

Chocagira en Gazebo

Con el gazebo perfectamente configurado y conectado con el jde, pasamos a probarlo utilizando nuestro chocagira.

Para ello copiamos el código elaborado para el chocagira en el navegacion.c (dentro del procedimiento yourcode_iteration) del  nuevo introrob.

El resultado es el siguiente:

Como podéis comprobar, en este escenario se podría afinar aún más el comportamiento del robot (añadir más velocidad, los giros, etc) aunque eso lo dejaremos para más adelante…

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…

Instalación y configuración del Entorno: Segunda parte (Gazebo)

Aquí estamos otra vez! intentando terminar la dichosa instalación de gazebo.

Os cuento cómo va la cosa…

En principio parecía que todo iba bien… me descargué gazebo 0.7.0, leí el archivo README y comprobé que necesitaba de otros paquetes (que novedad!): ODE y GDAL. Pues nada, a descargarlos e instalarlos………………… y comprobar que no compila, de ninguna de las maneras.

Finalmente, José María posteó una receta para instalarlo en un Ubuntu 8.04. Dado que mi portatil tiene el Guadalinex V5, basado en el anterior, seguí todos los pasos de la misma.

Resultado: ERROR.

Parece que tengo problemas de renderización. Gazebo utiliza la renderización off-screen y el soporte para esta varía de una máquina a otra.

Gazebo-0.7 soporta 4 tipos de renderización off-screen (unas aceleradas y otras no): glx, sgix, xlib y glxp.

Para poder especificar cuál de ellas se quiere utilizar se utiliza el parámetro <renderMethod> en el fichero de configuración de gazebo.

En mi caso, con el fichero de configuración siguiente y tras probar con cada uno de los anteriores métodos, tan solo funciona el “xlib” pero, aunque no obtengo ningún error, el resultado no es el esperado. Os lo muestro en la siguiente imagen:

error-gazebo

Finalmente, con un poco de ayuda he conseguido hacerlo funcionar. Para ello he deshabilitado la opción de Composite en mi servidor X, agregando en /etc/X11/xorg.conf  las siguientes líneas :

Section “ServerFlags”
Option “AIGLX” “off”
EndSection

Section “Extensions”
Option “Composite” “Disable”
EndSection

Y luego, en la configuración pioneer2dx-rendering.world, agregando el soporte para GLX :

<model:ObserverCam>

<renderMethod>glx</renderMethod>
</model:ObserverCam>

<model:Pioneer2DX>
….
<renderMethod>glx</renderMethod>
</model:Pioneer2DX>
Resultado:

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: