Ir al contenido principal

FollowLine: Últimas mejoras

Para finalizar la práctica he incorporado una serie de mejoras que no tienen tanto que ver con rendimiento en tiempo del robot, si no con su robustez. Estaba teniendo algunos problemas en las transiciones entre curvas enlazadas, porque el robot detectaba una recta entre ambas curvas y aceleraba a tope. Probé a aumentar el tamaño del buffer que cuenta las 'rectas' necesarias para utilizar el controlador de recta y acelerar. Aunque este problema se solucionaba, el robot perdía mucha estabilidad en la entrada de las rectas debido a que el cambio de controlador tardaba demasiado. Por ello he dicidido cambiar un poco la estrategia.

En primer lugar he aumentado el tamaño del buffer de 10 a 50 unidades. Si las últimas 10 detecciones han sido recta el controlador cambia, pero al aumento de velocidad es menor que anteriormente, 7.5 unidades. Además, si las últimas 30 detecciones también han sido recta la velocidad pasa a ser 11. El comportamiento obtenido con esta configuración mejora considerablemente. Las transiciones entre curvas enlazas son más suaves porque la velocidad es menor, al mismo tiempo que gana todavía más estabilidad en la entrada de las rectas. Sorprendentemente el tiempo por vuelta no se ha visto apenas afectado. Parece que los tramos de recta que ahora se realizan con menor velocidad se ven compensados por una trazada más precisa.

Por otra parte, he implementado una serie de instrucciones para que el robot sea capaz de recuperar la trazada en caso de perder la línea. También funciona cuando el robot empieza desde una posición donde no ve la línea. En cada frame el estado del robot puede ser:

  • '0' = curva.
  • '1' = recta.
  • 'nan' = no encuenta la línea
He creado una variable global, inicializada a 0, que guarda la última velocidad angular del robot. Cuando el estado actual es Nan, sin línea, se fija una velocidad de 2 y una velocidad angular de +0.1, -0.1 o 0 según el dato guardado en la variable. De esta forma, en caso de salirse de la trazada, el robot avanza con cautela hacia donde se ha producido la última detección. Obviamente la variable global se actualiza en cada iteración.
Por otra parte, si el estado actual no es Nan pero el buffer contiene algún Nan dentro de sus 50 unidades quiere decir que robot acaba recuperar la línea. En este caso entraría en acción el controlador de curva, independientemente de donde se encuentre, con una velocidad fija de 2. La idea es que durante esos 50 frames el robot tenga tiempo para situarse en la trazada correctamete. Una vez no exista ningún Nan en el buffer, el robot recupera su controlador pertinente y relanza la marcha. He realizado una pequeña prueba para comprobar el funcionamiento, que se puede ver en el vídeo del final.

Con estas últimas mejoras doy por concluída la práctica. El tiempo por vuelta es de 1min 40s, un resultado bastante bueno. Además incluye una serie reglas para reaccionar frente imprevistos que también muestran buenos resultados. 




   

Comentarios

Entradas populares de este blog

Reconstruccion3D: emparejamiento de puntos y cálculo del punto 3D

Como se comentaba en la entrada anterior, una vez tenemos la línea epipolar calculada podemos buscar el punto homólogo correspondiente. Para ello es necesario establecer una métrica para comparar ambos puntos. Tomar simplemente los valores RGB de los puntos no parece la forma más fiable, puesto que puede ser que haya más de un punto similar. Lo ideal sería tomar una región o parche centrada en los puntos. De esta forma la comparación será mucho más fiable y discriminante a lo largo de la epipolar. Es necesario establecer una métrica para comparar ambos parches. Una de las más sencillas es el MSE (Mean Square Error), que promedia el resultado de restar los valores en escala de grises de cada uno de los elementos del parche. Existen otras métricas como comparar histogramas o la correlación, pero considero que es mejor comenzar con la más simple. Como se trata de una diferencia, hay que calcular el MSE entre todas las posibles combinaciones a lo largo de la epipolar. El punto

FollowLine: primera aproximación

Para poner en práctica las ideas expuestas en la entrada anterior he realizado una primera aproximación al algoritmo de comportamiento. En el enunciado de la práctica se recomienda usar un controlador tipo PID para estimar el error, pero para este intento he decidido omitirlo. El objetivo es simplemente aprender a controlar el robot actuando en consecuencia al error cometido. He extraído tres puntos de control a diferentes alturas de la imagen referencia, con los que he dibujado la línea ideal de trayectoria en recta. En cada iteración calculo el punto medio del ancho de la línea y estimo la distancia con el punto de referencia, en principio solo para el punto a media altura. Según la magnitud del error he fijado una serie de reglas para establecer la velocidad de avance y de giro. Si el error es muy grande la velocidad de avance debe de ser pequeña y la de giro grande. Sin embargo, cuando el error es pequeño la velocidad de avance se puede aumentar al mismo tiempo que se disminuye la

FollowLine: diseño con un PID

En esta siguiente aproximación me he centrado en introducir el controlador PID en el sistema. Tras estudiar su funcionamiento teórico me he decantado por crear una nueva clase que contenga las tres constantes fijas: Kp, Kd y Ki, además de un método que compute la fórmula y devuelva el resultado. Las constantes anteriormente mencionadas no tienen ningún tipo de valor por defecto, dependen mucho del problema a tener en cuenta. Por ello, he obtenido sus valores óptimos mediante prueba y error. Realmente es un trabajo costoso y que toma tiempo, pero si se hece bien el resultado puede ser muy bueno. Para este caso en concreto, he comprobado que apenas se producen cambios en el comportamiento del robot cuando omito la constante Ki, por lo que la fijaré a 0. No entiendo bien porque parece funcionar mejor sin ella, pero realmente lo hace. También he observado que cuando Kd es mucho más grande que Kp el robot sigue las rectas increiblemente, sin oscilar, pero es poco estable en curvas. Sin e