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 embargo, cuando Kd y Kp tienen valores más similares el robot sigue la línea muy de cerca, trazando bien las curvas, pero tiende a oscilar en la rectas sin encontrar estabilidad. Una parte muy importante del diseño es encontrar un compromiso entre ambas opciones.
La estrategia para calcular el error en la posición del robot es el mismo que en el post anterior, lo he mantenido a falta de incorporar una medida lejana para predecir mejor el próximo moviemiento. Además del PID he utilizado una serie de reglas para establecer la velocidad de avance y giro según determinadas situaciones. Por ejemplo, cuando el error el sobrepasa un límite incremento la velocidad de giro al tiempo que disminuyo la de avance. De la misma forma, si el error es menor a cierto valor, aumento la de avance y disminuyo la de giro. He podido comprobar que este tipo de sencillas reglas mejoran el rendimiento, haciendo el comportamiento del robot más preciso.
Tanto el compromiso entre Kp y Kd como los valores de umbral para las distintas reglas han sido fijados mediante prueba y error hastan encontrar una solución satisfactoria. El resultado obtenido con este método es mucho mejor que los anteriores. He conseguido dar una vuelta completa en 2min35s, con un comportamiento bastante aceptable. Sin embargo, he observado que cuando el coche sale mal posicionado de las curvas le cuesta mucho encontrar el equilibrio. Además, en las curvas todavía se producen algunos bandazos sobre todo en la entrada.
Sin duda los mayores problemas vienen dados por la entrada y salida de curva. Si fuese posible suavizar estas transiciones el comportamiento mejoraría sustancialmente. Por otra parte, en vez de encontrar un compromiso entre una configuración que funciona mejor en curva contra otra que funciona mejor en recta, parece más lógico y efectivo emplear las dos, identificando en cada frame en que situación se encuentra el robot. Esto implica el uso de dos controladores, que equivale simplemente a crear otra instancia de la clase PID. En el siguiente paso intentaré diferenciar entre curva y recta para usar el correspondiente controlador en cada caso.
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 embargo, cuando Kd y Kp tienen valores más similares el robot sigue la línea muy de cerca, trazando bien las curvas, pero tiende a oscilar en la rectas sin encontrar estabilidad. Una parte muy importante del diseño es encontrar un compromiso entre ambas opciones.
La estrategia para calcular el error en la posición del robot es el mismo que en el post anterior, lo he mantenido a falta de incorporar una medida lejana para predecir mejor el próximo moviemiento. Además del PID he utilizado una serie de reglas para establecer la velocidad de avance y giro según determinadas situaciones. Por ejemplo, cuando el error el sobrepasa un límite incremento la velocidad de giro al tiempo que disminuyo la de avance. De la misma forma, si el error es menor a cierto valor, aumento la de avance y disminuyo la de giro. He podido comprobar que este tipo de sencillas reglas mejoran el rendimiento, haciendo el comportamiento del robot más preciso.
Tanto el compromiso entre Kp y Kd como los valores de umbral para las distintas reglas han sido fijados mediante prueba y error hastan encontrar una solución satisfactoria. El resultado obtenido con este método es mucho mejor que los anteriores. He conseguido dar una vuelta completa en 2min35s, con un comportamiento bastante aceptable. Sin embargo, he observado que cuando el coche sale mal posicionado de las curvas le cuesta mucho encontrar el equilibrio. Además, en las curvas todavía se producen algunos bandazos sobre todo en la entrada.
Sin duda los mayores problemas vienen dados por la entrada y salida de curva. Si fuese posible suavizar estas transiciones el comportamiento mejoraría sustancialmente. Por otra parte, en vez de encontrar un compromiso entre una configuración que funciona mejor en curva contra otra que funciona mejor en recta, parece más lógico y efectivo emplear las dos, identificando en cada frame en que situación se encuentra el robot. Esto implica el uso de dos controladores, que equivale simplemente a crear otra instancia de la clase PID. En el siguiente paso intentaré diferenciar entre curva y recta para usar el correspondiente controlador en cada caso.
Comentarios
Publicar un comentario