Jiroskop ve ivmeölçer
Jiroskop
Bölüm başlığı “Jiroskop”Jiroskop, robotun her eksen etrafındaki dönüş hızını radyan/saniye cinsinden verir. Başlangıç robotunda adı gyro’dur.
getValues(), [x, y, z] döndürür. Y ekseni dikeydir, bu yüzden getValues()[1] robotun dönüş hızıdır. Robot sola dönerken pozitiftir.
Örnek: 90 derece dönme
Bölüm başlığı “Örnek: 90 derece dönme”Dönülen açıyı bulmak için dönüş hızını zaman adımıyla çarpıp topla. Bu yöntem, dönüşü süreyle kontrol etmekten daha güvenilirdir, çünkü hıza bağlı değildir.
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;}Başlangıç robotunda yapılan bir testte, bu şekilde hesaplanan açı gerçek dönüşten en fazla 0,01 radyan farklıydı. Küçük hatalar bir oyun boyunca birikir; bu yüzden fırsat buldukça robotun yönünü düzelt (örneğin bir duvara hizalayarak).
İvmeölçer
Bölüm başlığı “İvmeölçer”İvmeölçer, her eksen boyunca ivmeyi m/s² cinsinden verir. Başlangıç robotunda adı accelerometer’dır. Robot dururken getValues()[1] yaklaşık 9,8 değerini verir; bu, yerçekimi ivmesidir.
Eylemsizlik birimi
Bölüm başlığı “Eylemsizlik birimi”Eylemsizlik birimi (inertial unit) başlangıç robotunda yoktur. Robot Customizer ile bir tane ekleyebilirsin; varsayılan adı inertial_unit’tir. Bu birim, dönüş hızlarını toplamana gerek kalmadan yönelimi doğrudan getRollPitchYaw() ile verir. Webots başvurusuna bak.
