路径规划与轨迹规划的区别:路径 vs 轨迹、几何路径 vs 时间参数化、约束条件引入
好,我们进入第三章。这一章我打算把两个经常被混为一谈的概念彻底拆开——路径规划和轨迹规划。
说实话,我刚入行那会儿也分不太清。面试时被问到「你做过轨迹规划吗?」我自信满满地说「做过,就是A*加RRT嘛。」面试官笑了笑,没说话。后来我才明白,我那叫路径规划,跟轨迹规划差了整整一个维度。
路径 vs 轨迹:本质差异
先给个最直白的定义:
- 路径(Path):空间中的一条几何曲线。它只关心「从A到B经过哪些点」,不关心时间。
- 轨迹(Trajectory):路径 + 时间信息。它告诉你「什么时刻到达哪个位置」,还包含速度、加速度。
你想想看,路径就像一张地图上画出的路线,而轨迹是你在导航软件里看到的那条带时间戳的线——「前方300米,预计到达时间14:23」。
核心区别一句话:路径是几何的,轨迹是运动的。
我在项目中遇到过一位同事,他把路径规划的结果直接发给底层控制器,结果机器人走两步就剧烈抖动。为什么?因为路径只给了位置点序列,没有速度信息,控制器只能靠默认的梯形速度曲线去猜,猜错了就震荡。
几何路径 vs 时间参数化
好,我们深入一层。
几何路径通常用一系列离散点或参数曲线表示:
// 路径:仅包含位置信息
Path = {p0, p1, p2, ..., pn}
其中 pi = (x_i, y_i, z_i) 或 qi = (x_i, y_i, theta_i)
时间参数化则是在路径上附加时间戳或速度信息:
// 轨迹:位置 + 时间
Trajectory = {(p0, t0), (p1, t1), (p2, t2), ..., (pn, tn)}
或者用样条表示:q(t) = f(t),t ∈ [t_start, t_end]
说白了,路径规划的输出是一张「地图路线」,轨迹规划的输出是一张「时刻表」。没有时刻表,你只知道怎么走,不知道走多快、什么时候该停。
| 维度 | 路径规划 | 轨迹规划 |
|---|---|---|
| 输出内容 | 位置序列 / 几何曲线 | 位置 + 时间 / 速度 / 加速度 |
| 核心问题 | 避障、连通性、最短路径 | 平滑性、时间最优、动力学可行 |
| 典型算法 | A*、RRT、PRM、Dijkstra | 多项式插值、梯形速度、S形曲线、TOTG |
| 约束类型 | 几何约束(障碍物、边界) | 运动学/动力学约束(速度限、加速度限、力矩限) |
| 应用场景 | 地图导航、全局路径搜索 | 机械臂运动、无人机航迹、自动驾驶 |
嗯,这里要注意:很多教材把路径规划和轨迹规划当成两个独立模块,但实际工程中它们是串行流水线——先规划路径,再对路径做时间参数化得到轨迹。我习惯把路径规划叫「上游」,轨迹规划叫「下游」。
约束条件引入:从几何到物理的跨越
为什么一定要区分这两个概念?因为约束条件变了。
路径规划只处理几何约束:
- 不能撞墙
- 不能碰障碍物
- 必须在工作空间内
轨迹规划在此基础上,还要处理运动学和动力学约束:
- 关节速度不能超过电机额定值
- 加速度不能太大(否则会丢步或抖动)
- 加加速度(Jerk)要限制(否则末端会振动)
- 力矩不能超出驱动器能力
我曾经踩过一个坑:给一个六轴机械臂做轨迹规划,路径规划阶段一切正常,但时间参数化时只考虑了速度约束,没考虑加速度约束。结果轨迹下发后,第三个关节在高速转弯时加速度超限,直接触发驱动器过流保护,机器人急停。那次差点把工件撞废。
所以,从路径到轨迹,本质上是从几何空间进入物理空间。路径规划回答「能不能到」,轨迹规划回答「能不能安全、平稳、高效地到」。
一个直观的例子
假设你要让机械臂从A点抓取一个零件,放到B点。
路径规划会给出:
A → 绕过障碍物1 → 经过中间点C → 到达B
路径长度:1.2m
轨迹规划会给出:
t=0s: 位置A, 速度0
t=0.5s: 位置C, 速度0.3m/s
t=1.2s: 位置B, 速度0
最大速度: 0.5m/s (未超限)
最大加速度: 1.2m/s² (在允许范围内)
你看,路径规划只告诉你「走这条路」,轨迹规划告诉你「怎么走、走多快、什么时候减速」。没有轨迹规划,机器人要么走得太慢(效率低),要么走得太猛(出事故)。
知识体系总览
下面这张图把本章的核心逻辑串起来了,我建议你多看几遍:
我的个人习惯:在项目初期,我会先用路径规划快速验证「这条路能不能走通」,确认可行后再做轨迹规划。如果上来就做完整的轨迹规划,调参会非常痛苦——你根本不知道是路径有问题还是时间参数化有问题。
避坑指南
最后分享几个我踩过的坑:
- 不要用路径规划的结果直接驱动电机。路径点之间没有速度信息,电机要么急停急启,要么震荡。必须做时间参数化。
- 注意路径的连续性。如果路径本身有尖角(比如A*走出来的折线),直接做时间参数化会导致速度方向突变。我一般会先做路径平滑(比如B样条拟合),再做轨迹规划。
- 约束条件要分层引入。先加速度约束,再加加速度约束,最后加力矩约束。一次性全加上,出了问题你都不知道是哪个约束在作怪。