Ir al contenido
Español

Giroscopio y acelerómetro

El giroscopio devuelve la velocidad de rotación del robot alrededor de cada eje, en radianes por segundo. En el robot inicial se llama gyro.

getValues() devuelve [x, y, z]. El eje Y es vertical, así que getValues()[1] es la velocidad de giro del robot. Es positiva cuando gira hacia la izquierda.

Girar a la izquierda da un valor positivo, y girar a la derecha, un valor negativo

Suma la velocidad de rotación multiplicada por el paso de tiempo para obtener el ángulo girado. Es más fiable que controlar el giro por tiempo, porque no depende de la velocidad.

from controller import Robot
import math
robot = Robot()
timestep = int(robot.getBasicTimeStep())
left = robot.getDevice("left wheel motor")
right = robot.getDevice("right wheel motor")
left.setPosition(float("inf"))
right.setPosition(float("inf"))
gyro = robot.getDevice("gyro")
gyro.enable(timestep)
def turnLeft(angle):
turned = 0
left.setVelocity(-2)
right.setVelocity(2)
while abs(turned) < angle and robot.step(timestep) != -1:
turned += gyro.getValues()[1] * timestep / 1000 # Speed multiplied by the time, in seconds
left.setVelocity(0)
right.setVelocity(0)
turnLeft(math.pi / 2)
print("Turned 90 degrees")

En una prueba con el robot inicial, el ángulo calculado así coincidió con la rotación real con un margen de 0,01 radianes. Los pequeños errores se acumulan a lo largo de una partida, así que corrige la orientación cuando puedas, por ejemplo alineándote con una pared.

El acelerómetro devuelve la aceleración a lo largo de cada eje en m/s². En el robot inicial se llama accelerometer. En reposo, getValues()[1] devuelve unos 9,8, que es la gravedad.

La unidad inercial no está en el robot inicial. Con el Robot Customizer puedes añadir una, llamada inertial_unit por defecto. Da la orientación directamente, con getRollPitchYaw(), en lugar de tener que sumar velocidades de rotación. Consulta la referencia de Webots.