4、路径表示方法:路径点序列、多项式曲线、贝塞尔曲线、样条曲线
路径怎么表示?这是个看似简单、实则坑不少的问题。
我刚开始做机器人导航时,觉得路径嘛,不就是一堆点连起来?后来发现,点连起来的方式不同,机器人走出来的效果天差地别。有的路径让机器人抖得像帕金森,有的路径却丝滑得像德芙巧克力。
今天咱们就把这几种路径表示方法掰开揉碎,讲清楚。
4.1 路径点序列:最朴素的方法
路径点序列,说白了就是一堆离散的坐标点。比如:
waypoints = [
(0.0, 0.0),
(1.0, 0.5),
(2.0, 1.0),
(3.0, 1.5),
(4.0, 2.0)
]
每个点代表机器人必须经过的位置。控制器就照着这些点,一个接一个地走。
优点很明显:
- 实现简单,存个数组就行
- 直观,一眼就能看懂路径长啥样
- 适合全局路径规划的输出(比如A*、RRT*)
缺点也很致命:
- 路径不连续——点与点之间是直线,拐角处有突变
- 机器人走到每个点必须停下来转向,否则会 overshoot
- 无法保证曲率连续,高速时容易甩出去
4.2 多项式曲线:让路径变平滑
路径点序列太生硬,怎么办?用多项式曲线去拟合这些点。
最简单的是一次多项式(直线):
y = ax + b
但直线不够用。实际中常用三次多项式:
y = a₀ + a₁x + a₂x² + a₃x³
为什么是三次?因为三次多项式能保证位置和速度连续(C¹连续),而且计算量不大。
我有个项目需要让机器人在仓库里走S形弯道。用三次多项式拟合路径点,效果还不错。但有个问题——多项式次数越高,曲线越容易在端点处剧烈振荡。这叫「龙格现象」,你想想看,一个高次多项式在两端像蛇一样扭来扭去,机器人根本没法跟。
4.3 贝塞尔曲线:设计师的最爱
贝塞尔曲线,你肯定见过。Photoshop里的钢笔工具、字体设计、汽车造型,到处都有它的影子。
它的核心思想是:用几个控制点来「拉」出一条曲线。控制点不一定要在曲线上,但曲线会被控制点「吸引」。
一个三次贝塞尔曲线需要4个控制点:
B(t) = (1-t)³P₀ + 3(1-t)²tP₁ + 3(1-t)t²P₂ + t³P₃
其中 t ∈ [0, 1]
你看,t从0变到1,曲线就从P₀平滑地走到P₃。中间被P₁和P₂拉着走。
贝塞尔曲线的优点:
- 直观——拖动控制点就能调整曲线形状
- 凸包性质——曲线始终在控制点围成的多边形内部
- 端点插值——曲线一定经过首尾控制点
缺点呢?
- 全局性——移动一个控制点,整条曲线都会变
- 不适合长路径——控制点一多,曲线就变得难以控制
我在项目中遇到过: 用贝塞尔曲线做泊车路径规划。控制点少,曲线光滑,很适合倒车入库这种短距离场景。但如果你要做几百米的路径,贝塞尔曲线就不太行了——控制点太多,调整起来像在解谜题。
4.4 样条曲线:工业级的选择
样条曲线,说白了就是「分段多项式」——把路径切成一小段一小段,每段用低次多项式拟合,然后在连接处保证光滑。
最常用的是三次样条(Cubic Spline):
- 每段是三次多项式
- 段与段之间位置、速度、加速度都连续(C²连续)
- 整体曲线非常光滑
还有B样条(B-Spline):
- 比三次样条更灵活
- 支持局部修改——移动一个控制点只影响附近几段
- 可以控制曲线的「松紧程度」
样条曲线为什么是工业级选择?因为它在光滑性和局部控制之间取得了完美平衡。
我曾经做过一个高速公路自动驾驶项目,路径长度几十公里。用B样条表示路径,每个控制点只影响周围一小段。调试时调整某个弯道的曲率,其他路段纹丝不动。这种局部性太重要了。
4.5 四种方法对比
| 方法 | 连续性 | 局部控制 | 计算量 | 适用场景 |
|---|---|---|---|---|
| 路径点序列 | C⁰(位置连续) | 是 | 极低 | 低速AGV、扫地机器人 |
| 多项式曲线 | C¹~C² | 否 | 低 | 短距离点对点运动 |
| 贝塞尔曲线 | C¹~C² | 否(全局) | 中 | 短路径、泊车、机械臂 |
| 样条曲线 | C² | 是(B样条) | 中高 | 长路径、高速运动、自动驾驶 |
4.6 知识体系图
下面这张图帮你理清这四种方法的关系和选择逻辑:
4.7 怎么选?我的建议
嗯,这里要注意,没有银弹。每种方法都有它的生态位。
- 做扫地机器人、简单AGV: 路径点序列就够了。别折腾,简单就是美。
- 做机械臂点对点运动: 三次多项式曲线,计算快、效果好。
- 做泊车、短距离特殊路径: 贝塞尔曲线,控制直观,调参方便。
- 做自动驾驶、高速移动机器人: 别犹豫,直接上B样条。虽然实现复杂一点,但后期调试会感谢你自己。
我曾经在一个项目里偷懒用了路径点序列,结果机器人在每个拐角都剧烈抖动,电机嗡嗡响。后来换成B样条,整个世界清净了。从那以后,但凡路径超过10米,我必用样条曲线。
好了,路径表示方法就讲到这里。记住一句话:路径的光滑程度,决定了机器人能跑多快、多稳。