陀螺仪直行与转弯
编码器管"走多远",陀螺仪管"朝哪走"。两个结合,机器人才能在 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-3 度。实测:命令转 90,量实际转角,差多少提前多少。速度越快提前量越大。
- 降速转弯:转弯前
设置移动速度 [25] %,惯性小、重复性好。转完恢复速度。 - 两段式转弯(高精度需求):先全速转到差 15 度,再以 10% 速度慢慢逼近目标角。慢速段几乎无惯性,可以把提前量降到 0-1 度。
wordblocks
定义 精准右转 (角度)
重设偏航角 [0]
开始移动 [转向 100]
等待到 <偏航角 > ((角度) - [15])>
设置移动速度 [10] %
开始移动 [转向 100]
等待到 <偏航角 > ((角度) - [1])>
停止移动
设置移动速度 [50] %原地转 vs 单轮转
| 方式 | steering | 特点 |
|---|---|---|
| 原地转(spin) | ±100 | 转弯中心在两轮中点,占地小,最常用 |
| 单轮转(pivot) | ±50 | 绕一个轮子转,转弯半径 = 轮距,适合贴着模型绕过去 |
两种都可以做成带角度参数的 My Block。
漂移管理
陀螺仪会漂移(静止时读数缓慢变化),长程序里误差累积:
- 每次出发前,机器人在基地摆正后再启动程序(启动瞬间的朝向就是 0 度基准)。
- 程序中段利用靠墙动作(见 FLL 实战技巧)重设偏航角,把累积误差清零。
- hub 静止时开机/启动程序,运动中启动会让初始基准就是错的。
练习
- 实测你的机器人的转弯提前量:命令 90 度,重复 5 次,记录实际角度取平均。
- 做一个
陀螺直行 (距离cm) (目标角)双参数 My Block,走"直行 50 → 右转 90 → 直行 30"验证末端位置的重复性,和不用陀螺仪的版本对比。
常见问答
为什么每次陀螺仪转弯都差几度?
停止指令发出后惯性还会带着机器人多转 1-3 度。实测你的提前量并从目标角里扣除,或用两段式转弯:先快转到差 15 度,再以 10% 速度慢慢逼近。
机器人静止不动,偏航角为什么还在变?
陀螺仪存在漂移,静止读数也会缓慢变化。每次出发前重设偏航角,长程序里利用靠墙动作把累积误差清零。
为什么 Python 里的陀螺仪转弯永远等不到结束?
SPIKE App 3 的原始 yaw 是左转为正,与 Word Blocks 相反。等待条件的符号写反就会死等——用取负号的 yaw() 辅助函数统一成右转为正(见本站 Python 篇)。
下一课:FLL 实战技巧,把所有技术拼成拿分组合。