Skip to content

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.

SensorRateDetail
2 × monochrome global-shutter cameras20 Hz1024×1024 fisheye
Bosch BMI160 IMU200 Hz/imu0

Board: AprilGrid 6×6, tag_size 0.088 m, tag_spacing 0.3, family t36h11.

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.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 results

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):

Terminal window
mvis cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_omni.yaml
mvis cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_equi.yaml

double_sphere, eucm, and fov have no shipped camchain. Fit the camera first, then feed the result into the camera–IMU step:

Terminal window
mvis calibrate -c examples/configs/tumvi_cam_imu/mvis_cam0_ds.yaml
mvis cam-imu -c examples/configs/tumvi_cam_imu/cam_imu_ds.yaml

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.
ModelModeReprojcam0 lever (mm)Baselinetd
omni_radtanstereo, pinned0.273 px[45.0, −68.7, −43.2]100.8 mm−0.73 ms
equidistantstereo, pinned0.277 px[44.7, −70.1, −43.7]100.8 mm−0.72 ms
double_spherecam0, pinned0.275 px[44.3, −68.5, −43.9]—−0.71 ms
eucmcam0, pinned0.275 px[44.3, −68.3, −43.9]—−0.71 ms
fovcam0, pinned0.288 px[44.0, −65.2, −44.0]—−0.68 ms
Kalibr (omni)reference0.11 px[46.2, −70.9, −43.7]100.94 mm~0
  • 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_radtan and equidistant reproduce 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_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. 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.

The settings behind the imu1 results above:

ItemValue
Configsexamples/configs/tumvi_cam_imu/
Sequencedataset-calib-imu1.bag, t0 3.0 s, 45 s window
BoardAprilGrid 6×6, 0.088 m, spacing 0.3, t36h11
ReferenceKalibr omni-radtan-1024/, pinhole-equi-1024/
Detection cache/tmp/mvis_tumvi_detcache — re-runs repeat only the solve