Esta práctica consiste en programar un robot para que siga una línea roja en base a la información captada por una de sus cámaras, la cual será la única fuente información que se tendrá del entorno.
Es base a estas especificaciones el programa que controlará el robot está dividido en dos fases diferenciadas: una primera fase de obtención de información a partir de la cámara izquierda del robot y una segunda fase en la que se comandará el robot en base a la información obtenida.
Fase I: obtención de información
En esta fase se pretende sintetizar la información más relevante a partir de los frames que nos ofrece la cámara.
Análisis de la imagen
Para ello lo primero que se hace es analizar la imagen de la cámara para localizar la línea roja. Como la información que proporciona la cámara es bastante densa, analizar toda la imagen sería bastante costoso en tiempo, con lo que se ha decidido analizar únicamente las líneas negras transversales que se observan en la siguiente imagen:
En concreto, en el caso que nos atañe las líneas analizadas son: 239, 230, 220, 200, 180, 160, 140 y 130 (en una imagen de 320x240 píxeles).
Una vez elegidas las líneas a analizar, se aplica sobre cada una de ellas un filtro de color para detectar los píxeles de color rojo, los cuales nos "dirán" dónde se encuentra la línea roja (si es que se ve). Tras varias pruebas, el filtro que se utiliza para detectar si un píxel es rojo o no es el siguiente:
((r > 230) && (g < 25) && (b < 25)) ||
((r > 200) && (abs(g-b)<10) && (g < 150) && (b < 150))
, donde r, g y b son las componentes red, green y blue respectivamente de cada píxel.
Para detectar el punto medio de la línea roja (por cada línea de la imagen analizada), para cada píxel que supera el filtro de color se anota en qué posición horizontal se encuentra. Una vez analizada toda la línea, el punto medio de la línea roja es la suma de todas las posiciones de los píxeles que han superado el filtro dividido entre el número de píxeles que lo han pasado.
De esta forma obtenemos de forma fiable el punto medio de la línea roja, ya que puede haber píxeles fuera de la línea que superen el filtro y píxeles dentro de la línea que no lo superen (puede que haya "impurezas" en la imagen).
Por cada línea de la imagen analizada se indicará si se ha encontrado la línea roja y, si es así, se hallará la diferencia entre este punto medio (real) y el esperado, determinando el error asociado.
Los puntos esperados están asociados a cómo se desea que la linea sea vista desde la cámara izquierda y que determina que el robot está justo encima de la misma. Esta imagen se ha obtenido empíricamente y sería algo así:
Para expresar matemáticamente esta recta esperada y poder calcular el punto medio esperado para cada línea transversal se ha sacado la siguiente ecuación:
w = 148,615 + 0.215*h , donde w representa la componente horizontal del píxel y h la componente vertical.
Por tanto, a partir de esta ecuación y las líneas que hemos decidido analizar los puntos medios esperados serán los siguientes (wxh): 200x239, 198x230, 196x220, 192x200, 187x180, 183x160, 178x140 y 176x130.
Detección de casos
Una vez analizada la imagen hay que sintetizar los datos extraídos para detectar en qué situación se encuentra el robot. En nuestro caso nos interesa saber si el robot está en alguna de las siguientes situaciones:
- SEARCH_LINE: si en las 3 líneas más cercanas no se detecta la línea roja.
- STRONG_CURVE: si en las 5 líneas más alejadas no se ha encontrado la línea roja.
- CURVE: si en 4 de las 5 líneas más alejadas no se detecta la línea roja.
- RECT: en cualquier situación no contemplado en los casos anteriores.
- CENTER_IN_LINE: si se encuentra en una recta pero no encima de la línea roja.
- STRONG_CENTER_IN_LINE: si se encuentra en una recta pero no encima de la línea roja y con bastante error.
Combinación de los errores
Por último hay que combinar los errores calculados por cada línea analizada. Esta combinación se hace de forma ponderada dando más peso a las líneas más cercanas, lo que hará que el robot se comporte de una forma más segura previniendo choches en zonas más peligrosas.
Fase II: comandar el robot
A partir del caso en el que se encuentra el robot y del error obtenidos en la fase anterior hay que comandar el robot para que siga la línea adecuadamente. A partir de los casos detectados en la fase anterior, el robot responderá de forma diferente:
En el caso de SEARCH_LINE el robot dará marcha atrás con una velocidad baja y girará hacia el lado donde vió por última vez la línea roja.
Para el resto de casos se ha empleado un controlador PID para asignar la velocidad lineal (V) y otro para la angular (W), ambos específicos en cada caso:.
- Para STRONG_CURVE y CURVE se da prioridad a girar rápido y no avanzar demasiado para tomar las curvas mejor. Aún así, cuando se detecta que la curva no es demasiado cerrada se permite una mayor velocidad lineal que en curvas más cerradas.
- En el caso RECT, el robot tomará la mayor velocidad lineal posible y minimizará los giros bruscos para no salirse de la trazada.
- Para STRONG_CENTER_IN_LINE y CENTER_IN_LINE, el robot pretende situarse encima de la línea para evitar chocarse con posibles obstáculos (ya que es la única fuente de información) y alinearse lo máximo posible para llegar al estado de RECT cuando antes y aumentar la velocidad.


No hay comentarios:
Publicar un comentario