Gyroskop und Beschleunigungssensor
Gyroskop
Abschnitt betitelt „Gyroskop“Das Gyroskop liefert die Drehgeschwindigkeit des Roboters um jede Achse in Radiant pro Sekunde. Beim Starter-Roboter heißt es gyro.
getValues() gibt [x, y, z] zurück. Die Y-Achse ist vertikal, also ist getValues()[1] die Drehgeschwindigkeit des Roboters. Sie ist positiv, wenn er sich nach links dreht.
Beispiel: um 90 Grad drehen
Abschnitt betitelt „Beispiel: um 90 Grad drehen“Addiere die Drehgeschwindigkeit multipliziert mit dem Zeitschritt auf, um den gedrehten Winkel zu erhalten. Das ist zuverlässiger, als die Drehung nach Zeit zu steuern, weil es nicht von der Geschwindigkeit abhängt.
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;}In einem Test mit dem Starter-Roboter stimmte der so berechnete Winkel bis auf 0,01 Radiant mit der echten Drehung überein. Kleine Fehler summieren sich im Lauf eines Spiels, also korrigiere die Ausrichtung, wann immer du kannst, zum Beispiel indem du dich an einer Wand ausrichtest.
Beschleunigungssensor
Abschnitt betitelt „Beschleunigungssensor“Der Beschleunigungssensor liefert die Beschleunigung entlang jeder Achse in m/s². Beim Starter-Roboter heißt er accelerometer. In Ruhe liefert getValues()[1] etwa 9,8, also die Schwerkraft.
Inertialsensor
Abschnitt betitelt „Inertialsensor“Der Starter-Roboter hat keinen Inertialsensor (Inertial Unit). Mit dem Robot Customizer kannst du einen hinzufügen, der standardmäßig inertial_unit heißt. Er liefert die Ausrichtung direkt mit getRollPitchYaw(), statt dass du Drehgeschwindigkeiten aufaddieren musst. Siehe die Webots-Referenz.
