路径规划与轨迹规划:到底差在哪?

很多新手刚接触这个领域时,都会问同一个问题:路径规划和轨迹规划,不都是让机器人从A走到B吗?

嗯,表面上看确实差不多。但实际做项目时,这两者的区别会直接影响你的算法选型和系统性能。我当年在做一个仓储机器人项目时,就因为这个概念没搞清楚,白白浪费了两周时间。

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

路径 vs 轨迹:一个管空间,一个管时间

先给个最直白的定义:

  • 路径(Path):只描述机器人要经过的空间位置序列。它不管速度,不管加速度,更不管什么时候到。
  • 轨迹(Trajectory):在路径的基础上,给每个点加上时间信息。说白了,就是「什么时间,在什么位置,以什么速度运动」。

举个例子你就明白了。假设你要从北京开车到上海:

  • 路径规划:告诉你走京沪高速,经过济南、徐州、南京,最后到上海。这就是一条几何路径。
  • 轨迹规划:告诉你几点从北京出发,在哪个服务区休息多久,每个路段开多快,几点到上海。这就是带时间律的轨迹。

核心区别一句话:路径是「去哪儿」,轨迹是「怎么去、多快去、什么时候到」。

几何路径 vs 时间律

咱们再深入一点。路径规划的输出,本质上是一个几何曲线。它可以是直线段、圆弧、样条曲线,甚至是一堆离散点。但不管形式如何,它只描述空间关系。

而轨迹规划,要在几何路径上叠加一个时间律。这个时间律通常用s(t)来表示——s是沿路径走过的距离,t是时间。

我习惯把轨迹规划拆成两步来看:

  1. 路径生成:先确定几何形状
  2. 时间参数化:再决定怎么沿着这条路径走

举个例子,同样是走一条直线:

参数 匀速轨迹 梯形速度轨迹 S形速度轨迹
速度曲线 恒定 先加速→匀速→减速 加加速→匀加速→减加速→匀速→加减速→匀减速→减减速
加速度 0 分段常数 连续变化
冲击度(Jerk) 0 无穷大(突变点) 有限值
适用场景 简单移动 大多数工业机器人 高精度、高舒适度场景

你看,几何路径完全一样,但加上不同的时间律,机器人的运动表现天差地别。

我曾经踩过的坑:在做一个码垛机器人项目时,我直接用梯形速度规划,结果末端执行器在加减速切换点产生了明显的振动。后来换成S形速度曲线,问题才解决。记住,加速度突变会激发机械结构的谐振频率——这是轨迹规划里最容易忽略的细节。

路径规划算法:A* 和 RRT 简介

路径规划算法有很多,但最经典、最常用的就是A*和RRT。我分别说说它们的核心思想。

A* 算法:有地图就找最优

A* 是一种基于搜索的路径规划算法。它适合在已知的栅格地图或拓扑地图上工作。

核心公式很简单:

f(n) = g(n) + h(n)
  • g(n):从起点到当前节点n的实际代价
  • h(n):从节点n到终点的估计代价(启发式函数)
  • f(n):总代价,A*每次选f(n)最小的节点扩展

说白了,A* 就是「既看走过的路,也看没走的路」。它比Dijkstra聪明的地方在于,有了启发式函数h(n)的引导,搜索方向更明确,效率更高。

我个人习惯:在二维栅格地图上,启发式函数用欧几里得距离或曼哈顿距离都行。但如果地图有障碍物,欧几里得距离会低估实际代价,导致搜索节点增多。这时候曼哈顿距离反而更准——前提是机器人只能四方向移动。

RRT 算法:没地图也能找

RRT(Rapidly-exploring Random Tree)是另一种思路。它不需要完整的地图,只需要一个碰撞检测器。

算法流程大致是:

  1. 从起点开始,随机采样一个点
  2. 在已有树上找离采样点最近的节点
  3. 从这个节点向采样点方向生长一段距离
  4. 如果新节点没碰到障碍物,就加入树中
  5. 重复直到新节点接近终点

你想想看,RRT 本质上是在用随机采样来「探索」空间。它不保证最优,但保证能找到一条可行路径——只要存在的话。

我当年做机械臂避障时,就用的RRT。因为机械臂的构型空间是6维甚至7维的,A*根本没法建图。而RRT只需要一个碰撞检测函数,就能在高维空间里快速找到路径。

对比项 A* RRT
地图需求 需要完整栅格/拓扑地图 只需要碰撞检测
最优性 保证最短路径(在栅格分辨率内) 不保证最优,但可改进为RRT*
适用维度 低维(2D/3D) 高维(6D/7D构型空间)
计算效率 随地图规模增大而快速增加 随机采样,效率相对稳定
典型应用 扫地机器人、AGV导航 机械臂运动规划、无人机航迹

轨迹规划的核心问题

好,现在路径有了,接下来就是轨迹规划要解决的核心问题。我总结为三个:

1. 时间最优 vs 平滑性

你想让机器人跑得最快,那就用最大速度、最大加速度。但这样做的代价是运动不平滑,机械冲击大,甚至可能让电机过载。

反过来,你想让运动极其平滑,那就得牺牲时间。这是个典型的权衡问题。

实际工程中,我一般会设定一个「时间上限」,然后在满足这个上限的前提下,尽量提高平滑性。说白了,就是「别太慢,也别太颠」。

2. 约束处理

轨迹规划必须满足一堆约束:

  • 运动学约束:速度、加速度、加加速度的上下限
  • 动力学约束:关节力矩、末端力的限制
  • 几何约束:不能碰障碍物,末端姿态要满足任务要求
  • 时间约束:必须在某个时间点到达某个位置

这些约束往往互相矛盾。比如你想让机械臂末端走一条直线,但某个关节可能因此需要极高的速度——这就违反了运动学约束。

核心思路:轨迹规划本质上是一个带约束的优化问题。目标函数可以是时间最短、能量最小、冲击最小等。约束就是上面说的那些物理限制。

3. 实时性

很多轨迹规划算法需要在机器人运动过程中在线计算。比如,当机器人发现前方有动态障碍物时,必须快速重新规划轨迹。

这就对算法的计算效率提出了要求。我见过一些团队用非线性优化做轨迹规划,效果确实好,但算一次要好几秒——这在实时场景下根本没法用。

所以实际工程中,分段多项式和样条曲线用得最多。它们计算快,而且能保证一定的平滑性。

知识体系总览

下面这张图把本章的核心逻辑串起来了:

路径规划与轨迹规划知识体系 路径规划 vs 轨迹规划:知识体系 路径规划(空间几何) 轨迹规划(空间+时间) A* 算法 RRT 算法 路径规划特点 • 只关心空间位置序列 • 输出几何曲线/离散点 时间参数化 s(t) 匀速 梯形速度 轨迹规划核心问题 ① 时间最优 vs 平滑性 ② 约束处理(运动学/动力学) ③ 实时性要求 路径是骨架,轨迹是血肉

你看,路径规划解决的是「能不能到」的问题,轨迹规划解决的是「怎么到得好」的问题。两者缺一不可。

实际项目中,我通常先跑路径规划拿到一条几何路径,然后再用轨迹规划给它加上时间信息。但有些场景下,比如动态避障,需要把路径和轨迹放在一起优化——这就是更高级的「时空联合规划」了。

嗯,不过那是后面章节的内容。今天先把基础打牢,搞清楚路径和轨迹的区别,后面的路就好走了。