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…