搭建路径高级两到三个周末

做一台能自主行驶的 GPS 航点漫游车

一台漫游车:能自己在草地上按一串保存好的 GPS 航点行驶,偏离路线不超过一米,一旦跑出电子围栏就会自行停车。

做一台能自主行驶的 GPS 航点漫游车 技术示意图LOOKAHEADGOAL POINTCOMMANDED PATH

做的是什么

你交给它一串坐标、把它放到草地上、然后转身走开的一台机器人。

本站其他移动机器人都只对正前方的东西作出反应——线、墙、障碍、边界。这一台执行的是一份计划,周围没有任何地标,依靠的传感器每分钟还要骗它几次。正是这个组合,让它成了本站最难的移动机器人,也成了教得最多的一个。

决定成败的三件事

路径跟踪器是最简单的部分。纯跟踪只有十二行代码和一个可调参数。位置估计完美时,在实验场地上它的 RMS 误差能保持在 0.09 m。

**位置估计才是整个项目。**同一个控制器,喂给它 1 Hz、带米级噪声的 GPS 定位,误差会变成 1.25 m——差了十四倍,而且为此要多花四倍半的转向量。最终误差里,控制器贡献的还不到十分之一。

**所以制作顺序是:先在室内做跟踪器,再去户外做估计。**在位置几乎精确的地方先把转向验证好,然后再去和传感器硬碰硬。两件事同时做,只会做出一台游荡得不明所以的机器人。

物料清单

零件 数量 大致价格 备注
Arduino Uno 或 Mega 1 $5–12 选 Mega 很划算:四个中断引脚足以做完整的 ×4 编码器解码,另外还有富余的 UART
GPS 模块(NEO-6M) 1 $8–12 NEO-M8N 是这里最值得做的一处升级——支持多星座,卫星几何更好
MPU-6050 1 $2 在两次定位之间维持航向。没有它,漫游车就无法知道自己朝哪个方向
N20 编码器电机 2 $16 编码器在这台机器上不是可选项
TB6612FNG 1 $3
两轮底盘 1 $10–20 户外用大一点的轮子有帮助;草地对 65 mm 的轮子并不友好
电池包 1 $10 2 节 18650 带保护板,或者 3S 配稳压
高位天线座 1 $2 贴片天线要的是天空而不是视野——头顶有金属就会损失卫星

合计大约 $55–80。

对项目影响最大的改动是接收机。NEO-6M 能用,大多数教程也都默认用它;NEO-M8N 除了 GPS 还能看到 GLONASS 和 Galileo 卫星,这会改善卫星几何,从而改善 HDOP。在建筑物和树木附近——也就是漫游车真正会跑的地方——这带来的现实提升比精度指标所暗示的还要大。

不要为了省 12 美元就省掉编码器。整个项目就是航位推算加上偶尔的定位修正;没有编码器就根本没有东西可以用来推算,漫游车只能一路追着 GPS 的噪声跑。

制作顺序

**1——先在模拟器里调跟踪器。**在路径跟踪实验台里,以你打算实际行驶的速度,花上一个小时。找出误差曲线落到最低点时的前视距离;注意速度一改,这个值就会变。

**2——搭好传动,让里程计工作。**把编码器接入差速驱动里程计,然后走一个 2 m 的正方形,看看终点离起点差多远。这个数就是你室内的误差预算。

**3——把航向融合进来。**用陀螺仪以控制回路的频率提供航向,再由某个绝对参考来修正它。航向误差是两种控制器里权重都最高的项,也是里程计最先丢掉的项——让平衡车站稳的那个互补滤波在这里干的是同一件事。

**4——在室内跟一条胶带赛道。**不用 GPS。在地上贴一条路径,用编码器估计跑纯跟踪,并在十个点上用直尺量横向误差。室内做不到 10 cm 以内,户外就不可能做到 1 m 以内。

**5——加上接收机,但先不要接到控制器上。**让漫游车静置十分钟,把定位结果记录下来并画成图。你会看到噪声、偶尔的跳变,以及 HDOP 如何同时反映出这两者。这张图比任何数据手册上的指标都更有价值。

**6——做融合,不要直接跟随。**以控制回路的频率做航位推算;在每次拿到好的定位时,轻轻把估计值往它那边拉一些。算术和门控逻辑在这里。任何状态为无解(void)或 HDOP 高于约 2.5 的数据都要丢掉。

**7——先设围栏,再出门。**设定离起点的最大距离、任务超时、硬性切断。然后在草地上走一次短任务,你在旁边跟着走。

值得注意的硬件细节

**天线装在顶部、朝向天空,并且远离一切。**陶瓷贴片天线装在底盘板下面会丢卫星,而丢卫星带来的不是彻底没有定位,而是几何变差——结果是一个自信的错误答案,而不是一次明显的失败。

**轮子要比室内的直觉更大。**草地、碎石和草坪边缘都是轮径问题。它们也会改变里程计的尺度系数,所以要在你真正要跑的地面上重新标定。

**磁力计要远离电机,否则干脆别用。**电机电流产生的磁场会淹没地磁场。如果你无法留出 15 cm 的间距,就改用陀螺仪加上对地航向来回避这个问题。

**把任务过程记录下来。**没有记录的户外故障就是没法调试的故障——机器人当时在 40 m 外,而你根本没在看串口。用 SD 卡或 Wi-Fi 记录位姿、定位、HDOP 和横向误差,就能让每一次运行都变成证据。

**第一次户外运行要预期它会提前结束。**这正是围栏的用途,而且这算成功。

做到什么程度算好

测量项 直接跟随原始 GPS 与里程计融合
横向误差 RMS 3–5 m 0.3–0.6 m
横向误差,最坏情况 8–12 m 1.0–1.5 m
转向动作量 持续而幅度很大的修正 平滑,偶尔才有
航点到达容差 5 m,而且这个值都算乐观 0.5–1 m
静止时的位置漂移 2–4 m 的散布 不适用——里程计会把它定住

第一列不代表车做得差;它只是说明,1 Hz、2.5 m CEP 的定位喂给一个信任它的控制器时会变成什么样。第二列在数量级上的改善来自估计器,而不是控制器——纯跟踪的代码还是同一份,只是喂进去的是融合后的位姿。

在写任何导航代码之前,先做一次这件事:把接收机在户外静放十分钟,记录每一个定位点。你得到的散布有好几米宽,而车根本没动。这张图是本项目中最值得一看的东西,因为它解释了为什么直接跟随原始定位行不通,也解释了为什么答案在控制器的上游。

出问题时看这张表

现象 通常原因
户外走直线时呈蛇形,室内正常 直接跟随原始定位而没有做融合
室内也呈蛇形 前视距离相对滞后量太短;回实验台重调
每个弯都被切掉 前视距离太长——这是权衡的结果,不是缺陷
位置很自信,却偏出几十米 卫星几何太差;没有对 HDOP 做门控
静止起步时朝反方向走 没有可用的航向;速度低于约 1 m/s 时对地航向全是噪声
稳定地往一侧漂 里程计尺度或轮距在这个地面上不对
头两分钟什么也不发生 GPS 冷启动。把这一点演示出来,不要假设起点就是原点
跑出了场地 测试前没有写围栏

这八条里有六条属于感知而不是控制——微型迷宫鼠和覆盖机器人也是同样的分布,原因是同一个:算法只占很小一部分。

想按顺序走完整套流程,就跟着路径跟踪路线图做;同一个问题的室内版本是房间覆盖机器人,它需要一份计划,却完全不需要绝对位置。

项目路线图

搭建路径

沿着技术树,从零件一路走到一台能正常工作的机器人。每个节点在其前置条件完成后解锁,你的进度会保存在这台设备上。

已完成 0 / 20

100%
搭建

先在室内跟踪路径

制作

搭建

第一次场地测试前先设围栏

制作

目标

独立完成一次任务

目标

元器件

本路径中的教程

接线之前先练习

用在线模拟器把它调好

搭建路径会经过一个浏览器实验台。先在这里把行为调对,再把参数迁移到真实的机器人上。

常见问题解答

为什么要先在室内做好跟踪器,再加 GPS?

因为如果两样同时做,车一乱跑,你就分不清是哪一半出了问题。在室内靠编码器跑一条胶带赛道,位置估计能精确到几厘米以内,所以你看到的任何误差都来自控制器。先在那里把前视距离调好,用直尺量出横向误差,然后才引入一个有噪声、有延迟、偶尔还会自信地给出错误答案的传感器。按这个顺序多花的每一个小时,都会得到双倍的回报。

一台业余 GPS 漫游车实际能有多精确?

状态好的时候,横向误差大约一米,而这个数由接收机决定,而不是由你的控制器决定。在同一条路线上用同一个纯跟踪控制器实测,完美的位置估计给出 0.09 米的 RMS 误差,而带米级噪声的 1 Hz 定位给出 1.25 米——所以控制器贡献的还不到总误差的十分之一。如果你需要更好的精度,该升级的是更快、支持多星座的接收机,然后是 RTK,而不是继续调参。

除了陀螺仪,还需要磁力计吗?

你需要某种绝对的航向参考,而你有三个选择。磁力计在静止时就能给出航向,但需要做硬铁和软铁校准,而且非常怕靠近电机。陀螺仪在几十秒内表现出色,之后就会漂移。GPS 的对地航向是绝对的,而且不花钱,但只有在速度高于大约每秒一米时才有意义。漫游车的常见做法是用陀螺仪提供控制回路频率的航向,并在机器人速度快到对地航向可信时用它来修正——这正是本制作的做法,而且完全省掉了校准。

它应该开多快?

比电机允许的要慢,模拟器会告诉你原因。无论怎么调,能达到的最佳横向误差都会随速度增长:在位置估计完美的实验台上,1 m/s 时的 0.05 米到 3 m/s 时会变成 0.23 米。到了户外,误差本来就由接收机主导,所以提速几乎得不到什么好处,却可能在第一次场地测试中损失惨重。从 0.5 m/s 起步。

什么能防止它开进马路或池塘?

在第一次户外运行之前写好的电子围栏:设定离任务起点的最大距离,在主循环的最开头检查,一旦超出就无条件停下电机。再加上任务超时和一个你够得着的物理切断开关——顶板上装一个碰撞开关就行,而且不需要无线链路。这只是十行代码,却决定了你遇到的只是一个程序缺陷,还是一台掉进水里的机器人。

可以用 ESP32 代替 Uno 吗?

可以,而且对这个项目来说它是更好的选择。你能获得第二个硬件串口来接 GPS,不必使用软件串口;有多得多的内存来存放航点列表;浮点运算也不再痛苦;还有 Wi-Fi,可以把任务过程记录回传到笔记本电脑——这是户外机器人所能拥有的最有用的调试工具。Uno 也能用;ESP32 则去掉了三处烦恼。