4. 传感器标定与同步
在 Orin 多传感器 AI 流水线中,摄像头、激光雷达、IMU、毫米波雷达往往来自不同厂商、运行在不同时钟域。若标定与同步没有做好,再强的模型也会因为“看得不准、对得不齐”而失效。本节围绕三条主线展开:空间对齐(内参、外参)、时间对齐(硬件触发、软件时间戳)、工程落地(验证与复盘)。
一、核心原理:空间与时间两条对齐链
空间对齐解决“像素落在哪里、点云落在哪里”的问题。相机内参描述像素坐标与相机归一化坐标的映射,通常包含焦距 fx, fy、主点 cx, cy 以及畸变系数 k1, k2, p1, p2, k3。外参描述传感器之间的刚体变换,即旋转 R 与平移 t,把雷达点投影到相机图像、把 IMU 姿态映射到车身坐标系,都依赖外参。
时间对齐解决“同一时刻的数据是否真的属于同一时刻”的问题。硬件触发让多个传感器在同一物理脉冲下采样,从源头保证节拍一致;软件时间戳则记录数据到达、曝光开始/结束、帧就绪等事件,用于后处理插值。二者不是替代关系,而是互补:硬件触发提供稳定基准,软件时间戳提供可追溯的精确时刻。
二、方法流程:从标定到同步的落地步骤
- 相机内参标定:使用棋盘格或圆点靶标,采集 20~30 张不同姿态图像,通过 OpenCV 的
calibrateCamera求解内参与畸变系数,重投影误差控制在 0.3 像素以内。 - 外参标定:相机与雷达常用标定板或自然场景特征对齐;相机与 IMU 可用 Kalibr 工具,通过角点与 IMU 积分联合优化,得到
T_cam_imu。 - 硬件触发配置:由 Orin 的 GPIO 或专用同步板输出 PPS/触发脉冲,相机进入外触发模式,雷达设置固定扫描周期,IMU 使用内部采样并记录触发边沿。
- 软件时间戳采集:在驱动层记录曝光开始、帧就绪、IMU 采样、雷达回波等事件,统一到同一时钟域(如
CLOCK_MONOTONIC或 PTP 同步时钟)。 - 时间对齐:对高频 IMU 做插值,对低频图像做最近邻或线性插值,对雷达点云按扫描时间补偿运动畸变。
- 验证与固化:用重投影误差、时间偏差直方图、融合可视化验证,将标定参数与同步配置写入版本化配置文件。
三、案例/场景:Orin 上的相机-雷达-IMU 联合标定
假设一台 Orin 开发板连接 1 路 GMSL2 相机、1 路 16 线激光雷达和 1 路 IMU。相机通过外部 30 Hz 触发,雷达 10 Hz 扫描,IMU 200 Hz 采样。标定阶段先用棋盘格完成相机内参,再用雷达与相机共视的标定板完成外参。同步阶段,Orin 输出 30 Hz 触发信号给相机,同时记录 PPS 边沿时间戳;雷达每帧记录起始与结束时间;IMU 每 5 ms 记录一次采样时刻。
在融合时,对每个雷达点,根据其扫描时间在 IMU 轨迹上插值得到位姿,补偿到统一时刻;对图像,取曝光中点作为时间戳,与雷达帧做最近邻匹配。若时间偏差超过阈值,则丢弃该帧或触发重新同步。
# 相机内参标定示例(OpenCV)
python3 calibrate_camera.py \
--images ./calib_imgs \
--pattern 9x6 \
--square_size 0.025 \
--output camera_intrinsics.yaml
# 时间戳对齐检查
ros2 run sensor_sync timestamp_check \
--topics /camera/image /lidar/points /imu/data \
--max_offset_ms 5.0
四、误区与复盘:常见问题与排查清单
误区一:只做软件时间戳,忽略硬件触发。软件时间戳受驱动调度、网络抖动影响,偏差可达数十毫秒;硬件触发能从源头稳定节拍。
误区二:外参一次标定后长期不更新。车辆振动、温度变化、安装松动都会导致外参漂移,建议定期在线校验。
误区三:忽略时钟域差异。相机、雷达、IMU 可能使用不同时钟源,必须统一到同一时钟域后再比较时间戳。
| 检查项 | 目标值 | 常用工具/方法 |
|---|---|---|
| 相机重投影误差 | < 0.3 px | OpenCV calibrateCamera |
| 相机-雷达外参误差 | < 2 cm / 0.5° | 标定板 + 点云投影 |
| 时间同步偏差 | < 5 ms | PPS + 时间戳直方图 |
| IMU 插值残差 | < 1 ms | 线性/样条插值 |
| 触发信号抖动 | < 100 μs | 示波器 + GPIO 回环 |
复盘建议:每次标定后保存原始图像、点云、时间戳日志和配置文件,形成可追溯的标定档案。上线前用一段已知轨迹的数据做端到端验证,确认融合结果在空间和时间上均一致。