Giroscopio y acelerómetro
Giroscopio
Sección titulada «Giroscopio»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.
Ejemplo: girar 90 grados
Sección titulada «Ejemplo: girar 90 grados»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 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;}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.
Acelerómetro
Sección titulada «Acelerómetro»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.
Unidad inercial
Sección titulada «Unidad inercial»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.
