|
|
Robobo: Códigos QR
Robobo puede detectar y leer códigos QR mediante la cámara y un algoritmo de procesado que está incorporado en el smartphone. Los códigos QR son muy comunes hoy en día, y nos permiten almacenar información con una representación en forma de matriz de pequeños cuadrados de 2 colores (normalmente blanco y negro). Este formato lo podemos leer usando una cámara y una aplicación adecuada, y permite almacenar hasta 4296 caracteres.
En robótica, utilizamos estos códigos para etiquetar elementos del entorno que el robot puede detectar, y que contienen información especial. Por ejemplo, podemos poner un QR en una puerta que nos diga qué habitacion es, o podemos marcar con un QR una zona por la que el robot no debe pasar.
Robobo tiene un método principal para leer QRs, y otros dos asociados para arrancar y parar la lectura (que consume bastante batería).
startQrTracking()
Función: Habilita la detección de códigos QR.
La detención de códigos QR está habilitada por defecto, pero será necesario este método en caso de que la detengamos.
Este cambio es persistente.
stopQrTracking()
Función: Deshabilita la detección de códigos QR.
readQR()
Función: Lee el último código QR detectado.
Devuelve:
- El código QR (QRCode). Ver Clase QRCode para conocer los atributos que contiene:
Clase QRCode
Función: Representa un código QR detectado por Robobo, definido por tres puntos p1, p2 y p3 como se muestra en la imagen inferior.
Atributos:
- x (float): La coordenada X del centro del QR, medida en píxeles desde el lado izquierdo de la pantalla. Los valores son siempre positivos.
- y (float): La coordenada Y del centro del QR, medida en píxeles desde el lado superior de la pantalla. Los valores son siempre positivos.
- distance (int): Valor cualitativo que aumenta cuando Robobo está cerca del código QR y disminuye cuando está lejos.
- p1 (dict): Diccionario con ‘x’ e ‘y’, coordenadas del primer punto de interés. Estas coordenadas se miden en píxeles desde los lados izquierdo y superior de la pantalla. Los valores son siempre positivos.
- p2 (dict): Diccionario con ‘x’ e ‘y’, coordenadas del segundo punto de interés. Estas coordenadas se miden en píxeles desde los lados izquierdo y superior de la pantalla. Los valores son siempre positivos.
- p3 (dict): Diccionario con ‘x’ e ‘y’, coordenadas del tercer punto de interés. Estas coordenadas se miden en píxeles desde los lados izquierdo y superior de la pantalla. Los valores son siempre positivos.
- id (int): Identificador del código QR.
- timestamp (int): Marca temporal del mensaje.
La siguiente imagen muestra estos atributos en un código QR.
El identificador del QR se codificad en los píxeles de color negro que se encuentran dispersados en la región central del cuadrado. Al descifrarlos, se traducen en código binario, y de ese código se obtiene el mensaje. Puede contener enlaces a otras páginas, llaves de cifrado, o simplemente palabras.
Para probar estos métodos en RoboboSim, debemos usar aquellos mundos que incluyan QRs. Entre ellos están:
- Maze
- Simple Maze
- Light Maze
- Recycling
- Recycling Simple
- Pedestrian Road
- Robobo Road
- Parking
- Parking Ocupied
- QR City
- Colors Navigation
En el siguiente ejemplo se va a utilizar el mundo SIMPLE MAZE, para hacer los siguientes pasos:
- Iniciar Robobo
- Activar la detección de QRs usando startQrTracking()
- Colocar el Tilt en un ángulo de 90º para detectar mejor los QRs de frente
- Girar sobre su eje, con el objetivo de buscar un QR alrededor
- En el momento en el que detecta un QR (la distancia de lectura obtenida del atributo de la Clase QR es mayor que 0), parar el movimiento
- Desactivar la detección de QRs con stopQrTracking()
#Paso 1
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
#Paso 2
rob.startQrTracking()
#Paso 3
rob.moveTiltTo(90,30)
#Paso 4
rob.moveWheels(5,-5)
#Paso 5
while not (rob.readQR().distance > 0):
rob.wait(0.1)
rob.stopMotors()
#Paso 6
rob.stopQrTracking()
rob.disconnect()
En este ejemplo puedes ver cómo utilizar el atributo distance de la Clase QR, el resto de atributos se utilizan de manera similar.
Otro ejemplo que hace uso del texto contenido en el QR, podría ser el siguiente:
En el mundo RECYCLING SIMPLE, el siguiente programa hace que Robobo ejecute los siguientes pasos:
- El robot se mueve de frente
- Gira su motor Pan hacia la izquierda del todo
- Empieza a moverlo hacia la derecha
- Cuando detecta un QR, lo lee y dice por voz su identificador. La distancia del QR debe de ser mayor que 0 y la posición X del punto P1 debe de estar entre 115 y 175
- Repite los últimos dos pasos dos veces más
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
rob.startQrTracking()
rob.moveWheelsByTime(35,35,3)
rob.wait(0.2)
rob.moveWheelsByTime(6,-6,2)
#Este bucle se repite 3 veces
for i in range(0,3):
rob.moveWheels(-3,3)
rob.wait(0.75)
coord_x=0
#Permanecerá en este bucle hasta que la distancia sea mayor que 0 y el P1 del QR esté entre 115 y 175 del eje X
while rob.readQR().distance <= 0 or coord_x>175 or coord_x<115:
rob.wait(0.1)
#Variable que guarda la coordenada X del P1 del QR
coord_x=int(rob.readQR().p1['x'])
#Se detienen los motores
rob.stopMotors()
#Leerá y dirá el identificador del QR
rob.sayText('Codigo')
rob.wait(0.2)
rob.sayText(rob.readQR().id)
rob.wait(0.2)
rob.sayText('detectado')
rob.wait(0.2)
#Finaliza el programa diciendo que ya ha leído tres códigos
rob.sayText("Ya he leído tres códigos qr")
rob.stopQrTracking()
rob.disconnect()
Hay otras funciones relacionadas con la lectura de códigos QR que veremos en el cuaderno dedicado a los callbacks.
EJERCICIO 1
Desactiva la opción de "Comportamiento aleatorio en mundos" en las opciones de RoboboSim, abre el mundo RECYCLING SIMPLE, y desarrolla un programa que haga lo siguiente:
- Robobo se tiene que acercar al vaso de papel hasta que el valor del IR Front-C sea mayor de 650
- Se detendrá y luego girará sobre su eje hacia la derecha a una velocidad de 2, ya que en esa posición debería de estar el depósito de papel.
- Con el lector de QRs, deberá detectar el QR que tenga de id "PAPER".
- Cuando lo detecte, se parará y dirá "Ahí está el depósito del papel" avanzará hacia él hasta que el valor de la distancia del QR sea mayor o igual que 45
- Al llegar, se parará y dará marcha atrás durante 3 segundos a una velocidad de 15.
- Dirá "Ya he dejado el vaso en su sitio" y se terminará el programa
Si Robobo ha dejado el vaso de papel tal y como está aquí, habéis resuelto el ejercicio:
#INSERTAR CÓDIGO AQUÍ
EJERCICIO 2
En el mundo PARKING debéis realizar un programa que haga que Robobo aparque en uno de los dos huecos:
- El usuario tiene que decir cuál buscará Robobo: El "1" o el "2". Usa una entrada por teclado simple para ello.
- Robobo moverá el PAN hacia un ángulo de 90º de forma que la cámara pueda detectar los QR.
- Después Robobo avanzará recto a una velocidad constante de 6.
- Si el QR que detecta es el indicado por el usuario, Robobo se detendrá y pondrá el PAN en su posición original.
- Los movimientos para aparcar Robobo en paralelos se dejan a libre elección del alumno (Es posible realizar esto en solo 2-3 movimientos como máximo). Lo que sí se pide es que Robobo se coloque detrás del poste.
- Cuando esté aparcado, Robobo deberá moverse hacia delante hasta que detecte el poste que contenía el QR con el sensor Front-C
Así debe de quedar Robobo al aparcar si se le ha pedido que aparque en el 2:
#INSERTAR CÓDIGO AQUÍ
EJERCICIO 3
Abrir el mapa PEDESTRIAN ROAD con la opción mundos aleatorios activadas y crear el siguiente programa:
El robot deberá leer los QRs de las señales y realizar las siguientes funciones:
- Si lee los QRs de las señales de velocidad (ids "10" y "30"), el robot se moverá a la velocidad acorde a ellas.
- Si lee el QR del paso de peatones (id "peatones") se detendrá durante 5 segundos. Una vez finalizado se moverá a la velocidad a la que iba antes de pararse.
- Si lee el QR de la señal de STOP (id "stop" ), se detendrá y terminará el programa
#INSERTAR CÓDIGO AQUÍ