4. 传感器数据采集与接口

自动驾驶感知系统的第一道工程关口,不是模型精度,而是“数据能不能稳定、同步、可追溯地进入计算平台”。摄像头、激光雷达、毫米波雷达、组合导航与车身传感器各自输出不同格式、不同频率、不同时间基准的原始数据,采集链路必须把它们统一成带时间戳、可标定、可回放的数据流。本章围绕原始数据格式、采集频率、时间戳机制、ROS/ROS2 与 DDS 中间件、采集硬件与软件栈展开。

一、核心原理:原始数据格式与采集频率

不同传感器的物理原理决定了其原始数据形态。摄像头输出的是图像帧,常见格式包括 RAW(Bayer 阵列)、YUV422、RGB 与压缩后的 H.264/H.265;激光雷达输出的是三维点云,每个点包含 x、y、z、intensity、ring、timestamp 等字段,机械式雷达还带有旋转角度与方位信息;毫米波雷达输出目标级或点云级数据,包含距离、速度、角度、RCS 等;组合导航输出 IMU 加速度、角速度以及 GNSS 位置、速度、时间。采集频率方面,摄像头通常为 10~60 FPS,机械激光雷达为 10~20 Hz,固态激光雷达可达 20~30 Hz,毫米波雷达为 10~50 Hz,IMU 常为 100~1000 Hz,GNSS 为 1~10 Hz。频率差异意味着采集系统必须做多速率缓冲与时间对齐,否则融合算法会因“旧数据”产生错误关联。

多传感器采集链路与时间戳对齐示意 摄像头 RAW/YUV · 30 FPS 激光雷达 点云 · 10~20 Hz 毫米波雷达 目标/点云 · 20 Hz IMU/GNSS 100~1000 Hz / 1~10 Hz 采集驱动层 SDK / 驱动 / 触发 硬件时间戳 PTP / GPS 同步 多速率缓冲 丢帧检测 数据校验 中间件层 ROS/ROS2 节点 DDS 发布/订阅 QoS 策略 零拷贝传输 时间同步服务 话题/服务/动作 记录与回放 rosbag / MCAP 原始数据落盘 时间戳索引 标定文件关联 回放对齐 数据质检

二、时间戳机制:从硬件触发到统一时间基准

时间戳是采集链路的“骨架”。常见时间戳分为三类:传感器硬件时间戳、驱动接收时间戳和系统软件时间戳。硬件时间戳精度最高,通常由传感器内部晶振或 GPS/PTP 授时产生;驱动时间戳在数据进入主机时打上,受操作系统调度影响;软件时间戳则在应用层生成,误差最大。工程上应优先使用硬件时间戳,并通过 PTP(IEEE 1588)或 GPS 秒脉冲实现多传感器共时钟。对于摄像头,可采用外部触发信号让曝光时刻与激光雷达扫描同步;对于 IMU,则需记录采样时刻而非接收时刻。时间戳统一后,还需处理时钟漂移与传输延迟,常用方法包括线性回归估计偏移、滑动窗口补偿以及基于 ROS 的 /clock 仿真时间。

建议在采集配置中显式声明每个话题的时间戳来源,例如 use_sim_time=false、timestamp_source=hardware,避免回放时出现“时间倒流”。

三、ROS/ROS2 与 DDS 通信中间件

ROS1 采用 TCPROS/UDPROS,依赖中心节点 Master,适合原型验证,但在多机、高带宽、实时性场景下存在单点瓶颈。ROS2 则基于 DDS(Data Distribution Service),以发布/订阅模型实现去中心化通信,天然支持 QoS、零拷贝与多播发现。DDS 的 QoS 策略对采集至关重要:RELIABILITY 可选 RELIABLE 或 BEST_EFFORT,图像与点云通常用 BEST_EFFORT 以降低延迟;HISTORY 与 DEPTH 决定缓存深度;DEADLINE 用于检测丢帧;LIVELINESS 用于判断传感器是否在线。实际部署中,常用 Cyclone DDS 或 Fast DDS 作为底层实现,并通过共享内存传输大帧数据。

# ROS2 中查看话题频率与时间戳
ros2 topic hz /camera/image_raw
ros2 topic echo /lidar/points --field header.stamp

# 使用 rosbag2 记录多传感器数据
ros2 bag record /camera/image_raw /lidar/points /imu/data /gnss/fix -o session_001

# 回放并检查时间同步
ros2 bag play session_001 --clock

四、采集硬件与软件栈

采集硬件通常包括传感器、触发盒、PTP 交换机、工控机与存储阵列。触发盒负责将 GPS 秒脉冲分发给摄像头与激光雷达;PTP 交换机为以太网传感器提供亚微秒级同步;工控机需具备足够的 PCIe 带宽与 CPU 隔离能力;存储阵列则要满足多路高码率数据的持续写入。软件栈方面,驱动层负责从 SDK 读取原始数据并打时间戳;中间件层通过 ROS2/DDS 发布话题;记录层使用 rosbag2 或 MCAP 落盘;监控层则采集 CPU、内存、磁盘、丢帧率与时间偏差等指标。

传感器 典型原始格式 采集频率 时间戳来源 常见接口
摄像头 RAW / YUV / H.264 10~60 FPS 硬件触发 / 曝光时刻 GMSL / USB / 以太网
激光雷达 点云 (x,y,z,intensity) 10~30 Hz PTP / GPS 秒脉冲 以太网
毫米波雷达 目标列表 / 点云 10~50 Hz 硬件时间戳 CAN / 以太网
IMU 加速度 / 角速度 100~1000 Hz 采样时刻 SPI / CAN
GNSS 位置 / 速度 / 时间 1~10 Hz 卫星授时 串口 / 以太网

五、案例与误区复盘

某园区自动驾驶项目在初期使用 ROS1 采集,摄像头与激光雷达分别由不同节点发布,未做硬件同步。回放时发现点云与图像存在约 80 ms 偏移,导致目标检测框与点云错位。复盘后采取三项措施:一是引入 PTP 交换机统一时钟;二是将摄像头改为外部触发,曝光时刻与激光雷达扫描起始对齐;三是将采集链路迁移到 ROS2,使用 BEST_EFFORT 与共享内存传输,降低延迟。改造后时间偏差降至 2 ms 以内,回放数据可直接用于融合算法训练。

常见误区:只记录软件时间戳、忽略时钟漂移、用 RELIABLE 传输大帧图像导致队列堆积、回放时不启用 --clock 造成时间基准混乱。采集阶段的一小步疏忽,往往会在感知融合阶段被放大成系统性误差。

综上,传感器数据采集与接口工程的核心是“格式统一、频率适配、时间对齐、中间件可靠、记录可回放”。只有把原始数据、时间戳与通信中间件打通,后续的标定、融合与感知算法才有稳定的数据基础。