第四节:路径表示方法——如何用数学描述一条路
好,咱们进入正题。路径规划里最基础的问题是什么?说白了就是:怎么用数学语言描述一条车能走的路。
你可能会想,这不简单吗?给一堆点,连起来不就行了?嗯,我刚开始做自动驾驶时也是这么想的。结果第一次实车测试,车开起来像喝醉了酒——左右摇摆,乘客差点晕车。从那以后我才明白,路径表示这件事,远没有想象中那么简单。
4.1 路径的数学定义
先给个严谨的定义。一条路径,在数学上可以表示为:
P(s) = (x(s), y(s), θ(s), κ(s))
其中 s 是弧长参数,x、y 是位置坐标,θ 是航向角,κ 是曲率。注意,我这里用的是弧长参数化,不是时间参数化。为什么?因为路径只关心几何形状,不关心速度。
核心要点:路径是几何的,轨迹才是带时间的。很多新手把这两个混为一谈,结果做出来的规划器又慢又别扭。
我个人习惯把路径定义成连续的、至少二阶可导的曲线。为什么要求二阶可导?因为车辆的运动受阿克曼转向几何约束,一阶导数对应航向,二阶导数对应曲率——而曲率直接决定了方向盘转角。
4.2 参数化曲线:B样条与贝塞尔
实际工程中,我们很少直接用离散点表示路径。原因很简单:离散点不光滑,没法直接控制曲率。所以我们需要参数化曲线。
4.2.1 贝塞尔曲线
贝塞尔曲线是最直观的参数化方法。给定 n+1 个控制点 P₀, P₁, ..., Pₙ,贝塞尔曲线定义为:
B(t) = Σᵢ₌₀ⁿ C(n,i) · (1-t)ⁿ⁻ⁱ · tⁱ · Pᵢ
其中 t ∈ [0,1],C(n,i) 是二项式系数。
贝塞尔曲线有个很好的性质:凸包性——整条曲线都在控制点构成的凸包内。这意味着你可以通过调整控制点直观地控制曲线形状。
我的经验:贝塞尔曲线适合做局部路径调整。比如在换道场景中,用三阶或四阶贝塞尔曲线就能生成一条平滑的换道路径。我曾经在一个项目中用五阶贝塞尔曲线做泊车路径,效果出奇地好——因为高阶数能保证曲率连续。
但贝塞尔曲线也有缺点:全局性。改变任何一个控制点,整条曲线都会变化。这在需要局部微调时就比较麻烦。
4.2.2 B样条曲线
B样条曲线解决了贝塞尔的全局性问题。它的数学形式是:
C(u) = Σᵢ₌₀ⁿ Nᵢₚ(u) · Pᵢ
其中 Nᵢₚ(u) 是 p 次B样条基函数,由节点向量 U = {u₀, u₁, ..., uₘ} 决定。
B样条最大的优势是局部支撑性——每个控制点只影响曲线的一部分。你想想看,这在路径优化中多有用?我可以固定起点和终点,只调整中间几个控制点来优化曲率,而不用担心把整条路径搞乱。
| 特性 | 贝塞尔曲线 | B样条曲线 |
|---|---|---|
| 控制点影响范围 | 全局 | 局部 |
| 阶数灵活性 | 固定(控制点数决定) | 可独立设置 |
| 连续性 | Cⁿ(n为阶数-1) | Cᵖ⁻¹(p为次数) |
| 工程常用场景 | 换道、泊车 | 全局路径、复杂路况 |
注意:B样条虽然强大,但节点向量的设置是个技术活。我曾经因为节点向量设置不当,导致生成的路径在某个点突然出现曲率跳变,车差点冲上路沿。后来我总结了一个经验:节点向量要尽量均匀,但在曲率变化大的区域可以适当加密。
4.3 路径平滑性度量
好,现在我们知道怎么表示路径了。但怎么判断一条路径好不好?这就涉及到平滑性度量。
我个人常用的三个指标:
- 曲率连续性:路径的曲率 κ(s) 必须连续,最好是一阶连续。为什么?因为曲率不连续意味着方向盘要瞬间转动,这在物理上不可能实现。
- 曲率变化率:dκ/ds 要尽量小。这个指标直接对应方向盘的转动速度。我见过一些算法生成的路径曲率连续但变化剧烈,结果车开起来像在画蛇——乘客体验极差。
- 最大曲率约束:κ(s) ≤ κ_max。这个 κ_max 由车辆的最小转弯半径决定。一般乘用车的最小转弯半径在5-6米左右,对应的最大曲率约0.17-0.2 m⁻¹。
实际工程中,我常用一个综合的代价函数来评估路径平滑性:
J = w₁ · ∫κ²(s) ds + w₂ · ∫(dκ/ds)² ds + w₃ · ∫(d²κ/ds²)² ds
其中 w₁、w₂、w₃ 是权重系数。这个函数越小,路径越平滑。
避坑指南:我曾经在一个项目中只用了曲率平方积分(即 w₂=w₃=0),结果生成的路径虽然曲率很小,但曲率变化率极大。车在弯道中频繁调整方向盘,电机都过热了。后来我加入了曲率变化率的惩罚项,问题才解决。
4.4 小结
嗯,这一节内容不少。总结一下:
- 路径用弧长参数化的方式表示,包含位置、航向、曲率
- 贝塞尔曲线适合局部路径生成,操作直观
- B样条曲线适合全局路径,局部可控性强
- 平滑性度量要关注曲率连续性和变化率
下一节我们会讲路径生成的具体算法。到时候我会结合一个实际项目案例,展示怎么用B样条生成一条满足车辆运动学约束的路径。敬请期待。