2. Autoware基础
Autoware 是构建在 ROS 2 之上的自动驾驶开源软件栈。理解它的关键,不是记住某个节点的名字,而是看清一条数据从传感器进入、经过感知与规划、最终变成车辆控制指令的完整链路。本节围绕架构分层、核心模块、ROS 2 通信机制、传感器抽象与车辆接口五个方面展开,为后续的量产集成与运行诊断打下基础。
一、Autoware 的分层架构
Autoware 在逻辑上可以划分为四层:感知层、定位与地图层、规划决策层、控制与车辆接口层。感知层负责把原始传感器数据转化为对环境的理解,包括障碍物、车道线、交通信号等;定位与地图层提供车辆在全局地图中的位姿以及高精地图信息;规划决策层根据当前场景生成从全局路径到局部轨迹的行为决策;控制与车辆接口层把轨迹转化为油门、刹车、转向等执行指令,并通过车辆接口下发到底盘。
这四层之间通过 ROS 2 的话题、服务与动作进行解耦。每一层内部又由若干功能包组成,例如感知层包含检测、跟踪、预测等模块,规划层包含行为规划、运动规划等模块。分层的好处是:某一层内部算法替换时,只要保持接口不变,其他层几乎不需要改动,这对量产项目的持续迭代非常重要。
二、核心模块与数据流
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
四、传感器抽象与车辆接口
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 缺失会导致感知和规划模块无法正确对齐数据。