1. Pure Pursuit 算法数学推导

大家好,我是你们的老朋友。今天咱们来啃一块硬骨头——Pure Pursuit 算法的数学推导。说实话,我刚入行那会儿,看到这些几何公式也头疼。但后来我发现,搞懂它,你就能在自动驾驶控制领域横着走。

先问个问题:为什么叫“纯跟踪”?说白了,就是让车像一条狗追着骨头跑一样。狗的眼睛盯着骨头,身体自然调整方向。我们的算法也一样——盯着前方一个目标点,然后算方向盘该打多少。

1.1 几何关系推导

咱们先画个图。想象一下,你的车现在在某个位置,车头朝前。前方有个目标点,你希望车能平滑地开过去。这中间有个关键参数——前视距离。

核心公式:

曲率 κ = 2 * sin(α) / Ld

其中 α 是车头方向与目标点方向的夹角,Ld 是前视距离

这个公式怎么来的?我给大家拆解一下。你看,车、目标点、还有转弯中心,这三者构成了一个等腰三角形。嗯,这里要注意,转弯半径 R 和曲率 κ 是倒数关系:κ = 1/R。

我在项目中遇到过一个问题:如果前视距离太短,车会像喝醉了酒一样左右摇摆。如果太长,车又像反应迟钝的老大爷。所以这个 Ld 的选取,是门学问。

推导过程其实不复杂:

  • 从车的位置到目标点,画一条直线,长度就是 Ld
  • 车头方向与这条线的夹角是 α
  • 根据正弦定理,sin(α) / R = sin(π - 2α) / Ld
  • 化简后得到 κ = 2 * sin(α) / Ld

你想想看,这个公式多漂亮。只要知道 α 和 Ld,就能算出需要的转弯半径。这就是 Pure Pursuit 的灵魂。

1.2 前视距离概念

前视距离,说白了就是“你看多远”。这个参数直接决定了车的控制品质。

前视距离 效果 适用场景
太短 抖动、震荡 低速、急转弯
适中 平滑、稳定 一般道路
太长 响应慢、切弯 高速、直道

我个人习惯的做法是:让前视距离随车速动态变化。车速快,就看远一点;车速慢,就看近一点。公式很简单:

Ld = k * v + Ld_min

其中 k 是比例系数,v 是车速,Ld_min 是最小前视距离。这个 k 值怎么调?我建议从 0.3 开始试,然后根据实际效果微调。

我的经验:曾经在一个项目中,前视距离设得太小,车在弯道里疯狂画龙。后来我把 Ld_min 从 2 米调到 4 米,问题立刻解决了。有时候,问题就出在这些小细节上。

1.3 曲率半径计算

曲率半径,就是转弯半径。它决定了方向盘该打多少。我们算出来曲率 κ 后,方向盘转角 δ 就是:

δ = arctan(L * κ)

其中 L 是轴距。这个公式来自阿克曼转向几何,我在这里就不展开了。

实际项目中,我一般会加个限幅。比如最大方向盘转角是 30 度,那算出来超过 30 度就截断。为什么?因为物理极限摆在那里,你算得再漂亮,硬件做不到也是白搭。

注意:曲率 κ 不能太大。如果目标点选得太近,算出来的 κ 会非常大,导致方向盘猛打。这在高速上是很危险的。我曾经吃过这个亏,后来加了曲率限幅才解决。

1.4 目标点选取策略

目标点怎么选?这其实是个工程问题。理论上,你只需要在参考轨迹上找一个距离车 Ld 的点就行。但实际操作中,有几种策略:

  1. 最近点投影法:先找到轨迹上离车最近的点,然后沿着轨迹往前走 Ld 距离
  2. 直接距离法:从车的位置出发,画一个半径为 Ld 的圆,与轨迹的交点就是目标点
  3. 混合策略:结合以上两种,根据曲率动态调整

我个人推荐第一种。为什么?因为它稳定。第二种方法在轨迹曲率变化大的地方,可能会找到多个交点,造成跳变。

嗯,这里要注意:目标点不能选在车后面。如果轨迹是环形的,或者车已经过了弯道,目标点可能会跑到后面去。这时候要做个判断,如果目标点在车后方,就跳过这一帧。

核心要点总结:

  • Pure Pursuit 的核心是几何关系:κ = 2 * sin(α) / Ld
  • 前视距离 Ld 要随车速动态调整
  • 方向盘转角 δ = arctan(L * κ),记得加限幅
  • 目标点选取推荐最近点投影法

好了,这一章的内容就到这里。数学推导看着枯燥,但它是整个算法的根基。你把它吃透了,后面写代码、调参数都会顺手很多。

Pure Pursuit 算法核心逻辑 参考轨迹 车辆位姿 车速 v 核心计算 1. 计算前视距离 Ld = k*v + Ld_min 2. 选取目标点 3. 计算夹角 α 4. 计算曲率 κ κ = 2*sin(α)/Ld 方向盘转角 δ 曲率 κ 目标点坐标

公众号:蓝海资料掘金营,微信deep3321