PRACTICA 2 FOLLOW LINE
Silvia Calvo Cabello
Silvia Calvo Cabello
Mediante Unibotics (página para la simulación de distintos proyectos) realizar un programa para un coche de Fórmula 1 autónomo. Para ello consta de una cámara frontal para reconocer la línea del circuito a seguir. Este debe ser lo más rápido y estable posible, realizando este control mediante un PID.
Es un controlador de lazo cerrado el cual intenta minimizar el error y hacer el sistema lo más rápido posible. Existen varios tipos de estos controladores (P, PD, PI, PID).
P - Proporcional - Es inversamente proporcional al error, cuanto mayor sea su valor, más rápidamente reaccionará al error instantáneo.
I - Integral - Calcula la integral del error para minimizar el offset (el error estable), cuanto mayor sea su valor ...
D - Derivativo - Calcula la derivada del error para suavizar o exagerar los cambios del error, cuanto mayor sea su valor ...
Para esta práctica se ha seleccionado un controlador PD (kp*error + kd*de/dt). Como las muestras del sistema son discretas, para el derivativo se calculará con la resta de tiempo entre muestras.
Como ya he mencionado antes, para esta práctica se está usando Unibotics para la simulación de los proyectos, y esta da dos opciones a la hora de controlar el coche de Fórmula 1. Primero mediante el giro roomba, indicando que la velocidad angular que recibe el modelo es la que gira, y está el modelo Ackerman, que funciona de manera que la velocidad angular gira las ruedas principales del coche y las secundarias no se mueven. Para esta práctica primero se realizará con el modelo simple.
El coche de Fórmula 1 consta de una cámara de visión en la parte frontal, para manejar dicha información necesitaremos las librerías de OpenCV (cv2) y Numpy.
Como la imagen recibida está a color y la línea a seguir es distinguible, trabajaremos la imagen aplicando un filtro de color para quedarnos solo con la línea roja (HSV). A continuación, para distinguir hacia dónde va la línea, sacaremos de una franja destacada (desde los 240 píxeles a los 260 píxeles en la componente y) los índices de todos estos píxeles que han pasado el filtrado y haremos una media, de esta manera podremos comprobar hacia dónde va la línea comparándola con el centro de la imagen.
- Calibración al inicio: La cámara frontal no está situada en el centro del coche, por lo que hay que calibrarla poniendo el coche en el centro de la línea.
- Perder la línea en mitad del circuito: El programa va guardando hacia donde tiene que girar para volver a encontrar la línea, así cuando la pierda solo gira en esa dirección.
- Margen del PD: Para evitar oscilaciones muy pequeñas, se ha generado un margen como el comentado en clase para el robot sigue personas, el cual selecciona la velocidad angular a 0.
Primer intento: Circuito: Simple Conducción: Simple Vision: RGB Controlador: PD(0.005 0.015) Velocidad: 4 tiempo: 280 s Problemas: Va muy lento
Segundo intento: Circuito: Simple Conducción: Simple Vision: RGB Controlador: PD(0.009 0.02) Velocidad: 8 tiempo: 130 s Problemas: Oscila bastante en las curvas.
Tercer intento: Circuito: Simple Conducción: Simple Vision: HSV Controlador: PD(0.01 0.3) Velocidad: 10 tiempo: 110 s Problemas: Para el modelo conducción simple es el mejor, no genera oscilaciones innecesarias. No hay problemas.
Prueba Ackerman: Circuito: Simple Probé el modo Ackerman, pero iba muy descontrolado. Intenté hacer pruebas de que simplemente fuese recto, y no podía, siempre giraba hacia un lado como se puede comprobar en el siguiente video. La única manera que conseguí que no girase era poniéndolo a velocidad 2, por lo que tardaba 180 segundos solo en hacer la primera curva.
Simple
Se ha dado prioridad a la estabilidad ante la rapidez, por ello el sistema tarda 110 s, pero tiene unas oscilaciones mínimas a lo largo de todo el recorrido como se puede comprobar en el siguiente video.
Se hicieron pruebas en otros circuitos como el Montmelo, el cual el tiempo final era algo elevado, pero seguía siendo muy estable, apenas saliéndose de la línea a seguir.