Pular para o conteúdo
Português (Brasil)

Giroscópio e acelerômetro

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.

Girar para a esquerda dá um valor positivo, e girar para a direita, um valor negativo

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 Robot
import 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")

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.

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.

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.