3. 自动驾驶系统架构

自动驾驶系统不是单一程序,而是由多个实时性、可靠性要求各异的子系统协同构成的复杂工程系统。理解模块划分与数据流,是后续在 ROS2 中做部署、调优和排障的前提。本节从功能分层出发,说明各模块的职责边界,再落到 ROS2 在系统集成中的角色,最后给出典型数据流设计方法。

一、核心原理:六层模块划分与职责边界

工程上通常把自动驾驶系统划分为感知、定位、规划、控制、底盘、HMI 六个功能域。它们并非简单串联,而是存在反馈与并行关系:感知与定位为规划提供环境与自车状态,规划输出轨迹,控制把轨迹转成执行器指令,底盘反馈真实运动状态,HMI 承担人机交互与状态监控。

  • 感知:激光雷达、摄像头、毫米波雷达、超声波等传感器数据接入,完成目标检测、跟踪、车道线识别、可行驶区域分割,输出障碍物列表与语义地图。
  • 定位:融合 GNSS/RTK、IMU、轮速计、激光点云匹配,输出高频位姿与速度,是规划与控制的空间基准。
  • 规划:分为全局路由、行为决策、局部轨迹规划三层,输出带时间戳的轨迹点序列及速度曲线。
  • 控制:横向控制(转向)与纵向控制(油门/制动),将轨迹误差转为执行器指令,常用 MPC、Pure Pursuit、PID 等算法。
  • 底盘:线控转向、线控制动、驱动电机、档位与灯光,通过 CAN 总线接收指令并回传车辆状态。
  • HMI:显示规划轨迹、感知目标、系统状态,提供接管提示、模式切换与故障告警。
模块划分的核心原则是“高内聚、低耦合”:每个模块只暴露必要的输入输出接口,内部算法可独立迭代。ROS2 的节点、话题、服务、动作正是承载这一原则的工程载体。

二、ROS2 在系统集成中的角色

ROS2 不是算法本身,而是系统集成的“神经系统”。它提供分布式通信、生命周期管理、参数配置、时间同步与日志诊断能力,使异构模块能够在同一时空基准下协作。其关键角色包括:

  1. 通信中间件:基于 DDS 实现发布/订阅、请求/响应、动作三种模式,支持进程内、跨进程、跨主机通信。
  2. 时间与时钟:通过 /clock 话题统一仿真与实车时间,保证多传感器数据时间戳一致。
  3. 生命周期管理:节点可配置、激活、去激活,便于启动顺序控制与故障隔离。
  4. 参数系统:算法阈值、车辆尺寸、控制增益等通过参数服务器动态调整,无需重新编译。
  5. 诊断与记录: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 订阅关键话题做可视化。

自动驾驶系统模块划分与 ROS2 数据流 传感器层 LiDAR / Camera Radar / GNSS / IMU 感知模块 检测 / 跟踪 / 分割 输出障碍物列表 定位模块 NDT / EKF 融合 输出位姿与速度 规划模块 全局路由 / 行为决策 局部轨迹规划 输出轨迹点序列 控制模块 横向 MPC / Pure Pursuit 纵向 PID / 速度规划 输出转向/油门/制动 底盘模块 线控转向 / 制动 驱动电机 / 档位 CAN 总线通信 HMI 人机交互模块 轨迹可视化 / 接管提示 / 模式切换 / 故障告警 原始数据 GNSS/IMU/轮速 障碍物 位姿 轨迹 控制指令 车辆状态反馈 ROS2 / DDS 通信中间件:话题 · 服务 · 动作 · 参数 · 时钟 · 诊断 传感器 感知 定位 规划 控制 底盘 HMI

数据流设计中需要特别关注 QoS 配置。感知点云数据量大、允许丢帧,适合 best_effort;控制指令要求可靠送达,应使用 reliable;定位与轨迹话题频率高,需设置合适的 depth 避免队列积压。错误配置会导致“话题存在但收不到数据”或“延迟累积”等典型问题。

四、案例与场景:城市路口左转

以城市路口左转为例:感知模块识别对向直行车辆与行人,输出目标 ID 与速度;定位模块提供车辆在路口内的厘米级位姿;规划模块先做行为决策判断是否可左转,再生成平滑轨迹;控制模块跟踪轨迹并输出转向角与减速度;底盘执行后回传横摆角速度;HMI 显示左转路径与对向车辆距离。整个链路中,ROS2 负责把各节点的时间戳对齐,使规划看到的是同一时刻的环境快照。

五、常见误区与复盘

误区一:把 ROS2 当成实时操作系统。ROS2 提供通信与调度框架,但硬实时控制仍需实时内核、CPU 隔离与优先级配置。
误区二:所有话题都用默认 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 的系统集成价值才能真正落地。