Skip to content

Multi-camera / multi-IMU rigs

Multi-sensor rigs are the case CamCalib is built for. There is no separate stereo step and no pairwise composition: every camera and every IMU enters one factor graph, so correlations between them are kept rather than discarded.

Add entries and choose the reference:

config.yaml
cameras:
- camera_id: 0
source_type: rosbag_topic
source_path: /data/rig.bag
topic: /cam0/image_raw
distortion_model: equidistant
- camera_id: 1
source_type: rosbag_topic
source_path: /data/rig.bag
topic: /cam1/image_raw
distortion_model: equidistant
- camera_id: 2
source_type: rosbag_topic
source_path: /data/rig.bag
topic: /cam2/image_raw
distortion_model: radtan # models may be mixed
shutter_type: rolling
reference_camera: 0
optimize_time_offset: true # for unsynchronised cameras

Extrinsics are expressed against reference_camera. Camera-to-camera transforms follow by composition through the graph, which is what keeps a five-camera rig consistent.

Cross-FOV rigs — a fisheye and a narrow lens on the same rig — are where time-offset estimation usually fails. CamCalib runs two independent estimators (PnP-based and M5 homography cross-correlation) precisely for this case.

The first entry in imu_topics is the base IMU: the reference clock, and the only IMU that carries the trajectory. Everything else is auxiliary, related by a rigid transform and a time offset.

cam_imu.yaml
input:
imu_topics: ["/imu0", "/imu1", "/t265/imu"]
imus:
- {} # base — needs the accel
- {}
- {gyro_only: true} # aux with an untrustworthy accel

Choose the best sensor as base — highest rate, lowest noise. Its errors propagate to the whole rig.

gyro_only is per-IMU and not permitted on the base. What it does and when to prefer it over estimate_t_ga: IMU model.

Several IMUs observe the same motion. That redundancy constrains parameters a single IMU leaves weak — time offsets, readout, and IMU intrinsics — which is the reason to carry the extra sensors at all. It is also what makes the round-trip check meaningful on these rigs: a wrong calibration usually cannot satisfy every IMU at once.

Sensor numbering when comparing with Kalibr

Section titled “Sensor numbering when comparing with Kalibr”

CamCalib numbers sensors by role; Kalibr numbers by input order. Getting this wrong silently compares the wrong pair. For the released rigs:

4 IMUs + 3 cameras

SensorBlackFlyT265 LT265 RGX3-25GX3-35Xsens MTI-100T265 IMU
Kalibrcam0cam1cam2imu0imu1imu2imu3
MVISCam2Cam0Cam1IbIs0Is1Is2

4 IMUs + 4 cameras

SensorT265 LT265 RELP LELP RGX3-25GX3-35XsensT265 IMU
Kalibr (T265)cam0cam1imu0imu1imu2imu3
Kalibr (ELP)cam0cam1imu0imu1imu2imu3
MVISCam0Cam1Cam2Cam3IbIs0Is1Is2

CamCalib reads and writes Kalibr camchain and camchain-imucam files directly — see Result formats.

4 IMUs + 3 cams · 4 IMUs + 4 cams