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
Publicar un comentario