TUM VI
Use this page to check a camera–IMU calibrator against a published answer. The TUM Visual-Inertial dataset is the reference check: a stereo-fisheye + IMU rig with a published Kalibr calibration to score against.
It is also the dataset where we compare every distortion model 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”You need two kinds of bag:
- Camera–IMU solve: the raw IMU-calibration bags,
dataset-calib-imu{1,2,3,4}.bag. - Camera-only fit:
standard_1024/dataset-calib-cam1_1024_16.bagas 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.
A camchain is Kalibr’s YAML file of camera intrinsics and distortion. With
it, the calibration is a single stereo run with the intrinsics pinned (held
fixed):
mvis cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_omni.yamlmvis 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. Fit the camera
first, then feed the result into the camera–IMU step:
mvis calibrate -c examples/configs/tumvi_cam_imu/mvis_cam0_ds.yamlmvis cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_ds.yamlResults — imu1, 45 s window
Section titled “Results — imu1, 45 s window”The columns:
- Reproj: reprojection error, the pixel distance between detected and predicted corners.
- cam0 lever: the lever arm, the camera–IMU position offset of cam0.
- Baseline: the distance between the two cameras.
td: the camera–IMU time offset.
| 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. It does not change the geometry a good fit recovers. - Agreement with Kalibr:
omni_radtanandequidistantreproduce the reference lever to ≤2 mm and the stereo baseline to ≤0.15 mm. The time offset is inside 1 ms. - Across all four bags,
omni_radtanholds: 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. It is better evidence than any single run’s residual.
Compare the parameters, not the residuals. MVIS’s reprojection error is higher than Kalibr’s 0.11 px because the two do not measure the same thing. They use different corner subsampling and robust statistics.
Reproducibility
Section titled “Reproducibility”The settings behind the imu1 results above:
| 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/mvis_tumvi_detcache — re-runs repeat only the solve |