1. Autoware规划模块概览

各位同学好,我是老张。在自动驾驶行业摸爬滚打了七八年,踩过的坑比走过的路还多。今天咱们来聊聊Autoware规划模块,这个模块说白了就是自动驾驶的「大脑」——它决定了车该怎么走、走哪条路、什么时候变道。

我记得刚接触Autoware那会儿,看着一堆节点和话题,头都大了。后来慢慢理清了脉络,才发现其实没那么复杂。今天我就把这块掰开了揉碎了讲给你听。

1.1 规划模块在Autoware中的位置

先看一张整体架构图,这是我用SVG画的,帮你快速建立全局认知。

感知层 LiDAR / Camera / Radar 目标检测 / 语义分割 定位层 GNSS / IMU / 里程计 NDT匹配 / EKF融合 规划层 行为规划 / 运动规划 路径生成 / 速度规划 控制层 PID / MPC / 纯跟踪 油门 / 刹车 / 转向 执行层 CAN总线 / 线控底盘 车辆动力学响应 障碍物信息 自车位姿 轨迹 / 速度指令 控制信号 ★ 本章核心

从这张图你能看到,规划层夹在感知定位和控制之间。它接收上游的障碍物信息和自车位姿,输出一条安全、舒适、可执行的轨迹给控制层。我习惯把规划模块比作「司机的大脑」——感知是眼睛,定位是方向感,控制是手脚,而规划就是那个做决策的大脑。

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 数据流详解

搞清楚了架构,咱们再来看看数据是怎么在模块间流动的。我画了一张数据流图,你跟着箭头走一遍就明白了。

感知输入 /perception/objects 定位输入 /localization/pose 地图输入 /map/vector_map 规划模块 全局规划 → 行为规划 → 运动规划 内部话题: /planning/route /planning/scenario 轨迹输出 /planning/trajectory

数据流其实就三步:

  1. 输入:规划模块订阅三个主要话题——感知障碍物、自车位姿、高精地图
  2. 处理:内部经过全局→行为→运动三级流水线处理
  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 里盯着节点连线看半天,就为了确认数据有没有断掉。

一句话总结:规划模块 = 全局路径(去哪儿)+ 行为决策(怎么走)+ 运动规划(具体轨迹)。调试时从输出往回查,先看轨迹有没有发布,再看场景决策对不对,最后查全局路径是否合理。

好了,这一章的内容就到这儿。记住这张架构图和数据流,后面咱们讲具体调试技巧时,你会经常回来翻它的。