Sigue Línea con Fórmula 1 en Python

En esta práctica tendrás que programar un fórmula 1 simulado para que siga la línea de un circuito utilizando las imágenes de su cámara.

Hacieno uso del API de la cámara tendrás que hacer girar el Fórmula 1 para que corrija la dirección y conseguir que complete el circuito. ¿Puedes hacerlo?

Tiempo de estudio Dificultad
3 horas
siguelinea_f1_python_vision_teoria

Sigue Línea Fórmula 1 con Visión Artificial

Para completar este ejercicio, deberás conseguir que el Fórmula 1 siga la línea blanca de la carretera a través de su sensor de visión, es decir, empleando las imágenes que éste recoge con su cámara.

1 - Qué vas a aprender en esta unidad

En esta unidad vas a trabajar con visión artificial, concretamente vas a usar la cámara del robot de fórmula uno simulado para detectar la línea blanca que queremos seguir.

También aprenderás cómo se representa una imagen digital en el ordenador y qué es el espacio de color RGB

Puede que ya tengas algo de experiencia previa con el uso de la visión en Kibotics. En esta unidad profundizaremos un poco más en la visión artificial.

2 - Requisitos de la práctica.

Se pide que implementes un algoritmo, en el área indicada, que permita al robot Fórmula 1 seguir la trayectoria marcada por la línea blanca de la carretera de forma autónoma, utilizando los bloques de código disponibles en el área de trabajo.

 

Pero...¿Cómo podemos detectar una línea en una imagen?

La manera más sencilla es utilizar una de las propiedades más importante de las imágenes RGB, el color. Detectaremos la línea blanca filtrando este color en las imágenes, de tal manera que el blanco sea el único color que "ve el robot". De esta manera, nos será mucho más sencillo seguir la línea, sin otros elementos que interfieran en la tarea.

 

3 - Imágenes digitales

La primera pregunta que tenemos que hacernos al empezar a trabajar con visión artificial es cómo se representa una imagen en un ordenador, o dicho de otra manera qué es una imagen digital.

Para poder trabajar con imágenes lo primero que necesitamos es una manera de representar esas imágenes en un medio digital, para entendernos tenemos que encontrar la manera de transformar una imagen en una colección de números. Para ello lo que hacemos es "cuadricular" la imagen: dividirla en un número determinado de cuadritos. Cada uno de esos cuadritos es lo que llamaremos píxel. Cuantos más píxeles tenga nuestra imagen más parecida será a una imagen no digital.

Cada uno de estos píxeles tendrá un color, por lo tanto también tenemos que "inventar" una manera de codificar esos colores, es decir, de asignar a cada color un número. Nuestra primera idea podría ser justo esa, a cada color le damos un número diferente, como en los pasatiempos de pintar por colores. Por ejemplo un 1 para el rojo, un 2 para el amarillo, un 3 para el verde... El problema con esta codificación tan sencilla es que si queremos representar una amplia gama de colores necesitamos un número para cada color y una tabla enorme para determinar a qué número corresponde ese color determinado. Otro problema, no menor, es saber exactamente cuál es el color. Este problema se resuelve con la codificación RGB.

RGB

Las imágenes RGB representan cada color mediante la combinación de los tres colores primarios rojo (Red), verde (Green) y azul (Blue). De esta manera cada pixel tendrá asociado 3 números, uno para cada uno de los colores primarios. Por eso se dice que es un modelo de color aditivo, porque cada colorse representa por la suma de los tres colores de luz primarios

 

Un inconveniente importante del modelo RGB es que no detalla a qué color considera rojo, verde o azul. Por eso el mismo número RGB puede mostrar colores notablemente diferentes dependiendo del modelo de color del dispositivo.

¿Cómo usamos el RGB?

Para determinar (en un ordenador) un color en RGB simplemente tenemos que dar 3 números entre 0 y 255. Por ejemplo (255,0,0) de esta manera lo que estamos diciendo es que nuestro pixel tiene un color que es la suma del máximo componente de rojo y sin componentes de verde o azul. La ausencia de los tres componentes nos daría el color negro, que se representaría como (0,0,0). Por el contrario el color blanco será la suma de los máximos componentes de todos los colores primarios es decir (255,255,255)

 

4 - Pistas para programar este ejercicio

Aquí tenéis algunos consejos para empezar a programar este ejercicio.

Inicialización

Para empezar a programar tu robot, primero debes importar el módulo de acceso a la capa hardware del mismo. Incluye este bloque de código en tu editor:

import HAL
#introduce aqui el codigo de tu robot

Recuerda que tu código se puede ejecutar de manera secuencial (instrucciones que sólo se ejecutan una vez), o de forma iterativa (código que se ejecuta en bucle). A continuación tienes un ejemplo que cómo se utilizan instrucciones de cada tipo:

import HAL
#ESTAS SON INSTRUCCIONES SECUENCIALES
HAL.avanzar_hasta(3) # el robot avanza 3 metros y se detiene

while (True):
    # ESTO SON INSTRUCCIONES ITERATIVAS
HAL.girar_derecha_hasta(10) # el robot gira 10 grados a la derecha en cada iteración, nunca se para

 

API de Sensores y Actuadores del Robot

Las funciones y métodos que puedes utilizar para obtener información del robot y enviarle órdenes para resolver la práctica son las siguientes:

Sensores

Como decíamos al principio con este ejercicio vamos a aprender a usar la cámara para lograr que nuestro fórmula 1 simulado siga una línea blanca. Necesitarás usar las funciones de la cámara, en concreto aquella que te permite obtener la coordenada deseada de un objeto de un color determinado. Piensa bien qué color quieres detectar y también la o las coordenadas que vas a necesitar para "conducir" el fórmula 1 siguiendo la línea blanca. Aquí tienes algunas de las funciones que tal vez te puedan ser útiles.

  • dame_objeto_de_color(posicion, color): Esta función te permite obtener la coordenada que quieras ('X', 'Y', 'Z', 'YAW') de la posición del elemento del color que especifiques. Uitliza la cámara del robot y un filtro de color para averigurar la posición del objeto en la imagen.

  • get_us(): Esta método te permite acceder al sensor de ultrasonidos (US) del robot. Utilízalo para obtener un valor de distancia al objeto más cercano, si lo hay.

  • get_position_value(posicion): Esta función te permite averiguar la posición del robot. Indica la coordenada que quieras obtener ('POSX', 'POSY', 'POSZ', 'POSYAW').

Actuadores

Una vez sepas hacia donde tiene que moverse tu fórmula 1 para seguir la línea blanca necesitarás enviarle las instrucciones coorectas para que lo haga. Podrás usar los comandos que envían distancias o giros o los que indican velocidades.

  • avanzar_hasta(distancia): Para avanzar una distancia concreta (m).

  • girar_derecha_hasta(angulo):: Para girar a la derecha un ángulo concreto (grados).

  • girar_izquierda_hasta(angulo): Para girar a la izquierda un ángulo concreto (grados).

  • set_v(velocidad): Indica la velocidad lineal (de avance) del robot (m/s).

  • set_w(velocidad): Indica la velocidad angular (de giro) del robot (grados/s).

5 - Recopilando

Este ejercicio no es un reto sencillo así que resolviéndolo habrás aprendido muchas cosas:

  1. Habrás aprendido cómo se representan imágenes digitales y lo que es un píxel.
  2. Habrás aprendido también cómo se representan los colores usando RGB.
  3. Habrás usado la instrucción de Kibotics para obtener la posición de un objeto de un color en la imagen.
  4. Habrás realizado un control sobre el robot para que vaya ajustando su velocidad y/o giro en función de la posición de la línea blanca en su cámara frontal.

6 - ¿Sabías que...?

El modelo RGB no es el único empleado para representar el color. Existen otras posibilidades. Una de ellas es el modelo llamado CMYK (Cyan, Magenta, Yellow, blacK)

El modelo CMYK es un modelo substractivo porque cada color se construye como la cantidad de los otros colores que hay que restarle al blanco para que quede el color deseado. Recordad que RGB es un modelo aditivo porque cada color se construye como la suma de los colores primarios rojo, verde y azul.

 

Es un modelo muy apropiado para la impresión sobre un papel blanco. El color que queda es la resta de los colores de las tintas sobre el blanco del lienzo. A diferencia el RGB si ahora sumamos los 3 colores básicos (que en este modelo son el cian, magenta y amarillo) lo que obtenemos es color negro.