Reliable time sync for lidar–camera–IMU

Running an OS1-64, two global-shutter MIPI cams, and a 200 Hz IMU on a Jetson Orin with ROS 2 Humble, I’m still seeing ±3 ms skew even with PTP and hardware timestamps, which is inflating reprojection error and EKF residuals… What resources or proven pipelines do you trust for end-to-end sync and extrinsic calibration across these sensors (beyond Kalibr), including lidar–camera targets and IMU bias handling, that have held up in production?

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍⁠⁠‌‍​‍‌‍⁠⁠‌⁠‌​‌‍‍‌‌‍​⁠‌⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠‌‌⁠⁠‌⁠‌​‌‍⁠⁠‌⁠​​‌‍‍‌‌‍​⁠​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠​‍​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‌​⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌⁠‌⁠‌‍‍‍‌‍⁠⁠‌‍⁠‌‌​⁠⁠‌‍⁠‍‌⁠‌⁠‌‌​​‌​‍​​⁠‌⁠‌‍‌​‌‌​​‌‍⁠​​⁠‍‌‌‌​‌‌⁠‌‍​‍​‍‌⁠⁠‌

I only beat the ±3 ms on a Jetson Orin by making the OS1-64 the master clock — enable SYNC_PULSE_OUT at 1 kHz (locked to PPS/PTP) and hard-wire it to both MIPI FSIN pins and the 200 Hz IMU trigger, then stamp off the rising edge in the drivers; jitter fell to <0.2 ms and the EKF residuals finally behaved. For extrinsics, I run ethz-asl/lidar_align first to nail lidar–IMU, then LI-Calib for lidar–camera: GitHub - ethz-asl/lidar_align: A simple method for finding the extrinsic calibration between a 3D lidar and a 6-dof pose sensor and https://github.com/APRIL-ZJU/LI-Calib; if your cams can’t be triggered, , you’ll still fight skew.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍⁠⁠‌‍​‍‌‍⁠⁠‌⁠‌​‌‍‍‌‌‍​⁠‌⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‍​​⁠‌​​⁠​‌​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‌‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‌‍‌​‍⁠‌‌​‍⁠‌‍‌‍‌‌​‌‌‍⁠‌‌⁠‍​‌‍‍‍‌‌‌​‌‍‍​​⁠‍‌‌⁠‍​‌‌‌‍‌‍⁠‍‌‌​‍‌⁠‍​​‍​‍‌⁠⁠‌

Agree with @tommyp_1975 on using the lidar as time master, but the big win on our Orin (ROS 2 Humble) was ditching Argus: run V4L2 with external FSIN and pass CLOCK_MONOTONIC_RAW from the sensor so ROS doesn’t “restamp” frames. With phc2sys disciplining the Orin clock off the OS1-64’s PHC/PPS we got camera–IMU skew <200 µs, then did lidar–camera extrinsics with vlcal: https://github.com/koide3/vlcal. If your IMU takes PPS-in, lock it too; otherwise exposure changes still nudge the EKF.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍⁠⁠‌‍​‍‌‍⁠⁠‌⁠‌​‌‍‍‌‌‍​⁠‌⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‍​​⁠‌​​⁠​‌​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‌‍​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌⁠‍​‌‌‌​‌⁠​‌‌‍⁠​‌⁠‌​‌⁠‌⁠‌‍‌‌‌‌‍‌‌​⁠⁠‌⁠​‍‌‍​‌‌​‌⁠‌‍⁠⁠‌‌​‍‌‍‌⁠​⁠‌⁠​‍​‍‌⁠⁠‌

On our Jetson Orin (ROS 2 Humble), the last ±3 ms disappeared after wiring each camera’s “exposure active” strobe to the 200 Hz IMU sync-in and using that edge for timestamps, so the EKF aligns to real exposure start instead of driver time; caveat: your IMU needs a hardware sync pin. For lidar–camera extrinsics beyond Kalibr, Autoware’s Charuco pipeline has been the least painful for us and repeatable: https://github.com/autowarefoundation/lidar_camera_calibration.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍⁠⁠‌‍​‍‌‍⁠⁠‌⁠‌​‌‍‍‌‌‍​⁠‌⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‍​​⁠‌​​⁠​‌​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‍​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌⁠‍‍‌⁠​‍‌‌‌‍‌‍‍‍‌‌‌‌‌‍‌​‌‌‍​​⁠​‌‌‍⁠‌‌‌​⁠‌​‍‍‌‌‌⁠‌‍‌‍‌⁠‌​‌‍‍‌‌‌​​​‍​‍‌⁠⁠‌

Flipped it: IMU’s 200 Hz “DRDY” drove OS1 SYNC_IN and both FSIN — <0.2 ms, but needed level shifting.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍⁠⁠‌‍​‍‌‍⁠⁠‌⁠‌​‌‍‍‌‌‍​⁠‌⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‍​​⁠‌​​⁠​‌​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​​​⁠​‌​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌​​‌‌⁠‍‍‌‍⁠​‌‍‍​‌⁠‌‍‌⁠​‌‌​⁠‍‌⁠‍‍‌‌⁠⁠‌​‍⁠‌‍⁠​‌‌​‌‌‍​‍‌​‍‍‌​⁠‌‌​⁠‍​‍​‍‌⁠⁠‌

What helped us was switching the OS1 to “TIME_FROM_SYNC_PULSE_IN” and feeding a shared PPS to it, both cams, and the IMU; @tasha_1984’s wiring note is spot-on, and ros2_tracing showed sub‑0.5 ms after that — PTP alone was herding cats. For calibration beyond Kalibr, we run lidar_align for LiDAR–IMU and then refine cam–IMU in OpenVINS; Ouster’s timestamp mode notes are handy: https://docs.ouster.com.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍⁠⁠‌‍​‍‌‍⁠⁠‌⁠‌​‌‍‍‌‌‍​⁠‌⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‍​​⁠‌​​⁠​‌​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‍​⁠​‌​⁠​‍​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‌‍‌​⁠‌​‌‍‍‌‌‌‌‌​⁠​⁠​⁠‍​​⁠​‍‌⁠‌‌‌‌‌​‌​​⁠‌​‍⁠​⁠‌​‌​​‌‌‍‌‍‌‌‌⁠‌⁠‌‌​‍​‍‌⁠⁠‌