TUM VI
The TUM Visual-Inertial dataset is the reference check for a camera–IMU calibrator: a stereo-fisheye + IMU rig with a published Kalibr calibration to score against. It is also the dataset where every distortion model can be compared on identical data.
The rig
Section titled “The rig”| Sensor | Rate | Detail |
|---|---|---|
| 2 × monochrome global-shutter cameras | 20 Hz | 1024×1024 fisheye |
| Bosch BMI160 IMU | 200 Hz | /imu0 |
Board: AprilGrid 6×6, tag_size 0.088 m, tag_spacing 0.3, family t36h11.
Getting the data
Section titled “Getting the data”Use the raw IMU-calibration bags — dataset-calib-imu{1,2,3,4}.bag — for
the camera–IMU solve, and standard_1024/dataset-calib-cam1_1024_16.bag as the
board bag when a model needs a camera-only fit first.
tum_vi_calib/ raw/dataset-calib-imu{1..4}.bag # cam-IMU sequences raw/dataset-calib-cam1-camchain.yaml # Kalibr omni/radtan intrinsics tumvi_camchain.yaml # Kalibr equidistant intrinsics standard_1024/dataset-calib-cam1_1024_16.bag omni-radtan-1024/ , pinhole-equi-1024/ # Kalibr cam-IMU reference resultsOne step, if a camchain exists
Section titled “One step, if a camchain exists”omni_radtan and equidistant ship with a Kalibr camchain for these cameras,
so the calibration is a single stereo run with intrinsics pinned:
camcalib cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_omni.yamlcamcalib cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_equi.yamlTwo steps, otherwise
Section titled “Two steps, otherwise”double_sphere, eucm, and fov have no shipped camchain, so fit the camera
first and feed the result in:
camcalib calibrate -c examples/configs/tumvi_cam_imu/camcalib_cam0_ds.yamlcamcalib cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_ds.yamlResults — imu1, 45 s window
Section titled “Results — imu1, 45 s window”| Model | Mode | Reproj | cam0 lever (mm) | Baseline | td |
|---|---|---|---|---|---|
omni_radtan | stereo, pinned | 0.273 px | [45.0, −68.7, −43.2] | 100.8 mm | −0.73 ms |
equidistant | stereo, pinned | 0.277 px | [44.7, −70.1, −43.7] | 100.8 mm | −0.72 ms |
double_sphere | cam0, pinned | 0.275 px | [44.3, −68.5, −43.9] | — | −0.71 ms |
eucm | cam0, pinned | 0.275 px | [44.3, −68.3, −43.9] | — | −0.71 ms |
fov | cam0, pinned | 0.288 px | [44.0, −65.2, −44.0] | — | −0.68 ms |
| Kalibr (omni) | reference | 0.11 px | [46.2, −70.9, −43.7] | 100.94 mm | ~0 |
What the table says
Section titled “What the table says”Every model lands on the same physical rig. Lever ~[44, −68, −44] mm and
td ~−0.7 ms across all six. Model choice changes how easily you get a good
fit, not the geometry a good fit recovers.
Agreement with Kalibr: omni_radtan and equidistant reproduce the
reference lever to ≤2 mm and the stereo baseline to ≤0.15 mm, with the
time offset inside 1 ms.
Across all four bags, omni_radtan holds: baseline 100.8–101.1 mm, lever
within ~1 mm, and the freed IMU intrinsics (Dw/Da) consistent to under 1%.
That cross-sequence spread is the honest error bar — better evidence than any
single run’s residual.
CamCalib’s reprojection error is higher than Kalibr’s 0.11 px because the two are not measuring the same thing: different corner subsampling and robust statistics. Compare the parameters, not the residuals.
Reproducibility
Section titled “Reproducibility”| Item | Value |
|---|---|
| Configs | examples/configs/tumvi_cam_imu/ |
| Sequence | dataset-calib-imu1.bag, t0 3.0 s, 45 s window |
| Board | AprilGrid 6×6, 0.088 m, spacing 0.3, t36h11 |
| Reference | Kalibr omni-radtan-1024/, pinhole-equi-1024/ |
| Detection cache | /tmp/camcalib_tumvi_detcache — re-runs repeat only the solve |