2. Autoware基础

Autoware 是构建在 ROS 2 之上的自动驾驶开源软件栈。理解它的关键,不是记住某个节点的名字,而是看清一条数据从传感器进入、经过感知与规划、最终变成车辆控制指令的完整链路。本节围绕架构分层、核心模块、ROS 2 通信机制、传感器抽象与车辆接口五个方面展开,为后续的量产集成与运行诊断打下基础。

一、Autoware 的分层架构

Autoware 在逻辑上可以划分为四层:感知层、定位与地图层、规划决策层、控制与车辆接口层。感知层负责把原始传感器数据转化为对环境的理解,包括障碍物、车道线、交通信号等;定位与地图层提供车辆在全局地图中的位姿以及高精地图信息;规划决策层根据当前场景生成从全局路径到局部轨迹的行为决策;控制与车辆接口层把轨迹转化为油门、刹车、转向等执行指令,并通过车辆接口下发到底盘。

这四层之间通过 ROS 2 的话题、服务与动作进行解耦。每一层内部又由若干功能包组成,例如感知层包含检测、跟踪、预测等模块,规划层包含行为规划、运动规划等模块。分层的好处是:某一层内部算法替换时,只要保持接口不变,其他层几乎不需要改动,这对量产项目的持续迭代非常重要。

Autoware 分层架构与 ROS 2 通信链路 传感器层 LiDAR / Camera GNSS / IMU / 轮速 感知层 检测 / 跟踪 / 预测 障碍物、车道线、信号 定位与地图层 NDT / EKF 位姿 高精地图 / Lanelet2 规划决策层 行为规划 / 运动规划 全局路径 → 局部轨迹 控制与车辆接口层 纵向 / 横向控制 CAN / 线控底盘 车辆平台 底盘 / 执行器 反馈状态 原始数据 环境模型 位姿+地图 障碍物 轨迹 控制指令 车辆状态反馈(车速、转角、挡位) ROS 2 通信机制:话题(Topic)· 服务(Service)· 动作(Action)· 参数(Parameter) DDS 中间件 · QoS 策略 · 节点发现 · 实时性保障

二、核心模块与数据流

Autoware 的核心模块可以按数据流顺序理解。传感器驱动节点发布原始点云、图像、IMU 等话题;感知模块订阅这些话题,输出障碍物数组、车道线、交通信号等结构化信息;定位模块融合 GNSS、IMU、LiDAR 与地图匹配结果,发布车辆位姿;规划模块订阅位姿、障碍物与地图,生成全局路径和局部轨迹;控制模块订阅轨迹与车辆状态,计算控制指令;车辆接口节点把控制指令转换为 CAN 报文,同时把底盘反馈发布回 ROS 2 话题。

这条链路中,每个模块都通过 ROS 2 话题进行异步通信。话题是单向的、多对多的,适合持续流动的数据;服务是请求-响应式的,适合配置查询或一次性操作;动作则适合带反馈的长时任务,例如路径规划请求。理解这三种通信方式的适用场景,是排查“数据为什么没到”或“节点为什么卡住”的基础。

三、ROS 2 通信机制与 QoS

ROS 2 底层使用 DDS 作为中间件,节点之间通过 DDS 发现机制自动建立连接。与 ROS 1 不同,ROS 2 没有中心化的 Master,每个节点都可以独立发现其他节点。这带来了更好的容错性,但也意味着网络配置、域 ID、QoS 策略会直接影响通信是否成功。

QoS(服务质量)是 ROS 2 中非常关键的概念。常见的 QoS 策略包括可靠性(Reliable / Best Effort)、持久性(Transient Local / Volatile)、历史深度(Keep Last / Keep All)等。传感器数据通常使用 Best Effort,因为丢一两帧点云不会导致系统崩溃;而控制指令和车辆状态通常使用 Reliable,确保关键指令不丢失。如果发布者和订阅者的 QoS 不兼容,话题会连接失败,表现为“节点在运行但收不到数据”。

# 查看话题列表与类型
ros2 topic list
ros2 topic info /sensing/lidar/points --verbose

# 查看 QoS 配置
ros2 topic info /vehicle/status --verbose

# 手动发布测试消息
ros2 topic pub /vehicle/command std_msgs/msg/Float32 "{data: 1.0}"

# 查看节点图
ros2 node list
ros2 run rqt_graph rqt_graph
在量产集成中,建议把关键话题的 QoS 配置写入统一的 launch 文件或参数文件,避免不同节点各自为政导致通信不稳定。

四、传感器抽象与车辆接口

Autoware 通过传感器抽象层把不同品牌、不同型号的传感器统一成标准话题。例如,无论使用哪种 LiDAR,点云最终都发布为 sensor_msgs/msg/PointCloud2;无论使用哪种相机,图像都发布为 sensor_msgs/msg/Image 和 sensor_msgs/msg/CameraInfo。这种抽象让上层感知算法不需要关心硬件差异,只需要订阅标准话题即可。

车辆接口层则负责把 Autoware 的控制指令转换为具体底盘能理解的协议。量产项目中常见的接口形式包括 CAN、CAN FD、以太网等。车辆接口节点通常需要完成以下工作:接收控制指令话题、进行安全校验与限幅、打包成 CAN 报文、发送到底盘,同时解析底盘反馈并发布车辆状态话题。下表列出了车辆接口层常见的话题与方向。

话题名称 消息类型 方向 说明
/vehicle/command autoware_control_msgs/msg/Control Autoware → 底盘 纵向加速度、横向转角指令
/vehicle/status autoware_vehicle_msgs/msg/VehicleStatus 底盘 → Autoware 车速、转角、挡位、制动状态
/sensing/lidar/points sensor_msgs/msg/PointCloud2 传感器 → 感知 激光雷达点云
/sensing/camera/image sensor_msgs/msg/Image 传感器 → 感知 相机图像
/localization/kinematic_state nav_msgs/msg/Odometry 定位 → 规划/控制 车辆位姿与速度

五、常见误区与排查思路

初学者最容易犯的错误,是把 Autoware 当成一个“黑盒”,只关心启动命令,不关心数据流。实际运行中,大部分问题都可以归结为三类:话题没有数据、QoS 不匹配、坐标系不一致。

  • 话题没有数据:先用 ros2 topic list 确认话题是否存在,再用 ros2 topic hz 查看频率。如果话题存在但频率为 0,检查发布节点是否正常运行。
  • QoS 不匹配:用 ros2 topic info --verbose 对比发布者和订阅者的 QoS 配置,重点看 Reliability 和 Durability 是否兼容。
  • 坐标系不一致:检查 TF 树是否完整,特别是 map、odom、base_link、lidar_link 之间的变换关系。TF 缺失会导致感知和规划模块无法正确对齐数据。
在量产环境中,不要依赖手动启动节点来排查问题。应通过 launch 文件和参数文件固化配置,并加入健康检查与日志记录,确保每次启动的环境一致。