Práctica 1 de visión robótica . Robot sigue línea con simulador Gazebo

Esta es la primera práctica de la asignatura de Visión Robótica.

En esta práctica deberemos programar el comportamiento de un robot para que sólo mediante la visión sea capaz de recorrer un circuito en el menor tiempo posible.

Para simular el robot se utilizará el simulador Gazebo y como entorno de programación Jderobot.

Screenshot gazebo 2016-06-09 00:14:51

Nuestro robot simulado, dispondrá de dos cámaras virtuales., pero solo puede utilizar una de sus 2 cámaras virtuales para guiarse. Para que el robot sea capaz de seguir el trazado  del circuito,  la zona central de la carreterase ha pintado con una ancha línea roja de tal forma que para recorrer completamente el circuito , el robot sólo debe seguir esta línea. Para la nota final de esta práctica cuenta el tiempo en el que el robot consigue completar una vuelta al circuito, por tanto hay que prestar especial interés en que el robot se desplaze a una buena velocidad pero no demasiada para que no se salga de la pista en las curvas.

Screenshot robot programado 2016-06-09 00:16:15

El lenguaje de programación será Python y se podrán utilizar la librería de OpenCV.

Para la programación del comportamiento del robot se seguirá el temario explicado en la asignatura , especialmente el tema de control reactivo.

El comportamiento básico de nuestro robot será:

1Tomar imagen de la cámara

2 Analizar imagen, segmentación de la zona roja de la carretera

4 Indicar al robot que movimiento debe realizar

El punto 1 es sencillo, leeremos la imagen capturada por la cámara.

El punto 2 es un poco más complejo. Lo normal sería tratar la imagen capturada en formato RGB, pero se observa que a lo largo del circuito hay sombras sobre la línea roja . Estas sombras complicarán la detección del color rojo en RGB por tanto las imagenes se pasarán a formato HSV (Huge=Matiz, Saturation=Saturacion, Value=Valor ). Este formato es capaz de detectar colores independientemente de las variaciones de luminosidad del entorno, es decir que no nos van a afectar las zonas rojas sombreadas, seremos capaces de detectar el color rojo tanto en las zonas sombreadas como en las no sombreadas. Una vez hallamos detectado la zona roja podremos decir al robot hacia donde debe moverse.

En el tercer punto, definiremos que comportamiento va a seguir nuestro robot, en función de la posición de la carretera roja del circuito.

Trataremos que el robot permanezca centrado siempre en la carretera. Una vez hallamos segmentado la imagen en formato HSV para quedarnos solo con el color rojo, tendremos una imagen bicolor, en negro todo lo que no sea rojo , y la parte iluminada será la roja.

A partir de aquí vamos a procurar que la parte iluminada quede siempre centrada en la pantalla, para ello nuestro robot se comportará de la siguiente forma.

Si la parte iluminada aparece a la izquierda , nuestro robot debe girar a la izquierda

Si la parte iluminada aparece a la derecha, nuestro robot debe girar a la derecha

Si la parte iluminada está centrada , nuestro robot puede seguir avanzando e incluso acelerar!

Como primera aproximación sólo nos quedaríamos con la ultima línea de la imagen. No necesitamos leer toda la imagen para saber si el robot está centrado en la carretera o debe girar. Leyendo la última línea roja conseguimos realizar  una vuelta al circuito , pero en 4 minutos. Demasiado tiempo. Había que dar más velocidad al robot.

Para ello necesitamos leer más líneas de la imagen segmentada, de tal forma que el robot sea capaz de ir a buena velocidad o acelerar cuando detecte que está sobre una recta y tambien que sea capaz de frenar cuando detecte una curva.

Se ha comprobado que si el robot hace giros cuando va a gran velocidad suele salirse de la pista e incluso bolcar , por tanto es importante controlar la velocidad del robot antes de los giros.

Se ha creado un controlador PID para controlar los giros, de esta forma el robot podrá corregir su posición de forma más eficiente.

Al final para el analisis de la imagen segmentada se tomarán varias filas de la imagen, comenzando de abajo hacia arriba.

Hallando el punto medio de cada segmento, calcularemos depués la media  de todos los puntos medios de cada segmento y el error a corregir será la diferencia entre esta media y la mitad del ancho de la imagen.

Se ha conseguido que el robot sea capaz de recorrer el circuito sin salirse de la carretera , completando el circuito en poco más de 2 minutos y 5 segundos.