Práctica 1. Follow Line: Giro con Control PD

El siguiente paso para el control reactivo del giro es añadir la componente D, derivativa, la cual introduce una derivada del error que nos da memoria del error y nos hace girar más o menos según su tendencia. Esto nos dará mayor suavidad en los giros.

Control PD = kP * errorP + kD * errorD

Siendo el errorD la derivada de error, la cual calcularemos de la siguiente manera:

errorD = (error actual de P – error anterior de P)

kD de nuevo será una constante de proporcionalidad que traducirá nuestras unidades de error en unidades de giro. Esta se ha obtenido a partir de ensayo y error y, curiosamente, tiene el mismo valor que nuestra kP, 0.01.

Con este añadido, como se puede observar, nuestro F1 toma las curvas con mucha mayor suavidad y se ha confirmado después de tener durante más de media hora ejecutándose nuestro algoritmo, que no se sale del trazado en ningún caso.

No obstante, añadir la componente Derivativa no nos ha supuesto una mejora en nuestros tiempos, por lo que será necesario definir un nuevo Control para la Velocidad, que aumente a más de 10 en rectas.

Práctica 1. Follow Line: Giro con Control P

Una vez conseguido el paso del filtro de color, se comienza a implementar el control reactivo con el que, a través de control visual sobre el resultado de nuestro filtro, se calcularán los parámetros de giro y velocidad.

Para comenzar mantendremos la Velocidad constante a 10 tal y como estaba indicada en los comentarios de nuestro método execute, e implementaremos un Control P para el giro.

Siguiendo la formula de los controladores PID, tenemos que:

Control P = Kp * errorP

¿Y cuál es nuestro error?

Una posible solución es la indicada en el enunciado práctica: La diferencia entre el centro del circuito cuando el robot está perfectamente alineado y el centro del circuito actualmente observado. Para calcularlo nos situaremos en una línea horizontal de la imagen y la recorreremos, almacenando el primer y ultimo pixel blanco encontrados en la imagen. Conocidos estos dos, podremos obtener el punto medio a partir de la fórmula (x1 + x2) / 2.

La primera vez que ejecutemos nuestro algoritmo almacenaremos este punto como referencia de alineamiento, ya que sabemos que en ese momento nuestro robot está perfectamente alineado, y a partir de ahí calcularemos errorP = (initCenter – actualMedPoint).

La Kp traducirá el valor de nuestro error (num pixeles) a la unidad de giro, y se obtiene a partir de prueba y error.

En el enunciado de la práctica se propone realizar el cálculo del error a un cuarto de altura. Se probó esta alternativa, pero se vió que estaba demasiado abajo y no daba tiempo para rectificar el giro a tiempo y si ampliábamos mucho la constante para intentar que el giro fuera grande el control se hacia ingobernable.

Es por ello que se probó a realizar la medición a mayor altura, analizando con mayor tiempo de respuesta el circuito. En concreto se realiza practicamente en la línea del horizonte,  height / 2 + 10. Con este punto de referencia, sí se consigue encontrar una constante con la cual podamos terminar el circuito (Kp = 0.01), aunque con grandes oscilaciones, lo cual causa que en algunas ocasiones, que no se precedibles, las oscilaciones hagan que nuestro robot se salga del circuito y sea incapaz de volver de nuevo al trazado.

En esta primera aproximación se completa el circuito en 1:46 min, como se puede observar en el siguiente vídeo:

Práctica 1. Follow Line: Filtro de Color

El objetivo de la primera practica es desarrollar un algoritmo con el que un robot sea capaz de completar de forma autónoma un circuito de F1. Para ello se realizará un control visual a través de un filtro de color con el cual identificar el circuito, que será de color rojo, y un control reactivo PID para el giro y la velocidad.

En primer lugar se ha comenzado con el desarrollo del filtro de color. Para que nuestro algoritmo no se vea afectado por la iluminación (como puede ser la ocasionada por sombras), se desarrollará éste siguiendo el modelo de color HSV, por lo que necesitaremos previamente pasar las imagenes ofrecidas por nuestra cámara de RGB a HSV.

Al no poder ejecutar correctamente los componentes de desarrollo, como es el caso del componente colorTuner, se ha tenido que buscar los limites inferior y superior a través de software externo de edición de imágenes, concretamente GIMP, e ir ajustando los límites inferior y superior ejecutando el código de la práctica, follow_line.py.  Finalmente, se consigue un buen resultado sin necesidad tampoco de partir la imagen a la mitad para evitar que el filtro capte las paredes de nuestro circuito, de color rojo oscuro.

No obstante, existe un problema importante con las oclusiones intermitentes de la línea de salida, como se puede ver en la siguiente imagen:

Para intentar evitar esta problemática se ha probado la alternativa comentada por otros compañeros en sus blogs de realizar un operación morfológica de cierre, pero en mi caso, pese a realizar multitud de pruebas, no se resuelve el problema en absoluto, por lo que finalmente se decide desechar este procesado.

 

Instalación del entorno

El entorno de prácticas es completamente libre. Como Sistema Operativo se utilizará Ubuntu 16.04 Xenial LTS y el entorno de desarrollo será propio de la universidad, JdeRobot.

Para la instalación del entorno se han seguido los pasos descritos en el Manual-5 de la web oficial de JdeRobot.

En un primer momento hubo ciertos problemas con las shared libraries necesarias para ejecutar las prácticas de la asignatura, pero realizando todos los pasos, inclusive el paso que se especifica como prescindible, Installation for running JdeRobot , se consiguió ejecutar el entorno con la práctica 1.

El código de las prácticas se encuentra alojado en el proyecto Academy del github de la asignatura.