路径规划与轨迹规划的区别:路径 vs 轨迹、时间参数化、运动学约束的引入

很多刚入行的朋友问我:「路径规划和轨迹规划,不就是一回事吗?」

嗯,我刚开始做机器人那会儿也这么想。直到有一次,我写了一个路径规划算法,让机械臂走一条很漂亮的曲线,结果一跑起来,关节电机嘎嘎响,末端抖得像筛糠。那时候我才意识到——路径和轨迹,完全是两码事。

路径 vs 轨迹:本质差异

先给个最直白的定义:

  • 路径:空间中的一条几何曲线。它只关心「从哪到哪」,不关心怎么走。
  • 轨迹:带时间信息的路径。它告诉你「什么时刻,机器人应该在哪个位置,速度是多少」。

说白了,路径是静态的几何问题,轨迹是动态的运动问题。

核心区别一句话:路径 = 空间几何;轨迹 = 空间几何 + 时间 + 运动学约束。

我习惯用一个比喻来理解:路径就像地图上画的一条公路,轨迹则是你开车时每个时刻的车速、油门、刹车。地图一样,但老司机和菜鸟开出来的轨迹完全不同。

对比维度 路径规划 轨迹规划
输入 起点、终点、障碍物 路径 + 时间约束 + 运动学约束
输出 点序列 (x₁,y₁,z₁) → (x₂,y₂,z₂) → ... 时间参数化序列 (t₁, q₁, v₁, a₁) → ...
是否包含速度 否 是
是否包含加速度 否 是
典型算法 A*, RRT, PRM 梯形速度规划、S形速度规划、多项式插值

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

路径规划完成后,你得到了一堆离散点。但机器人不能直接吃这些点——它需要知道每个点该在什么时候到达。

时间参数化,就是把路径上的几何位置映射到时间轴上。最常见的做法是引入一个参数 s(t),表示路径的「进度」。s=0 是起点,s=1 是终点,s(t) 随时间单调递增。

举个例子,假设路径长度是 1 米,你希望机器人用 2 秒走完。最简单的参数化就是线性映射:

s(t) = t / 2,  t ∈ [0, 2]
位置 p(t) = p(s(t)) = p(t/2)
速度 v(t) = dp/dt = (dp/ds) * (ds/dt)

但线性映射有个问题——起点和终点速度突变。你想想看,机器人从静止瞬间跳到某个速度,电机受得了吗?

我曾经踩过的坑:第一次做 AGV 路径跟踪时,我直接用线性时间参数化,结果小车在起点猛地一冲,差点把货架上的零件甩下来。后来我才知道,时间参数化必须考虑速度的连续性。

实际工程中,我们常用梯形速度曲线或 S 形速度曲线来做时间参数化。梯形曲线有加速、匀速、减速三段;S 形曲线则加了加加速度(jerk)约束,让运动更平滑。

运动学约束的引入:让轨迹「可执行」

路径规划只管「能不能走通」,轨迹规划要管「能不能走好」。这个「好」字,就体现在运动学约束上。

常见的运动学约束包括:

  • 速度上限:电机有额定转速,关节不能转太快
  • 加速度上限:电机扭矩有限,加速度不能太大
  • 加加速度上限:避免冲击,延长机械寿命
  • 关节位置极限:机械限位,不能超程

这些约束在路径规划阶段是看不到的。路径规划只关心几何可达性,而轨迹规划必须把这些「硬杠杠」加进去。

我的个人习惯:在轨迹规划阶段,我会先做一次「约束检查」——把路径上的每个点映射到关节空间,看看速度、加速度是否超限。如果超限,要么降低速度,要么重新规划路径。这个步骤能省掉很多调试时间。

从路径到轨迹的完整流程

下面这张图展示了从路径规划到轨迹规划的完整链路:

路径规划到轨迹规划流程 从路径规划到轨迹规划的完整流程 环境建模 路径规划 路径平滑 时间参数化 运动学约束 轨迹生成 关键说明: 路径规划只输出几何路径(蓝色→绿色→紫色),不包含时间信息。 轨迹规划在路径基础上加入时间参数化和运动学约束(红色→橙色→青色),生成可执行的轨迹。

一个实战案例:从路径到轨迹的转换

假设我们有一条路径,由三个点组成:A(0,0) → B(1,0) → C(1,1)。路径规划只输出这些点。现在要做轨迹规划。

第一步:路径参数化

计算路径总长:AB 段 1 米,BC 段 1 米,总长 2 米。定义 s 从 0 到 1。

s = 0 → 位置 A(0,0)
s = 0.5 → 位置 B(1,0)
s = 1.0 → 位置 C(1,1)

第二步:时间参数化

设定总时间 T=4 秒,采用梯形速度曲线:加速 1 秒,匀速 2 秒,减速 1 秒。

t ∈ [0,1]: 加速段, s(t) = 0.125 * t²
t ∈ [1,3]: 匀速段, s(t) = 0.125 + 0.25*(t-1)
t ∈ [3,4]: 减速段, s(t) = 0.875 + 0.25*(t-3) - 0.125*(t-3)²

第三步:运动学约束检查

假设关节 1 的速度上限是 0.5 rad/s。计算轨迹在关节空间的速度:

v₁(t) = dq₁/dt = (dq₁/ds) * (ds/dt)

如果发现某个时刻 v₁ > 0.5,就需要调整时间参数化——要么延长总时间,要么修改速度曲线。

实战经验:我一般会预留 20% 的速度裕量。比如电机额定速度 1 rad/s,我按 0.8 rad/s 做约束。这样即使负载变化或摩擦增大,轨迹仍然安全。

路径规划与轨迹规划的协同工作

在实际系统中,路径规划和轨迹规划不是孤立的。它们需要协同工作:

  1. 路径规划先输出一条无碰撞的几何路径
  2. 路径平滑对离散点做插值,生成连续曲线(B样条、贝塞尔曲线等)
  3. 轨迹规划在平滑路径上做时间参数化,加入运动学约束
  4. 轨迹跟踪控制器根据轨迹生成控制指令,驱动电机

这里有个容易忽略的点:路径平滑的质量直接影响轨迹规划的可行性。如果路径上有尖锐拐角,即使时间参数化做得再好,关节加速度也可能瞬间爆表。

我曾经踩过的坑:有一次路径规划输出了一条「之」字形路径,拐角接近 90 度。我花了很多精力优化时间参数化,结果发现无论怎么调,关节加速度都超限。最后回头重新做了路径平滑,问题才解决。所以我现在做项目,一定会先检查路径的曲率分布。

总结一下

路径规划和轨迹规划的区别,说白了就是「画地图」和「开车」的区别。路径规划告诉你路在哪,轨迹规划告诉你油门怎么踩、刹车什么时候点。

在实际工程中,我建议你把这两个模块分开设计。路径规划专注几何可达性,轨迹规划专注运动可行性。接口处定义好路径的数据结构(点序列 + 曲率信息),这样两个模块可以独立迭代,互不干扰。

嗯,这一章就到这里。记住:路径是骨架,轨迹是血肉。只有骨架没有血肉,机器人动不起来;只有血肉没有骨架,机器人会撞墙。