jueves, 15 de marzo de 2018

Práctica 1: Follow line (Prueba 1)

Esta práctica (https://github.com/JdeRobot/Academy/tree/master/src/follow_line) consiste en completar una vuelta de un circuito Fórmula 1. Para ello será necesario emplear un control visual, así como realizar un control reactivo PID o bien un control PD. Para realizar la práctica se empleará el simulador Gazebo, la plataforma JdeRobot y la librería OpenCV para procesamiento de imágenes.

Para poder ver la práctica en funcionamiento, deberemos primero lanzar el simulador Gazebo con el mundo correpondiente, que contendrá el coche fórmula 1 y el circuito; y después ejecutar nuestro código para ver cómo se comporta el coche en el circuito. En un terminal lanzamos:

gazebo simpleCircuit.world

En otro terminal lanzamos:

 python2 ./follow_line.py FollowLineF1.yml

 El fórmula 1 posee dos sensores, que son dos cámaras, y nos proporcionarán la información necesaria para guiar a nuestro fórmula 1 por el circuito. Además, posee dos actuadores: la velocidad de tracción y la velocidad de rotación. El circuito se puede ver en la siguiente imagen:




El coche posee dos cámaras como hemos visto, aunque solamente emplearemos una (la izquierda) en la práctica, ya que con eso será suficiente. Las imágenes que capta la cámara se pueden obtener del siguiente modo:

 imageLeft = self.cameraL.getImage()
imageRight = self.cameraR.getImage()

Como hemos visto anteriormente , el objetivo de la práctica es que el coche de una vuelta al circuito. Para ello, será necesario detectar la línea roja que está en el centro de la carretera, es decir, será necesario realizar una umbralización de esta línea.

Para realizar esta umbralización, primero debemos transformar las imágenes al espacio de color HSV, ya que HSV es más robusto que RGB ante cambios de iluminación. Tras realizar la transformación a HSV, se ha hecho una umbralización de la imagen empleando la función cv2.inRange de OpenCV. Este fitrado se hace en función a los valores de rojo de la línea de la carretera.

Si mostramos la imagen tras la umbralización veríamos que aparecen puntos en negro que pertenecen a la línea roja y no debería ser así. Esto ocurre en la línea de salida del circuito, ya que se puede ver que la línea parpadea y por lo tanto no tiene siempre el tono rojo habitual. Este problema lo podemos ver en la siguiente imagen.


Para solventar este problema, se ha aplicado una operación morfológica (un cierre en concreto) empleando un elemento estructurante con forma de elipse. Se puede observar en la siguiente imagen cómo ya no quedan huecos al filtrar la línea roja.


Tras obtener una imagen con la carretera en blanco, se ha tenido en cuenta que si el coche circula sobre la carretera correctamente la línea debería aparecer más o menos centrada en la imagen. Si por el contrario, la línea aparece en la parte izquierda de la imagen o derecha, es debido a que el coche debería girar puesto que está un poco desviado de la línea roja. De esta forma se puede conocer el giro que debe realizar el coche.

La prueba que se ha realizado es analizando una única fila de la imagen y suponiendo que el centro de la línea roja es el centro de la imagen, se ha realizado un control. Para conocer el centro de la línea, se calculan las posiciones donde los píxeles tienen valor 255. El control P sigue la siguiente fórmula:

Corrección = kp * error

Se ha comprobado mediante esta prueba que el resultado no es bueno puesto que el coche se choca en la primera curva. Esto se debe a que analizar una única fila de la imagen no nos proporciona suficiente información para saber si nos encontramos en recta o en curva. Además, puede ser que el uso de un control P no sea suficiente, ya que el coche puede oscilar sobre la línea. Por lo que será mejor emplear un control PD para evitar estos vaivenes del coche. El resultado de esta prueba se puede ver en el siguiente vídeo.