传感器时间同步:stamp 语义比算法更重要
区分采集/到达/曝光中点三种时间戳,比较硬同步与软件 offset 估计,给出 bag 可复现的同步验收。

1. bias 发散三天,最后是 stamp 错了
VIO 项目里 IMU 预积分和视觉残差长期对不上,调噪声、调外参、换前端都没用——最后发现相机 header.stamp 填的是主机到达时间,平均滞后 12ms、方差 4ms。融合算法假设的是采集时刻;驱动填 arrival time,等价于给观测加了未知时变延迟,预积分在错误时间上对齐,bias 会被迫吸收系统误差。
SLAM/VIO/LIO 论文默认「观测带正确时间戳」。真机上最常见的崩溃之一,是时间语义不一致:用 arrival 当 capture、曝光中点与快门模型不符、雷达点时间与 IMU 不在同一时钟域。团队契约应写死:stamp 是哪一种时间、谁负责正确性、算法层禁止猜。
2. 三种时间不要混
| 语义 | 典型来源 | 误用后果 |
|---|---|---|
| 采集时间 | 传感器内部时钟 + 曝光模型 | 融合与去畸变所需 |
| 到达时间 | now() / 网卡收包 | 含 USB/调度 jitter |
| 曝光中点 | 快门开始 + 积分时间/2 | 卷帘去畸变所需 |
全局快门常用 。卷帘快门每行时刻不同;快速运动下忽略行时戳,表现像外参错或「高速转弯掉高程」。能提供 per-row timestamp 或 rolling shutter 模型的驱动值得优先选——Kalibr 支持 rs cam;全局快门仍是多数 VIO 的 hard requirement。
3. LiDAR 与 IMU 的接口
机械雷达一帧内各点采样时刻不同,LIO 去畸变需要
驱动只给帧头、不给 per-point offset 时,去畸变退化为「整帧同一时刻」——快速 yaw 必弯墙。Velodyne/Ouster 驱动通常有 time field;使用前先验证 offset 范围 ≈ 扫描周期。
IMU 200–1000Hz,是插值姿态与估计相机/LiDAR 相对 IMU 常数偏移 的桥梁。要求 stamp 单调、无跳变、单位一致(rad/s、m/s²);丢包应可检测——silent drop 比 explicit gap 更危险。
4. 硬同步 vs 软件估计
硬同步(优先):PPS、IEEE 1588 PTP、相机 external trigger 对齐 IMU sample、雷达锁 GPS/PTP。动态运动下 offset 稳定;成本是布线、驱动支持,仍需 offline 验证。
软件估计:Kalibr / VIO 在线估 。部署简单,但可观性依赖加速度激励(需要 acceleration excitation);负载/温度变化可能 drift。产品策略:能硬同步就硬同步,软件估计作 backup 与诊断,不要当唯一真相。
5. ROS 2 典型坑
use_sim_time与真机混用- 多 host 未 PTP → TF extrapolation error
- 驱动用
this->now()填 stamp(最差实践) - 录 bag 时各 topic stamp 来源不一致
- 回放 bag 时 CPU 跟不上 → 伪 jitter
诊断核心:画 直方图,应接近常数(= ),std 目标 < 1–2ms;若随 CPU 负载变化,stamp 多半是 arrival time。
ros2 topic delay /camera/image_raw
ros2 topic hz /imu/data --window 1000
ros2 run tf2_ros tf2_monitor6. 与算法模块的契约
团队内应固定:
- 融合输入必须是 capture timestamp
- 驱动负责 stamp 正确性;算法不猜
- 配置显式写
timeshift_cam_imu(秒)及来源(Kalibr / 在线) - bag metadata 记录同步模式(hardware trigger / software / unknown)
7. 案例:注入时延可检测
fix 外参与噪声,对同一 bag 把 image stamp 整体 +5ms 再跑 VIO——ATE 应可检测恶化。若 +5ms 无感,多半 stamp 本身已是 arrival time 或 未正确补偿,而不是算法「鲁棒」。同一项目里我们还试过把 LiDAR 帧头当点时刻——快速直线还好,原地转圈时墙线弯成弧线,和「外参 yaw 偏了」的症状一模一样,直到打开 per-point offset 才消失。
导航事故袋若没有各 topic 的 stamp 统计摘要,复盘只能猜同步模式。状态层录包应附带关键 topic 的 diff mean/std,证据链完整才分得清是算法责任还是时间契约责任。
8. 验收
- 静止 5min:各 topic 频率稳定、stamp 单调、diff 常数
- 已知时延注入:+5ms 应恶化 ATE / reproj
- 快速 yaw:去畸变后墙/边缘直线度
- 双机(若多机):PTP offset 视需求 < 1ms
- CI 弱版:bag 内 stamp 单调性与 diff 统计自动化
时间戳是传感器与融合之间的行为接口;语义不清,再强的后端只是在错误时钟上优化。
相关
也可以看看
johan's blog