1. Autoware规划模块概览
各位同学好,我是老张。在自动驾驶行业摸爬滚打了七八年,踩过的坑比走过的路还多。今天咱们来聊聊Autoware规划模块,这个模块说白了就是自动驾驶的「大脑」——它决定了车该怎么走、走哪条路、什么时候变道。
我记得刚接触Autoware那会儿,看着一堆节点和话题,头都大了。后来慢慢理清了脉络,才发现其实没那么复杂。今天我就把这块掰开了揉碎了讲给你听。
1.1 规划模块在Autoware中的位置
先看一张整体架构图,这是我用SVG画的,帮你快速建立全局认知。
从这张图你能看到,规划层夹在感知定位和控制之间。它接收上游的障碍物信息和自车位姿,输出一条安全、舒适、可执行的轨迹给控制层。我习惯把规划模块比作「司机的大脑」——感知是眼睛,定位是方向感,控制是手脚,而规划就是那个做决策的大脑。
1.2 规划模块的内部架构
规划模块本身又分三层,每一层干的事都不一样。咱们一层层来看。
1.2.1 全局路径规划(Route Planning)
这一层负责回答「去哪儿」的问题。它根据起点和终点,在高精地图上找出一条宏观路径。说白了就是导航,跟手机地图差不多。
在Autoware里,lane_planner 节点干的就是这个活。它读取HD Map,用A*或Dijkstra算法在车道级路网上搜索路径。输出是一系列车道ID的序列。
关键点:全局路径不包含具体的速度信息,只包含空间上的车道序列。它更新频率很低,一般只在路线改变时才重新规划。
1.2.2 行为规划(Behavior Planning)
这一层回答「怎么走」的问题。它根据全局路径和当前交通场景,决定下一秒该做什么动作。
举个例子:前方有车挡路,行为规划要决定——是跟车、变道、还是停车等待?在Autoware里,behavior_planner 节点用有限状态机(FSM)来管理这些行为状态。
我项目中遇到过一个问题:FSM状态切换太生硬,导致车辆在路口犹豫不决。后来我们加了状态平滑过渡机制,才解决了这个「犹豫症」。
| 行为状态 | 触发条件 | 输出动作 |
|---|---|---|
| FOLLOW_LANE | 前方无障碍物 | 沿车道中心线行驶 |
| DECELERATE | 前方有低速障碍物 | 减速跟车 |
| LANE_CHANGE | 当前车道受阻且邻车道安全 | 执行变道轨迹 |
| STOP | 红灯/行人/紧急情况 | 生成停车轨迹 |
1.2.3 运动规划(Motion Planning)
这一层回答「具体怎么走」的问题。它把行为规划的动作意图,转化成一条平滑、安全、可执行的轨迹。轨迹包含位置、速度、加速度、曲率等信息。
在Autoware里,motion_planner 节点负责这个活。它用优化算法(比如二次规划QP、样条插值)生成轨迹。我建议你重点关注两个子模块:
- 路径生成器:生成空间上的路径点序列
- 速度规划器:给路径点分配速度和时间
调试小技巧:当你发现车辆行驶不平顺时,先检查速度规划器。很多时候问题出在加速度突变上,而不是路径本身。我曾经花了两天排查路径问题,最后发现只是速度曲线没平滑好。
1.3 数据流详解
搞清楚了架构,咱们再来看看数据是怎么在模块间流动的。我画了一张数据流图,你跟着箭头走一遍就明白了。
数据流其实就三步:
- 输入:规划模块订阅三个主要话题——感知障碍物、自车位姿、高精地图
- 处理:内部经过全局→行为→运动三级流水线处理
- 输出:最终发布
/planning/trajectory话题给控制模块
注意:数据流的时序非常关键。如果感知输入延迟了100ms,规划模块还在用旧数据做决策,那后果...嗯,我在测试场亲眼见过一辆车因为数据延迟直接冲上了路沿。所以调试时一定要用 rosbag 回放检查时间戳对齐情况。
1.4 核心组件一览
最后,我把规划模块的核心组件整理成了一张表。你调试的时候,对照这张表就能快速定位问题出在哪个节点。
| 组件名称 | 节点名 | 输入话题 | 输出话题 | 核心算法 |
|---|---|---|---|---|
| 全局路径规划 | lane_planner | /map/vector_map /planning/goal |
/planning/route | A* / Dijkstra |
| 行为规划 | behavior_planner | /planning/route /perception/objects |
/planning/scenario | 有限状态机 |
| 路径生成 | path_generator | /planning/scenario | /planning/path | 样条插值 / 优化 |
| 速度规划 | velocity_planner | /planning/path /perception/objects |
/planning/trajectory | ST图 / 速度优化 |
你想想看,这么多节点协同工作,任何一个环节出问题,车就跑不起来。我刚开始调试的时候,经常在 rqt_graph 里盯着节点连线看半天,就为了确认数据有没有断掉。
一句话总结:规划模块 = 全局路径(去哪儿)+ 行为决策(怎么走)+ 运动规划(具体轨迹)。调试时从输出往回查,先看轨迹有没有发布,再看场景决策对不对,最后查全局路径是否合理。
好了,这一章的内容就到这儿。记住这张架构图和数据流,后面咱们讲具体调试技巧时,你会经常回来翻它的。