4. 路径规划与轨迹规划的区别

说实话,我刚入行那会儿,也搞混过这两个概念。

那时候领导让我做个「轨迹规划」,我吭哧吭哧搞了条路径出来。结果机器人一跑,急停急启,抖得像筛糠。领导看了直摇头:「你这是路径,不是轨迹。」

嗯,今天咱们就把这事彻底掰扯清楚。

4.1 路径 vs 轨迹:本质区别

先给个最直白的定义:

  • 路径(Path):只关心「走哪条路」,不关心「怎么走」。
  • 轨迹(Trajectory):不仅关心「走哪条路」,还关心「每个时刻走到哪、速度多快、加速度多大」。

说白了,路径是几何问题,轨迹是时间问题。

我举个例子你就明白了。你从家走到公司,地图上画一条线——那是路径。但如果你说「我8点出门,8点05分到路口,8点20分到公司,前5分钟慢走,中间10分钟快走,最后5分钟再慢下来」——这就是轨迹。

核心区别一句话:

路径 = 空间上的曲线

轨迹 = 路径 + 时间信息 + 运动状态

我在做AGV项目时遇到过一个问题:两辆小车在同一条路径上相向而行,路径规划说「没问题,路够宽」。结果真跑起来,一辆急刹一辆急加速,差点撞上。为什么?因为路径规划没考虑时间上的同步。后来我改成轨迹规划,给每辆车分配了时间槽,问题就解决了。

4.2 时间参数化:给路径加上「时钟」

路径是一条几何曲线,通常用参数 s 表示。s 可以是弧长,也可以是归一化参数(0到1)。

但轨迹不一样。轨迹是时间的函数:

路径:P(s) = [x(s), y(s), z(s)],s ∈ [0, 1]
轨迹:T(t) = [x(t), y(t), z(t)],t ∈ [0, T]

时间参数化,就是把路径参数 s 映射到时间 t 上。这个映射关系决定了机器人怎么走。

举个例子:

  • 如果 s = t / T(线性映射),那就是匀速运动。
  • 如果 s = (t/T)^2(二次映射),那就是加速运动。
  • 如果 s 是更复杂的函数,那就是变速运动。

你想想看,为什么需要时间参数化?因为真实世界有物理限制。电机有最大转速,关节有最大加速度,你不能让机器人瞬间从0加速到1m/s。时间参数化就是把这些约束考虑进去。

我的经验:

做时间参数化时,一定要先检查路径的曲率。曲率大的地方,速度要降下来。我曾经在一个急弯处没做速度限制,结果机器人直接甩出去了——嗯,那次测试把旁边的纸箱撞飞了好几个。

4.3 S形速度曲线:平滑才是王道

说到速度曲线,最常见的两种是梯形和S形。

梯形速度曲线:加速-匀速-减速三段。简单粗暴,但问题在于加速度突变。从0加速到最大速度那一刻,加速度从0跳变到某个值,会产生冲击力(Jerk)。

S形速度曲线:加加速-匀加速-减加速-匀速-加减速-匀减速-减减速七段。加速度连续变化,没有突变,运动更平滑。

我画个图你就明白了:

梯形 vs S形速度曲线对比 梯形速度曲线 0 t1 t2 加速度突变 S形速度曲线 0 t1 t2 平滑过渡 梯形 S形

看到没?梯形在拐角处有尖点,那就是加速度突变的地方。S形曲线圆润平滑,加速度连续变化。

S形速度曲线的数学表达式通常用分段多项式表示。我给出一个简单的实现:

def s_curve_profile(t, T, v_max, a_max, j_max):
    """
    S形速度曲线生成
    t: 当前时间
    T: 总时间
    v_max: 最大速度
    a_max: 最大加速度
    j_max: 最大加加速度
    """
    # 计算各阶段时间点
    ta = a_max / j_max          # 加加速/减加速时间
    tv = T - 2 * ta             # 匀速时间
    
    if t <= ta:
        # 加加速阶段
        v = 0.5 * j_max * t**2
    elif t <= ta + tv:
        # 匀速阶段
        v = v_max
    elif t <= T:
        # 减加速阶段
        t_dec = t - (ta + tv)
        v = v_max - 0.5 * j_max * t_dec**2
    else:
        v = 0
    
    return v

注意:

S形曲线虽然平滑,但计算量比梯形大。在嵌入式平台上跑的时候,要注意实时性。我建议把曲线参数提前算好,存成查找表,运行时直接查表插值。

4.4 路径规划 vs 轨迹规划:一张图说清楚

下面这张图总结了整个知识体系:

路径规划 vs 轨迹规划:知识体系 路径规划 核心目标: 找到一条无碰撞的几何路径 输入: 地图、起点、终点、障碍物 输出: 一系列路径点 [x, y, z] 常用算法: A*、Dijkstra、RRT、PRM 不考虑: 时间、速度、加速度 轨迹规划 核心目标: 生成平滑、可执行的运动曲线 输入: 路径 + 运动约束 + 时间 输出: 时间-位置-速度-加速度表 常用方法: S形曲线、多项式插值、B样条 考虑: 时间、速度、加速度、Jerk 时间参数化

这张图把两者的关系说得很清楚了。路径规划是轨迹规划的前置步骤,轨迹规划在路径的基础上加上时间维度和运动约束。

4.5 实战中的选择建议

说了这么多,到底什么时候用路径规划,什么时候用轨迹规划?

我的建议是这样的:

场景 用路径规划就够了 必须用轨迹规划
低速移动(< 0.5 m/s) ✅ 可以 ❌ 没必要
高速移动(> 1 m/s) ❌ 会抖动 ✅ 必须
机械臂点到点 ✅ 简单场景 ✅ 高精度场景
AGV/AMR导航 ❌ 容易急停 ✅ 推荐
无人机航点飞行 ❌ 会飘 ✅ 必须

避坑指南:

我曾经在一个项目中偷懒,只做了路径规划没做轨迹规划。结果机器人每次转弯都像在漂移,货物全甩出去了。后来老老实实加了S形速度曲线,问题才解决。所以我的建议是——除非你的应用对平滑性完全没要求,否则还是上轨迹规划吧。

好了,这一章的内容就到这。路径和轨迹的区别,说白了就是「走哪」和「怎么走」的区别。下一章咱们聊聊具体的轨迹生成算法,到时候会用到今天讲的时间参数化和S形曲线。


可可精品资料库