教程 · 中级 · 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 下表现一致的原因。
同一条赛道、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 相对速度和滞后太高;它是增益,不是几何量 |
| 两个控制器一起乱走 | 问题在上游——在位置估计,不在转向 |
探索关联图谱
本教程所属的搭建
包含本教程的项目和学习路线。
延伸阅读