Para controlar los motores debemos seguir los siguientes pasos:
NOTA: Los radianes son una forma de medir ángulos al igual que los grados sexagesimales. Podemos convertir entre radianes y grados usando las siguientes fórmulas:
- radianes = grados * PI / 180
- grados = radianes * 180 / PI
Para obtener cada objeto Motor debemos ejecutar el método robot.getDevice
pasando como parámetro el nombre del motor:
En el siguiente ejemplo se pueden observar los 3 pasos antes mencionados para mover el motor izquierdo a la máxima velocidad permitida.
from controller import Robot
TIME_STEP = 32
MAX_VEL = 6.28 # Velocidad máxima (1 vuelta por segundo)
robot = Robot()
wheelL = robot.getDevice("wheel1 motor") # Paso 1
wheelL.setPosition(float("inf")) # Paso 2
while robot.step(TIME_STEP) != -1:
wheelL.setVelocity(MAX_VEL) # Paso 3
La velocidad máxima de cada motor es 6,28 radianes/s, lo cual equivale a una vuelta completa cada segundo. Si superamos la velocidad máxima webots muestra un error en la consola, por lo cual recomendamos usar una variable global (MAX_VEL, en este caso) para guardar la velocidad máxima y poder referirnos a ella a la hora de establecer la velocidad final del motor.
Para mover el robot en el mapa, sin embargo, no alcanza con controlar el motor izquierdo, necesitamos ambos motores. Dependiendo de la velocidad que asignemos a cada motor vamos a obtener diferentes tipos de movimientos.
Para avanzar, por ejemplo, debemos asignar la misma velocidad a ambos motores:
wheelL.setVelocity(MAX_VEL)
wheelR.setVelocity(MAX_VEL)
Para retroceder usamos la misma velocidad en ambos motores, pero en sentido inverso (nótese el signo):
wheelL.setVelocity(-MAX_VEL)
wheelR.setVelocity(-MAX_VEL)
Si queremos hacer que el robot gire, vamos a asignar diferentes velocidades a cada motor. El tipo de giro más sencillo que podemos realizar es una rotación sobre el centro del robot. Para ello, asignamos la misma velocidad a cada motor pero en uno de los dos invertimos el signo (es decir, hacemos que uno de los dos motores gire en sentido contrario al otro). Dependiendo del sentido de giro que deseamos obtener, invertiremos uno u otro motor.
Para rotar en sentido horario (o hacia la derecha, visto desde la perspectiva del robot) debemos entonces invertir el sentido del motor derecho:
wheelL.setVelocity(MAX_VEL)
wheelR.setVelocity(-MAX_VEL)
Por el contrario, si deseamos girar en sentido anti-horario (o hacia la izquierda), invertiremos el motor izquierdo:
wheelL.setVelocity(-MAX_VEL)
wheelR.setVelocity(MAX_VEL)
Los motores del robot e-puck incluyen también encoders que permiten determinar cuánto giró el motor. Para acceder a los valores de los encoders debemos seguir los siguientes pasos:
En el siguiente ejemplo habilitamos el encoder del motor izquierdo y mostramos en la consola su posición mientras el motor gira a un 10% de su velocidad máxima.
from controller import Robot
TIME_STEP = 32
MAX_VEL = 6.28 # Velocidad máxima (1 vuelta por segundo)
robot = Robot()
wheelL = robot.getDevice("wheel1 motor")
wheelL.setPosition(float("inf"))
encoderL = wheelL.getPositionSensor() # Paso 1
encoderL.enable(TIME_STEP) # Paso 2
while robot.step(TIME_STEP) != -1:
wheelL.setVelocity(0.1*MAX_VEL)
pos = encoderL.getValue() # Paso 3
print(f"La posición del motor es {pos} radianes")
Para cada ejercicio se pide armar un programa controlador distinto y entregar los archivos de código.