Gyroscope et accéléromètre
Gyroscope
Section intitulée « Gyroscope »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.
Exemple : tourner de 90 degrés
Section intitulée « Exemple : tourner de 90 degrés »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 Robotimport 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")#include <cmath>#include <iostream>#include <webots/Robot.hpp>#include <webots/Motor.hpp>#include <webots/Gyro.hpp>
using namespace webots;
Robot *robot;Motor *leftMotor, *rightMotor;Gyro *gyro;int timeStep;
void turnLeft(double angle) { double turned = 0; leftMotor->setVelocity(-2); rightMotor->setVelocity(2); while (fabs(turned) < angle && robot->step(timeStep) != -1) turned += gyro->getValues()[1] * timeStep / 1000.0; // Speed multiplied by the time, in seconds leftMotor->setVelocity(0); rightMotor->setVelocity(0);}
int main() { robot = new Robot(); timeStep = (int)robot->getBasicTimeStep();
leftMotor = robot->getMotor("left wheel motor"); rightMotor = robot->getMotor("right wheel motor"); leftMotor->setPosition(INFINITY); rightMotor->setPosition(INFINITY);
gyro = robot->getGyro("gyro"); gyro->enable(timeStep);
turnLeft(M_PI / 2); std::cout << "Turned 90 degrees" << std::endl;
delete robot; return 0;}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.
Accéléromètre
Section intitulée « Accéléromètre »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é.
Centrale inertielle
Section intitulée « Centrale inertielle »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.
