第三章:Autoware架构解析:核心模块总览

各位同学,今天我们来聊聊Autoware的架构。说实话,我第一次接触Autoware时,也被它庞大的代码量吓了一跳。但当你真正理解了它的模块划分,就会发现——嗯,其实挺清晰的。

Autoware的核心模块,说白了就是自动驾驶的「五驾马车」:感知、定位、规划、控制,再加上一个通信机制把它们串起来。我习惯把这五个部分想象成一个人的五官和四肢——感知是眼睛耳朵,定位是方向感,规划是大脑,控制是手脚。

Autoware 核心模块架构图 感知模块 Detection 定位模块 Localization 规划模块 Planning 控制模块 Control 传感器输入:LiDAR / Camera / GNSS / IMU / 轮速计 ROS2 通信中间件(DDS) 车辆控制指令输出

3.1 感知模块——自动驾驶的「眼睛」

感知模块负责回答一个问题:「周围有什么?」。它处理LiDAR点云、摄像头图像、毫米波雷达数据,输出障碍物检测结果、交通标志识别、车道线信息等。

我个人习惯把感知分为三个层次:

  • 检测(Detection):识别车辆、行人、骑行者等动态物体
  • 分割(Segmentation):区分可行驶区域、路肩、障碍物
  • 跟踪(Tracking):对检测到的物体进行持续追踪,预测其运动轨迹
避坑指南: 我在项目中遇到过一个问题——感知模块的检测频率和规划模块的订阅频率不匹配。感知输出10Hz,规划期望20Hz,结果导致规划模块频繁丢帧。后来我加了一个消息缓存队列,才解决了这个问题。

3.2 定位模块——自动驾驶的「方向感」

定位模块要回答:「我在哪里?」。Autoware主要使用NDT(正态分布变换)算法进行点云配准,结合GNSS和IMU做融合定位。

你想想看,如果定位偏差了30厘米,在高速上可能就撞上护栏了。所以定位模块的精度要求非常高——一般要求厘米级。

Autoware的定位流程大致是:

  1. 加载高精度点云地图(PCD文件)
  2. 接收实时LiDAR点云
  3. 使用NDT算法将实时点云与地图配准
  4. 输出6自由度位姿(x, y, z, roll, pitch, yaw)

关键话题:

  • /localization/ndt_pose — NDT配准后的位姿
  • /localization/ekf_pose — EKF融合后的位姿
  • /localization/twist — 速度信息

3.3 规划模块——自动驾驶的「大脑」

规划模块是最复杂的部分。它要回答:「接下来怎么走?」。我把它拆成三个子模块:

子模块 功能 输出话题
全局规划 从起点到终点的宏观路径 /planning/mission_planning/route
行为规划 决定变道、跟车、停车等行为 /planning/scenario_planning/scenario
运动规划 生成具体的轨迹(路径+速度) /planning/scenario_planning/trajectory

说白了,全局规划告诉你「走哪条路」,行为规划告诉你「现在该干嘛」,运动规划告诉你「方向盘打多少、油门踩多深」。

注意: 运动规划输出的轨迹是一个包含时间戳的路径点序列。每个点都包含位置、朝向、速度、加速度信息。我曾经见过一个bug——轨迹点的时间戳顺序错了,导致车辆在路口突然急刹车。排查了两天才发现是时间戳排序问题。

3.4 控制模块——自动驾驶的「手脚」

控制模块负责执行规划模块的指令。它把轨迹转换成具体的油门、刹车、方向盘角度。

Autoware默认使用纯跟踪(Pure Pursuit)算法做横向控制,PID做纵向控制。当然,你也可以换成MPC(模型预测控制),效果会更好,但调参也更痛苦——嗯,我调MPC参数调了整整一周。

控制模块的核心话题:

  • /control/command/control_cmd — 控制指令(油门、刹车、转向)
  • /control/command/gear_cmd — 档位指令
  • /control/command/hazard_lights_cmd — 危险报警灯

3.5 模块间通信机制——ROS2的「神经网络」

Autoware的模块之间怎么通信?全靠ROS2的发布-订阅机制。每个模块都是一个节点,通过话题(Topic)交换数据。

我画了一张节点图,方便你理解:

传感器节点 → 感知节点 → 定位节点 → 规划节点 → 控制节点 → 车辆接口
    │            │           │          │          │
    ▼            ▼           ▼          ▼          ▼
  /sensing/   /perception/ /localization/ /planning/ /control/

每个箭头都对应一个ROS2话题。比如感知节点发布/perception/object_recognition/detection/objects,规划节点订阅这个话题获取障碍物信息。

调试技巧: 我习惯用ros2 topic list查看所有话题,用ros2 topic echo /topic_name查看具体消息内容。如果某个模块不工作,先检查它订阅的话题有没有数据——八成是话题名拼错了。

3.6 节点图与话题分析——实战视角

在实际项目中,我建议你用rqt_graph可视化节点关系。运行命令:

ros2 run rqt_graph rqt_graph

你会看到一张动态的节点-话题关系图。我曾经用这个工具发现了一个隐藏问题——两个节点订阅了同一个话题,但消息类型不同,导致其中一个节点一直收不到数据。

常见的核心话题列表:

  • /tf — 坐标变换树(所有模块都依赖它)
  • /vehicle/status/velocity_status — 车辆当前速度
  • /sensing/lidar/pointcloud — LiDAR点云数据
  • /sensing/camera/image — 摄像头图像

记住一句话:在ROS2里,话题就是模块之间的「语言」。你只要搞懂了每个话题的数据结构,就等于掌握了Autoware的通信密码。

总结一下本章核心:

  • 感知模块负责「看」,输出障碍物和道路信息
  • 定位模块负责「定位」,输出厘米级位姿
  • 规划模块负责「想」,输出轨迹和行为
  • 控制模块负责「做」,输出油门刹车转向
  • ROS2话题是模块间的「桥梁」,用rqt_graph可以可视化

好了,这一章就到这里。下一章我们会深入感知模块,手把手带你跑通一个目标检测的Demo。

可可精品资料库