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.
Several cameras
Section titled “Several cameras”Add entries and choose the reference:
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: 0optimize_time_offset: true # for unsynchronised camerasExtrinsics 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.
Several IMUs
Section titled “Several IMUs”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.
input: imu_topics: ["/imu0", "/imu1", "/t265/imu"] imus: - {} # base — needs the accel - {} - {gyro_only: true} # aux with an untrustworthy accelChoose 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.
Why redundancy helps
Section titled “Why redundancy helps”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
| Sensor | BlackFly | T265 L | T265 R | GX3-25 | GX3-35 | Xsens MTI-100 | T265 IMU |
|---|---|---|---|---|---|---|---|
| Kalibr | cam0 | cam1 | cam2 | imu0 | imu1 | imu2 | imu3 |
| MVIS | Cam2 | Cam0 | Cam1 | Ib | Is0 | Is1 | Is2 |
4 IMUs + 4 cameras
| Sensor | T265 L | T265 R | ELP L | ELP R | GX3-25 | GX3-35 | Xsens | T265 IMU |
|---|---|---|---|---|---|---|---|---|
| Kalibr (T265) | cam0 | cam1 | — | — | imu0 | imu1 | imu2 | imu3 |
| Kalibr (ELP) | — | — | cam0 | cam1 | imu0 | imu1 | imu2 | imu3 |
| MVIS | Cam0 | Cam1 | Cam2 | Cam3 | Ib | Is0 | Is1 | Is2 |
CamCalib reads and writes Kalibr camchain and camchain-imucam files
directly — see Result formats.