一、路径表示方法:离散点、多项式曲线、贝塞尔曲线、样条曲线
做机器人轨迹规划这些年,我最大的感触就是——路径怎么表示,直接决定了后面所有算法的复杂度。你想想看,如果连路径都描述不清楚,那平滑、避障、速度规划这些事根本无从谈起。
今天咱们就来聊聊路径的几种主流表示方法。我个人习惯把它们分成四类:离散点、多项式曲线、贝塞尔曲线、样条曲线。每种方法都有自己的脾气,选对了事半功倍,选错了……嗯,我踩过的坑后面会讲。
1.1 离散点表示法——最原始,也最直接
说白了,就是把路径存成一系列的点坐标。比如:
waypoints = [
(0.0, 0.0),
(1.0, 2.0),
(3.0, 3.0),
(5.0, 1.0)
]
这种方法最简单,我在早期做AGV小车项目时就用过。但问题也很明显——点与点之间怎么走?是直线插值还是曲线插值?如果直接连直线,那机器人走到拐角处就会突然转向,产生冲击。
离散点的优点:
- 存储简单,就一堆坐标
- 修改方便,增删点就行
- 适合全局路径规划的输出
缺点也很明显:
- 没有导数信息,无法保证速度/加速度连续
- 点太密则数据量大,点太疏则路径粗糙
- 无法直接用于控制,必须插值
1.2 多项式曲线——用数学公式描述路径
既然离散点不够用,那我们就用连续函数来描述路径。最常用的就是多项式曲线。
比如一个三次多项式:
y = a₀ + a₁·x + a₂·x² + a₃·x³
为什么是三次?因为三次多项式可以保证位置和速度都连续(C¹连续)。如果你需要加速度也连续,那就用五次多项式。
我记得有一次做机械臂轨迹规划,要求末端执行器走一条S形曲线。用三次多项式拟合四个关键点,效果还不错。但问题来了——多项式是全局的,改一个点,整条曲线都会变。
| 多项式阶数 | 连续性 | 适用场景 |
|---|---|---|
| 3次 | C¹(速度连续) | 点到点运动 |
| 5次 | C²(加速度连续) | 高精度轨迹 |
| 7次及以上 | C³+ | 特殊需求(慎用) |
1.3 贝塞尔曲线——设计师的最爱
贝塞尔曲线这玩意儿,最早是汽车设计师用来画车身的。它的核心思想是:用几个控制点来「拉」出一条曲线。
公式长这样(三次贝塞尔):
B(t) = (1-t)³·P₀ + 3(1-t)²·t·P₁ + 3(1-t)·t²·P₂ + t³·P₃
其中t从0到1,P₀到P₃是四个控制点。曲线会经过P₀和P₃,但不经过P₁和P₂——这两个点只是用来「吸引」曲线。
我个人特别喜欢贝塞尔曲线的一点是:它的形状非常直观。你拖动控制点,曲线就会跟着变化,有点像拉橡皮筋。做交互式路径编辑时特别好用。
贝塞尔曲线的优缺点:
- ✅ 控制直观,适合人工编辑
- ✅ 凸包性质:曲线一定在控制点围成的多边形内
- ✅ 计算简单,适合实时应用
- ❌ 全局性:改一个控制点,整条曲线都变
- ❌ 高阶贝塞尔计算量大,一般只用3~5阶
1.4 样条曲线——工业界的标准答案
样条曲线,说白了就是「分段多项式,整体连续」。它把路径分成很多小段,每段用一个低阶多项式(通常是三次),然后在连接处保证连续。
最常见的B样条曲线,公式如下:
C(t) = Σᵢ Nᵢₖ(t) · Pᵢ
其中Nᵢₖ(t)是基函数,Pᵢ是控制点。看不懂没关系,你只需要知道:B样条比贝塞尔更灵活,因为它支持局部修改。
1. 局部性:改一个控制点,只影响附近几段曲线
2. 连续性:可以做到C²甚至更高
3. 计算效率:每段都是低阶多项式,算得快
我在做自动驾驶路径规划时,样条曲线几乎是标配。尤其是NURBS(非均匀有理B样条),可以精确表示圆弧和直线,这对车辆轨迹规划太重要了。
几种样条的对比:
| 类型 | 局部性 | 连续性 | 能否表示圆弧 |
|---|---|---|---|
| 三次样条 | ❌ 全局 | C² | 近似 |
| B样条 | ✅ 局部 | C² | 近似 |
| NURBS | ✅ 局部 | C² | 精确 |
1.5 四种方法的对比与选择
说了这么多,到底该用哪种?我个人的选择原则是这样的:
- 离散点:只做全局规划,后续还要做平滑处理时用
- 多项式曲线:简单场景,点少(≤5个),要求数学表达式简洁时用
- 贝塞尔曲线:需要人工交互编辑路径,或者做可视化展示时用
- 样条曲线:工业级应用,要求高连续性、局部修改、复杂路径时用
下面这张图总结了四种方法的核心关系,你可以对照着看:
好了,这四种方法就是路径表示的基础。我个人建议你从离散点和三次样条入手,这两个最实用。等遇到具体问题了,再回头看看贝塞尔和NURBS——它们在某些场景下确实有奇效。
可可精品资料库