Aller au contenu
Français

Gyroscope et accéléromètre

Le gyroscope renvoie la vitesse de rotation du robot autour de chaque axe, en radians par seconde. Sur le robot de départ, il s’appelle gyro.

getValues() renvoie [x, y, z]. L’axe Y est vertical : getValues()[1] est donc la vitesse de rotation du robot. Elle est positive quand il tourne vers la gauche.

Tourner vers la gauche donne une valeur positive, et tourner vers la droite une valeur négative

Additionnez la vitesse de rotation multipliée par le pas de temps pour obtenir l’angle parcouru. C’est plus fiable que de piloter le virage à la durée, car cela ne dépend pas de la vitesse.

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")

Lors d’un test sur le robot de départ, l’angle calculé de cette façon correspondait à la rotation réelle à 0,01 radian près. Les petites erreurs s’accumulent au cours d’une partie : corrigez donc l’orientation quand vous le pouvez, par exemple en vous alignant sur un mur.

L’accéléromètre renvoie l’accélération le long de chaque axe en m/s². Sur le robot de départ, il s’appelle accelerometer. Au repos, getValues()[1] vaut environ 9,8 : c’est la gravité.

La centrale inertielle (inertial unit) n’est pas présente sur le robot de départ. Avec le Robot Customizer, vous pouvez en ajouter une, nommée inertial_unit par défaut. Elle donne directement l’orientation, avec getRollPitchYaw(), sans avoir à additionner les vitesses de rotation. Consultez la référence Webots.