一、路径表示方法:离散点、多项式曲线、贝塞尔曲线、样条曲线

做机器人轨迹规划这些年,我最大的感触就是——路径怎么表示,直接决定了后面所有算法的复杂度。你想想看,如果连路径都描述不清楚,那平滑、避障、速度规划这些事根本无从谈起。

今天咱们就来聊聊路径的几种主流表示方法。我个人习惯把它们分成四类:离散点、多项式曲线、贝塞尔曲线、样条曲线。每种方法都有自己的脾气,选对了事半功倍,选错了……嗯,我踩过的坑后面会讲。

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形曲线。用三次多项式拟合四个关键点,效果还不错。但问题来了——多项式是全局的,改一个点,整条曲线都会变。

💡 我的经验: 多项式曲线适合点少、路径简单的场景。如果路径点超过5个,我建议你别用多项式,否则曲线会像蛇一样扭来扭去,这就是所谓的「龙格现象」。
多项式阶数 连续性 适用场景
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₂——这两个点只是用来「吸引」曲线。

我个人特别喜欢贝塞尔曲线的一点是:它的形状非常直观。你拖动控制点,曲线就会跟着变化,有点像拉橡皮筋。做交互式路径编辑时特别好用。

🎯 实用技巧: 如果你想让机器人经过某些特定点,可以把这些点设为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搞得天花乱坠,结果实际跑起来还不如一段三次多项式。选方法之前,先搞清楚你的需求——连续性要求多高?计算资源够不够?要不要实时修改?

下面这张图总结了四种方法的核心关系,你可以对照着看:

路径表示方法知识体系 路径表示方法 离散点 多项式曲线 贝塞尔曲线 样条曲线 特性 • 存储简单 • 无连续性信息 • 需配合插值 • 适合全局规划 • 修改方便 特性 • 数学表达式简洁 • 可保证C¹/C²连续 • 全局性(龙格现象) • 适合点少场景 • 计算简单 特性 • 控制直观 • 凸包性质 • 全局性 • 适合交互编辑 • 一般用3~5阶 特性 • 局部修改 • 高连续性(C²+) • 计算效率高 • 工业标准 • NURBS可精确 表示圆弧

好了,这四种方法就是路径表示的基础。我个人建议你从离散点和三次样条入手,这两个最实用。等遇到具体问题了,再回头看看贝塞尔和NURBS——它们在某些场景下确实有奇效。

可可精品资料库