En este blog se irán describiendo todos los avances realizados por Vicent Avaria Avaria en las prácticas de Visión Robótica del Máster Oficial de Visión Artificial - URJC - Móstoles

domingo, 26 de marzo de 2017

3- Práctica1 Follow_Line

Anteriormente se completó la vuelta en 4:56 minutos y avanzando sobre lo implementado esa vez, se ha podido conseguir un tiempo de 2:20 como se puede observar en el vídeo Vuelta completa en 2:20 min.

Para ello se han añadido más variables self. como las siguientes:

-self.nh, para controlar el número de iteraciones que el Formula 1 no encuentra la línea donde debería haber.

-self.w, para controlar la velocidad de rotación ya que anteriormente se utilizaban constantes.

-self.state, para poder visualizar en que estado se encuentra el Formula 1. Se han determinado 5 estados:
         -Stop: Cuando se inicia el script My_Algorithm.py.
         -Run: Cuando el coche se encuentra dentro del umbral de recta. 
         - +rot: Cuando el coche se encuentra rotando hacia la izquierda.
         -  -rot: Cuando el coche se encuentra rotando hacia la derecha.
         - Search: Cuando el coche se encuentra buscando la línea.

-self.t, para almacenar el tiempo total actual en segundos. Para esto se ha utilizado el self.iteration y el tiempo de ciclo (80ms)
Como se puede observar estas variables son de control y en el vídeo Vuelta completa en 2:20 min, se puede observar que la imagen filtrada derecha tiene escrito algunas de ellas. En concreto se ha realizado un control de:

-self.iteration, para saber en que iteración se encuentra.
-self.v, para saber en que velocidad se encuentra.
-self.w, para saber en que velocidad de rotación se encuentra.
-x1, para saber en que posición x se encuentra.
-self.state, para saber en que estado se encuentra.
-self.t, para saber cuanto tiempo tarda en dar una vuelta.

A parte de estos cambios también se han realizado los siguientes cambios:

-Se ha fijado una constante para self.xf, que se ha comprobado que es la ideal para el circuito probado.

-El umbral de recta se ha modificado a: self.xf*0.85<x1<self.xf*1.15. El cual corresponde al estado Run. Pero interiormente se han creado subestados cuando self.xf*0.85<x1<self.xf*0.9 pasando al estado +rot self.xf*1.1<x1<self.xf*1.15 pasando al estado -rot, dándole respectivamente una velocidad de rotación de 0.3 o -0.3. Pero manteniendo la velocidad obtenida en el umbral de recta.

-Se ha modificado la aceleración del coche a múltiplos de 15, pero se mantiene el aumento de 3 puntos en la velocidad.

-Fuera de estos umbrales, aparecen los estados de +rot y -rot ambos con una velocidad de rotación de 0.5 y -0.5 respectivamente. Y una velocidad de 3.

-Se ha comprobado si hay una recta en la imagen para pasar al estado search en caso de no ser así. Dentro de este estado el coche tiene una velocidad de 0.5 y una velocidad de rotación de 0.3.

Finalmente en el vídeo se comprueba que efectivamente se cumplen los 2:20 de velocidad.

 
Vuelta completa en 2:20min

2-Práctica1 Follow_Line

Después de realizar el estudio del script My_algorithm.py encargado de controlar el Formula 1, se vio la necesidad de tener variables self. para poder controlarlo óptimamente.

Para conseguir que el Formula 1 diése una vuelta entera al circuito, como se puede ver en el vídeo "Vuelta completa en 4:56" ha sido necesario crear tres variables nuevas:

-self.v, para controlar la velocidad del coche.
-self.xf, para guardar el valor x de la boundingbox que engloba la línea elegida.
-self.iteration, para controlar en que iteración se encuentra actualmente.
-self.i, para contabilizar el número de interaciones que el Formula 1 se encuentra dentro del umbral de recta.

Con estas variables creadas se ha elegido un rango de líneas de la mitad inferior de la imagen, de la 20 a la 29 (sin sumar la mitad de la imagen), y se ha detectado su bounding box para extraer el valor de x. En la primera iteración se guardará el valor de la x en self.xf, ya que se tiene en cuenta que el Formula 1 se encuentra centrado en la línea.

Una vez se tenga self.xf guardada se ha creado un umbral de recta para determinar que el Formula 1 se encuentra centrado, por lo tanto el Formula 1 se encontrará en el centro de la línea si:

-self.xf*0.9<x<self.xf*1.1

En caso de que el formula 1 no se encuentre en este umbral, se comprueba si la nueva x es menor o mayor que self.xf. Sabiendo si es menor o mayor se sabe si se encuentra en una curva hacia izquierdas y hacia derechas. Por lo tanto se realiza una disminución de velocidad a una constante (1) y se le añade una velocidad de rotación que se ha determinado por el método de prueba y error, y aquel valor que no falla es -0.3 y 0.3.

Una vez comprobado que el Formula 1 completa una vuelta entera se ha comprobado que en las rectas se pierde mucho tiempo. Como se tiene guardado el número de iteración actual dentro del umbral de recta en self.i se ha utilizado este valor para aumentar el valor de la velocidad. En concreto cada múltiple de 25 la variable self.v aumenta 3 puntos. Para realizar este ajuste también se ha realizado por el método de prueba y error.
Con los puntos anteriores se observa que aunque no consigue dar una vuelta en menos de 2:15 (récord actual) se consigue dar la vuelta completa sin ningún error.

Vuelta completa en 4:56

miércoles, 8 de marzo de 2017

1-Práctica1 Follow_Line

Esta práctica consiste en que un Formula 1 pueda recorrer un circuito con la única ayuda de una línea que se encuentra en el centro del circuito.

Para ello es necesario realizar una detección de esa línea. A través de un filtro de color similar al de la práctica 0. En este caso se ha grabado un vídeo donde se puede ver el color de la línea para pasarlo por la aplicación ColorTuner y extraer los valores de H, S y V óptimos para su detección. Teniendo en cuenta que H va de 0 a 2*(pi), por lo tanto ha de transformarse de 0 a 180 para el filtro de color. S va de 0 a 1 y hay que transformarlo de 0 a 255 y finalmente V ya se encuentra normalizado de 0 a 255. 

Posteriormente, como dice el enunciado de la práctica es recomendable realizar este filtrado tan solo en la mitad inferior de la imagen, quedándose con la carretera para optimizar la carga computacional. En este caso, por mal entendimiento, se intentó primero realizar un filtrado tan solo de líneas pares, que finalmente no dio ningún resultado óptimo y se procedió a utilizar tan solo la mitad inferior de la imagen.

Durante el proceso de visualización del filtrado de color hubo problemas ya que daba errores incomprensibles. Finalmente se encontró el fallo y era que la imagen procesada debía tener canales RGB, por eso se procedió a dejar la línea roja y el resto en negro.

Para comprobar si funcionaba en todo el circuito el filtrado, se controló el coche desde el pad que facilita la práctica, obteniendo el siguiente resultado:

Follow_Line 1