PRÁCTICA 1. FOLLOW LINE. PRUEBA 1

En esta práctica se trata de conseguir que un coche de la vuelta completa a un circuito. Para ello se deberá realizar el control visual, así como ajustar el control PID. Al hacer la práctica se ha visto que no era necesario un control PID y que con un PD valía, por ello es lo que se ha empleado.

El coche posee dos cámaras (derecha e izquierda), pero solo se ha usado la izquierda, ya que con ello era suficiente. La imagen se obtenía con:

Obtención de imágenes
imageRight = self.cameraR.getImage()
imageLeft = self.cameraL.getImage()


El control visual se ha hecho umbralizando la imagen con el objetivo de quedarnos con la línea roja del circuito, la cual nos sirve de referencia.



Para realizar la umbralización se ha empleado el espacio de color HSV, ya que es más robusto ante cambios de iluminación. En primer lugar se ha transformado la imagen al espacio HSV. Tras esto se ha umbralizado con cv2.inRange en función a un rango de valores.Finalmente se ha hecho una transformación morfológica usando un elemento estructurante, pues se ha visto que se obtenía mejores resultados.

La transformación morfológica ha sido necesaria porque en algunas ocasiones como por ejemplo en la línea de salida había problemas. Estos problemas se debían a que al haber rayas blancas la línea no quedaba bien definida en la umbralización. Tal y como se puede ver la siguiente imagen:


Al realizar la transformación morfológica se obtiene algo como:

 
En la siguiente tabla se ven los pasos seguidos para hacer toda la umbralización:

Umbralización
hsv_left = cv2.cvtColor(imageLeft, cv2.COLOR_RGB2HSV)
hsv_filterleft = cv2.inRange(hsv_left, hsv_min, hsv_max)
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (19, 19))
hsv_filterleft = cv2.morphologyEx(hsv_filterleft, cv2.MORPH_CLOSE, element)

Con la línea detectada, y sabiendo que el centro de la pantalla más o menos, es donde se debería ubicar dicha línea para que el coche estuviese moviéndose correctamente, podemos estimar que giro debe efectuar el coche en cada momento.

En este caso, se ha buscado el centro de la línea en dos filas de la imagen (300 y 370). Con estos dos centros se estima la diferencia entre ellos y en función de eso se ajusta la rotación y velocidad que debe tener el coche. Para saber el centro de cada línea se calculan las posiciones donde los píxeles tienen valor. Para ello se usa la función np.where , la cual devuelve la posición donde hay píxeles con valor distinto de 0.

En el caso de la rotación se han hecho dos controles PD. Uno si la diferencia entre el centro de la fila 300 y la fila 370 es 20 y otro para el resto de casos Para la velocidad se dan tres velocidades distintas en función de la diferencia que haya entre el centro de la fila 300 y la 370.

En el control PD se sigue la siguiente fórmula:

Control PD
corrección = Kp*error + Kd*(error - error_anterior)

Kp es la constante aplicada para el control proporcional y la Kd la aplicada al control derivativo.

El resultado que se ha obtenido con estas restricciones no es el óptimo, pues no llega a completar del todo el circuito y la velocidad que llega a alcanzar es un poco lenta. A continuación se puede ver el resultado obtenido:



Comentarios

Entradas populares de este blog

PRÁCTICA 2. 3D RECONSTRUCTION . PUNTOS DE INTERÉS Y EPIPOLAR

PRÁCTICA 1. FOLLOW LINE. PRUEBA 4

PRÁCTICA 2. 3D RECONSTRUCTION. MEJORA