3、轨迹规划概述:全局路径规划 vs 局部轨迹规划、S型与梯形速度规划
大家好,我是老张。今天咱们聊聊轨迹规划。
说实话,很多刚入行的朋友容易把「路径规划」和「轨迹规划」混为一谈。我刚开始做AGV那会儿也犯过这个错——以为规划出一条路就完事了。结果呢?车是能走,但要么急停急起把货物晃倒,要么转弯时直接冲出路线。嗯,这里面的门道,咱们今天一次说透。
核心区别一句话:路径规划告诉你「走哪条路」,轨迹规划告诉你「怎么走这条路」。
3.1 全局路径规划:先看地图再出发
全局路径规划,说白了就是「先看地图,再定路线」。AGV在启动之前,需要知道整个环境长什么样——哪里有墙、哪里有货架、哪里是通道。然后算法基于这张静态地图,算出一条从起点到终点的可行路径。
我个人习惯把全局规划比作「导航软件里的路线推荐」。你输入目的地,高德给你三条路:最快的、最堵的、红绿灯最少的。AGV的全局规划也是类似,只不过它要考虑的是路径长度、转弯次数、是否经过狭窄区域等等。
实战经验:我在做仓储AGV项目时,遇到过一个问题——全局路径规划出来的路线太「理想化」了。算法觉得走直线最短,但实际通道中间有个柱子,车根本过不去。后来我学乖了,在代价函数里加入了「安全距离惩罚项」,路径才变得靠谱。
常用的全局规划算法有这些:
- A*算法:最经典,启发式搜索,效率高。我90%的项目都用它。
- Dijkstra:A*的祖宗,保证最优但慢。适合小地图。
- RRT / RRT*:随机采样,适合高维空间或非结构化环境。
- PRM:概率路线图,适合静态环境多次查询。
但注意,全局规划有个致命弱点——它假设地图是静态的。如果路上突然出现一个人、一辆叉车,全局规划是不知道的。这时候就需要局部轨迹规划上场了。
3.2 局部轨迹规划:边走边看
局部轨迹规划,你可以理解为「实时避障」。AGV一边沿着全局路径走,一边用激光雷达或视觉传感器感知周围环境。发现障碍物?立刻重新规划一小段轨迹,绕过去。
我经常跟团队说:全局规划是「战略」,局部规划是「战术」。战略定大方向,战术处理突发情况。
避坑指南:我曾经在一个项目中,局部规划的频率设得太低(只有5Hz),结果AGV撞上了突然出现的纸箱。后来我把频率提到20Hz,同时加了速度限制——如果障碍物太近,先急刹再重新规划。记住:局部规划的反应速度,直接决定了AGV的安全性。
常见的局部规划方法:
- DWA(动态窗口法):在速度空间采样,选最优轨迹。简单高效,我入门时第一个学的就是它。
- TEB(时间弹性带):把轨迹看作一条「橡皮筋」,优化它的形状。适合复杂环境。
- MPC(模型预测控制):预测未来几步,滚动优化。效果好但计算量大。
- 人工势场法:目标点产生引力,障碍物产生斥力。容易陷入局部极小值,慎用。
3.3 速度规划:让AGV「丝滑」运动
路径规划好了,轨迹也调整了,但还有一个关键问题——速度怎么给?
你想想看,如果AGV从静止直接跳到1m/s,电机瞬间输出最大扭矩,会发生什么?轻则货物倾倒,重则电机过载烧毁。所以我们需要速度规划,让速度平滑变化。
这里有两个经典的速度曲线:梯形速度规划和S型速度规划。
3.3.1 梯形速度规划
梯形速度曲线,顾名思义,速度-时间图像像一个梯形。它分为三个阶段:匀加速、匀速、匀减速。
优点:简单、计算量小、容易实现。
缺点:加速度在拐点处突变,产生「冲击」(Jerk无限大)。
// 梯形速度规划示例(伪代码)
float v_max = 1.0; // 最大速度 m/s
float a = 0.5; // 加速度 m/s²
float d = 0.5; // 减速度 m/s²
float s_total = 5.0; // 总位移 m
// 计算加速段和减速段距离
float s_acc = v_max * v_max / (2 * a);
float s_dec = v_max * v_max / (2 * d);
if (s_acc + s_dec <= s_total) {
// 能达到最大速度
float s_cruise = s_total - s_acc - s_dec;
// 三段式:加速-匀速-减速
} else {
// 达不到最大速度,只有加速和减速
// 两段式:加速-减速
}
什么时候用梯形?我个人建议:对舒适度要求不高、负载较轻、或者计算资源有限的场景。比如小型搬运AGV、巡检机器人。
3.3.2 S型速度规划
S型速度曲线,在梯形的基础上增加了「加加速度」(Jerk)控制。加速度不再是突变,而是平滑变化。速度-时间图像像字母「S」。
优点:运动极其平滑,无冲击,适合精密操作或载人场景。
缺点:参数多(7段甚至更多),计算复杂,实时性稍差。
// S型速度规划核心参数
float v_max = 1.0; // 最大速度
float a_max = 0.5; // 最大加速度
float j_max = 2.0; // 最大加加速度
// 7段式S型曲线:
// 加加速 - 匀加速 - 减加速 - 匀速 - 加减速 - 匀减速 - 减减速
我记得有一次做医疗AGV项目,车上要运送精密仪器。梯形规划一启动,仪器就报警「加速度超限」。换成S型规划后,问题立刻解决。说白了,S型就是「梯形的高级版」,用计算量换舒适度。
| 对比项 | 梯形速度规划 | S型速度规划 |
|---|---|---|
| 加速度变化 | 突变(阶跃) | 平滑(连续) |
| 加加速度(Jerk) | 无限大 | 有限值可控 |
| 计算复杂度 | 低 | 中高 |
| 适用场景 | 普通搬运、巡检 | 精密操作、载人、高速 |
| 实时性 | 好 | 一般 |
我的选择策略:如果项目预算紧、MCU性能弱,用梯形。如果客户对「平稳性」有明确要求(比如运输玻璃、液体),必须上S型。没有绝对的好坏,只有合不合适的场景。
3.4 全局与局部的配合:一个实际案例
最后分享一个我实际做过的案例。某电商仓库的AGV项目,环境是2000平米的货架区。
全局规划:先用A*在已知地图上算出一条主路径,避开所有固定货架。
局部规划:AGV运行时,激光雷达检测到前方有临时堆放的包裹。DWA算法立刻介入,在局部范围内重新规划轨迹,绕开包裹后再回到全局路径上。
速度规划:考虑到货物是普通纸箱,我用了梯形速度规划,最大速度1.2m/s,加速度0.4m/s²。跑起来很稳,没有出现货物倾倒的情况。
嗯,这就是轨迹规划的全貌。全局定方向,局部躲障碍,速度保平稳。三者缺一不可。