Giroscópio e acelerômetro
Giroscópio
Seção intitulada “Giroscópio”O giroscópio retorna a velocidade de rotação do robô em torno de cada eixo, em radianos por segundo. No robô inicial, ele se chama gyro.
getValues() retorna [x, y, z]. O eixo Y é vertical, então getValues()[1] é a velocidade com que o robô gira. Ela é positiva quando ele gira para a esquerda.
Exemplo: girando 90 graus
Seção intitulada “Exemplo: girando 90 graus”Some a velocidade de rotação multiplicada pelo passo de tempo para obter o ângulo girado. Isso é mais confiável do que controlar o giro pelo tempo, porque não depende da velocidade.
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;}Em um teste com o robô inicial, o ângulo calculado dessa forma bateu com a rotação real com uma diferença de menos de 0,01 radiano. Pequenos erros se acumulam ao longo de uma partida, então corrija a direção quando puder, por exemplo alinhando o robô com uma parede.
Acelerômetro
Seção intitulada “Acelerômetro”O acelerômetro retorna a aceleração ao longo de cada eixo em m/s². No robô inicial, ele se chama accelerometer. Em repouso, getValues()[1] vale cerca de 9,8, que é a gravidade.
Unidade inercial
Seção intitulada “Unidade inercial”A unidade inercial não faz parte do robô inicial. Com o Robot Customizer, você pode adicionar uma, chamada inertial_unit por padrão. Ela fornece a orientação diretamente, com getRollPitchYaw(), sem precisar somar velocidades de rotação. Veja a referência do Webots.
