路径表示方法:路径点序列、B样条曲线、贝塞尔曲线、多项式曲线
做路径规划这些年,我越来越觉得——选对路径表示方法,比调参数重要得多。你想想看,同样的规划算法,换个曲线表达方式,轨迹平滑度、计算效率、甚至能不能过弯,结果可能天差地别。
今天咱们就来聊聊路径的几种主流表示方法。我按自己的理解,把它们分成两类:一类是离散的路径点序列,另一类是连续的曲线表达。后者又包括贝塞尔曲线、B样条曲线和多项式曲线。嗯,一个一个说。
1. 路径点序列:最直接,但最粗糙
说白了,路径点序列就是把路径存成一堆离散的坐标点。比如:
waypoints = [(0, 0), (1, 2), (3, 3), (5, 1), (7, 4)]
这种方式最简单,存储量小,也容易理解。我在早期做AGV导航时,就用的这种。但问题也很明显——
- 不连续:点与点之间是直线连接,拐角处有突变
- 曲率不可控:你没法保证路径的转弯半径满足车辆约束
- 插值麻烦:想加密路径?得自己写插值逻辑
2. 贝塞尔曲线:直观,但全局影响
贝塞尔曲线是我个人比较喜欢的一种表达。它的核心思想是:用几个控制点来“拉”出一条平滑曲线。
公式其实不复杂,以三次贝塞尔为例:
B(t) = (1-t)³P₀ + 3(1-t)²tP₁ + 3(1-t)t²P₂ + t³P₃, t ∈ [0,1]
你看,四个控制点,就能生成一条连续、光滑的曲线。我在做无人车局部路径规划时,经常用贝塞尔曲线来生成避障轨迹。好处是:
- 计算简单,实时性好
- 曲线始终在控制点构成的凸包内
- 端点插值,起点终点可控
但有个坑——移动一个控制点,整条曲线都会变。这叫全局性。我曾经在项目中因为这个特性吃了亏:想微调某一段路径,结果整个轨迹都歪了。后来才改用B样条。
3. B样条曲线:局部可控,工业首选
B样条曲线可以说是贝塞尔曲线的“升级版”。它最大的优势是局部支撑性——移动一个控制点,只影响附近几段曲线,不会波及全局。
我举个例子你就明白了。假设有一条B样条曲线,控制点有10个。你调整第5个控制点,只有第3到第7段曲线会变化。这在工程调试中太重要了。
B样条的数学表达稍微复杂一点:
C(u) = Σ Nᵢₚ(u) Pᵢ
其中Nᵢₚ(u)是基函数,由节点向量决定。节点向量的选择直接影响曲线形状。我习惯用均匀节点或准均匀节点,前者适合自由曲线,后者适合插值端点。
| 特性 | 贝塞尔曲线 | B样条曲线 |
|---|---|---|
| 局部控制 | 否 | 是 |
| 阶数可调 | 固定(由控制点数量决定) | 可独立设置 |
| 凸包性 | 是 | 是 |
| 计算复杂度 | 低 | 中等 |
在实际项目中,B样条曲线是我最常用的路径表达方式。尤其是做轨迹平滑时,配合曲率约束优化控制点位置,效果非常好。
4. 多项式曲线:适合短距离精确控制
多项式曲线,比如三次多项式、五次多项式,常用于路径的局部生成。它的形式是:
y(x) = a₀ + a₁x + a₂x² + a₃x³
或者参数化形式:
x(t) = a₀ + a₁t + a₂t² + a₃t³
y(t) = b₀ + b₁t + b₂t² + b₃t³
多项式曲线的优势在于:你可以通过边界条件(位置、速度、加速度)直接求解系数。比如在换道场景中,给定起点和终点的状态,用五次多项式就能生成一条平滑的换道轨迹。
我记得有一次做泊车路径规划,就用五次多项式生成了倒车入库的轨迹。边界条件设好,系数一解,轨迹就出来了。简单粗暴,但很有效。
不过多项式曲线也有局限:阶数高了容易震荡,阶数低了不够灵活。一般三次或五次就够用了。
知识体系总览
下面这张图是我自己整理的路径表示方法分类,你可以对照着看:
怎么选?我的建议
说实话,没有万能的方法。我一般这样选:
- 快速原型验证:路径点序列就够了,别折腾
- 局部避障轨迹:贝塞尔曲线,简单高效
- 全局路径平滑:B样条曲线,局部可控,适合迭代优化
- 换道/泊车等精确控制:多项式曲线,边界条件直接求解
嗯,路径表示方法就聊到这儿。每种方法都有它的用武之地,关键看你的场景和需求。下一节咱们会深入讲如何用B样条做轨迹平滑,到时候再细聊。
可可精品资料库