|
|
Robobo: Pantalla táctil
Robobo puede detectar dos tipos de gestos realizados con el dedo sobre la pantalla del Smartphone. Este tipo de interacción táctil es muy habitual hoy en día en diferentes dispositivos, imita al sentido del tacto en los seres humanos, y se utiliza para mejorar la interacción natural de los robots autónomos. Por tanto, los métodos que vamos a ver en este cuaderno están relacionados con los que ya vimos en el cuaderno 4.
En RoboboSim, la interacción táctil no se realiza con el dedo, sino con el ratón del ordenador sobre la ventana emergente inferior derecha (ver documentación del simulador en https://grupo3.francispenalba.es/inicio/simulador/entorno-de-simulacion/).
Los dos tipos de gestos que podemos detectar se llaman en inglés Fling y Tap:
Fling: ocurre cuando se traza una línea recta desde un punto a otro en la pantalla de forma continua. Por ejemplo, cuando nos desplazamos hacia abajo en una web en nuestro smartphone.
Tap: ocurre cuando se hace un toque instantáneo sobre la pantalla. Por ejemplo, cuando tocamos cualquier icono de una app en nuestro smartphone.
Cada uno de ellos tiene varios métodos asociados, vamos a verlos:
readFlingAngle()
Función: Lee el último ángulo de fling detectado. El valor devuelto se corresponde con el ángulo que se forma entre la linea trazada por el movimiento del dedo y la horizontal, como se explica en las imágenes de abajo.
Devuelve:
- El ángulo en grados (int). Varía entre 0 y 360, tal y como se muestra en la imagen inferior.
En la imagen de la izquierda vemos que el ángulo es de 0º en los dos casos, aunque se haya hecho el fling en puntos diferentes de la pantalla. En la imagen central tenemos un ángulo de 65º aproximandamente y en la imagen derecha uno de 330º. Trata de comprender por qué se leen esos valores.
Para probar este método en el simulador, abrimos un mundo cualquiera y pulsamos la opción "Cámara y Pantalla" que se muestra en la parte superior izquierda.
A continuación, vamos a probar un ejemplo que simplemente nos permite imprimir por pantalla el ángulo detectado durante 5 veces. Para que funcione, debes mover tu ratón por encima de la pantalla de interacción (cara de Robobo), haciendo click en un punto, trazando una línea y soltando a continuación:
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
parar = 0
#Bucle que dura aproximadamente 10 segundos. En ese tiempo, se debe ir probando los flings
while parar < 10:
fling_angle = rob.readFlingAngle()
print(fling_angle)
rob.wait(1)
parar=parar+1
Fíjate en el gesto trazado y el valor devuelto, que no tiene por qué coincidir perfectamente (sensor real). Por ejemplo, trata de hacer un ángulo perfecto de 0º, a ver si eres capaz. De paso, trata de hacerlo en diferentes partes de la pantalla, para que comprendas que el ángulo devuelto es relativo al punto donde lo aplicas.
readFlingDistance()
Función: Lee la longitud del último fling detectado por Robobo.
Devuelve:
- La longitud en píxeles (float).
Los valores que devuelve este método siempre serán positivos. El valor máximo dependerá de la resolución del smarthphone, ya que al depender del número de píxeles, cuanto mayor sea la resolución, mayor será el valor máximo al que puede llegar.
Para hacer una comprobación rápida, se recomienda realizar un trazo en diagonal desde la esquina superior izquierda hasta la esquina inferior derecha.
Para probar este método , está disponible el siguiente ejemplo:
Cada segundo se imprimirá por pantalla la distancia del último fling realizado.
Para finalizar la ejecución del programa, se deberá de realizar un fling con una longitud mínima de 90
from robobopy.Robobo import Robobo
from robobopy.utils.Sounds import Sounds
rob = Robobo('localhost')
rob.connect()
fling_distance=0
#Bucle en el que se prueba la lectura de distancia del Fling. Si es mayor que 90, se termina el programa
while fling_distance<90:
fling_distance = rob.readFlingDistance()
print(f"La distancia del fling es de: {fling_distance}")
rob.wait(1)
#Emite un sonido de aprovación y se cierra el programa
rob.playSound(Sounds.APPROVE)
rob.disconnect()
readFlingTime()
Función: Lee la duración del último fling detectado por Robobo.
Devuelve:
- La duración en milisegundos (float).
En este ejemplo, tenéis 5 segundo para realizar un fling cualquiera. Una vez se acabe el tiempo, se imprimirá por pantalla el tiempo que pasó desde el último fling realizado.
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
#Se declara una variable
fling_time=0
rob.wait(0.1)
#En estos 5 segundos se debe realizar un Fling. No os preocupéis, el wait() no influye en la lectura
rob.wait(5)
#Se lee el tiempo del último fling realizado y se imprime por pantalla
fling_time = rob.readFlingTime()
print(fling_time)
rob.wait(1)
resetFlingSensor()
Función: Reinicia el estado del sensor Fling, poniendo los valores de la distancia, ángulo y tiempo a 0.
Este es un método útil en muchos casos, porque los métodos anteriores guardan el último valor medido. Si queremos partir de un valor inicial, debemos reiniciar el sensor.
Partiendo del apartado anterior, si ejecutáis el siguiente programa, se resetearán todos los valores:
#Se imprimen los valores de los ejemplos anteriores
print("ANTES")
print(fling_distance)
print(fling_angle)
print(fling_time)
#Reinicia los valores
rob.resetFlingSensor()
fling_distance = rob.readFlingDistance()
fling_angle = rob.readFlingAngle()
fling_time = rob.readFlingTime()
#Se imprimen los nuevos valores
print("DESPUÉS")
print(fling_distance)
print(fling_angle)
print(fling_time)
rob.disconnect()
readTapSensor()
Función: Lee los datos del último tap detectado. Un tap se corresponde con un toque único (no mantenido) sobre la pantalla del smartphone
Devuelve:
- El valor devuelto es un objeto de la clase Tap, que tiene estos 3 atributos:
- x (int): La coordenada X del tap. Toma valores de entre 0 y 100.
- y (int): La coordenada Y del tap. Toma valores de entre 0 y 100.
- 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:
En la imagen de abajo se muestra la orientación de los ejes XY para las coordenadas del tap.
En la segunda imagen se pueden apreciar las áreas de las zonas.
Para poder probar este método, se carga un mundo cualquiera y se ejecuta este programa:
Se puede probar en tocar cualquier punto de la pantalla del smarthphone de RoboboSimulator, y cada segundo se imprimirá por pantalla los valores del método.
Una vez hayan pasado 25 segundos, se cierra el programa.
from robobopy.Robobo import Robobo
rob = Robobo('localhost')
rob.connect()
tiempo=0
#Bucle que dura aproximadamente 25 segundos
while tiempo<25:
tap = rob.readTapSensor()
print(tap)
rob.wait(1)
tiempo=+1
resetTapSensor()
Función: Reinicia el estado del sensor tap.
Ya que el método anterior guarda el último valor medido, en muchos programas será necesario reiniciarlo antes de medir. Para probarlo, se parte del programa del apartado anterior, y se ejecutan las tres líneas de abajo que nos permiten comprobar cómo se ponen los atributos a su valor inicial (Tap, (x,y): 0, 0, zone: None):
#Reinicia el valor del tap
rob.resetTapSensor()
tap=rob.readTapSensor()
print(tap)
rob.disconnect()
EJERCICIO 1
Abrir un mundo cualquiera y crear el siguiente código:
Mediante los métodos asociados al sensor Fling, cread un programa en el que Robobo gire sobre su eje en dependiendo del fling:
- La longitud del fling debe ser mayor que 40 para cada acción, de lo contrario, no habrá ningún cambio.
- Si el ángulo del fling es inferior a 45 o superor a 315, gira a la izquierda a una velocidad de 5.
- Si el ángulo del fling es superior a 135 e inferior a 225, gira a la derecha a una velocidad de 5.
- Si el ángulo del fling no corresponde a ninguno de los dos casos anteriores, se detiene.
- El programa funcionará durante 60 segundos. Cuando termine se tienen que parar los motores.
#INSERTAR CÓDIGO AQUÍ
EJERCICIO 2
En un mundo cualquiera, realiza un programa en el que Robobo avance dependiendo de la zona que toques de la pantalla táctil:
- Si tocas la zona eye, el robot se moverá a una velocidad de 20 de forma constante.
- Si tocas la zona right, el robot girará hacia la izquierda a una velocidad de 5.
- Si tocas la zona left, el robot girará hacia la derecha a una velocidad de 5.
- Si tocas la zona chin, el robot avanzará el doble de rápido, es decir, a 40.
- Si tocas la zona forehead, el robot avanzará hacia atrás a una velocidad de 20.
- Si tocas la zona mouth, el robot se detendrá.
El programa funcionará durante 60 segundos. Cuando termine se tienen que parar los motores.
#INSERTAR CÓDIGO AQUÍ