Giroskop dan akselerometer
Giroskop
Section titled “Giroskop”Giroskop mengembalikan kecepatan rotasi robot terhadap setiap sumbu, dalam radian per detik. Pada robot pemula, namanya gyro.
getValues() mengembalikan [x, y, z]. Sumbu Y adalah sumbu vertikal, jadi getValues()[1] adalah kecepatan belok robot. Nilainya positif saat berbelok ke kiri.
Contoh: berbelok 90 derajat
Section titled “Contoh: berbelok 90 derajat”Jumlahkan kecepatan rotasi dikalikan dengan time step untuk mendapatkan besar sudut putarnya. Cara ini lebih andal daripada mengendalikan belokan berdasarkan waktu, karena tidak bergantung pada kecepatan.
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;}Dalam pengujian dengan robot pemula, sudut yang dihitung dengan cara ini cocok dengan rotasi sebenarnya hingga selisih 0,01 radian. Kesalahan kecil akan menumpuk selama permainan, jadi koreksi arah robot bila memungkinkan, misalnya dengan menyejajarkannya dengan dinding.
Akselerometer
Section titled “Akselerometer”Akselerometer mengembalikan percepatan di sepanjang setiap sumbu dalam m/s². Pada robot pemula, namanya accelerometer. Saat diam, getValues()[1] terbaca sekitar 9,8, yaitu gravitasi.
Unit inersia
Section titled “Unit inersia”Unit inersia (inertial unit) tidak ada di robot pemula. Dengan Robot Customizer kamu bisa menambahkannya, dengan nama bawaan inertial_unit. Unit ini memberikan orientasi secara langsung, dengan getRollPitchYaw(), jadi kamu tidak perlu menjumlahkan kecepatan rotasi. Lihat referensi Webots.
