|
|
Robobo: Motores PAN y TILT
Introducción
El accesorio donde se coloca el smarthphone dispone de dos motores:
- Motor Pan: Gira el smartphone en un eje vertical.
- Motor Tilt: Gira el smartphone en un eje horizontal.
Con estos dos motores se consigue que la "cabeza" del robot pueda moverse hacia abajo, arriba, derecha o izquierda de forma independiente a las ruedas, lo cual es muy interesante para que el robot muestre un comportamiento autónomo más realista. Recuerda que el smartphone tiene la cámara del robot, por lo que podrías hacer que avance hacia adelante mientras busca algo por los lados, por ejemplo.
Motor Pan
Este motor hace que el smartphone gire a derecha e izquierda, y tenemos dos métodos de Robobo asociados.
movePanTo(degrees, speed, wait=True)
FUNCIÓN: Mueve el motor PAN hasta la posición deseada.
Parámetros:
- degrees (int): Posición en grados del motor PAN. El rango de valores permitidos está entre -160 y 160, como se puede ver en la imagen siguiente.
- speed (int): Velocidad de giro del motor PAN. El rango de valores permitidos está entre 0 y 100. Cuanto mayor es la velocidad, menos tiempo tardará en alcanzar la posición objetivo.
- wait (boolean): Indica si este método se ejecuta en modo bloqueante o no (True: modo bloqueante, False: modo no bloqueante).
Antes de probar este método, debemos tener cargado el simulador RoboboSim, abrir el mundo FOUR WALLS y ejecutar las 3 instrucciones básicas de conexión:
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
A continuación, si ejecutas esta línea de código, el motor PAN se moverá hasta los 120º con una velocidad de 5:
rob.movePanTo(120,5)
Fíjate si se ha movido hacia la derecha o hacia la izquierda. Ahora ejecuta la siguiente línea de código, que hará que se mueva hasta -30º con una velocidad de 10.
rob.movePanTo(-30,10)
Si se desea devolver el PAN a la posición inicial, debes hacer que se mueva hasta 0º:
rob.movePanTo(0,20)
readPanPosition()
Función: Lee la posición actual de motor PAN.
Devuelve:
- La posición en grados (int): los valores devueltos están en el rango de -160 a 160.
Tras el último paso realizado en, podemos leer ahora la posición del motor PAN:
Posicion_Pan=rob.readPanPosition()
print(f"La posición actual del Pan es de {Posicion_Pan} grados.")
Motor Tilt
Este motor hace que el smartphone gire hacia arriba o hacia abajo y, de nuevo, tiene dos métodos asociados.
moveTiltTo(degrees, speed, wait=True)
Función: Mueve el motor TILT hasta la posición deseada.
Parámetros:
- degrees (int): Posición en grados del motor TILT. El rango de valores permitidos está entre 5 y 105, siendo 75 el valor central, como se observa en la figura inferior.
- speed (int): Velocidad de giro del motor TILT. El rango de valores permitidos está entre 0 y 100. Cuanto mayor es la velocidad, menos tiempo tardará en alcanzarla posición objetivo.
- wait (boolean): Indica si este método se ejecuta en modo bloqueante o no (True: modo bloqueante, False: modo no bloqueante).
Por ejemplo, la siguiente instrucción mueve el motor TILT hasta 90º con velocidad 5.
rob.moveTiltTo(90,5)
Esta otra lo mueve hasta 20º con velocidad 10.
rob.moveTiltTo(20,10)
El ángulo por defecto del TILT es de 75º, por lo que lo que puede ser interesante devolverlo a esta posición inicial:
rob.moveTiltTo(75,20)
readTiltPosition()
Función: Lee la posición actual de motor TILT.
Devuelve:
- La posición del TILT en grados (int): los valores están en rango de 5 a 105.
Ejecutando este comando a partir del último movimiento anterior obtenemos el ángulo base:
Tilt_valor=rob.readTiltPosition()
print(f"La posición actual del Tilt es de {Tilt_valor} grados.")
Modo Bloqueante y No Bloqueante
En el cuaderno anterior se explicaron los modos de funcionamiento bloqueante y no bloqueante. Como los métodos de este cuadernos también los tienen, vamos a ver más ejemplos de su utilidad.
Primero, ejecutad estos comandos para mover el Pan y el Tilt en modo bloqueante:
rob.moveTiltTo(100,20)
rob.movePanTo(140,15)
Como habrás podido ver, primero se ha girado el Tilt y después el Pan. El modo bloqueante se encarga de no empezar el movimiento del Pan hasta que termine el del Tilt.
Veamos qué pasa cuando se hace en modo no bloqueante:
rob.moveTiltTo(20,20,False)
rob.movePanTo(-140,15)
Como véis, ahora se mueve el smartphone hacia la izquierda a la vez que se baja, porque el comando del Tilt tiene el tercer parámetro a "False". No es necesario que el movimiento del Pan sea no bloqueante este ejemplo, ya que no hay nada después.
EJERCICIO 1: En un mapa cualquiera de RoboboSim, haz que el robot gire el Pan 50º hacia la izquierda a una velocidad de 10 y el Tilt se incline 70º hacia delante a una velocidad de 4.
Realiza este ejercicio primero en modo bloqueante y después en modo no bloqueante.
#MODO BLOQUEANTE
#MODO NO BLOQUEANTE
EJERCICIO 2
Haz un programa en el que Robobo avance 5 segundos a una velocidad de 25 en línea recta, después se pare y mire primero hacia la derecha después hacia la izquierda. A continuación vuelve a mirar de frente y arranca de nuevo en línes recta durante 15 segundos a velocidad 20.
El mundo a cargar será TEST PLANE
#INSERTAR CÓDIGO AQUÍ
EJERCICIO 3
Realiza un programa que realice estas acciones:
- Mover el TILT hacia los extremos (0 y 100) a una velocidad de 15
- Movel el PAN hacia los extremos (-180 y 180) a una velocidad de 20
Antes de ejecutar la secuencia, se tiene que pedir al usuario que si quiere hacerlo en modo bloqueante (S) o en modo no bloqueante (N).
- Si se hace en modo no bloqueante se tienen que ejecutar el tilt y el pan de forma simultánea en el que los dos avancen hacia un extremos , y después que ambos avancen hacia el otro extremo a la vez.
- Si se hace en modo bloqueante primero se hace primero el movimiento del TILT y hacia un extremo y después el movimiento del PAN hacia un extremo. Repetir la secuencia para los otros extremos. Para realizar este ejercicio se puede usar cualquier mapa
#INSERTAR CÓDIGO AQUÍ
EJERCICIO 4
En el mapa TEST PLANE, implementa un programa en Python que pida al usuario por teclado un número entero entre -100 y 100 que indicará la velocidad de las ruedas, y un valor real entre 1 y 5 que indicará el tiempo de dicho movimiento.
A continuación, Robobo se moverá con dichos valores a la vez que inclina el TILT hacia delante si la velocidad es positiva y hacia atrás si es negativa. Se puede usar cualquier valor para este movimiento, por ejemplo:
- Hacia delante: ángulo 5 y velocidad 50
- Hacia atrás: ángulo 105 y velocidad 30
IMPORTANTE: el movimiento del TILT debe ocurrir a la vez que el robot se mueve (modo no bloqueante).
#INSERTAR CÓDIGO AQUÍ