教程 · 中级 · 25 分钟

横向误差:衡量路径跟踪得有多好

判断路径跟踪器好坏的那个数字:如何如实测量它,以及为什么 Stanley 在弯道外侧甩得更宽,而纯跟踪则切向内侧。

一个带符号的数

**横向误差是机器人到路径的垂直距离,带符号。**行进方向左侧为正,右侧为负。定义就这么多,而它是路径跟踪器唯一诚实的记分牌。

这个符号比看上去重要得多。无符号距离只告诉你机器人偏了 20 cm;带符号的告诉你偏在哪一边——这是任何控制器都需要的,也是误差曲线变得可读的原因:偏置表现为一个固定的偏移,振荡表现为一条正弦,弯道表现为一个方向已知的尖峰。

不自欺地测它

三个陷阱,按人们掉进去的顺序排列。

不要对着估计值去测。如果机器人认为自己就在路径上,那么它自己报告的误差天然就是零。横向误差必须对照真值来打分——卷尺、全站仪、动作捕捉设备,或者在仿真里对照模型积分出的真实位姿。在路径跟踪模拟器里,控制器看到的是一个可能带噪声的定位,而误差始终由真值算出,这也是 GPS 惩罚项之所以能成为一个数字的唯一原因。

**符号要从路径坐标系取,不要用叉乘测试。**最自然的实现是测试机器人在当前线段的哪一侧。而当投影越过一个路点时这个符号会不连续翻转,配合任何执行器滞后,指令就会在满量程上抖动,而轮子几乎不动——这看起来和一个坏掉的控制器一模一样。改成投影到路径上,取路径自身坐标系里的横向分量:

float h = pathHeadingAt(s);                       // tangent direction there
float e = -(x - px) * sinf(h) + (y - py) * cosf(h);  // + is left of travel

**在附近搜,不要到处搜。**在一条会折返回来的路径上做全局最近点搜索,会高高兴兴地匹配上一分钟你刚走过的那一段。保留上一次的弧长,在它周围的一个窗口里搜索——向后几米,向前足够覆盖前视距离。

还有第四个陷阱更隐蔽,也曾让一个能用的控制器彻底失灵:在弯道处,相邻两段会以相同的距离投影到同一个顶点。如果保留进入的那一段,那么航向误差和横向偏移都约等于零,于是一个只根据这两项来转向的控制器会完全自信地笔直开出路径。把这种平局判给离开的那一段。

均方根、最坏情况,以及误差住在哪里

要报三个数字,因为每一个都藏着别的能看出来的东西。

  • 均方根误差是诚实的平均值。你调的就是它。
  • 最坏情况决定机器人能不能挤过那条走廊。0.12 m 均方根配 0.50 m 峰值,和 0.12 m 均方根配 0.15 m 峰值,是两台不同的机器。
  • 沿路径距离画出的误差显示的是在哪里。就是这张图能告诉你,你遇到的是调参问题还是几何问题。

第三项正是模拟器要画它的原因。前视距离短会在整条路径上产生抖动;前视距离长则在直道上干净,只在弯道处出现尖峰。均方根可能完全一样。

两种控制器,两种失效形状

纯跟踪瞄准前方一点,然后沿那段圆弧行驶。Stanley——赢得 2005 年 DARPA 大挑战赛的控制器——以前轴为参考,把两项相加来转向:

δ = θ_e + atan(k · e / v)

第一项让机器人和路径方向对齐。第二项把横向误差变成转向角,而除以速度正是让同一个增益在 1 m/s 和 10 m/s 下表现一致的原因。

上下两栏。上面一栏是赛道上某个弯角的特写,虚线是指令路径,纯跟踪的路线从弯道内侧切过,Stanley 的路线则从外侧甩开。下面一栏把两种控制器在整条赛道上的绝对横向误差对沿路径距离作图,Stanley 在弯道处显示出更高的尖峰。
同一条赛道、同一速度、同样滞后。纯跟踪在弯道内切;Stanley 从弯道外侧甩开——代价是18.5 弧度对 4.3 弧度的转向量。 下载 SVG

同一条赛道、2 m/s 下的实测:

均方根 最坏 行驶路径长 转向量
纯跟踪 0.12 m 0.50 m 短 0.8% 4.3 rad
Stanley 0.17 m 0.87 m 长 2.2% 18.5 rad

第三列的符号就是整个故事。纯跟踪走内线,提前到达;Stanley 拒绝离开路径,冲过弯角再绕回来——于是行驶距离比给它的路径更长。

**转向量是大家会忘掉的数字。**四倍的执行器运动就是四倍的舵机磨损、四倍的电流,在差速底盘上还是四倍的轮子横向擦滑。Stanley 不是免费的。

怎么选

路径只是个建议时,选纯跟踪。覆盖扫荡、航点任务,以及任何户外的、“切掉半米弯角不算问题”的场合。它只有一个几何旋钮,退化得很优雅,而且大约十二行代码。

路径是硬约束时,选 Stanley。车道、作物行、带墙的走廊。它守得住线、不会切,代价是转向量,以及一个确实需要调的增益——前视距离是几何量,可以在机器人之间迁移;k 是控制增益,不能。

**低速时两者都不够用。**它们都要除以速度或随速度缩放。低于大约 0.3 m/s 时,差速机器人更好的做法是原地转到目标方位再开出去,而这两个控制器都表达不了这件事。

出问题时

现象 通常原因
报告的误差总是接近零 对着估计值测量,而不是对着真值
每个路点处指令都在抖 符号取自会在顶点翻转的叉乘测试
过完弯后自信地开出路径 顶点平局判给了进入的那一段——这是最安静的那个故障
误差跳到一个巨大数值又恢复 全局最近点搜索匹配到了远处的一段
均方根看着很好,车却蹭到墙 也要报最坏情况;均方根会藏起单个尖峰
Stanley 在直道上振荡 k 相对速度和滞后太高;它是增益,不是几何量
两个控制器一起乱走 问题在上游——在位置估计,不在转向

在路径跟踪模拟器里让两种控制器跑同一条赛道,然后沿着路径跟踪路线图从里程计一路走到那台能独立执行任务的机器人。

探索关联图谱

本教程所属的搭建

包含本教程的项目和学习路线。

延伸阅读

参考资料