第三章:Autoware架构解析:核心模块总览
各位同学,今天我们来聊聊Autoware的架构。说实话,我第一次接触Autoware时,也被它庞大的代码量吓了一跳。但当你真正理解了它的模块划分,就会发现——嗯,其实挺清晰的。
Autoware的核心模块,说白了就是自动驾驶的「五驾马车」:感知、定位、规划、控制,再加上一个通信机制把它们串起来。我习惯把这五个部分想象成一个人的五官和四肢——感知是眼睛耳朵,定位是方向感,规划是大脑,控制是手脚。
3.1 感知模块——自动驾驶的「眼睛」
感知模块负责回答一个问题:「周围有什么?」。它处理LiDAR点云、摄像头图像、毫米波雷达数据,输出障碍物检测结果、交通标志识别、车道线信息等。
我个人习惯把感知分为三个层次:
- 检测(Detection):识别车辆、行人、骑行者等动态物体
- 分割(Segmentation):区分可行驶区域、路肩、障碍物
- 跟踪(Tracking):对检测到的物体进行持续追踪,预测其运动轨迹
3.2 定位模块——自动驾驶的「方向感」
定位模块要回答:「我在哪里?」。Autoware主要使用NDT(正态分布变换)算法进行点云配准,结合GNSS和IMU做融合定位。
你想想看,如果定位偏差了30厘米,在高速上可能就撞上护栏了。所以定位模块的精度要求非常高——一般要求厘米级。
Autoware的定位流程大致是:
- 加载高精度点云地图(PCD文件)
- 接收实时LiDAR点云
- 使用NDT算法将实时点云与地图配准
- 输出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 |
说白了,全局规划告诉你「走哪条路」,行为规划告诉你「现在该干嘛」,运动规划告诉你「方向盘打多少、油门踩多深」。
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。