第4章:路径规划 vs 轨迹规划

好,咱们今天聊个特别基础、但也特别容易混淆的话题——路径规划和轨迹规划到底有啥区别?

我刚开始做机器人那会儿,也傻傻分不清。总觉得“规划一条路”不就是规划吗?后来被项目狠狠教育了一顿,才明白这两者完全是两码事。

4.1 路径与轨迹:一字之差,天壤之别

先给个最直白的定义:

  • 路径:只关心“走哪条路”,不关心“怎么走”。
  • 轨迹:不仅关心“走哪条路”,还关心“什么时候走到哪”。

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

举个例子。你从家走到公司,路径就是“出门左转,过红绿灯,直走200米”。但轨迹呢?它得告诉你:8:00出门,8:02到红绿灯,8:05到公司门口,而且中间速度不能超过1.5m/s,拐弯时加速度不能太大——不然你手里的咖啡会洒。

我在项目中遇到过最典型的坑:路径规划明明找到了最短路径,但机器人一跑起来就抖得像帕金森。为什么?因为路径没考虑速度和加速度约束。路径上有个急转弯,机器人以高速冲过去,直接侧翻。嗯,这就是只做路径规划、不做轨迹规划的后果。

核心区别总结:
  • 路径 = 空间中的一条曲线(位置序列)
  • 轨迹 = 路径 + 时间信息(位置 + 速度 + 加速度)

你想想看,如果只给机器人一条路径,它怎么走?它不知道是该快还是该慢,不知道什么时候该减速。所以轨迹规划才是真正让机器人“动起来”的关键。

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

路径规划算法很多,但最经典、最常用的就两个:A* 和 RRT。我个人的经验是,这两个算法基本覆盖了90%的日常场景。

A* 算法:有地图时的首选

A* 是一种基于搜索的算法。它把环境离散成网格,然后从起点开始,一步步搜索到终点。它的核心公式很简单:

f(n) = g(n) + h(n)

其中:

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

说白了,A* 就是“既看过去,也看未来”。它不像 Dijkstra 那样盲目地往四周扩散,而是有个“目标感”——朝着终点方向优先搜索。

我曾经用 A* 做仓储机器人的路径规划。环境是已知的货架布局,网格化后直接跑 A*,效果非常好。但要注意一点:网格分辨率很关键。网格太大,路径粗糙;网格太小,计算量爆炸。我一般取机器人直径的1/2作为网格大小,算是个经验值。

避坑指南:我曾经把启发式函数 h(n) 设成欧几里得距离,结果在走廊场景下搜索效率极低。后来改成曼哈顿距离,速度直接翻倍。记住:启发式函数要跟实际运动模型匹配。

RRT 算法:高维空间或未知环境的救星

RRT(快速随机扩展树)是另一种思路。它不依赖网格,而是在连续空间中随机采样,从起点向外“生长”出一棵树,直到碰到终点。

RRT 的伪代码大概长这样:

function RRT(start, goal, environment):
    tree = [start]
    while not reached_goal:
        sample = random_sample()          // 随机采样一个点
        nearest = find_nearest(tree, sample)  // 找树上最近节点
        new_node = steer(nearest, sample)     // 向采样点延伸一步
        if not collision(new_node, environment):
            tree.add(new_node)
            if distance(new_node, goal) < threshold:
                return extract_path(tree, new_node)
    return failure

RRT 的好处是:不需要对环境做离散化,适合高维空间(比如机械臂的关节空间)。而且它天然带有随机性,不容易陷入局部最优。

但 RRT 也有缺点——路径通常很“丑”,弯弯绕绕的,不是最优。我一般会在 RRT 之后加一个路径平滑步骤,比如用 B 样条曲线或者梯度下降法把路径捋直。

注意:RRT 的随机采样可能导致路径不稳定——同样的起点终点,每次跑出来的路径都不一样。如果应用场景要求可重复性(比如工业流水线),建议用 A* 或者 RRT*(带优化的版本)。

4.3 轨迹规划:时间与速度才是灵魂

好,路径有了,接下来就是轨迹规划。轨迹规划的核心问题就两个:什么时候到?速度怎么变?

我习惯把轨迹规划分成两步:

  1. 时间分配:给路径上的每个点分配一个时间戳
  2. 速度曲线生成:确定速度、加速度随时间的变化规律

最简单的轨迹规划是梯形速度曲线:先匀加速,再匀速,最后匀减速。但实际应用中,梯形曲线的加速度突变会导致机器人抖动。所以更常用的是 S 形速度曲线(加加速度连续)。

举个例子,假设路径总长 10 米,最大速度 1 m/s,最大加速度 0.5 m/s²:

梯形速度曲线参数:
加速段:t1 = v_max / a_max = 1 / 0.5 = 2 秒
匀速段:t2 = (总路程 - 加速段路程 - 减速段路程) / v_max
减速段:t3 = t1 = 2 秒
总时间 = t1 + t2 + t3

你看,轨迹规划本质上就是在做“时间-速度”的权衡。时间短,速度快,但加速度大,容易抖动;时间长,速度慢,但运动平滑。具体怎么选,取决于你的应用场景。

我的经验:做轨迹规划时,永远要留有余量。不要把电机推到极限速度的100%,留个10%-20%的余量。我曾经在项目中把速度设到极限,结果电机过热保护,机器人直接停在半路。从那以后,我所有轨迹规划都加了一个安全系数。

4.4 本章知识体系

下面这张图是我自己整理的,把路径规划和轨迹规划的关系画清楚了:

路径规划 vs 轨迹规划 知识体系 路径规划 只关心空间几何路径 输出:位置序列 (x,y,z,...) 常用算法: • A*:有地图,网格搜索,最优 • RRT:无地图,随机采样,高维 轨迹规划 关心时空运动参数 输出:位置+速度+加速度+时间 核心要素: • 时间分配:何时到达 • 速度曲线:梯形/S形 输入 路径 vs 轨迹 对比 对比维度 路径规划 轨迹规划 关注点 空间几何可行性 时间+运动平滑性 输出 路径点序列 速度/加速度曲线 典型算法 A*, RRT, Dijkstra 梯形/S形曲线, 多项式

这张图把本章的核心内容都串起来了。左边是路径规划,右边是轨迹规划,下面是两者的对比。我个人觉得,理解这张图比背十个公式都管用。

4.5 小结

最后总结几句:

  • 路径规划是轨迹规划的前提,但路径规划不等于轨迹规划
  • A* 适合有地图、低维度的场景;RRT 适合无地图、高维度的场景
  • 轨迹规划的核心是“时间+速度”,不是简单的路径跟随
  • 实际项目中,路径规划和轨迹规划要配合使用,缺一不可

嗯,这一章就到这儿。下一章咱们会深入讲轨迹规划的具体实现方法,包括多项式插值和优化求解。到时候见。

个人建议:初学者可以先从 A* + 梯形速度曲线这个组合入手,简单、稳定、容易调试。等跑通了再尝试 RRT + S形曲线。别一上来就搞太复杂的,容易劝退。

可可精品资料库