Aula
Objetivo da aula
- Compreender como o giroscópio (IMU) do hub funciona.
- Utilizar o
heading()para medir e corrigir o ângulo de giro. - Realizar giros precisos com base em ângulos absolutos e correções automáticas.
- Aplicar correção de trajetória (rumo reto) durante a locomoção.
1) O que é o giroscópio?
O giroscópio (parte da IMU – Unidade de Medição Inercial) detecta variações de orientação do robô.
Ele mede a rotação em graus, normalmente entre -180° e +180°.
- 0°: direção inicial (rumo padrão).
- Valores positivos: giro para a direita.
- Valores negativos: giro para a esquerda.
Dica: use
hub.imu.reset_heading(0) no início do programa para redefinir o ângulo inicial.2) Lendo o ângulo atual
Exemplo simples de leitura contínua da orientação do robô:
from pybricks.hubs import PrimeHub from pybricks.tools import wait hub = PrimeHub() hub.imu.reset_heading(0) while True: angulo = hub.imu.heading() hub.display.number(angulo) wait(100)
3) Giro até um ângulo desejado
Para girar com precisão até um ângulo alvo (ex.: 90°), o robô pode comparar o valor atual com o alvo
e ajustar as velocidades até se alinhar.
from pybricks.pupdevices import Motor from pybricks.parameters import Port, Stop mE = Motor(Port.A) mD = Motor(Port.B) hub.imu.reset_heading(0) alvo = 90 while True: erro = alvo - hub.imu.heading() if abs(erro) < 2: break vel = erro * 5 if vel > 200: vel = 200 if vel < -200: vel = -200 mE.run(-vel) mD.run(vel) mE.stop(Stop.HOLD) mD.stop(Stop.HOLD)
Dica: ajuste o ganho (multiplicador do erro) para o seu robô.
Ganho muito alto → oscila; muito baixo → demora a atingir o alvo.
Ganho muito alto → oscila; muito baixo → demora a atingir o alvo.
4) Giro usando o DriveBase
Com o DriveBase, é possível combinar giros e correções em comandos simples:
from pybricks.robotics import DriveBase robot = DriveBase(mE, mD, 56, 120) hub.imu.reset_heading(0) alvo = -45 Kp = 4.0 while True: erro = alvo - hub.imu.heading() if abs(erro) < 1: break robot.drive(0, erro * Kp) robot.stop(Stop.HOLD)
5) Manter rumo em linha reta
Mesmo motores sincronizados podem fazer o robô desviar.
O giroscópio pode corrigir automaticamente o rumo, mantendo heading() ≈ 0°.
hub.imu.reset_heading(0) Kp = 2.5 v = 250 for _ in range(50): # ~2s de movimento erro = 0 - hub.imu.heading() correcao = Kp * erro robot.drive(v, correcao) wait(40) robot.stop(Stop.BRAKE)
Boas práticas:
Use
Isso evita acumular erros de rotação ao longo da rodada.
Use
reset_heading(0) antes de cada reta longa ou nova missão.Isso evita acumular erros de rotação ao longo da rodada.
6) Curvas controladas com giroscópio
Você pode definir um ângulo alvo e girar de forma controlada, como em uma “curva assistida”:
hub.imu.reset_heading(0) alvo = 60 Kp = 3.2 v_base = 200 while abs(hub.imu.heading() - alvo) > 1: erro = alvo - hub.imu.heading() turn = erro * Kp if turn > 250: turn = 250 if turn < -250: turn = -250 robot.drive(v_base, turn) wait(20) robot.stop(Stop.HOLD)
7) Recalibração e estabilidade
- Posição inicial: mantenha o robô imóvel durante o início do programa (antes de
reset_heading()). - Vibrações e impacto: giroscópio é sensível — evite pancadas na base do hub.
- Drift (deriva): após longas sessões, os valores podem deslocar levemente. Resete o heading a cada missão.
- Suavidade: evite giros abruptos acima de 500°/s para não gerar leituras inconsistentes.
Erros comuns
- Não resetar o heading: faz o robô “achar” que está em outro ângulo.
- Loop sem condição: se o erro nunca fica < 1°, o robô pode girar indefinidamente (use
abs()). - Ganho alto (Kp): faz o robô “oscilar” perto do alvo.
- Uso de baterias fracas: pode afetar a resposta do controle.
Atividades práticas
- Leia o
heading()continuamente e observe o valor ao girar o robô com a mão. - Programe um giro de 90° para a direita e outro de 45° para a esquerda.
- Faça o robô andar em linha reta com correção por giroscópio (rumo = 0°).
- Combine o giroscópio com o segue-linha: enquanto segue a linha, corrija o rumo se o desvio angular for > 5°.