一、纯追踪算法的几何直觉
纯追踪算法,说白了就是让车像狗追飞盘一样跑。
你想想看,狗追飞盘的时候,它不会去计算什么复杂的轨迹。它就看飞盘在哪儿,然后调整自己的方向,一直朝着飞盘跑。纯追踪算法也是这个道理——我们给车设定一个“目标点”,然后让车一直朝着这个点跑。
我刚开始做路径跟踪时,总觉得这方法太简单,肯定不靠谱。直到有一次在测试场,我用纯追踪算法让一辆车以60km/h的速度跑了个8字弯,结果稳得一批。嗯,从那以后我再也不敢小看这个“简单”的算法了。
1.1 核心思想:追着目标点跑
纯追踪算法的核心就一句话:在路径上选一个前视点,然后控制车辆转向,让车辆沿着一条圆弧到达这个点。
这里面有三个关键要素:
- 当前车辆位置:车现在在哪儿
- 前视点:路径上离车一定距离的目标点
- 圆弧轨迹:连接当前位置和前视点的圆弧
说白了,我们就是在做一件事:用圆弧去拟合路径。每次只拟合一小段,然后不断更新。
关键理解:纯追踪不是让车沿着路径走,而是让车始终朝着路径上的某个点走。这个区别很重要。
二、前视距离:算法的灵魂参数
前视距离(Look-ahead Distance)是纯追踪算法里最重要的参数,没有之一。
什么叫前视距离?就是从车辆当前位置到目标点之间的距离。这个距离决定了车是“看得远”还是“看得近”。
2.1 前视距离的影响
| 前视距离 | 效果 | 问题 |
|---|---|---|
| 太小 | 跟踪精度高,转弯灵活 | 容易震荡,高速不稳定 |
| 太大 | 轨迹平滑,高速稳定 | 切弯严重,精度差 |
我记得有一次做园区物流车项目,一开始把前视距离设成了固定值2米。结果车在直道上跑得挺好,一到弯道就开始画龙。后来改成速度相关的动态前视距离,问题就解决了。
经验之谈:前视距离一般取车速的0.5-2倍。比如车速10m/s,前视距离可以设在5-20米之间。具体值需要根据车辆特性和路径曲率来调。
2.2 动态前视距离
实际工程中,我们很少用固定前视距离。为什么?因为车速在变,弯道曲率也在变。
我常用的公式是这样的:
L_d = L_0 + k_v * v
其中:
- L_d:前视距离
- L_0:基础前视距离(一般取1-3米)
- k_v:速度系数(一般取0.5-1.5)
- v:当前车速
你想想看,车速越快,前视距离就得越大。不然车还没反应过来就到弯道了,肯定要出事。
避坑指南:我曾经在雨天的测试中吃过亏。当时前视距离设得偏大,结果路面湿滑,车在弯道直接推头了。后来我加了个路面附着系数修正项,才把这个问题解决。
三、圆弧拟合与曲率计算
有了前视点,接下来就是怎么让车过去。纯追踪的做法是:用一条圆弧连接当前位置和前视点。
3.1 几何关系
来看这个几何关系:
- 车辆当前位置:点P
- 前视点:点G
- 车辆航向角:θ
- 前视点相对于车辆的方向角:α
- 前视距离:L_d
- 圆弧半径:R
根据几何关系,我们可以得到:
R = L_d / (2 * sin(α))
这个公式很关键。它告诉我们:圆弧半径由前视距离和角度偏差共同决定。
3.2 曲率计算
曲率是半径的倒数:
κ = 1 / R = 2 * sin(α) / L_d
嗯,这里要注意:曲率有正负之分。左转为正,右转为负。这个符号在控制里很重要,搞反了车就往反方向跑了。
核心公式:κ = 2 * sin(α) / L_d
这个公式就是纯追踪算法的数学本质。所有工程实现都是围绕它展开的。
四、转向角推导
有了曲率,接下来就是怎么转方向盘。这里要用到车辆的运动学模型。
4.1 阿克曼转向几何
对于前轮转向的车辆,转向角δ和曲率κ的关系是:
δ = arctan(L * κ)
其中L是车辆轴距。
把曲率公式代入:
δ = arctan(2 * L * sin(α) / L_d)
这就是纯追踪算法的最终控制律。
4.2 工程实现要点
实际编码时,有几个坑要注意:
- 角度归一化:sin(α)计算前,确保α在[-π, π]范围内
- 防止除零:L_d不能太小,一般设个下限
- 转向限幅:计算出的δ不能超过车辆最大转向角
代码小技巧:我习惯在计算前先判断L_d是否小于某个阈值(比如0.1米),如果小于就直接输出0转向角,避免数值问题。
五、知识体系总览
下面这张图展示了纯追踪算法的完整知识结构:
六、总结
纯追踪算法的核心就三件事:
- 选点:在路径上选一个前视点
- 算弧:用圆弧连接当前位置和前视点
- 转舵:根据圆弧曲率计算转向角
说白了,这个算法就是用几何关系代替了复杂的动力学模型。它简单、直观、容易实现,在低速场景下表现非常好。
当然,它也有局限性。比如高速时精度会下降,对路径曲率变化敏感。但这些我们后面会讲到怎么优化。
一句话记住纯追踪:前视选点,圆弧拟合,几何转向。
公众号:蓝海资料掘金营,微信deep3321