3. 自动驾驶系统架构
自动驾驶系统不是单一程序,而是由多个实时性、可靠性要求各异的子系统协同构成的复杂工程系统。理解模块划分与数据流,是后续在 ROS2 中做部署、调优和排障的前提。本节从功能分层出发,说明各模块的职责边界,再落到 ROS2 在系统集成中的角色,最后给出典型数据流设计方法。
一、核心原理:六层模块划分与职责边界
工程上通常把自动驾驶系统划分为感知、定位、规划、控制、底盘、HMI 六个功能域。它们并非简单串联,而是存在反馈与并行关系:感知与定位为规划提供环境与自车状态,规划输出轨迹,控制把轨迹转成执行器指令,底盘反馈真实运动状态,HMI 承担人机交互与状态监控。
- 感知:激光雷达、摄像头、毫米波雷达、超声波等传感器数据接入,完成目标检测、跟踪、车道线识别、可行驶区域分割,输出障碍物列表与语义地图。
- 定位:融合 GNSS/RTK、IMU、轮速计、激光点云匹配,输出高频位姿与速度,是规划与控制的空间基准。
- 规划:分为全局路由、行为决策、局部轨迹规划三层,输出带时间戳的轨迹点序列及速度曲线。
- 控制:横向控制(转向)与纵向控制(油门/制动),将轨迹误差转为执行器指令,常用 MPC、Pure Pursuit、PID 等算法。
- 底盘:线控转向、线控制动、驱动电机、档位与灯光,通过 CAN 总线接收指令并回传车辆状态。
- HMI:显示规划轨迹、感知目标、系统状态,提供接管提示、模式切换与故障告警。
二、ROS2 在系统集成中的角色
ROS2 不是算法本身,而是系统集成的“神经系统”。它提供分布式通信、生命周期管理、参数配置、时间同步与日志诊断能力,使异构模块能够在同一时空基准下协作。其关键角色包括:
- 通信中间件:基于 DDS 实现发布/订阅、请求/响应、动作三种模式,支持进程内、跨进程、跨主机通信。
- 时间与时钟:通过 /clock 话题统一仿真与实车时间,保证多传感器数据时间戳一致。
- 生命周期管理:节点可配置、激活、去激活,便于启动顺序控制与故障隔离。
- 参数系统:算法阈值、车辆尺寸、控制增益等通过参数服务器动态调整,无需重新编译。
- 诊断与记录:ros2 bag 记录全量话题,配合诊断聚合器实现回放与问题复现。
在部署层面,ROS2 常与 Docker、systemd、launch 文件结合,形成可重复的启动流程。例如使用 launch 文件按依赖顺序拉起定位、感知、规划、控制节点:
ros2 launch autoware_launch autoware.launch.xml \
vehicle_model:=sample_vehicle \
sensor_model:=sample_sensor_kit \
map_path:=/maps/area_01
三、数据流设计:从传感器到执行器
数据流设计要回答三个问题:谁发布、谁订阅、以什么频率和 QoS 传输。典型链路如下:传感器驱动发布原始点云与图像;感知节点订阅后输出目标列表;定位节点融合多源数据输出位姿;规划节点订阅目标、位姿与地图,输出轨迹;控制节点订阅轨迹与车辆状态,输出控制指令;底盘驱动订阅指令并回传底盘状态;HMI 订阅关键话题做可视化。
数据流设计中需要特别关注 QoS 配置。感知点云数据量大、允许丢帧,适合 best_effort;控制指令要求可靠送达,应使用 reliable;定位与轨迹话题频率高,需设置合适的 depth 避免队列积压。错误配置会导致“话题存在但收不到数据”或“延迟累积”等典型问题。
四、案例与场景:城市路口左转
以城市路口左转为例:感知模块识别对向直行车辆与行人,输出目标 ID 与速度;定位模块提供车辆在路口内的厘米级位姿;规划模块先做行为决策判断是否可左转,再生成平滑轨迹;控制模块跟踪轨迹并输出转向角与减速度;底盘执行后回传横摆角速度;HMI 显示左转路径与对向车辆距离。整个链路中,ROS2 负责把各节点的时间戳对齐,使规划看到的是同一时刻的环境快照。
五、常见误区与复盘
误区二:所有话题都用默认 QoS。默认配置在跨主机、高频率场景下容易丢包或阻塞。
误区三:模块间直接共享内存或全局变量。这会破坏分布式部署能力,应通过话题或服务解耦。
误区四:忽略时间同步。多传感器融合若时间戳不一致,定位会漂移,规划会误判。
| 模块 | 典型输入话题 | 典型输出话题 | 建议频率 | QoS 建议 |
|---|---|---|---|---|
| 感知 | /lidar/points, /camera/image | /perception/objects | 10–20 Hz | best_effort |
| 定位 | /gnss/fix, /imu/data, /points | /localization/pose | 50–100 Hz | reliable |
| 规划 | /perception/objects, /localization/pose | /planning/trajectory | 10–20 Hz | reliable |
| 控制 | /planning/trajectory, /vehicle/status | /control/command | 50–100 Hz | reliable |
| 底盘 | /control/command | /vehicle/status | 50–100 Hz | reliable |
复盘时建议用 ros2 topic hz 与 ros2 topic delay 检查各链路频率与延迟,用 ros2 bag record 记录关键话题后离线回放,定位是算法问题还是通信问题。只有模块边界清晰、数据流可观测,ROS2 的系统集成价值才能真正落地。