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作为网格大小,算是个经验值。
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 样条曲线或者梯度下降法把路径捋直。
4.3 轨迹规划:时间与速度才是灵魂
好,路径有了,接下来就是轨迹规划。轨迹规划的核心问题就两个:什么时候到?速度怎么变?
我习惯把轨迹规划分成两步:
- 时间分配:给路径上的每个点分配一个时间戳
- 速度曲线生成:确定速度、加速度随时间的变化规律
最简单的轨迹规划是梯形速度曲线:先匀加速,再匀速,最后匀减速。但实际应用中,梯形曲线的加速度突变会导致机器人抖动。所以更常用的是 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
你看,轨迹规划本质上就是在做“时间-速度”的权衡。时间短,速度快,但加速度大,容易抖动;时间长,速度慢,但运动平滑。具体怎么选,取决于你的应用场景。
4.4 本章知识体系
下面这张图是我自己整理的,把路径规划和轨迹规划的关系画清楚了:
这张图把本章的核心内容都串起来了。左边是路径规划,右边是轨迹规划,下面是两者的对比。我个人觉得,理解这张图比背十个公式都管用。
4.5 小结
最后总结几句:
- 路径规划是轨迹规划的前提,但路径规划不等于轨迹规划
- A* 适合有地图、低维度的场景;RRT 适合无地图、高维度的场景
- 轨迹规划的核心是“时间+速度”,不是简单的路径跟随
- 实际项目中,路径规划和轨迹规划要配合使用,缺一不可
嗯,这一章就到这儿。下一章咱们会深入讲轨迹规划的具体实现方法,包括多项式插值和优化求解。到时候见。