跳到主要内容

陀螺仪直行与转弯

编码器管"走多远",陀螺仪管"朝哪走"。两个结合,机器人才能在 2 米多长的场地上精确导航。

为什么直行会歪

两个马达标称一样,实际输出总有微小差异;轮子打滑、场地不平、出发手抖都会让"直行"越走越歪。走 1 米歪 2 度,末端偏差就是 3.5 cm——足够错过一个模型。

解法:用陀螺仪 yaw 实时纠偏,歪了立刻拉回来。

陀螺仪直行(P 控制)

原理和巡线的 P 控制一模一样,只是"偏差"从反射光变成了偏航角:

wordblocks
定义 陀螺直行 (距离cm)
重设偏航角 [0]
设置 [Kp][2]
马达 [A] 重设角度 [0]                      ← 用编码器测距离
重复执行直到 <(马达 [A] 角度) > ((距离cm) * [每cm度数])>
  开始移动 [转向 ((0 - (偏航角)) * (Kp))]
停止移动
  • 目标 yaw 是 0,偏差 = 0 − 当前 yaw。机器人右歪(yaw 变正)→ 转向量为负 → 向左修。
  • 每cm度数 = 360 / 轮周长 cm,提前算好存变量。
  • Kp 从 2 开始调:蛇形抖动就减小,回正太慢就加大。

这个积木只处理前进

距离传了负数,循环条件"编码器 > 负目标"一开始就成立,积木会立即退出,并不会倒车。回程要倒车就直接用 移动 [后退] [x] cm(回程通常不需要陀螺精度);确实需要"陀螺倒车"再做一个方向取反的变体积木。

想直行到任意朝向?

把"重设偏航角 0"去掉,加一个 目标角 参数,偏差 = 目标角 − 当前 yaw。这样转弯后不用重设,直接沿新朝向直行,朝向误差不会因分段切换而累积(陀螺漂移和打滑带来的误差仍然存在,见下文"漂移管理")。

陀螺仪转弯

Hub 传感器一课给过基础版,这里是要点:

wordblocks
定义 转弯 (角度)
重设偏航角 [0]
如果 <(角度) > [0]> 那么
  开始移动 [转向 100]
  等待到 <偏航角 > ((角度) - [提前量])>
否则
  开始移动 [转向 -100]
  等待到 <偏航角 < ((角度) + [提前量])>
停止移动

精度三招

  1. 提前量:停止后惯性会多转 1-3 度。实测:命令转 90,量实际转角,差多少提前多少。速度越快提前量越大。
  2. 降速转弯:转弯前 设置移动速度 [25] %,惯性小、重复性好。转完恢复速度。
  3. 两段式转弯(高精度需求):先全速转到差 15 度,再以 10% 速度慢慢逼近目标角。慢速段几乎无惯性,可以把提前量降到 0-1 度。
wordblocks
定义 精准右转 (角度)
重设偏航角 [0]
开始移动 [转向 100]
等待到 <偏航角 > ((角度) - [15])>
设置移动速度 [10] %
开始移动 [转向 100]
等待到 <偏航角 > ((角度) - [1])>
停止移动
设置移动速度 [50] %

原地转 vs 单轮转

方式steering特点
原地转(spin)±100转弯中心在两轮中点,占地小,最常用
单轮转(pivot)±50绕一个轮子转,转弯半径 = 轮距,适合贴着模型绕过去

两种都可以做成带角度参数的 My Block。

漂移管理

陀螺仪会漂移(静止时读数缓慢变化),长程序里误差累积:

  • 每次出发前,机器人在基地摆正后再启动程序(启动瞬间的朝向就是 0 度基准)。
  • 程序中段利用靠墙动作(见 FLL 实战技巧)重设偏航角,把累积误差清零。
  • hub 静止时开机/启动程序,运动中启动会让初始基准就是错的。

练习

  1. 实测你的机器人的转弯提前量:命令 90 度,重复 5 次,记录实际角度取平均。
  2. 做一个 陀螺直行 (距离cm) (目标角) 双参数 My Block,走"直行 50 → 右转 90 → 直行 30"验证末端位置的重复性,和不用陀螺仪的版本对比。

常见问答

为什么每次陀螺仪转弯都差几度?

停止指令发出后惯性还会带着机器人多转 1-3 度。实测你的提前量并从目标角里扣除,或用两段式转弯:先快转到差 15 度,再以 10% 速度慢慢逼近。

机器人静止不动,偏航角为什么还在变?

陀螺仪存在漂移,静止读数也会缓慢变化。每次出发前重设偏航角,长程序里利用靠墙动作把累积误差清零。

为什么 Python 里的陀螺仪转弯永远等不到结束?

SPIKE App 3 的原始 yaw 是左转为正,与 Word Blocks 相反。等待条件的符号写反就会死等——用取负号的 yaw() 辅助函数统一成右转为正(见本站 Python 篇)。

下一课:FLL 实战技巧,把所有技术拼成拿分组合。

© 2026 FLL 知识库 · 保留所有权利