Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Octubre de 2022
2
Anexo 1
Manual de programación
de Robobo con Python
3
Anexo 1
Manual de programación
de Robobo con Python
4
Anexo 1
Manual de programación
de Robobo con Python
5
Anexo 1
Manual de programación
de Robobo con Python
6
Anexo 1
Manual de programación
de Robobo con Python
7
Anexo 1
Manual de programación
de Robobo con Python
1. | Introducción
En este manual se documenta la librería de programación robobopy para el robot Robobo. Se
considera que el usuario tiene conocimientos previos de python, por lo que no se explicarán
conceptos que se consideran básicos de programación, como variables, condicionales, bucles, listas o
funciones.
Este manual no es un tutorial y no está pensado para ser leído de forma secuencial. Sin embargo, sí
se recomienda primero leer los apartados 2 y 3 para entender algunas características generales de la
librería y del robot.
Los elementos de programación están agrupados por funcionalidad. Por ejemplo, en el apartado
Motores, se encuentra todo lo relacionado con el movimiento de Robobo. Antes de consultar cualquier
método, se recomienda leer la introducción del grupo de métodos correspondiente.
La documentación original se puede consultar en:
https://mintforpeople.github.io/robobo.py/
Robobo es un robot real de investigación y educación compuesto por una plataforma robótica, la base
Robobo, y un smartphone que se acopla a dicha base (ver imagen izquierda en la Fig. 1). La base
constituye el cuerpo del robot, proporcionando movilidad y algunas capacidades de detección,
mientras que el smartphone es el cerebro del Robobo, proporcionando potencia de procesamiento en
bruto y capacidades de detección/actuación de alto nivel.
Tanto la base como el smartphone disponen de una serie de sensores y actuadores adecuados para el
aprendizaje en robótica inteligente, que se pueden observar en la imagen de la derecha de la Fig. 1.
Los sensores permiten recibir información del entorno (por ejemplo, medir distancias o percibir
colores) y los actuadores permiten realizar acciones (por ejemplo, moverse o hablar) en el mundo real.
Los principales sensores de Robobo (base + Smartphone) son:
● 8 sensores infrarrojos, 5 situados en la parte delantera de la base y 3 en la parte trasera. Se
utilizan para medir las distancias a objetos del entorno, como paredes u obstáculos.
● 2 codificadores de motor (encoder) en las ruedas, permiten conocer los grados de giro o la
velocidad real aplicada por el motor.
● 1 codificador de motor (encoder) en el motor PAN, para leer su posición.
● 1 codificador de motor (encoder) en el motor TILT, para leer su posición.
● Sensor de batería, permite conocer el nivel de batería del robot.
8
Anexo 1
Manual de programación
de Robobo con Python
● Cámara. Se utiliza para detectar información visual, como blobs de colores, señales de tráfico,
códigos QR, y cualquier objeto del mundo real.
● Giroscopio 3D, para conocer la orientación del robot.
● Acelerómetro 3D, para leer la aceleración del Robobo.
● Pantalla táctil para detectar contacto y gestos sobre ella.
Fig. 1. Imagen del robot Robobo (izda) y conjunto de sensores y actuadores principales (dcha)
9
Anexo 1
Manual de programación
de Robobo con Python
● Pantalla para mostrar imágenes, como distintas expresiones en la cara del robot.
2.2 RoboboSim
Para instalar el simulador, basta con acceder a la wiki de Robobo y descargar la versión
correspondiente a tu sistema operativo:
https://github.com/mintforpeople/robobo-programming/wiki/Unity
Una vez descargada, simplemente debes descomprimir el archivo y guardar el programa en la
ubicación de tu ordenador que desees (no requiere instalación como tal). En ese momento podemos
ejecutar el programa, simplemente haciendo doble click sobre el archivo descomprimido.
NOTA: los usuarios de MacOS pueden recibir un mensaje de error al intentar ejecutar este archivo, que
impide abrirlo. La solución más sencilla es pulsar la tecla CTRL + botón derecho Abrir, lo cual mostrará
una ventana con la opción “Abrir”, y bastará con hacer click sobre ella. Esta acción no es necesario
repetirla.
En la próxima sección se explican los diferentes menús y opciones del RoboboSim.
10
Anexo 1
Manual de programación
de Robobo con Python
El menú principal presenta cinco botones que permiten navegar a las diferentes secciones del
simulador.
● “World Select”: Permite acceder a la selección de los diferentes mundos simulados.
● “Options”: Lleva al menú de configuración y opciones. Estas opciones alteran el
comportamiento del simulador y permiten ajustarlo a nuestras necesidades
● “Help”: Lleva a la página de ayuda del simulador.
● “About”: Proporciona información sobre la versión del simulador.
● “Exit”: Sale de la aplicación del simulador y la cierra. Este comportamiento es idéntico a usar
el botón de cerrar ventana de la barra de título del programa.
11
Anexo 1
Manual de programación
de Robobo con Python
Este menú permite seleccionar y arrancar los diferentes mundos simulados. Existen varios mundos con
diferentes elementos como obstáculos, pelotas o señales de tráfico.
Para navegar por la lista de mundos puede usarse tanto la rueda del ratón como la barra de scroll azul
del margen derecho de la ventana. En controles táctiles, aunque también con el ratón, puede
arrastrarse la lista de mundos arriba y abajo.
El botón situado en la parte superior izquierda con el icono del proyecto Robobo permite volver al
menú principal
El botón situado en la parte inferior izquierda lleva al menú de opciones detallado previamente.
Una vez elegido un mundo, comenzará la simulación. Los mundos disponibles en “World Select” son:
● “Ball Track”. Mundo con un cilindro y una esfera verde para realizar ejercicios sencillos de
detección de blobs. Incluye comportamiento aleatorio que permite cambiar la posición de la
esfera, aunque siempre dentro del rango de visión del robot.
● “Four Walls”. Mundo sencillo donde el espacio está restringido por cuatro paredes. Incluye
comportamiento aleatorio para cambiar el tamaño y la posición de las paredes.
● “Cylinder”. Mundo sencillo con un cilindro y una esfera. Incorpora comportamiento aleatorio
para cambiar la posición del cilindro y la esfera.
12
Anexo 1
Manual de programación
de Robobo con Python
● “Four Cylinders”. Mundo sencillo con cuatro cilindros y bolas de colores que sirven de blobs.
Incorpora comportamiento aleatorio para cambiar el color de los elementos.
● “Pillars”. Mundo con 4 cilindros y un código Aruco, ideado para trabajar la navegación.
● “Avoid the Block”. Mundo de navegación infrarroja en el que se rodea un bloque de tamaño y
dimensiones variables. Incluye comportamiento aleatorio para modificar el tamaño y la
posición del bloque.
● “Maze”. Laberinto en U con un cilindro al final, pensado para guiarse por las paredes, luz, blobs
o QRs. Incluye comportamiento aleatorio para modificar la forma del laberinto, la posición
incial de Robobo y la posición del cilindro.
● “Simple maze”. Laberinto en U muy similar al anterior, pero sin cilindro. También pensado para
guiarse por las paredes, luz, blobs o QRs. Incluye comportamiento aleatorio para modificar la
forma del laberinto y la posición inicial de Robobo.
● “Test Plane”. Plano con una recta muy larga y paredes para realizar pruebas de velocidades y
sensores.
● “Slope”. Dos rampas con distintas pendientes. Incluye comportamiento aleatorio para cambiar
las pendientes.
● “Recycling”. Un mundo más complejo ya que hace uso de la detección de objetos. Hay varios
objetos y varios contenedores marcados con un QR. Incluye comportamiento aleatorio para
modificar el tipo, número y ubicación de los distintos elementos.
● “Recycling simple”. Similar al anterior, pero solo incluye un objeto de cada vez.
● “Pedestrian Road”. Carretera sencilla, que incluye un peatón cruzando el paso de cebra.
Incluye comportamiento aleatorio para modificar la posición de las personas y para hacer que
aparezcan otros Robobos en la carretera.
● “Robobo Road”. Carretera sencilla que incluye señales de límite de velocidad y otro Robobo
circulando. Incluye comportamiento aleatorio para modificar los valores de las señales y la
posición del otro Robobo.
● “Speed Road”. Carretera sencilla, que incluye señales de límite de velocidad.
● “Parking”. Incluye dos postes para aparcar el robot entre ellos utilizando la detección de QRs.
Entre los dos postes hay espacio suficiente para aparcar. Incluye comportamiento aleatorio
para cambiar la distancia de los postes; esto podría hacer que el espacio no fuese suficiente.
● “Parking - Enough”. Incluye dos postes para aparcar el robot utilizando la detección de QRs,
con espacio holgado entre ellos.
● “Parking - Narrow”. Incluye dos postes para aparcar el robot utilizando la detección de QRs,
pero los postes están demasiado juntos como para aparcar entre ellos.
● “Measure Plane”. Plano para realizar medidas con las marcas del suelo y los sensores.
13
Anexo 1
Manual de programación
de Robobo con Python
● “Aruco navigation”. Circuito con dos cilindros de colores y un código ArUco pensado para
navegación a través de los distintos elementos del entorno.
14
Anexo 1
Manual de programación
de Robobo con Python
15
Anexo 1
Manual de programación
de Robobo con Python
16
Anexo 1
Manual de programación
de Robobo con Python
Para poder ejecutar código en el robot, es necesario instalar la librería robobopy. Para ello utilizaremos
el gestor de paquetes de Python pip (package instaler for Python).
A continuación, se explican los pasos para instalar esta librería con pip. Para ello, usaremos la terminal
“PowerShell” de Windows:
1. Escribimos “PowerShell” en el campo de búsqueda de la barra de Windows
2. Aparecerá la opción “Windows PowerShell”. Se seleccionará esta opción.
3. A continuación, se abrirá una ventana con la terminal “Windows PowerShell”:
17
Anexo 1
Manual de programación
de Robobo con Python
rob = Robobo("10.113.26.150")
2.2 En el caso del simulador, lo habitual es tenerlo instalado en el mismo ordenador en el que se
realizan los programas, con lo que la dirección será “localhost”.
rob = Robobo("localhost")
rob.connect()
Más detalles sobre la configuración del robot Robobo en Python están desarrollados en:
18
Anexo 1
Manual de programación
de Robobo con Python
https://github.com/mintforpeople/robobo-programming/wiki/python-doc
Mientras se están creando programas con Robobo, puede ser necesario conocer el valor de los
sensores de cara a establecer umbrales o valores de referencia. Por este motivo, Robobo incluye una
ventana de monitorización web, que es altamente recomendable tener abierta. Para acceder a esta
ventana, basta con ir a esta url: http://monitor.theroboboproject.com/
En la página que se abre, debemos escribir, en la parte superior izquierda, la dirección IP del robot real
o bien localhost si estamos usando RoboboSim, y pulsar el botón Connect.
La ventana de monitorización mostrará los valores de los diferentes sensors en tiempo real según van
cambiando.
19
Anexo 1
Manual de programación
de Robobo con Python
Al pulsar sobre la imagen en miniatura del mundo, se muestra una pantalla como la siguiente:
A continuación, creamos un archivo “prueba.py” en Visual Studio Code (u otro IDE similar) con el
siguiente contenido:
20
Anexo 1
Manual de programación
de Robobo con Python
# Importamos la librería
from robobopy.Robobo import Robobo
# Desconectamos Robobo
rob.disconnect()
El último paso es ejecutar el ejemplo y el robot debería moverse en línea recta durante 4 segundos.
Es importante destacar que algunos módulos no están implementados en el simulador y, por lo tanto,
no se puede utilizar ninguno de sus métodos. Los módulos no implementados en el simulador son:
• Micrófono.
• Detección facial.
• Detección de líneas.
• Detección de carriles.
21
Anexo 1
Manual de programación
de Robobo con Python
La cámara del simulador siempre está activa por defecto, por lo que los métodos startCamera y
stopCamera no están implementados. Además, solo se trabaja con la cámara frontal del teléfono, por
lo que los métodos setFrontCamera y setBackCamera no están implementados.
Justo al comienzo de la ejecución de un programa en el simulador, los valores de los sensores no están
cargados todavía, por lo que hay que esperar un instante para poder leerlos. Si la primera instrucción
de un programa consiste en leer un sensor, puede devolver un valor de 0, que no se correspondería
con el valor medido en otro momento para las mismas condiciones.
Por último, el simulador puede emitir sonidos como el robot real, pero también es posible mostrar un
bocadillo con el texto que se está reproduciendo.
En algunos casos, los parámetros que reciben los métodos o los valores que devuelven, son clases o
enumerados que se encuentran en otros módulos y por tanto tendremos que añadir un import de las
clases o enumerados que necesitemos.
En cada grupo de métodos se describen de forma detallada las clases y los enumerados necesarios
para la utilización de ese grupo de métodos.
Por ejemplo, Robobo tiene varios infrarrojos para detectar la distancia a los objetos cercanos. Estos
infrarrojos están almacenados en el enumerado IR. El Método readIRSensor sirve para leer los valores
detectados por un infrarrojo, pero es necesario especificar qué sensor infrarrojo se desea leer. Para
eso se utiliza el enumerado IR, y antes de utilizarlo es necesario añadir la siguiente línea:
Lo métodos de Robobo, permiten en la mayoría de los casos, dos modos de ejecución: bloqueante y
no bloqueante:
• Una instrucción es bloqueante cuando evita que se realice otra hasta que la instrucción en curso
termine su ejecución completamente.
• Una instrucción es no bloqueante cuando permite que se ejecute otra al mismo tiempo. Por
ejemplo: el robot avanza hacia delante (instrucción de movimiento) al mismo tiempo gira la cabeza
(instrucción de movimiento) y comunica información a través del altavoz (instrucción de
producción de sonido).
El método wait es un método especial que hacer que Robobo espere durante el tiempo indicado antes
de ejecutar la siguiente instrucción. A lo largo de este manual se utiliza en muchos de los ejemplos.
22
Anexo 1
Manual de programación
de Robobo con Python
wait(seconds)
Pausa el programa durante el tiempo especificado. Después de ese tiempo, se ejecuta la siguiente
instrucción.
Parámetros:
• seconds (float): El tiempo en segundos. Los valores deben ser positivos.
EJEMPLO DE USO
El siguiente programa hace que Robobo se mueva en línea recta hacia delante durante dos segundos;
luego espera durante dos segundos y, por último, se vuelve a mover durante dos segundos.
from robobopy.Robobo import Robobo
from robobopy.utils.Wheels import Wheels
rob = Robobo("localhost")
rob.connect()
rob.moveWheelsByTime(10, 10, 2)
rob.wait(2)
rob.moveWheelsByTime(10, 10, 2)
Un módulo agrupa un conjunto de métodos que puede utilizar Robobo. Para mejorar el rendimiento,
algunos módulos están deshabilitados por defecto. Para utilizar estos módulos, es necesario activarlos.
Después de utilizarlos, es recomendable deshabilitarlos.
Por ejemplo, la detección de ArUco está deshabilitada por defecto. Para utilizar cualquier método
relacionado con la detección de ArUcos, como el Método readArucoTag, primero es necesario habilitar
el módulo con el método startArUcoTagDetection. Después de trabajar con la detección de ArUcos, se
puede deshabilitar con el método stopArUcoTagDetection.
Los módulos habilitados por defecto son:
• Detección de caras.
• Detección de blobs.
• Detección de QRs.
Los módulos deshabilitados por defecto son:
• Stream de la cámara.
• Detección de líneas.
23
Anexo 1
Manual de programación
de Robobo con Python
• Detección de carriles.
• Reconocimiento de objetos.
• Detección de ArUcos.
En algunos métodos se utilizan coordenadas para indicar la posición de ciertos elementos dentro de la
pantalla.
Las coordenadas de la pantalla tienen su origen en la esquina superior izquierda de la pantalla, como
se ve en la figura siguiente. El eje X sigue el borde superior de la pantalla, de izquierda a derecha. Toma
valores entre 0 y 100, siendo 0 el borde izquierdo y 100 el borde derecho de la pantalla. El eje Y sigue
el borde izquierdo de la pantalla, de arriba abajo. Toma valores entre 0 y 100, siendo 0 el borde
superior y 0 el borde inferior de la pantalla.
Algunos métodos afectan al hardware de Robobo. Los cambios persistentes permanecen incluso
cuando el programa termina y hasta que Robobo se reinicia, momento en el que toma de nuevo todos
los valores por defecto.
Por ejemplo, la detección de ArUcos está deshabilitada por defecto y se habilita con el método
startArUcoTagDetection. A partir de ese momento, se puede utilizar cualquier método relacionado con
la detección de ArUcos, como el método readArucoTag. Aunque finalice el programa, no será necesario
habilitar de nuevo la detección de ArUcos hasta que Robobo se reinicie. Una vez reiniciado, el módulo
estará de nuevo deshabilitado.
24
Anexo 1
Manual de programación
de Robobo con Python
4. | Métodos de actuación
4.1 Motores
Introducción
• Motor TILT para inclinar el smartphone hacia delante y hacia detrás de forma independiente a
la posición de la base. En la imagen siguiente se muestran las diferentes posiciones del motor
tilt, que se expresan en ángulos de entre 5 y 105 grados.
• Motor PAN para el smartphone hacia la derecha y hacia la izquierda de forma independiente
a la posición de la base. La imagen siguiente muestra las diferentes posiciones del motor pan,
que se expresan en ángulos de entre –160 y 160 grados. Los valores negativos hacen que el
smartphone esté girado hacia la izquierda, mientras que los valores positivos hacen que el
smartphone esté girado hacia la derecha
25
Anexo 1
Manual de programación
de Robobo con Python
Elementos de programación
Mueve las ruedas de Robobo en función de los grados de giro especificados. Permite establecer la
velocidad y los grados de giro de la rueda derecha, la rueda izquierda o ambas.
Parámetros:
• wheel (Wheels): Rueda o ruedas a mover.
• degrees (int): Ángulo de giro medido en grados. Toma valores positivos. Hay que tener en
cuenta que una vuelta completa de la rueda son 360 grados.
• speed (int): Factor de velocidad de giro que se aplica al motor de la rueda seleccionada. El
rango de valores permitidos para la velocidad está entre -100 y 100. El valor absoluto de
100 representa la máxima velocidad que la rueda puede alcanzar, mientras que 0 representa
que la rueda no se mueve. Los valores positivos mueven la rueda hacia delante y los valores
negativos hacia atrás.
26
Anexo 1
Manual de programación
de Robobo con Python
IMPORTANTE: Este método se ejecuta siempre en modo bloqueante (ver sección sobre Modos de
ejecución).
EJEMPLO DE USO
El siguiente programa hace que Robobo se mueva en línea recta a velocidad 30 hasta que las dos
ruedas (Wheels.Both) hayan girado 360 grados. A continuación, hace que la rueda izquierda (Wheels.L)
gire 180 grados hacia atrás a velocidad 30. Por último, hace que la rueda derecha (Wheels.R) gire 180
grados hacia delante a velocidad 50.
Robobo termina en la misma posición tras ejecutar las dos últimas instrucciones, ya que una rueda gira
y la otra permanece en el sitio.
rob = Robobo("localhost")
rob.connect()
Mueve las ruedas de Robobo durante el tiempo especificado, cada una a la velocidad especificada.
Parámetros:
• rSpeed (int). Factor de velocidad para la rueda derecha. El rango de valores permitidos está
entre -100 y 100. El valor absoluto de 100 representa la máxima velocidad que la rueda
puede alcanzar, mientras que 0 representa que la rueda no se mueve. Los valores positivos
mueven la rueda hacia delante y los valores negativos hacia atrás.
• lSpeed (int). Factor de velocidad para la rueda izquierda. El rango de valores permitidos está
entre -100 y 100. El valor absoluto de 100 representa la máxima velocidad que la rueda
puede alcanzar, mientras que 0 representa que la rueda no se mueve. Los valores positivos
mueven la rueda hacia delante y los valores negativos hacia atrás.
• duration (float). Duración del movimiento en segundos. Se permiten valores positivos.
27
Anexo 1
Manual de programación
de Robobo con Python
• wait (boolean): Indica si este método se ejecuta en modo bloqueante o no (True: modo
bloqueante, False: modo no bloqueante).
EJEMPLO DE USO
El siguiente programa hace que las ruedas de Robobo se muevan hacia delante a la misma velocidad
durante dos segundos, durante los cuales el robot avanzará en línea recta. Luego, hace que la velocidad
de la rueda derecha sea mayor que la de la rueda izquierda durante 3 segundos, por lo que el robot
girará hacia la izquierda.
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.moveWheelsByTime(50, 50, 2)
rob.moveWheelsByTime(60,40,3)
Mueve las ruedas de Robobo. Este método permite establecer la velocidad de cada rueda. El
movimiento se realizará de forma indefinida hasta que sea detenido con el método stopMotors.
Parámetros:
• rSpeed (int): Factor de velocidad de giro del motor de la rueda derecha. El rango de valores
permitidos está entre -100 y 100. El valor absoluto de 100 representa la máxima velocidad
que la rueda puede alcanzar, mientras que 0 representa que la rueda no se mueve. Los
valores positivos mueven la rueda hacia delante y los valores negativos hacia atrás.
• lSpeed (int): Factor de velocidad de giro del motor de la rueda izquierda. El rango de valores
permitidos está entre -100 y 100. El valor absoluto de 100 representa la máxima velocidad
que la rueda puede alcanzar, mientras que 0 representa que la rueda no se mueve. Los
valores positivos mueven la rueda hacia delante y los valores negativos hacia atrás.
IMPORTANTE: Este método se ejecuta siempre en modo no bloqueante (ver sección sobre Modos
de ejecución).
stopMotors()
28
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa hace que Robobo se desplace en línea recta y continúa moviéndose hasta que
el valor del sensor infrarrojo central (leído con el método readIRSensor) sea mayor de 100, lo que
significa que hay un objeto cerca. Cuando esto ocurre, la función stopMotors() detiene los motores de
las ruedas:
rob = Robobo("localhost")
rob.connect()
rob.moveWheels(30,30)
rob.stopMotors()
EJEMPLO DE USO
29
Anexo 1
Manual de programación
de Robobo con Python
El siguiente programa mueve el motor PAN hasta 120º con velocidad 5. Luego, lo mueve hasta -30º
con velocidad 10.
rob = Robobo("localhost")
rob.connect()
rob.movePanTo(120,5)
rob.movePanTo(-30,10)
EJEMPLO DE USO
El siguiente programa mueve el motor TILT hasta 90º con velocidad 5. Luego, lo mueve hasta 20º· con
velocidad 10.
rob = Robobo("localhost")
rob.connect()
rob.moveTiltTo(90,5)
rob.moveTiltTo(20,10)
30
Anexo 1
Manual de programación
de Robobo con Python
Introducción
Elementos de programación
31
Anexo 1
Manual de programación
de Robobo con Python
• wait (boolean): Indica si este método se ejecuta en modo bloqueante o no (True: modo
bloqueante, False: modo no bloqueante).
EJEMPLO DE USO
El siguiente programa hace que Robobo diga una frase, y tras una pausa diga otra frase.
rob = Robobo("localhost")
rob.connect()
EJEMPLO DE USO
32
Anexo 1
Manual de programación
de Robobo con Python
rob = Robobo("localhost")
rob.connect()
nota = 52
rob.wait(1)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga una frase y luego reproduzca un sonido.
rob = Robobo("localhost")
rob.connect()
33
Anexo 1
Manual de programación
de Robobo con Python
4.3 LEDs.
Introducción
Robobo tiene un conjunto de luces LED que se pueden iluminar de distintos colores para mostrar
información visual simple. La siguiente imagen muestra un esquema de su posición en el cuerpo del
robot.
Elementos de programación
34
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa enciende los LEDs frontales de la base de Robobo, cada uno de un color
diferente. Se mantienen encendidos durante dos segundos (bloque wait). Después, se apagan todos.
rob = Robobo("localhost")
rob.connect()
35
Anexo 1
Manual de programación
de Robobo con Python
rob.setLedColorTo(LED.FrontC, Color.BLUE)
rob.setLedColorTo(LED.FrontL, Color.WHITE)
rob.setLedColorTo(LED.FrontLL, Color.RED)
rob.setLedColorTo(LED.FrontR, Color.CYAN)
rob.setLedColorTo(LED.FrontRE, Color.MAGENTA)
rob.setLedColorTo(LED.FrontL, Color.YELLOW)
rob.setLedColorTo(LED.FrontR, Color.GREEN)
rob.wait(2)
rob.setLedColorTo(LED.All, Color.OFF)
Introducción
Robobo puede mostrar un conjunto de expresiones predeterminadas utilizando para ello la pantalla
del Smartphone, o la propia pantalla del ordenador en el caso simulado.
Elementos de programación
Representa la lista de emociones que la cara de Robobo puede mostrar, como se ve en el ejemplo de
la imagen siguiente.
HAPPY: Feliz.
LAUGHING: Riendo.
SURPRISED: Sorprendido.
36
Anexo 1
Manual de programación
de Robobo con Python
SAD: Triste.
ANGRY: Enfadado.
NORMAL: Normal.
SLEEPING: Durmiendo.
TIRED: Cansado.
AFRAID: Asustado.
setEmotionTo (emotion)
Cambia la expresión de la cara de Robobo con el objetivo de indicar una emoción determinada.
Parámetros:
• emotion (Emotions): Emoción que se muestra en la cara (ver Enumerado Emotions).
EJEMPLO DE USO
El siguiente programa hace que el Robobo muestre cara se sorpresa cuando se encuentra con un
obstáculo. Inicialmente, se pone en movimiento hacia adelante hasta que encuentra un obstáculo
cerca con el sensor infrarrojo delantero central. En ese momento, muestra una expresión de sorpresa
(surprised), gira hacia atrás y se mueve en dirección contraria durante 2 segundos. Finalmente muestra
una expresión de sonrisa (laughing).
from robobopy.Robobo import Robobo
from robobopy.utils.Emotions import Emotions
from robobopy.utils.IR import IR
rob = Robobo("localhost")
rob.connect()
rob.setEmotionTo(Emotions.NORMAL)
rob.moveWheels(25, 25)
rob.setEmotionTo(Emotions.SURPRISED)
rob.moveWheelsByTime(-20, 20, 1)
rob.moveWheelsByTime(28, -28, 2)
rob.moveWheelsByTime(30, 30, 2)
rob.setEmotionTo(Emotions.LAUGHING)
37
Anexo 1
Manual de programación
de Robobo con Python
5. | Métodos de sensorización
5.1 Batería
Introducción
Tanto la base de Robobo como el smartphone utilizan una batería como fuente de energía, y es posible
conocer el nivel de cada uno de ellos
Elementos de programación
readBatteryLevel(device)
EJEMPLO DE USO
El siguiente programa muestra un ejemplo en el que se reproducen mediante la voz de Robobo el nivel
de batería de la base y del smartphone.
rob = Robobo("localhost")
rob.connect()
rob.wait(1)
rob.sayText("El nivel de batería de la base es " + str(rob.readBatteryLevel('base')))
rob.sayText("El nivel de batería del teléfono es " + str(rob.readBatteryLevel('phone')))
38
Anexo 1
Manual de programación
de Robobo con Python
Introducción
Robobo cuenta con varios infrarrojos que le permiten detectar si hay objetos cerca: cinco en la parte
delantera y tres en la parte trasera. Cuanto más altos sean los valores devueltos por un infrarrojo, más
cerca estarán los objetos de alrededor.
Elementos de programación
5.2.1 Enumerado IR
Representa la lista de infrarrojos de la base de Robobo, que se corresponden con la imagen siguiente:
39
Anexo 1
Manual de programación
de Robobo con Python
readIRSensor(id)
EJEMPLO DE USO
El siguiente programa hace que Robobo se mueva hacia delante hasta que encuentre un obstáculo
cercano en el sensor delantero central (el valor de 100 es orientativo, y debe ser ajustado al nivel de
luz y al tipo de objeto a detectar). Cuando eso ocurre, se mueve hacia atrás durante 1 segundo para
separase del obstáculo, luego gira en el sitio 180º aproximadamente y, finalmente, se mueve en
dirección contraria durante 2 segundos:
rob = Robobo("localhost")
rob.connect()
rob.moveWheels(30,30)
rob.moveWheelsByTime(-20,-20,1)
rob.moveWheelsByTime(28,-28,1)
rob.moveWheelsByTime(30,30,2)
readAllIRSensor()
40
Anexo 1
Manual de programación
de Robobo con Python
Devuelve:
• Valores medidos (dict). Es un diccionario con los valores medidos por todos los sensores
IR de la base. Las claves del diccionario son de tipo string, e indican el sensor IR
correspondiente (ver Enumerado IR). Los valores del diccionario son de tipo int e indican
el valor medido por el IR correspondiente.
EJEMPLO DE USO
El siguiente programa hace que Robobo se mueva hacia adelante hasta que encuentra un obstáculo
cercano en el sensor delantero central (el valor de 100 es orientativo, y debe ser ajustado al nivel de
luz y al tipo de objeto a detectar). Cuando eso ocurre, se para.
rob = Robobo("localhost")
rob.connect()
rob.moveWheels(30,30)
while (rob.readAllIRSensor()==[]):
rob.wait(0.1)
rob.stopMotors()
5.3 Motores
Introducción
Todos los motores de Robobo incorporan un sensor (codificador de eje o encoder) que permite leer su
posición mediante los métodos descritos en este apartado.
Elementos de programación
41
Anexo 1
Manual de programación
de Robobo con Python
Both: Ambas.
readWheelPosition(wheel)
EJEMPLO DE USO
Con este bloque podemos conocer la distancia aproximada que recorre Robobo. En este ejemplo, se
utiliza este bloque para hacer que el robot se pare cuando la rueda derecha ha dado 2 vueltas
completas (720 grados). Si conocemos la longitud de la circunferencia de la rueda, podemos
determinar fácilmente la distancia recorrida:
El siguiente programa
rob = Robobo("localhost")
rob.connect()
rob.moveWheels(20,20)
rob.wait(1)
vueltas = rob.readWheelPosition(Wheels.R)
rob.stopMotors()
readWheelSpeed(wheel)
42
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa hace que Robobo avance en línea recta con una velocidad que aumenta de 10
en 10 desde 20 hasta 50 (4 veces). En cada paso del bucle, dice la velocidad real que alcanza la rueda
(se utiliza solo la rueda izquierda ya que ambas usan el mismo valor):
rob = Robobo("localhost")
rob.connect()
speed = 20
for i in range(4):
rob.moveWheels(speed, speed)
rob.wait(1)
rob.sayText('Mi velocidad es' + str(rob.readWheelSpeed(Wheels.L)))
speed+= 10
rob.stopMotors()
resetWheelEncoders()
43
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
rob = Robobo("localhost")
rob.connect()
rob.moveWheelsByTime(20,20,5)
rob.sayText('La posición de la rueda derecha es' + str(rob.readWheelPosition(Wheels.R)))
rob.resetWheelEncoders()
rob.wait(0.5)
rob.sayText('La posición de la rueda derecha ha sido reiniciada. La posición actual es' +
str(rob.readWheelPosition(Wheels.R)))
readPanPosition()
EJEMPLO DE USO
En el siguiente programa, se mueve el motor PAN a un valor aleatorio dentro de su rango de operación
y, a continuación, se encienden los LEDs del lado de la base correspondiente al giro realizado. Por lo
tanto, este programa nos permite conocer la orientación del smartphone respecto a la base en
cualquier momento.
44
Anexo 1
Manual de programación
de Robobo con Python
rob = Robobo("localhost")
rob.connect()
rob.setLedColorTo(LED.All, Color.OFF)
rob.movePanTo(random.randint(-160,160), 15)
if rob.readPanPosition() < 0:
rob.setLedColorTo(LED.FrontLL, Color.CYAN)
rob.setLedColorTo(LED.FrontL, Color.CYAN)
rob.setLedColorTo(LED.BackL, Color.CYAN)
else:
rob.setLedColorTo(LED.FrontR, Color.CYAN)
rob.setLedColorTo(LED.FrontRE, Color.CYAN)
rob.setLedColorTo(LED.BackR, Color.CYAN)
readTiltPosition()
EJEMPLO DE USO
En el siguiente programa, se mueve el motor TILT a un valor aleatorio dentro de su rango de operación
y, a continuación, se encienden los LEDs delanteros o traseros de la base en función de si el TILT está
por encima o por debajo de 90 grados. Por lo tanto, este programa nos permite conocer la orientación
del smartphone respecto a la base en cualquier momento.
rob = Robobo("localhost")
rob.connect()
rob.setLedColorTo(LED.All, Color.OFF)
rob.moveTiltTo(random.randint(60,108), 15)
45
Anexo 1
Manual de programación
de Robobo con Python
rob.setLedColorTo(LED.BackL, Color.CYAN)
rob.setLedColorTo(LED.BackR, Color.CYAN)
else:
rob.setLedColorTo(LED.FrontC, Color.CYAN)
rob.setLedColorTo(LED.FrontL, Color.CYAN)
rob.setLedColorTo(LED.FrontLL, Color.CYAN)
rob.setLedColorTo(LED.FrontR, Color.CYAN)
rob.setLedColorTo(LED.FrontRE, Color.CYAN)
Introducción
Robobo envía mensajes al dispositivo en el que se esté programando con una frecuencia determinada,
que se puede modificar para reducir el coste computacional.
Elementos de programación
Representa la lista de posibles valores para establecer la frecuencia de los mensajes de estado del
robot.
Low: Baja.
Normal: Normal.
High: Alta.
Max: Máxima.
setStatusFrecuency(frecuency)
Establece la frecuencia de los mensajes de estado provenientes del Robobo. Los mensajes de
estado se filtran por defecto para reducir el ancho de banda. Una alta frecuencia reduce los filtros,
por lo que se envían más mensajes de estado y se usa más ancho de banda.
Parámetros:
• frecuency (StatusFrequency): La nueva frecuencia de los mensajes de estado (ver
Enumerado StatusFrequency).
46
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
En este ejemplo, se cambia la frecuencia de los mensajes de estado a tres posibles valores: Frecuencia
baja, frecuencia media y frecuencia alta.
rob = Robobo("localhost")
rob.connect()
rob.setStatusFrequency(StatusFrequency.Low)
rob.setStatusFrequency(StatusFrequency.Normal)
rob.setStatusFrequency(StatusFrequency.High)
5.5 Cámara
Introducción
Robobo permite utilizar la cámara delantera o la cámara trasera del smartphone, pero solo una cámara
puede estar activa al mismo tiempo. Existen varios métodos que hacen uso de la información de la
cámara, la procesan, y devuelven percepciones de más alto nivel (color, QR, Aruco). Pero también es
posible acceder directamente a las imágenes que se envían por stream al ordenador, a una frecuencia
determinada (fps). Para utilizar el stream de video de la cámara es necesario descargar la siguiente
librería:
import cv2
rob.moveWheels(10,10)
while True:
47
Anexo 1
Manual de programación
de Robobo con Python
cv2_image = videoStream.getImage()
cv2.namedWindow('imagen', cv2.WINDOW_NORMAL)
cv2.imshow('imagen', cv2_image)
cv2.waitKey(1)
Elementos de programación
SetStreamFPS(fps)
Establece los fps (frames per second) del stream. Estos son el número de fotogramas por segundo
enviados desde el smartphone al ordenador. El valor por defecto es 60, pero el valor efectivo es
normalmente más bajo (alrededor de 20), dependiendo del smartphone. Este cambio es
persistente.
Parámetros:
• fps (int): Nuevo límite superior de los fps del stream. Toma únicamente valores positivos.
EJEMPLO DE USO
En este ejemplo, se varía el valor por defecto de 60 fotogramas por segundo a 30 haciendo uso del
método setStreamFps.
rob = Robobo("localhost")
rob.connect()
rob.setStreamFps(30)
SetCameraFPS(fps)
Establece los fps (frames per second) de la cámara. Estos son el número de fotogramas por
segundo leídos por la cámara del smartphone. El valor por defecto es 60, pero el valor efectivo es
normalmente más bajo (alrededor de 20), dependiendo del smartphone. Este cambio es
persistente.
Parámetros:
48
Anexo 1
Manual de programación
de Robobo con Python
• fps (int): Nuevo límite superior de los fps del stream. Toma únicamente valores positivos.
EJEMPLO DE USO
En este ejemplo, se varía el valor por defecto de 60 de los fotogramas por segundo de la cámara del
smartphone a 20 haciendo uso del método setCameraFps.
rob = Robobo("localhost")
rob.connect()
rob.setCameraFps(20)
setFrontCamera()
EJEMPLO DE USO
En este ejemplo, se mueve el motor TILT para situar el smartphone de la base de forma perpendicular
al suelo y establece la cámara frontal como la cámara a utilizar.
rob.moveTiltTo(90, 20)
rob.setFrontCamera()
49
Anexo 1
Manual de programación
de Robobo con Python
setBackCamera()
EJEMPLO DE USO
En este ejemplo, se mueve el motor TILT para situar el smartphone de la base de forma perpendicular
al suelo, a continuación, el Robobo se mueve durante 3 segundos, varía los fps de la cámara a 20 y
establece la cámara trasera como la cámara a utilizar.
rob.moveTiltTo(90, 20)
rob.setBackCamera()
startCamera()
Habilita la cámara.
La cámara está deshabilitada por defecto en el robot real y habilitada por defecto en el simulador.
Este cambio es persistente.
Este método no está implementado en el simulador.
Advertencia: Algunos módulos dependen de la cámara, por lo que es necesario habilitarla para
hacer uso de ellos.
EJEMPLO DE USO
En el siguiente programa se habilita la cámara. Esto permitiría hacer uso del streaming.
50
Anexo 1
Manual de programación
de Robobo con Python
videoStream = RoboboVideo("192.168.1.58")
rob = Robobo("192.168.1.58")
rob.connect()
rob.startCamera()
stopCamera()
Deshabilita la cámara.
La cámara está deshabilitada por defecto en el robot real y habilitada por defecto en el simulador.
Este cambio es persistente.
Este método no está implementado en el simulador.
Advertencia: Algunos módulos dependen de la cámara, por lo que es necesario habilitarla para
hacer uso de ellos.
EJEMPLO DE USO
En el siguiente programa se deshabilita la cámara. Esto impediría hacer uso del streaming.
videoStream = RoboboVideo("192.168.1.58")
rob = Robobo("192.168.1.58")
rob.connect()
rob.stopCamera()
startStream()
51
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
En este ejemplo, se activa la cámara haciendo uso de las librerías ‘OpenCV’ y se muestra lo que el robot
está viendo en tiempo real. Para parar el streaming basta con pulsar la tecla ‘q’ en cualquier momento.
videoStream.connect()
print("Showing images")
i=0
last_ts = 0
while True:
i+=1
frame, timestamp, sync_id, frame_id = videoStream.getImageWithMetadata()
if timestamp != last_ts:
print(timestamp)
print(sync_id)
print(frame_id)
cv2.imshow('smartphone camera', frame)
52
Anexo 1
Manual de programación
de Robobo con Python
last_ts = timestamp
if cv2.waitKey(1) & 0xFF == ord('q'):
videoStream.disconnect()
cv2.destroyAllwindows()
break
main()
stopStream()
EJEMPLO DE USO
rob = Robobo("localhost")
rob.connect()
rob.stopStream()
5.6 Luz
Introducción
Robobo permite leer el nivel de luz ambiente gracias al sensor de luz del smartphone, que
normalmente está situado en la propia cámara.
53
Anexo 1
Manual de programación
de Robobo con Python
Elementos de programación
readBrightnessSensor()
EJEMPLO DE USO
En el siguiente programa, Robobo se mueve a velocidad 20 y realiza sucesivas medidas del nivel de
brillo haciendo uso del método readBrightnessSensor mientras avanza de forma permanente.
rob = Robobo("localhost")
rob.connect()
rob.moveWheels(20,20)
while True:
rob.wait(0.5)
print(f'\nEl valor de brillo actual es de: {rob.readBrightnessSensor()} lux')
Introducción
Robobo permite detectar blobs de distintos colores. Un blob es un área de la imagen con el mismo
color uniforme, y su detección implica un procesado interno de la imagen obtenida.
Elementos de programación
Representa un blob detectado por Robobo. Los ejes de referencia que se utilizan son los siguientes:
54
Anexo 1
Manual de programación
de Robobo con Python
Atributos:
• color (string): El color del blob detectado.
• posx (int): Representa la localización de la pelota en el X respecto al robot. Los valores están
en el rango de 0 a 100. Ver imagen anterior.
• posy (int): Representa la posición de la pelota en el Y respecto al robot, es decir, lo cerca o
lejos que se encuentra del mismo. Los valores están en el rango de 0 a 100. Ver imagen
anterior.
• size (int): El área del blob medida en pixels, de forma que, cuanto mayor es el valor, más cerca
se encuentra el robot del blob detectado.
• frame_timestamp (long): La hora a la que el frame se comenzó a procesar.
• status_timestamp (long): La hora a la que se envió el estado.
55
Anexo 1
Manual de programación
de Robobo con Python
readColorBlob(color)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga dónde ve un objeto de color verde de forma natural para
el usuario. Así, cuando lo ve a la derecha, izquierda o en el medio, lo dice. Si no ve ningún objeto verde,
también avisa de palabra. Para ello se usa la coordenada x de la mayor área verde detectada en la
imagen.
rob = Robobo("localhost")
rob.connect()
while True:
56
Anexo 1
Manual de programación
de Robobo con Python
setActiveBlobs(red,green,blue,custom)
Habilita o deshabilita el seguimiento individual de cada color. Por defecto, el seguimiento del color
verde está habilitado y los demás deshabilitados.
• red (bool): Si es “True”, habilita el seguimiento del color rojo.
• green (bool): Si es “True”, habilita el seguimiento del color verde.
EJEMPLO DE USO
El siguiente programa configura los colores rojo y azul para la detección. A continuación, Robobo dice
si ve rojo o azul, y enciende los LEDS de la base en cada caso, al situarle delante de la cámara un objeto
de cada color. Por defecto, los LEDs de la base están en verde:
rob = Robobo("localhost")
rob.connect()
while True:
if rob.readColorBlob(Color.RED).size > 0:
rob.setLedColorTo(LED.All, Color.RED)
rob.sayText('Veo rojo')
else:
if rob.readColorBlob(Color.BLUE).size > 0:
57
Anexo 1
Manual de programación
de Robobo con Python
rob.setLedColorTo(LED.All, Color.BLUE)
rob.sayText('Veo azul')
else:
if rob.readColorBlob(Color.GREEN).size > 0:
rob.setLedColorTo(LED.All, Color.GREEN)
rob.sayText('Veo verde)
rob.wait(0.5)
readAllColorBlobs()
EJEMPLO DE USO
En este ejemplo, se lee los datos del blob (diccionario), se guarda en una variable local las llaves de
este (key) y se muestra por pantalla la información recogida en estas como son el color detectado, la
posición X e Y del objeto y su área.
rob = Robobo("localhost")
rob.connect()
rob.wait(1)
blobs = rob.readAllColorBlobs()
58
Anexo 1
Manual de programación
de Robobo con Python
ResetColorBlobs()
Reinicia el detector de colores. Esto pone a 0 los atributos de los últimos blobs detectados, pero
mantiene iguales los colores habilitados y deshabilitados.
EJEMPLO DE USO
En el siguiente programa se reinician los valores leídos de color y se le indica al usuario en voz alta
dicha acción.
rob = Robobo("localhost")
rob.connect()
rob.resetColorBlobs()
rob.sayText('Los valores de los colores han sido reiniciados')
whenANewColorBlobIsDetected(callback)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga de forma continuada el color que detecta, asumiendo
que están activados verde, rojo y azul:
def color_detected():
print(rob.readColorBlob(Color.BLUE).size)
if rob.readColorBlob(Color.GREEN).size != 0:
59
Anexo 1
Manual de programación
de Robobo con Python
rob = Robobo("localhost")
rob.connect()
EJEMPLO DE USO
En este ejemplo, se varían varios hiperparámetros que definen cuando se considera que se ha perdido
un color. Entre ellos se aumenta el número de fotogramas de 5 a 10 y el área mínima para considerar
que un Blob es un Blob se reduce a la mitad (500).
rob = Robobo("localhost")
60
Anexo 1
Manual de programación
de Robobo con Python
rob.connect()
Introducción
Elementos de programación
startFaceDetection()
stopFaceDetection()
61
Anexo 1
Manual de programación
de Robobo con Python
resetFaceSensor()
Reinicia el sensor facial. Después de utilizar este método, y mientras no se detecte una nueva cara,
el sensor facial devolverá ‘0’ para cada atributo leído.
readFaceSensor()
EJEMPLO DE USO
El siguiente programa hace que Robobo diga dónde ve la cara que está detectando de forma natural
para el usuario. Así, cuando ve una cara a la derecha, izquierda o centrada, lo dice. Si no ve ninguna
cara, también avisa de palabra. Para ello, utiliza la coordenada x de la cara que detecta. Inicialmente
se activa la detección facial haciendo uso del método startFaceDetection y si se pulsa la tecla ‘q’ se
desactiva la detección facial haciendo uso del método stopFaceDetection.
rob = Robobo("10.113.26.150")
rob.connect()
rob.startFaceDetection()
while True:
if rob.readFaceSensor().posx > 40 and rob.readFaceSensor().posx < 60:
rob.sayText('Te veo centrado')
else:
62
Anexo 1
Manual de programación
de Robobo con Python
whenAFaceIsLost(callback)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga «No te veo» de manera continua cada 2 segundos
siempre que pierda una cara.
def face_lost():
rob.sayText('No te veo')
rob.wait(2)
rob = Robobo("10.113.26.150")
rob.connect()
rob.whenAFaceIsLost(face_lost)
63
Anexo 1
Manual de programación
de Robobo con Python
whenANewFaceIsDetected(callback)
Establece la función callback que se llama cuando se detecta una nueva cara.
• callback (fun): La función callback que será llamada.
EJEMPLO DE USO
El siguiente programa hace que Robobo diga «te veo» de manera continua cada 2 segundos siempre
que detecte una cara.
def face_detected():
rob.sayText('Te veo')
rob.wait(2)
rob = Robobo("10.113.26.150")
rob.connect()
rob.whenANewFaceIsDetected(face_detected)
Introducción
Robobo puede detectar objetos mediante el uso de la cámara y una librería externa basada en el uso
de redes de neuronas artificiales. En esta página hay más detalles sobre este método:
https://github.com/mintforpeople/robobo-programming/wiki/Real-time-object-identification
Elementos de programación
64
Anexo 1
Manual de programación
de Robobo con Python
• x (int): La coordenada x del centro del “bounding box” del objeto, medido en pixels desde el
lado izquierdo de la pantalla. Es un valor positivo.
• y (int): La coordenada y del centro del “bounding box” del objeto, medido en pixels desde el
lado izquierdo de la pantalla. Es un valor positivo.
• width (int): El ancho del “bounding box” medido en pixels. Es un valor positivo.
• height (int): The alto del “bounding box” medido en pixels. Es un valor positive.
startObjectRecognition()
stopObjectRecognition()
readDetectedObject()
65
Anexo 1
Manual de programación
de Robobo con Python
whenAnObjectIsDetected(callback)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga qué objeto se ha detectado y con qué intervalo de
confianza.
El siguiente programa hace que Robobo active la detección de objetos haciendo uso del método
startObjectRecognition y coloque el TILT en una posición adecuada para ver lo que hay en el entorno.
Luego, hace que Robobo diga en voz alta de forma continuada la etiqueta del objeto detectado y su
confianza de detección.
rob = Robobo('localhost')
rob.connect()
rob.startObjectRecognition()
rob.moveTiltTo(85,30)
def say_object():
object = rob.readDetectedObject()
if object.label is not None:
rob.sayText(f'Se ha detectado el objeto {object.label} con una confianza del
{object.confidence}')
rob.whenAnObjectIsDetected(say_object)
5.10 Micrófono
Introducción
Robobo puede identificar notas musicales, palmadas o conocer el nivel de ruido ambiente mediante el
micrófono del Smartphone. Este módulo no está implementado en el simulador.
66
Anexo 1
Manual de programación
de Robobo con Python
Elementos de programación
readLastNote()
EJEMPLO DE USO
El siguiente programa genera notas musicales desde MI hasta RE utilizando el método playNote. Luego,
esas notas se leen con el método readLastNote y se dice en voz alta la nota detectada. Al ejecutar este
programa, se puede observar como para algunas notas emitidas (sostenidas), no se dice nada.
rob = Robobo("10.113.26.150")
rob.connect()
note_to_play = 52
while True:
67
Anexo 1
Manual de programación
de Robobo con Python
if read_note == 'C':
rob.sayText('Acabo de oir un DO')
else:
if read_note == 'D':
rob.sayText('Acabo de oir un RE')
else:
if read_note == 'E':
rob.sayText('Acabo de oir un MI')
else:
if read_note == 'F':
rob.sayText('Acabo de oir un FA')
else:
if read_note == 'G':
rob.sayText('Acabo de oir un SOL')
else:
if read_note == 'A':
rob.sayText('Acabo de oir un LA')
else:
if read_note == 'B':
rob.sayText('Acabo de oir un SI')
rob.wait(1)
whenANoteIsDetected(callback)
Establece la función callback que se llama cuando se detecta una nueva nota.
Parámetros:
• callback (fun): La función callback que será llamada.
EJEMPLO DE USO
El siguiente programa hace que Robobo diga que acaba de oír la nota Do si efectivamente esta nota
ha sonado y haciendo uso del método whenANoteIsDetected.
def fun():
if rob.readLastNote() == 'C':
rob.sayText('Acabo de oir un DO')
rob = Robobo('10.113.26.150')
rob.connect()
68
Anexo 1
Manual de programación
de Robobo con Python
rob.whenANoteIsDetected(fun)
readClapCounter()
resetClapCounter()
EJEMPLO DE USO
El siguiente programa detecta cuando se realizan dos o más palmadas consecutivas (en menos de dos
segundos), lo cual hace que Robobo emita un sonido de alegría y ponga la expresión de sorpresa. Para
ello se utiliza un variable como temporizador el cual se reinicia cada 2 segundos y el método
readClapCounter. Si damos una única palmada, no ocurre nada.
rob = Robobo('10.113.26.150')
rob.connect()
timer = 0
while True:
if timer < 2:
if rob.readClapCounter() > 1:
69
Anexo 1
Manual de programación
de Robobo con Python
rob.playSound(Sounds.LAUGH)
rob.setEmotionTo(Emotions.SURPRISED)
rob.wait(0.5)
rob.resetClapCounter()
else:
timer = 0
rob.resetClapCounter()
rob.setEmotionTo(Emotions.NORMAL)
rob.wait(2)
timer+=1
whenClapDetected(callback)
Establece la función callback que se llama cuando se detecta una nueva palmada.
Parámetros:
• callback (fun): La función callback que será llamada.
EJEMPLO DE USO
El siguiente programa hace que Robobo se detenga y diga, «Me has mandado parar» cuando detecta
una palmada.
def clap():
rob.stopMotors()
rob.sayText('Me has mandado parar')
rob = Robobo('10.113.26.150')
rob.connect()
rob.moveWheels(20,20)
rob.whenClapIsDetected(clap)
70
Anexo 1
Manual de programación
de Robobo con Python
readNoiseLevel()
Lee el nivel de presión de sonido (SPL, por sus siglas en inglés), que es una medida del ruido
ambiente.
Devuelve:
• El valor de SPL en decibelios (float).
EJEMPLO DE USO
El siguiente programa hace que Robobo diga el nivel de ruido de manera continua y lo categorice en
nivel de ruido alto, medio o bajo en función de los decibelios detectados por el método readNoiseLevel.
rob = Robobo('10.113.26.150')
rob.connect()
while True:
noise_level = rob.readNoiseLevel()
rob.sayText(noise_level)
Introducción
Robobo puede detectar gestos en la pantalla (fling y tap) gracias al sensor táctil de la pantalla del
Smartphone. En el simulador se realizan sobre la ventana emergente inferior derecha (ver
documentación del simulador).
Los flings son deslizamientos del dedo sobre la pantalla en una dirección determinada.
71
Anexo 1
Manual de programación
de Robobo con Python
Los taps son pequeños golpes que no tienen una dirección definida.
Elementos de programación
• zone (string): Devuelve el área de la pantalla del smartphone, que puede ser uno de los
siguientes valores: ‘forehead’, ‘eye’, ‘right’, ‘left’, ‘mouth’ o ‘chin’. Estos valores están
representados en la imagen siguiente:
readFlingAngle()
Lee el último ángulo de fling detectado. Este ángulo está formado por una línea horizontal y el
primer y último punto donde el dedo toco la pantalla.
Devuelve:
• El ángulo en grados (int).
EJEMPLO DE USO
72
Anexo 1
Manual de programación
de Robobo con Python
El siguiente programa hace que Robobo muestre de forma continuada el ángulo del último fling
medido.
rob = Robobo('localhost')
rob.connect()
while True:
fling_angle = rob.readFlingAngle()
print(fling_angle)
rob.wait(1)
readFlingDistance()
EJEMPLO DE USO
El siguiente programa hace que Robobo muestre de forma continuada la distancia del último fling
medido.
rob = Robobo('localhost')
rob.connect()
while True:
fling_distance = rob.readFlingDistance()
print(fling_distance)
rob.wait(1)
readFlingTime()
73
Anexo 1
Manual de programación
de Robobo con Python
Devuelve:
• La duración en milisegundos (float).
EJEMPLO DE USO
El siguiente programa hace que Robobo muestre de forma continuada la duración del último fling
medido.
rob = Robobo('localhost')
rob.connect()
while True:
fling_time = rob.readFlingTime()
print(fling_time)
rob.wait(1)
resetFlingSensor()
EJEMPLO DE USO
En el siguiente programa, cuando el valor del ángulo del último fling supera los 50 grados, se reinicia
el valor del sensor de flings.
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
while True:
fling_time = rob.readFlingTime()
print(fling_time)
rob.wait(1)
74
Anexo 1
Manual de programación
de Robobo con Python
WhenAFlingIsDetected(callback)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga el nivel de batería de la base al detectar un fling en la
pantalla.
def say_batery_level():
rob.sayText('La base tiene una bateria de' + str(rob.readBatteryLevel('base')))
rob = Robobo('localhost')
rob.connect()
rob.whenAFlingIsDetected(say_batery_level)
readTapSensor()
resetTapSensor()
75
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa hace que Robobo diga «no tengo bigote» al pulsar brevemente sobre la zona de
la pantalla entre la boca y el ojo. Es necesario reiniciar el valor del sensor tap en cada iteración del
bucle porque este sensor mantiene el último valor medido.
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
while True:
if rob.readTapSensor().x > 30 and rob.readTapSensor().x < 70:
if rob.readTapSensor().y > 50 and rob.readTapSensor().y < 60:
rob.sayText('No tengo bigote')
rob.resetTapSensor()
WhenATapIsDetected(callback)
EJEMPLO DE USO
A continuación, se muestra un programa que hace que el robot pare todos los motores al realizar un
tap sobre la pantalla.
from robobopy.Robobo import Robobo
def fun():
rob.stopMotors()
rob = Robobo('localhost')
rob.connect()
rob.moveWheels(30,30)
76
Anexo 1
Manual de programación
de Robobo con Python
rob.whenATapIsDetected(fun)
Introducción
Robobo puede conocer su orientación gracias a los sensores de la IMU del smartphone, giroscopio,
brújala y magnetómetro.
Nota importante: no todos los modelos de Smartphone incorporan IMU
Elementos de programación
readOrientationSensor()
77
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa hace que Robobo se mueva en línea recta de forma indefinida, y diga si sube o
si baja en caso de encontrarse con una inclinación en su camino. Para ello, se analiza si el
ángulo pitch está por encima de un umbral negativo o positivo:
rob = Robobo('localhost')
rob.connect()
rob.moveWheels(20,20)
rob.resetWheelEncoders()
while True:
if rob.readOrientationSensor().pitch < -20:
rob.sayText('Subiendo')
else:
if rob.readOrientationSensor().pitch > 20:
rob.sayText('Bajando')
rob.wait(1)
Introducción
Robobo puede conocer su aceleración gracias al acelerómetro que suelen ocupar todos los
smartphones.
Elementos de programación
78
Anexo 1
Manual de programación
de Robobo con Python
readAccelerationSensor()
EJEMPLO DE USO
El siguiente programa hace que Robobo se mueva en línea recta de forma indefinida a velocidad 90
hasta que el sensor de aceleración lea un valor en el eje ‘Z’ superior a 5. En ese momento el robot
indicara en voz alta al usuario que se van a parar los motores y el robot se para.
rob = Robobo('localhost')
rob.connect()
rob.moveWheels(90,90)
while True:
if rob.readAccelerationSensor().z < 5:
rob.sayText('Parando Motores')
rob.stopMotors()
break
rob.wait(0.1)
Introducción
Robobo puede detectar los carriles por los que circula utilizando la cámara del smartphone y un
algoritmo de detección explicado con detalle en esta página:
https://github.com/mintforpeople/robobo-programming/wiki/Lane-detection-library
Los carriles básicos están formados por dos líneas rectas, mientras que los carriles pro están formados
por dos polinomios de segundo grado.
Este módulo no está implementado en el simulador.
79
Anexo 1
Manual de programación
de Robobo con Python
Elementos de programación
Representa un carril básico detectado por Robobo, formado por dos líneas rectas.
Atributos:
• coeffs1 (dict): Diccionario con ‘a’ y ‘b’ (ax + b), coeficientes de la línea izquierda.
• coeffs2 (dict): Diccionario con ‘a’ y ‘b’ (ax + b), coeficientes de la línea derecha.
• id (int): Número de secuencia de frame. Desde que la cámara se inicial, cada frame tiene un
número que lo identifica. El valor es siempre positivo.
Respresenta un carril pro detectado por Robobo, formado por dos polinomios de segundo grado.
Atributos:
• coeffs1 (dict): Diccionario con ‘a’, ‘b’ y ‘c’ (ax2 + bx + c), coeficientes de la línea izquierda.
• coeffs2 (dict): Diccionario con ‘a’, ‘b’ y ‘c’ (ax2 + bx + c), coeficientes de la línea derecha.
startLaneDetection()
stopLaneDetection()
80
Anexo 1
Manual de programación
de Robobo con Python
readLaneBasic()
El siguiente programa hace que Robobo habilite la detección de carriles. Luego, hace que Robobo se
mueva en línea recta de forma indefinida a velocidad 20 y vaya mostrando por pantalla los coeficientes
‘a’ y ‘b’ que forman la recta de uno de los carriles básicos detectado.
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
while True:
lane_basic = rob.readLaneBasic()
print(f"El coeficente a del carril es: {lane_basic.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_basic.coeffs1['b']}")
rob.wait(1)
readLanePro()
EJEMPLO DE USO
81
Anexo 1
Manual de programación
de Robobo con Python
El siguiente programa hace que Robobo habilite la detección de carriles. Luego, hace que se mueva en
línea recta de forma indefinida a velocidad 20 y vaya mostrando por pantalla los coeficientes ‘a’, ‘b’ y
‘c’ que forman el polinomio de grado 2 de uno de los carriles detectado.
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
while True:
lane_pro = rob.readLanePro()
print(f"El coeficente a del carril es: {lane_pro.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_pro.coeffs1['b']}")
print(f"El coeficente c del carril es: {lane_pro.coeffs1['c']}")
rob.wait(1)
WhenALaneBasicDetected(callback)
EJEMPLO DE USO
En el siguiente programa, cuando Robobo detecta un carril simple se llama a una función que leerá los
coeficientes ‘a’ y ‘b’ que forman la recta de una de las líneas detectada.
def fun():
lane_basic = rob.readLaneBasic()
print(f"El coeficente a del carril es: {lane_basic.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_basic.coeffs1['b']}")
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
82
Anexo 1
Manual de programación
de Robobo con Python
rob.moveWheels(20,20)
rob.whenALaneBasicDetected(fun)
WhenALaneProDetected(callback)
EJEMPLO DE USO
A continuación, se muestra un programa que cuando el robot detecte un carril simple llame a una
función que leerá los coeficientes ‘a’, ‘b’ y ‘c’ que forman el polinomio de grado 2 de uno de los carriles
detectado.
def fun():
lane_pro = rob.readLanePro()
print(f"El coeficente a del carril es: {lane_pro.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_pro.coeffs1['b']}")
print(f"El coeficente c del carril es: {lane_pro.coeffs1['c']}")
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
rob.whenALaneProDetected(fun)
83
Anexo 1
Manual de programación
de Robobo con Python
setLaneColorInversion(set_on)
Configura la inversión de color para el módulo de detección de carriles. Por lo general, se detectan
carriles claros sobre fondo oscuro, pero también es posible detectar carriles oscuros sobre fondos
claros.
Este cambio es persistente.
Parámetros:
• set_on (bool): Booleano para elegir si se activa la inversión de color o no.
Advertencia: Solo utiliza esta función si sabes que estás haciendo. Una mala configuración podría
traer consecuencias inesperadas.
EJEMPLO DE USO
En el siguiente programa, se activa la inversión de color para leer carriles oscuros sobre fondo claro.
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.setLaneColorInversion(True)
rob.sayText('Inversión de color activada')
Introducción
Elementos de programación
84
Anexo 1
Manual de programación
de Robobo con Python
• 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.
startQrTracking()
EJEMPLO DE USO
rob = Robobo('localhost')
rob.connect()
rob.startQrTracking()
85
Anexo 1
Manual de programación
de Robobo con Python
stopQrTracking()
EJEMPLO DE USO
rob = Robobo('localhost')
rob.connect()
rob.stopQrTracking()
readQR()
EJEMPLO DE USO
El siguiente programa hace que Robobo avise cuando detecta un código QR centrado (coordenada X
entre 200 y 250), indicando de palabra el identificador que contiene.
rob = Robobo('localhost')
86
Anexo 1
Manual de programación
de Robobo con Python
rob.connect()
while True:
rob.wait(0.1)
if rob.readQR().x > 200 and rob.readQR().x < 250:
rob.sayText('El QR pone')
rob.sayText(rob.readQR().id)
WhenAQRCodeIsDetected(callback)
EJEMPLO DE USO
El siguiente programa hace que Robobo pare los motores y diga el código del QR que detecta.
def fun():
rob.stopMotors()
rob.sayText('Codigo')
rob.sayText(rob.readQR().id)
rob.sayText('detectado')
rob = Robobo('localhost')
rob.connect()
rob.moveWheels(20,20)
rob.whenAQRCodeIsDetected(fun)
WhenANewQRCodeIsDetected(callback)
87
Anexo 1
Manual de programación
de Robobo con Python
Establece la función callback que se llama cuando se detecta un nuevo QR. Un QR se considera
nuevo si es distinto del detectado la última vez.
• callback (fun): La función callback a ser llamada.
EJEMPLO DE USO
El siguiente programa hace que Robobo diga el código del QR que detecta cada vez que un nuevo QR
distinto es detectado.
def fun():
rob.sayText('Un nuevo código QR detectado')
rob.wait(1)
rob.sayText('Codigo')
rob.sayText(rob.readQR().id)
rob.sayText('detectado')
rob = Robobo('localhost')
rob.connect()
rob.startQrTracking()
rob.moveWheels(20,20)
rob.whenANewQRCodeIsDetected(fun)
WhenAQRCodeIsLost(callback)
88
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa hace que Robobo muestre por pantalla el ID del código del QR que detecta y
que diga en voz alta que este código QR ha sido perdido cuando esto ocurra haciendo uso del método
WhenAQRCodeIsLost.
def fun():
rob.sayText('Se ha perdido el codigo QR')
rob = Robobo('localhost')
rob.connect()
rob.moveWheels(20,20)
rob.whenAQRCodeIsLost(fun)
while True:
rob.wait(0.1)
print(rob.readQR().id)
Introducción
Robobo puede detectar marcadores ArUco. Para conocer los detalles de este proceso, se recomienda
consultar:
https://github.com/mintforpeople/robobo-programming/wiki/ArUco-marker-detection
Elementos de programación
Representa un tag ArUco detectado por Robobo, definido por cuatro esquinas leídas en sentido
horario.
Atributos:
• cor1 (dict): Diccionario con ‘x’ e ‘y’, coordenadas de la primera esquina.
• cor2 (dict): Diccionario con ‘x’ e ‘y’, coordenadas de la segunda esquina.
89
Anexo 1
Manual de programación
de Robobo con Python
• rvects (dict): Diccionario con ‘x’. ‘y’ y ‘z’, componentes del vector de rotación.
• id (int) Identificador del tag ArUco.
startArUcoTagDetection()
EJEMPLO DE USO
El siguiente programa hace que Robobo habilite la detección de marcadores ArUco para poder usarla
posteriormente.
rob = Robobo('localhost')
rob.connect()
rob.startArUcoTagDetection()
stopArUcoTagDetection()
Deshabilita la detección de marcadores ArUco.
La detención ArUco está deshabilitada por defecto.
Este cambio es persistente.
EJEMPLO DE USO
El siguiente programa hace que Robobo deshabilite la lectura de marcadores ArUco. De esta forma, no
es posible usar este módulo hasta que se habilite de nuevo.
90
Anexo 1
Manual de programación
de Robobo con Python
rob = Robobo('localhost')
rob.connect()
rob.stopArUcoTagDetection()
readArucoTag()
EJEMPLO DE USO
El siguiente programa hace que Robobo avise cuando lea el ID de un marcador ArUco o diga que no ha
detectado ninguno en caso contrario.
rob = Robobo('localhost')
rob.connect()
while True:
rob.wait(0.1)
if rob.readArucoTag().id != '':
print(f'Aruco detectado con ID: {rob.readArucoTag().id}')
else:
print('Aruco no detectado')
setArucoTagSize(size)
Establece la longitud del lado de la etiqueta ArUco que será detectada. Es importante que este
valor se ajuste al tamaño real de la etiqueta utilizada, ya que esto se utiliza para calcular la
distancia de Robobo a la etiqueta.
Parámetros:
• size (int): Tamaño del lado del marcador ArUco en milímetros.
91
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
En este ejemplo, se varía el tamaño del tag detectado a 100 milímetros y acto seguido se comienza a
leer de forma indefinida el ID de ArUco detectado en voz alta.
rob = Robobo('localhost')
rob.connect()
rob.setArucoTagSize(100)
while True:
rob.wait(1)
rob.sayText(f'Aruco detectado con ID: {rob.readArucoTag().id}')
WhenArucoTagIsDetected(callback)
EJEMPLO DE USO
El siguiente programa hace que Robobo diga que ha detectado un nuevo marcador ArUco y diga en
voz alta su ID haciendo uso del método WhenArucoTagIsDetected.
def fun():
rob.sayText(f'Aruco detectado con ID: {rob.readArucoTag().id}')
rob = Robobo('localhost')
rob.connect()
92
Anexo 1
Manual de programación
de Robobo con Python
rob.startArUcoTagDetection()
rob.whenArucoTagIsDetected(fun)
Introducción
Robobo puede detectar líneas en la imagen. Este procesado se utiliza en la detección de carriles, pero
se proporciona por su interés práctico para otras aplicaciones.
Este módulo no está implementado en el simulador.
Elementos de programación
startLineDetection()
EJEMPLO DE USO
93
Anexo 1
Manual de programación
de Robobo con Python
El siguiente programa hace que Robobo habilite la detección de líneas para que se pueda usar
posteriormente.
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLineDetection()
stopLineDetection()
Desabilita la detección de líneas.
La detención de líneas está deshabilitada por defecto.
Este cambio es persistente.
EJEMPLO DE USO
El siguiente programa hace que Robobo deshabilite la detección de líneas. De esta forma, no es posible
usar este módulo hasta que se habilite de nuevo.
rob = Robobo('10.113.26.150')
rob.connect()
rob.stopLineDetection()
readLine()
94
Anexo 1
Manual de programación
de Robobo con Python
EJEMPLO DE USO
El siguiente programa hace que Robobo busque indefinidamente líneas en el entorno. Si alguna línea
es detectada lo indicará y en caso contrario también.
rob = Robobo('10.113.26.150')
rob.connect()
while True:
rob.wait(0.1)
if rob.readLine().id != 0:
rob.sayText('Línea detectada')
else:
rob.sayText('No se ha detectado ninguna Línea')
WhenALineIsDetected(callback)
EJEMPLO DE USO
A continuación, se muestra un programa que cuando el robot detecte una línea indique en voz alta al
usuario que dicha línea ha sido detectada y cuáles son sus coordenadas.
def fun():
rob.sayText('Una linea ha sido detectada. Sus coordenadas son ')
rob.sayText(rob.readLine().lines)
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
rob.whenALineIsDetected(fun)
95
Anexo 1
Manual de programación
de Robobo con Python
96
Anexo 1