This page is a static snapshot. The live leaderboard and the per-dataset results pages are on openmvis.com, the home of OpenMVIS and Calibench-VI, the visual-inertial calibration benchmark.
Leaderboard → Per-dataset results → Datasets → Results records →
Calibench-VI leaderboard
Calibration results from MVIS, Kalibr and Basalt on the same datasets: every parameter as median ± sd (n) across recordings.
MVIS, Kalibr and Basalt results, per dataset.
There is no ground truth. Differences show where tools disagree, not who is right. Spread shows repeatability across recordings, not accuracy.
Run by the MVIS authors, who also ran Kalibr and Basalt. Batch 2026-11-10a · results 537de7c
How to read this
- Spread shows repeatability across recordings, not accuracy. A tool can repeat well and still be biased.
448.50 ± 0.48 (10): median ± sd across the 10 recordings that tool solved. With 3 or 4 recordings the sd itself is rough.(3/15): this tool has 3 of the family's 15 recordings.fixed: Kalibr doesn't estimate this value. Its camera + IMU runs take intrinsics and baselines as input, from an MVIS export or, on T6 and T11, from its own camera-only calibration; T7 ELP-L readout is held at 0. The spread here isn't repeatability.shown: the tool uses a different model here, so the value has no difference next to it.other model: Kalibr's coefficients here belong to a different lens model.not in model,not reported,no run,no data,no RS model,not in one run: the tool has no value for this row, and the words say why.no runmeans the tool never ran with this sensor;not in one runmeans it ran with each sensor, but no single run holds both ends of the baseline.not run, in the recordings line: the tool has no run for the family.- Differences: the column header gives the subtraction, using stored medians. No tool is the reference.
◆: the difference is larger than the larger of the two sds. It marks disagreement, not an error in either tool.≠n: the two medians come from different numbers of recordings.≠ model: the tools' models differ, so no difference is shown.fit: reprojection error measures fit and isn't comparable across models.‡ td: MVIS splits the IMU into gyro (td) and accel (td + t_ga); Kalibr and Basalt have one timeline. Basalt − Kalibr is the like-for-like check.- Each family folds; the first is open. Click a family's title to open or close it.
VI-Rig 4 IMUs + 3 cams (ours)
No ground truth: ◆ marks disagreement, not who is right.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
Key and MVIS column
Swipe a table sideways for the other tools and differences.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
T6c · 3 GS cameras — camera calibration
MVIS 10 of 10 · Kalibr 10 of 10 · Basalt 10 of 10, Blackfly shown only
Camera · april 01–10 · Kalibr kalibr_calibrate_cameras, 3 cameras jointly
Read first: MVIS runs the Blackfly and the t265 pair separately, so it has no baseline to the Blackfly; Kalibr solves the three cameras jointly.
Notes
Like for like: MVIS uses two corners per tag and estimates the board shape; Kalibr uses all four corners and assumes a flat board.
Note: MVIS runs camera-only per bag, the Blackfly alone and the t265 pair (the rig's cameras share no frame stamps), so it has no baseline to the Blackfly; Kalibr's 10 camera-only runs solve the three cameras jointly.
Basalt: t265 pair (kb4, fisheye 2 snapped onto fisheye 1) and Blackfly alone (pinhole-radtan8, a different model from radtan: its intrinsics are shown only); no camera-only Basalt run holds both devices, so no baselines to the Blackfly.
Run config · MVIS · run_calibration.py
Camera-only runs: the Blackfly alone and the t265 pair, since the rig's cameras share no frame stamps.
Command for blackfly_april_01 from the MVIS repo root (batch 2026-11-10a); run directly with this config, not through the regression manifest.
python scripts/run_calibration.py \
--config blackfly_april_01.yaml \
--output results/regression/mvis_4imus_3cams/blackfly_april_01 \
--dataset-name mvis_4imus_3cams \
--collection-name blackfly_april_01 \
--no-rs \
--no-td \
--rerun-outliers \
--corner-subsample two_anti \
--target-hz 5.0blackfly_april_01.yaml
input:
cameras:
- camera_id: 0
name: Blackfly
source_type: rosbag_topic
source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag
topic: /blackfly/image_raw
distortion_model: radtan
shutter_type: global
factor_hz: 15.0
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
solve:
max_iterations: 15
max_init_frames: 100
pixel_sigma: 1.0
huber_threshold: 1.345
output:
path: <OUTPUT>/
format: yaml
reference_camera: 0
optimize_time_offset: false
rerun_visualization: false
estimate:
board_points: trueRuns (20: config · input; any other key that differs from blackfly_april_01 is listed, otherwise only the bag / prior / output paths change):
- blackfly_april_01 · blackfly_april_01.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag
- t265_april_01 · t265_april_01.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_02 · blackfly_april_02.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_02.bag
- t265_april_02 · t265_april_02.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_02.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_02.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_03 · blackfly_april_03.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_03.bag
- t265_april_03 · t265_april_03.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_03.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_03.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_04 · blackfly_april_04.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_04.bag
- t265_april_04 · t265_april_04.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_04.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_04.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_05 · blackfly_april_05.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_05.bag
- t265_april_05 · t265_april_05.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_05.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_05.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_06 · blackfly_april_06.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_06.bag
- t265_april_06 · t265_april_06.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_06.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_06.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_07 · blackfly_april_07.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_07.bag
- t265_april_07 · t265_april_07.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_07.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_07.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_08 · blackfly_april_08.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_08.bag
- t265_april_08 · t265_april_08.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_08.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_08.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_09 · blackfly_april_09.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_09.bag
- t265_april_09 · t265_april_09.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_09.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_09.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
- blackfly_april_10 · blackfly_april_10.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_10.bag
- t265_april_10 · t265_april_10.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_10.bag · input.cameras[0].name: T265-1; input.cameras[0].topic: /t265/fisheye1/image_raw; input.cameras[0].distortion_model: equidistant; input.cameras[1].camera_id: 1; input.cameras[1].name: T265-2; input.cameras[1].source_type: rosbag_topic; input.cameras[1].source_path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_10.bag; input.cameras[1].topic: /t265/fisheye2/image_raw; input.cameras[1].distortion_model: equidistant; input.cameras[1].shutter_type: global; input.cameras[1].factor_hz: 15.0
Not in the manifest: april_01, april_02, april_03, april_04, april_05, april_06, april_07, april_08, april_09, april_10
Run config · Kalibr · kalibr_calibrate_cameras
Command for april_01, rebuilt from run_camonly_sweep.py (Kalibr logs no command line); in docker kalibr:noetic, bag folder at /data, examples/regression/kalibr/targets at /targets. Focal init: KALIBR_MANUAL_FOCAL_LENGTH_INIT=1, each camera's seed piped on stdin 8× (per-camera fx of the T6 prior (mvis_4imus_3cams_calib.yaml)).
KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 kalibr_calibrate_cameras \
--models pinhole-radtan pinhole-equi pinhole-equi \
--target /targets/april_6x6_88mm.yaml \
--bag /data/virig_4imus_3cams_april_01.bag \
--topics /blackfly/image_raw /t265/fisheye1/image_raw /t265/fisheye2/image_raw \
--bag-freq 4.0 \
--approx-sync 0.05 \
--dont-show-reportBag: original virig_4imus_3cams bag, hard-linked into a folder per run. Multi-camera runs: --approx-sync 0.05 (config.yaml gs.approx_sync_s).
targets/april_6x6_88mm.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
Runs (10; only the bag differs):
- april_01 · ok
- april_02 · ok
- april_03 · ok
- april_04 · ok
- april_05 · ok
- april_06 · ok
- april_07 · ok
- april_08 · ok
- april_09 · ok
- april_10 · ok
Run config · Basalt · basalt_calibrate
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T6c t265 · command for april_01:
basalt_calibrate \
--dataset-path <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-topics /t265/fisheye1/image_raw /t265/fisheye2/image_raw \
--stamp-tolerance-ms 10.0 \
--cam-types kb4 kb410 runs; options that differ from this one (paths aside):
- april_01 · ok
- april_02 · ok
- april_03 · ok
- april_04 · ok
- april_05 · ok
- april_06 · ok
- april_07 · ok
- april_08 · ok
- april_09 · ok
- april_10 · ok
T6c blackfly · command for april_01: Intrinsics seeded from Basalt row mvis_4imus_3cams/april_01__blackfly_kb4 (--seed-intrinsics).
basalt_calibrate \
--dataset-path <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-topics /blackfly/image_raw \
--cam-types pinhole-radtan8 \
--seed-intrinsics <OUTPUT>/10 runs; options that differ from this one (paths aside):
- april_01 · ok
- april_02 · ok
- april_03 · ok
- april_04 · ok
- april_05 · ok
- april_06 · ok
- april_07 · ok
- april_08 · ok
- april_09 · ok
- april_10 · ok
examples/regression/basalt/targets/april_6x6_88mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.088,
"tagSpacing": 0.3
}cam0 – Blackfly · 8 rows · ◆ 3
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr |
|---|---|---|---|---|
| fx px | 449.95 ± 0.98 (10) | 446.75 ± 2.17 (10) | shown 448.12 ± 1.02 (10) | ◆ +3.20 |
| fy px | 449.10 ± 1.12 (10) | 444.89 ± 2.50 (10) | shown 446.93 ± 0.98 (10) | ◆ +4.21 |
| cx px | 369.81 ± 0.55 (10) | 368.67 ± 3.28 (10) | shown 368.56 ± 0.47 (10) | +1.13 |
| cy px | 279.90 ± 0.66 (10) | 278.41 ± 1.44 (10) | shown 281.06 ± 0.51 (10) | ◆ +1.50 |
| dist k1 | −0.31405 ± 0.00256 (10) | −0.30796 ± 0.00996 (10) | shown 0.31003 ± 6.46473 (10) | −0.00609 |
| dist k2 | 0.084 ± 0.003 (10) | 0.077 ± 0.009 (10) | shown 11.204 ± 13.707 (10) | +0.007 |
| dist p1 | 0.00003 ± 0.00017 (10) | 0.00011 ± 0.00038 (10) | shown −0.00034 ± 0.00026 (10) | −0.00008 |
| dist p2 | −0.00013 ± 0.00018 (10) | 0.00014 ± 0.00095 (10) | shown −0.00032 ± 0.00024 (10) | −0.00027 |
cam1 – t265 fisheye 1 · 9 rows · ◆ 5
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 286.31 ± 0.40 (10) | 285.72 ± 1.61 (10) | 286.17 ± 0.40 (10) | +0.59 | +0.45 | −0.15 |
| fy px | 285.97 ± 0.32 (10) | 285.13 ± 1.69 (10) | 285.60 ± 0.33 (10) | +0.84 | +0.47 | ◆ −0.37 |
| cx px | 415.17 ± 0.20 (10) | 415.83 ± 0.55 (10) | 415.00 ± 0.20 (10) | ◆ −0.67 | ◆ −0.83 | −0.16 |
| cy px | 404.00 ± 0.21 (10) | 404.09 ± 1.09 (10) | 404.05 ± 0.17 (10) | −0.10 | −0.05 | +0.05 |
| dist k1 | −0.00452 ± 0.00153 (10) | 0.00165 ± 0.01882 (10) | −0.00455 ± 0.00115 (10) | −0.00617 | −0.00621 | −0.00004 |
| dist k2 | 0.03684 ± 0.00360 (10) | 0.02307 ± 0.04201 (10) | 0.04107 ± 0.00248 (10) | +0.01377 | +0.01800 | ◆ +0.00423 |
| dist k3 | −0.03393 ± 0.00426 (10) | −0.02549 ± 0.03728 (10) | −0.04057 ± 0.00239 (10) | −0.00844 | −0.01508 | ◆ −0.00664 |
| dist k4 | 0.00503 ± 0.00167 (10) | 0.00321 ± 0.01100 (10) | 0.00755 ± 0.00076 (10) | +0.00183 | +0.00434 | ◆ +0.00252 |
| baseline to Blackfly mm | not in one run | 71.856 ± 1.457 (10) | not in one run |
cam2 – t265 fisheye 2 · 9 rows · ◆ 3
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 286.30 ± 0.40 (10) | 285.37 ± 1.99 (10) | 286.05 ± 0.39 (10) | +0.93 | +0.68 | −0.25 |
| fy px | 285.75 ± 0.32 (10) | 284.57 ± 2.08 (10) | 285.32 ± 0.33 (10) | +1.18 | +0.75 | ◆ −0.43 |
| cx px | 414.58 ± 0.22 (10) | 415.44 ± 0.59 (10) | 414.58 ± 0.20 (10) | ◆ −0.86 | ◆ −0.86 | −0.01 |
| cy px | 398.47 ± 0.17 (10) | 398.62 ± 1.01 (10) | 398.38 ± 0.13 (10) | −0.14 | −0.24 | −0.09 |
| dist k1 | −0.00623 ± 0.00131 (10) | 0.00218 ± 0.03237 (10) | −0.00554 ± 0.00104 (10) | −0.00842 | −0.00773 | +0.00069 |
| dist k2 | 0.04019 ± 0.00335 (10) | 0.02374 ± 0.07849 (10) | 0.04308 ± 0.00276 (10) | +0.01646 | +0.01934 | +0.00288 |
| dist k3 | −0.03670 ± 0.00418 (10) | −0.02631 ± 0.07301 (10) | −0.04154 ± 0.00289 (10) | −0.01039 | −0.01523 | ◆ −0.00484 |
| dist k4 | 0.00633 ± 0.00171 (10) | 0.00280 ± 0.02243 (10) | 0.00763 ± 0.00100 (10) | +0.00353 | +0.00483 | +0.00130 |
| baseline to Blackfly mm | not in one run | 71.630 ± 2.455 (10) | not in one run |
T6 · 3 GS cameras + 4 IMUs
MVIS 10 of 10 · Kalibr 10 of 10 · Basalt not run
Camera + IMU · april 01–10 · Kalibr 3 cameras + 4 IMUs jointly
Read first: Kalibr's intrinsics and baselines are inputs from its own camera-only calibration; its td and lever are solved given them. Data settings differ: see Notes.
Notes, including why Basalt has no run
Basalt not run: Basalt cannot calibrate T6 — one IMU per run (the rig has four) and frames grouped by exact stamp (the t265 pair and the Blackfly share none), so no single run holds the rig.
Like for like: MVIS uses two corners per tag, non-base cameras at 4 Hz or lower and an estimated board shape; Kalibr has none of these. Every tool uses the same IMU noise, measured at rest (the rig's noisiest IMU, one set for all four IMUs). Kalibr's runs date from 2026-11-08.
Note: Kalibr starts from its own camera-only calibration of each bag. Every tool uses the same IMU noise, measured at rest on the rig's noisiest IMU.
Run config · MVIS · mvis cam-imu
IMU noise measured at rest (white-noise density × 2.5; bias walks at the defaults), the same values Kalibr used.
Command for april_01 from the MVIS repo root (batch 2026-11-10a); run directly with this config, not through the regression manifest.
python -m mvis.cli.main cam-imu -c t6_april_01_kalibr.yaml
t6_april_01_kalibr.yaml
input:
format: ros1
path: <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag
cam_topics:
- /blackfly/image_raw # Blackfly (global)
- /t265/fisheye1/image_raw # T265-1 (global)
- /t265/fisheye2/image_raw # T265-2 (global)
imu_topics:
- /imu/data # base IMU
- /gx3_25/data # aux 1
- /gx3_35/imu/data # aux 2
- /t265/imu # aux 3
window_mode: motion # auto-pick the most-exciting 80 s (modern default)
segment_length: 80.0
cache_dir: <OUTPUT>/
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
heights_file: null # D2: flat board start (no measured shape for this board)
camera_input:
path: examples/regression/mvis_4imus_3cams/mvis_4imus_3cams_calib.yaml
cameras:
- {}
- factor_hz: 4.0
- factor_hz: 4.0
solve:
max_iterations: 40 # state_hz inherits modern default 30 (was stale 8)
corner_subsample: two_anti # D2: two corners per tag for speed on the VI-Rig rows (2026-11-02)
estimate_t_ga: true
sigma_t_ga: 0.010 # measured noise below (x 2.5, bias walks default)
sigma_g: 0.00065
sigma_a: 0.0026
sigma_bg: 0.001
sigma_ba: 0.002
vision_pose: imu
estimate:
board_points: true
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU (was pinned to the prior until 2026-10-18)
tr: false # all cameras are global shutter
td: true
extrinsics: true
imu:
intrinsics: full
model: kalibr
extrinsics: true
td: true
output:
path: <OUTPUT>/Camera prior examples/regression/mvis_4imus_3cams/mvis_4imus_3cams_calib.yaml (intrinsics + extrinsics the solve starts from)
source: 'per-camera median of single-camera solves (cam0: 10; cam1: 10; cam2: 10);
extrinsics + time offsets kept from the seed'
cameras:
- id: 0
model: pinhole_radtan
intrinsics:
fx: 450.86711027126194
fy: 450.85387180818054
cx: 368.7765466822725
cy: 279.3341500338614
distortion:
model: radtan
coeffs:
- -0.32509667133062115
- 0.09584086025845817
- 0.0002316587496415108
- -3.8091949003965376e-05
image_size:
- 720
- 540
rolling_shutter_readout: 0.0
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 286.7609852349825
fy: 286.7307787553235
cx: 414.95048781065645
cy: 404.5163866859639
distortion:
model: equidistant
coeffs:
- -0.0048602855193616646
- 0.03630728447531942
- -0.03527767594126116
- 0.005886578086983354
image_size:
- 848
- 800
rolling_shutter_readout: 0.0
- id: 2
model: pinhole_equidistant
intrinsics:
fx: 286.9198088468522
fy: 286.72497563179843
cx: 414.3218875675151
cy: 398.66776453261076
distortion:
model: equidistant
coeffs:
- -0.006976584040031526
- 0.04188810504591071
- -0.0412584035288784
- 0.008462403555989706
image_size:
- 848
- 800
rolling_shutter_readout: 0.0
extrinsics:
reference_camera: 0
transforms:
- from: 1
to: 0
T_to_from:
- - 0.9998894651010144
- -0.012730952813123524
- 0.007679871123871683
- -0.03737228110230717
- - 0.012615335283841506
- 0.9998091090019162
- 0.014919747734850997
- 0.05165169683619479
- - -0.007868347710003887
- -0.014821214432877738
- 0.9998592004412664
- 0.03158705951653852
- - 0.0
- 0.0
- 0.0
- 1.0
so3:
- -0.014871577198352458
- 0.007774682452464735
- 0.012674078195583926
translation:
- -0.03737228110230717
- 0.05165169683619479
- 0.03158705951653852
- from: 2
to: 0
T_to_from:
- - 0.9997335128170951
- -0.013228450849358944
- 0.018918547473789783
- 0.02712959323135141
- - 0.01294005410666437
- 0.9997994241619572
- 0.015286152070908162
- 0.05205907991610934
- - -0.01911696498162142
- -0.01503727147937514
- 0.9997041672996809
- 0.027707076751407423
- - 0.0
- 0.0
- 0.0
- 1.0
so3:
- -0.015163639870173126
- 0.019020174690860432
- 0.013085916385264849
translation:
- 0.02712959323135141
- 0.05205907991610934
- 0.027707076751407423
time_offsets:
reference_camera: 0
offsets:
- camera: 1
dt: -0.0031668068618575114
- camera: 2
dt: -0.0059264304892471175Runs (10: config · input; any other key that differs from april_01 is listed, otherwise only the bag / prior / output paths change):
- april_01 · t6_april_01_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_01.bag
- april_02 · t6_april_02_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_02.bag
- april_03 · t6_april_03_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_03.bag
- april_04 · t6_april_04_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_04.bag
- april_05 · t6_april_05_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_05.bag
- april_06 · t6_april_06_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_06.bag
- april_07 · t6_april_07_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_07.bag
- april_08 · t6_april_08_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_08.bag
- april_09 · t6_april_09_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_09.bag
- april_10 · t6_april_10_kalibr.yaml · <DATASETS>/mvis_4imus_3cams/virig_4imus_3cams_april_10.bag
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for april_01 (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu0.yaml /work/imu1.yaml /work/imu2.yaml /work/imu3.yaml \
--imu-models scale-misalignment scale-misalignment scale-misalignment scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.1 \
--dont-show-report \
--bag-freq 10.0 \
--imu-delay-by-correlationBag: original bag, mounted read-only as /work/input.bag. Cameras /blackfly/image_raw, /t265/fisheye1/image_raw, /t265/fisheye2/image_raw · IMUs /imu/data (400 Hz), /gx3_25/data (500 Hz), /gx3_35/imu/data (100 Hz), /t265/imu (200 Hz) (imu0 = Kalibr's reference IMU).
camchain.yaml: Kalibr's own camera-only calibration of the same recording: intrinsics held fixed, topics set to the bag's. IMU noise measured at rest (white-noise density × 2.5; bias walks at the defaults), the same values MVIS used.
imu0.yaml
rostopic: /imu/data update_rate: 400.0 accelerometer_noise_density: 2.6e-3 accelerometer_random_walk: 0.002 gyroscope_noise_density: 6.5e-4 gyroscope_random_walk: 0.001
imu1.yaml
rostopic: /gx3_25/data update_rate: 500.0 accelerometer_noise_density: 2.6e-3 accelerometer_random_walk: 0.002 gyroscope_noise_density: 6.5e-4 gyroscope_random_walk: 0.001
imu2.yaml
rostopic: /gx3_35/imu/data update_rate: 100.0 accelerometer_noise_density: 2.6e-3 accelerometer_random_walk: 0.002 gyroscope_noise_density: 6.5e-4 gyroscope_random_walk: 0.001
imu3.yaml
rostopic: /t265/imu update_rate: 200.0 accelerometer_noise_density: 2.6e-3 accelerometer_random_walk: 0.002 gyroscope_noise_density: 6.5e-4 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
camchain.yaml (april_01)
cam0:
cam_overlaps:
- 1
- 2
camera_model: pinhole
distortion_coeffs:
- -0.3196281936640669
- 0.09148045375962316
- 0.00011153579901817504
- -0.0001681478113178642
distortion_model: radtan
intrinsics:
- 446.75323429342046
- 445.2562641201713
- 369.1357239488681
- 279.8930469733092
resolution:
- 720
- 540
rostopic: /blackfly/image_raw
cam1:
T_cn_cnm1:
- - 0.9998528511632643
- 0.01210026600653429
- -0.012159752598716605
- 0.0323001564016268
- - -0.0122651436777378
- 0.9998325954538088
- -0.013577456266336746
- -0.05640477276496449
- - 0.011993426168336261
- 0.013724599472150333
- 0.9998338827515665
- -0.030024332549969075
- - 0.0
- 0.0
- 0.0
- 1.0
cam_overlaps:
- 0
- 2
camera_model: pinhole
distortion_coeffs:
- 0.0011511981022998582
- 0.02222352918572518
- -0.019320855978417862
- -0.00014323926802138815
distortion_model: equidistant
intrinsics:
- 285.78394898385176
- 285.31324907885255
- 415.92456944464897
- 404.12759262943723
resolution:
- 848
- 800
rostopic: /t265/fisheye1/image_raw
cam2:
T_cn_cnm1:
- - 0.9999804394973973
- 0.0009689700227186675
- -0.006179135836139286
- -0.0636672317985457
- - -0.0009481280804646048
- 0.9999938552221914
- 0.003374991999429049
- 0.0006576328859089549
- - 0.006182368132796903
- -0.003369067370690021
- 0.9999752135474742
- -0.0002493486811083756
- - 0.0
- 0.0
- 0.0
- 1.0
cam_overlaps:
- 0
- 1
camera_model: pinhole
distortion_coeffs:
- 0.0029295971333663166
- 0.014016192035476256
- -0.007012550091010928
- -0.005680804885348355
distortion_model: equidistant
intrinsics:
- 285.58243005128224
- 284.95111887702615
- 415.4410893275213
- 398.2584954292695
resolution:
- 848
- 800
rostopic: /t265/fisheye2/image_rawRuns (10; only the bag and its camchain seed differ):
- april_01 · ok
- april_02 · ok
- april_03 · ok
- april_04 · ok
- april_05 · ok
- april_06 · ok
- april_07 · ok
- april_08 · ok
- april_09 · ok
- april_10 · ok
Run config · Basalt
No Basalt run is compared for the whole rig: Basalt solves one IMU per run and groups frames by exact stamp (the t265 pair and the Blackfly share none).
cam0 – Blackfly · 11 rows · ◆ 1
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| fx px | 448.30 ± 0.62 (10) | fixed 446.75 ± 2.17 (10) | |
| fy px | 447.62 ± 0.58 (10) | fixed 444.89 ± 2.50 (10) | |
| cx px | 370.77 ± 0.71 (10) | fixed 368.67 ± 3.28 (10) | |
| cy px | 281.31 ± 0.69 (10) | fixed 278.41 ± 1.44 (10) | |
| dist k1 | −0.31178 ± 0.00310 (10) | fixed −0.30796 ± 0.00996 (10) | |
| dist k2 | 0.08088 ± 0.00268 (10) | fixed 0.07731 ± 0.00889 (10) | |
| dist p1 | −0.00033 ± 0.00010 (10) | fixed 0.00011 ± 0.00038 (10) | |
| dist p2 | −0.00012 ± 0.00013 (10) | fixed 0.00014 ± 0.00095 (10) | |
| time offset td to base IMU‡ ms | −4.293 ± 0.093 (10) | −5.438 ± 0.149 (10) | ◆ +1.145 |
| distance to base IMU ‖p‖ mm | 89.32 ± 1.41 (10) | 91.41 ± 3.64 (10) | −2.09 |
| reproj median px | 0.349 ± 0.032 (10) | 0.483 ± 0.209 (10) | fit |
cam1 – t265 fisheye 1 · 12 rows · ◆ 2
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| fx px | 287.08 ± 0.37 (10) | fixed 285.72 ± 1.61 (10) | |
| fy px | 286.70 ± 0.35 (10) | fixed 285.13 ± 1.69 (10) | |
| cx px | 415.31 ± 0.27 (10) | fixed 415.83 ± 0.55 (10) | |
| cy px | 403.53 ± 0.25 (10) | fixed 404.09 ± 1.09 (10) | |
| dist k1 | −0.00342 ± 0.00290 (10) | fixed 0.00165 ± 0.01882 (10) | |
| dist k2 | 0.03197 ± 0.00604 (10) | fixed 0.02307 ± 0.04201 (10) | |
| dist k3 | −0.03047 ± 0.00611 (10) | fixed −0.02549 ± 0.03728 (10) | |
| dist k4 | 0.00457 ± 0.00213 (10) | fixed 0.00321 ± 0.01100 (10) | |
| baseline to Blackfly mm | 71.267 ± 0.143 (10) | fixed 71.856 ± 1.457 (10) | |
| time offset td to base IMU‡ ms | −5.022 ± 0.148 (10) | −5.999 ± 0.247 (10) | ◆ +0.977 |
| distance to base IMU ‖p‖ mm | 130.10 ± 1.49 (10) | 133.92 ± 3.19 (10) | ◆ −3.83 |
| reproj median px | 0.225 ± 0.013 (10) | 0.272 ± 0.126 (10) | fit |
cam2 – t265 fisheye 2 · 12 rows · ◆ 1
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| fx px | 287.02 ± 0.33 (10) | fixed 285.37 ± 1.99 (10) | |
| fy px | 286.40 ± 0.32 (10) | fixed 284.57 ± 2.08 (10) | |
| cx px | 414.56 ± 0.32 (10) | fixed 415.44 ± 0.59 (10) | |
| cy px | 397.96 ± 0.28 (10) | fixed 398.62 ± 1.01 (10) | |
| dist k1 | −0.00397 ± 0.00265 (10) | fixed 0.00218 ± 0.03237 (10) | |
| dist k2 | 0.03449 ± 0.00610 (10) | fixed 0.02374 ± 0.07849 (10) | |
| dist k3 | −0.03146 ± 0.00674 (10) | fixed −0.02631 ± 0.07301 (10) | |
| dist k4 | 0.00430 ± 0.00258 (10) | fixed 0.00280 ± 0.02243 (10) | |
| baseline to Blackfly mm | 69.849 ± 0.327 (10) | fixed 71.630 ± 2.455 (10) | |
| time offset td to base IMU‡ ms | −7.798 ± 0.238 (10) | −8.778 ± 0.244 (10) | ◆ +0.980 |
| distance to base IMU ‖p‖ mm | 111.39 ± 1.71 (10) | 114.03 ± 3.99 (10) | −2.63 |
| reproj median px | 0.239 ± 0.014 (10) | 0.288 ± 0.140 (10) | fit |
base IMU – Xsens MTi · 19 rows · ◆ 4
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 0.99863 ± 0.00149 (10) | 0.99998 ± 0.00344 (10) | −0.00135 |
| gyro Dw[1,1] scale y | 0.99778 ± 0.00051 (10) | 0.99679 ± 0.00182 (10) | +0.00099 |
| gyro Dw[2,2] scale z | 1.00183 ± 0.00201 (10) | 1.00589 ± 0.00248 (10) | ◆ −0.00406 |
| gyro Dw[1,0] cross | −0.00147 ± 0.00081 (10) | 0.00235 ± 0.00266 (10) | ◆ −0.00382 |
| gyro Dw[2,0] cross | 0.00329 ± 0.00143 (10) | 0.00682 ± 0.00393 (10) | −0.00353 |
| gyro Dw[2,1] cross | 0.00178 ± 0.00144 (10) | 0.01213 ± 0.00345 (10) | ◆ −0.01035 |
| accel Da[0,0] scale x | 0.99988 ± 0.00044 (10) | 1.00005 ± 0.00093 (10) | −0.00017 |
| accel Da[1,1] scale y | 0.99681 ± 0.00163 (10) | 0.99549 ± 0.00332 (10) | +0.00132 |
| accel Da[2,2] scale z | 1.00043 ± 0.00132 (10) | 1.00476 ± 0.00292 (10) | ◆ −0.00433 |
| Tg[0,0] g-sensitivity mrad·s/m | 0.016 ± 0.048 (10) | 0.512 ± 0.824 (10) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | 0.074 ± 0.087 (10) | 0.042 ± 0.564 (10) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | 0.053 ± 0.085 (10) | 2.760 ± 1.449 (10) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | −0.033 ± 0.033 (10) | 0.184 ± 0.967 (10) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.004 ± 0.064 (10) | 0.032 ± 0.643 (10) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | 0.021 ± 0.086 (10) | 3.582 ± 1.728 (10) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | 0.012 ± 0.074 (10) | 0.101 ± 0.275 (10) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | 0.057 ± 0.090 (10) | −1.158 ± 0.364 (10) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | −0.099 ± 0.087 (10) | 0.093 ± 0.296 (10) | ≠ model |
| t_ga gyro−accel ms | −0.308 ± 0.109 (10) | not in model |
aux IMU – GX3-25 · 21 rows · ◆ 4
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 0.99989 ± 0.00054 (10) | 0.99849 ± 0.00193 (10) | +0.00140 |
| gyro Dw[1,1] scale y | 1.00107 ± 0.00161 (10) | 1.00185 ± 0.00390 (10) | −0.00078 |
| gyro Dw[2,2] scale z | 1.00310 ± 0.00235 (10) | 1.01022 ± 0.00197 (10) | ◆ −0.00712 |
| gyro Dw[1,0] cross | −0.00110 ± 0.00066 (10) | 0.00045 ± 0.00239 (10) | −0.00155 |
| gyro Dw[2,0] cross | −0.00240 ± 0.00149 (10) | −0.01170 ± 0.00333 (10) | ◆ +0.00929 |
| gyro Dw[2,1] cross | 0.00170 ± 0.00160 (10) | −0.00122 ± 0.00438 (10) | +0.00293 |
| accel Da[0,0] scale x | 0.99729 ± 0.00179 (10) | 0.99594 ± 0.00627 (10) | +0.00134 |
| accel Da[1,1] scale y | 1.00073 ± 0.00041 (10) | 1.00340 ± 0.00167 (10) | ◆ −0.00267 |
| accel Da[2,2] scale z | 1.00040 ± 0.00137 (10) | 1.00156 ± 0.00239 (10) | −0.00116 |
| Tg[0,0] g-sensitivity mrad·s/m | 0.041 ± 0.110 (10) | −1.083 ± 0.406 (10) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | 0.038 ± 0.060 (10) | −0.181 ± 0.517 (10) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | −0.072 ± 0.126 (10) | 1.498 ± 0.973 (10) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | 0.001 ± 0.092 (10) | −0.526 ± 0.339 (10) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.026 ± 0.056 (10) | −0.033 ± 0.398 (10) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | 0.038 ± 0.076 (10) | 1.217 ± 0.829 (10) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | −0.036 ± 0.087 (10) | −0.224 ± 0.341 (10) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | 0.002 ± 0.066 (10) | 0.131 ± 0.245 (10) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | −0.102 ± 0.091 (10) | 1.146 ± 0.569 (10) | ≠ model |
| time delay td to base IMU‡ ms | −0.032 ± 0.209 (10) | −0.133 ± 0.189 (10) | +0.101 |
| distance to base IMU ‖p‖ mm | 131.31 ± 0.20 (10) | 129.26 ± 0.88 (10) | ◆ +2.05 |
| t_ga gyro−accel ms | 0.147 ± 0.068 (10) | not in model |
aux IMU – GX3-35 · 21 rows · ◆ 6
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 0.99888 ± 0.00039 (10) | 0.99818 ± 0.00172 (10) | +0.00070 |
| gyro Dw[1,1] scale y | 0.99978 ± 0.00160 (10) | 1.00242 ± 0.00388 (10) | −0.00264 |
| gyro Dw[2,2] scale z | 1.00149 ± 0.00228 (10) | 1.00859 ± 0.00211 (10) | ◆ −0.00710 |
| gyro Dw[1,0] cross | −0.00161 ± 0.00079 (10) | 0.00090 ± 0.00242 (10) | ◆ −0.00250 |
| gyro Dw[2,0] cross | −0.00179 ± 0.00131 (10) | −0.01102 ± 0.00320 (10) | ◆ +0.00923 |
| gyro Dw[2,1] cross | −0.00232 ± 0.00175 (10) | −0.00612 ± 0.00448 (10) | +0.00381 |
| accel Da[0,0] scale x | 0.99673 ± 0.00173 (10) | 0.99543 ± 0.00530 (10) | +0.00130 |
| accel Da[1,1] scale y | 1.00005 ± 0.00038 (10) | 1.00237 ± 0.00149 (10) | ◆ −0.00232 |
| accel Da[2,2] scale z | 1.00009 ± 0.00133 (10) | 1.00623 ± 0.00315 (10) | ◆ −0.00614 |
| Tg[0,0] g-sensitivity mrad·s/m | 0.006 ± 0.100 (10) | −0.924 ± 0.474 (10) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | −0.026 ± 0.033 (10) | −0.013 ± 0.691 (10) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | −0.061 ± 0.081 (10) | −0.251 ± 1.086 (10) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | −0.024 ± 0.069 (10) | −0.556 ± 0.390 (10) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.024 ± 0.031 (10) | 0.182 ± 0.584 (10) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | 0.038 ± 0.052 (10) | −0.144 ± 1.024 (10) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | −0.042 ± 0.086 (10) | 0.140 ± 0.334 (10) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | 0.009 ± 0.031 (10) | 0.188 ± 0.251 (10) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | −0.011 ± 0.061 (10) | 1.292 ± 0.607 (10) | ≠ model |
| time delay td to base IMU‡ ms | −1.612 ± 0.209 (10) | −1.680 ± 0.170 (10) | +0.068 |
| distance to base IMU ‖p‖ mm | 94.70 ± 0.19 (10) | 93.58 ± 0.86 (10) | ◆ +1.12 |
| t_ga gyro−accel ms | 0.081 ± 0.067 (10) | not in model |
aux IMU – t265 IMU · 21 rows · ◆ 3
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 0.99736 ± 0.00139 (10) | 0.99908 ± 0.00344 (10) | −0.00172 |
| gyro Dw[1,1] scale y | 1.00472 ± 0.00203 (10) | 1.00911 ± 0.00276 (10) | ◆ −0.00439 |
| gyro Dw[2,2] scale z | 1.00288 ± 0.00057 (10) | 1.00142 ± 0.00208 (10) | +0.00146 |
| gyro Dw[1,0] cross | 0.00242 ± 0.00163 (10) | 0.00617 ± 0.00408 (10) | −0.00376 |
| gyro Dw[2,0] cross | 0.00296 ± 0.00066 (10) | 0.00080 ± 0.00264 (10) | +0.00216 |
| gyro Dw[2,1] cross | −0.00169 ± 0.00141 (10) | −0.01204 ± 0.00351 (10) | ◆ +0.01035 |
| accel Da[0,0] scale x | 1.01988 ± 0.00053 (10) | 1.01601 ± 0.00611 (10) | +0.00387 |
| accel Da[1,1] scale y | 1.01927 ± 0.00160 (10) | 1.01475 ± 0.00544 (10) | +0.00452 |
| accel Da[2,2] scale z | 1.01301 ± 0.00200 (10) | 1.00913 ± 0.00206 (10) | ◆ +0.00388 |
| Tg[0,0] g-sensitivity mrad·s/m | 0.006 ± 0.042 (10) | 1.183 ± 0.753 (10) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | 0.021 ± 0.067 (10) | 5.084 ± 1.362 (10) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | −0.018 ± 0.096 (10) | 0.238 ± 0.726 (10) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | 0.000 ± 0.039 (10) | −0.908 ± 0.691 (10) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.030 ± 0.050 (10) | 0.003 ± 0.318 (10) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | −0.068 ± 0.080 (10) | 1.923 ± 0.432 (10) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | 0.043 ± 0.035 (10) | −1.374 ± 1.098 (10) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | −0.031 ± 0.091 (10) | −6.191 ± 1.532 (10) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | 0.026 ± 0.054 (10) | 0.110 ± 0.803 (10) | ≠ model |
| time delay td to base IMU‡ ms | 2.830 ± 0.212 (10) | 2.753 ± 0.188 (10) | +0.077 |
| distance to base IMU ‖p‖ mm | 125.15 ± 0.19 (10) | 124.41 ± 1.42 (10) | +0.74 |
| t_ga gyro−accel ms | −6.564 ± 0.054 (10) | not in model |
MVIS default IMU model (calyx) · 41 of 117 rows, model-independent only · ◆ 6
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – Blackfly | |||||
| fx px | 448.30 ± 0.62 (10) | 448.30 ± 0.61 (10) | fixed 446.75 ± 2.17 (10) | 0.00 | |
| fy px | 447.62 ± 0.58 (10) | 447.63 ± 0.58 (10) | fixed 444.89 ± 2.50 (10) | +0.02 | |
| cx px | 370.77 ± 0.71 (10) | 370.78 ± 0.72 (10) | fixed 368.67 ± 3.28 (10) | 0.00 | |
| cy px | 281.31 ± 0.69 (10) | 281.31 ± 0.69 (10) | fixed 278.41 ± 1.44 (10) | 0.00 | |
| dist k1 | −0.31178 ± 0.00310 (10) | −0.31178 ± 0.00309 (10) | fixed −0.30796 ± 0.00996 (10) | +0.00001 | |
| dist k2 | 0.08088 ± 0.00268 (10) | 0.08088 ± 0.00267 (10) | fixed 0.07731 ± 0.00889 (10) | 0.00000 | |
| dist p1 | −0.00033 ± 0.00010 (10) | −0.00033 ± 0.00010 (10) | fixed 0.00011 ± 0.00038 (10) | 0.00000 | |
| dist p2 | −0.00012 ± 0.00013 (10) | −0.00012 ± 0.00013 (10) | fixed 0.00014 ± 0.00095 (10) | 0.00000 | |
| time offset td to base IMU‡ ms | −4.293 ± 0.093 (10) | −4.279 ± 0.096 (10) | −5.438 ± 0.149 (10) | ◆ +1.159 | +0.014 |
| distance to base IMU ‖p‖ mm | 89.32 ± 1.41 (10) | 89.35 ± 1.40 (10) | 91.41 ± 3.64 (10) | −2.06 | +0.03 |
| reproj median px | 0.349 ± 0.032 (10) | 0.349 ± 0.032 (10) | 0.483 ± 0.209 (10) | fit | fit |
| cam1 – t265 fisheye 1 | |||||
| fx px | 287.08 ± 0.37 (10) | 287.09 ± 0.36 (10) | fixed 285.72 ± 1.61 (10) | +0.01 | |
| fy px | 286.70 ± 0.35 (10) | 286.70 ± 0.35 (10) | fixed 285.13 ± 1.69 (10) | +0.01 | |
| cx px | 415.31 ± 0.27 (10) | 415.32 ± 0.27 (10) | fixed 415.83 ± 0.55 (10) | +0.01 | |
| cy px | 403.53 ± 0.25 (10) | 403.53 ± 0.26 (10) | fixed 404.09 ± 1.09 (10) | −0.01 | |
| dist k1 | −0.00342 ± 0.00290 (10) | −0.00341 ± 0.00288 (10) | fixed 0.00165 ± 0.01882 (10) | +0.00001 | |
| dist k2 | 0.03197 ± 0.00604 (10) | 0.03209 ± 0.00601 (10) | fixed 0.02307 ± 0.04201 (10) | +0.00012 | |
| dist k3 | −0.03047 ± 0.00611 (10) | −0.03060 ± 0.00606 (10) | fixed −0.02549 ± 0.03728 (10) | −0.00013 | |
| dist k4 | 0.00457 ± 0.00213 (10) | 0.00457 ± 0.00211 (10) | fixed 0.00321 ± 0.01100 (10) | +0.00001 | |
| baseline to Blackfly mm | 71.267 ± 0.143 (10) | 71.269 ± 0.142 (10) | fixed 71.856 ± 1.457 (10) | +0.001 | |
| time offset td to base IMU‡ ms | −5.022 ± 0.148 (10) | −5.014 ± 0.155 (10) | −5.999 ± 0.247 (10) | ◆ +0.984 | +0.008 |
| distance to base IMU ‖p‖ mm | 130.10 ± 1.49 (10) | 130.13 ± 1.48 (10) | 133.92 ± 3.19 (10) | ◆ −3.79 | +0.03 |
| reproj median px | 0.225 ± 0.013 (10) | 0.225 ± 0.013 (10) | 0.272 ± 0.126 (10) | fit | fit |
| cam2 – t265 fisheye 2 | |||||
| fx px | 287.02 ± 0.33 (10) | 287.02 ± 0.33 (10) | fixed 285.37 ± 1.99 (10) | 0.00 | |
| fy px | 286.40 ± 0.32 (10) | 286.41 ± 0.32 (10) | fixed 284.57 ± 2.08 (10) | +0.01 | |
| cx px | 414.56 ± 0.32 (10) | 414.57 ± 0.32 (10) | fixed 415.44 ± 0.59 (10) | +0.01 | |
| cy px | 397.96 ± 0.28 (10) | 397.96 ± 0.28 (10) | fixed 398.62 ± 1.01 (10) | 0.00 | |
| dist k1 | −0.00397 ± 0.00265 (10) | −0.00397 ± 0.00264 (10) | fixed 0.00218 ± 0.03237 (10) | 0.00000 | |
| dist k2 | 0.03449 ± 0.00610 (10) | 0.03448 ± 0.00610 (10) | fixed 0.02374 ± 0.07849 (10) | −0.00001 | |
| dist k3 | −0.03146 ± 0.00674 (10) | −0.03153 ± 0.00672 (10) | fixed −0.02631 ± 0.07301 (10) | −0.00007 | |
| dist k4 | 0.00430 ± 0.00258 (10) | 0.00431 ± 0.00257 (10) | fixed 0.00280 ± 0.02243 (10) | +0.00001 | |
| baseline to Blackfly mm | 69.849 ± 0.327 (10) | 69.849 ± 0.328 (10) | fixed 71.630 ± 2.455 (10) | 0.000 | |
| time offset td to base IMU‡ ms | −7.798 ± 0.238 (10) | −7.791 ± 0.238 (10) | −8.778 ± 0.244 (10) | ◆ +0.987 | +0.007 |
| distance to base IMU ‖p‖ mm | 111.39 ± 1.71 (10) | 111.45 ± 1.70 (10) | 114.03 ± 3.99 (10) | −2.58 | +0.06 |
| reproj median px | 0.239 ± 0.014 (10) | 0.239 ± 0.015 (10) | 0.288 ± 0.140 (10) | fit | fit |
| aux IMU – GX3-25 | |||||
| time delay td to base IMU‡ ms | −0.032 ± 0.209 (10) | −0.022 ± 0.208 (10) | −0.133 ± 0.189 (10) | +0.111 | +0.011 |
| distance to base IMU ‖p‖ mm | 131.31 ± 0.20 (10) | 131.31 ± 0.20 (10) | 129.26 ± 0.88 (10) | ◆ +2.05 | 0.00 |
| aux IMU – GX3-35 | |||||
| time delay td to base IMU‡ ms | −1.612 ± 0.209 (10) | −1.602 ± 0.208 (10) | −1.680 ± 0.170 (10) | +0.078 | +0.010 |
| distance to base IMU ‖p‖ mm | 94.70 ± 0.19 (10) | 94.70 ± 0.19 (10) | 93.58 ± 0.86 (10) | ◆ +1.12 | 0.00 |
| aux IMU – t265 IMU | |||||
| time delay td to base IMU‡ ms | 2.830 ± 0.212 (10) | 2.832 ± 0.212 (10) | 2.753 ± 0.188 (10) | +0.079 | +0.002 |
| distance to base IMU ‖p‖ mm | 125.15 ± 0.19 (10) | 125.16 ± 0.19 (10) | 124.41 ± 1.42 (10) | +0.75 | +0.01 |
VI-Rig 4 IMUs + 4 cams: t265 + ELP (ours)
No ground truth: ◆ marks disagreement, not who is right.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
Key and MVIS column
Swipe a table sideways for the other tools and differences.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
T1 · t265 GS fisheye stereo
MVIS 15 of 15 · Kalibr 15 of 15 · Basalt 15 of 15
Camera · bags 01–15 · Kalibr pinhole-equi
Read first: MVIS estimates the board shape; Kalibr assumes a flat board.
Notes
Like for like: Bag 09: fisheye 2 starts one frame before fisheye 1. Kalibr ran on a copy with that frame dropped, because its 4 Hz sampling of each camera otherwise pairs frames one apart and it diverges.
Basalt: Basalt groups stereo frames by stamp and the t265 pair never shares one, so its fisheye 2 frames are snapped onto fisheye 1's (1.8–5 ms apart).
Run config · MVIS · run_calibration.py
Command for stereo_bag1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam --only mvis_t265/<collection> runs it through the manifest.yaml row (calyx model, no variant).
python scripts/run_calibration.py \
--config examples/regression/mvis_t265/cam_stereo_bag1.yaml \
--output results/regression/mvis_t265/stereo_bag1 \
--dataset-name mvis_t265 \
--collection-name stereo_bag1 \
--no-rs \
--no-td \
--rerun-outliers \
--corner-subsample two_antiexamples/regression/mvis_t265/cam_stereo_bag1.yaml
# T1 (fast suite): VI-rig t265 GS fisheye stereo (f1+f2, equidistant
input:
cameras:
- camera_id: 2
name: T265-1
source_type: rosbag_topic
source_path: <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
topic: /t265/fisheye1/image_raw
distortion_model: equidistant
shutter_type: global
- camera_id: 3
name: T265-2
source_type: rosbag_topic
source_path: <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
topic: /t265/fisheye2/image_raw
distortion_model: equidistant
shutter_type: global
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
solve:
max_iterations: 15
max_init_frames: 100
pixel_sigma: 1.0
huber_threshold: 1.345
output:
path: results/regression/mvis_t265/stereo_bag1/calibration.yaml
format: yaml
reference_camera: 2
estimate:
board_points: trueRun config · Kalibr · kalibr_calibrate_cameras
Command for stereo_bag1, rebuilt from run_camonly_sweep.py (Kalibr logs no command line); in docker kalibr:noetic, bag folder at /data, examples/regression/kalibr/targets at /targets. Focal init: KALIBR_MANUAL_FOCAL_LENGTH_INIT=1, each camera's seed piped on stdin 8× (fx of the MVIS camera-only row of the same recording).
KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 kalibr_calibrate_cameras \
--models pinhole-equi pinhole-equi \
--target /targets/april_6x6_88mm.yaml \
--bag /data/t265_01.bag \
--topics /t265/fisheye1/image_raw /t265/fisheye2/image_raw \
--bag-freq 4.0 \
--approx-sync 0.05 \
--dont-show-reportBag: original 4imus_4cams bag, hard-linked into a folder per run; for bag 9, a copy with fisheye 2's first frame dropped (see Notes). Multi-camera runs: --approx-sync 0.05 (config.yaml gs.approx_sync_s).
targets/april_6x6_88mm.yaml
target_type: 'aprilgrid'
tagCols: 6
tagRows: 6
tagSize: 0.088
tagSpacing: 0.3
Runs (15; only the bag differs):
- stereo_bag1 · ok
- stereo_bag2 · ok
- stereo_bag3 · ok
- stereo_bag4 · ok
- stereo_bag5 · ok
- stereo_bag6 · ok
- stereo_bag7 · ok
- stereo_bag8 · ok
- stereo_bag9 · ok
- stereo_bag10 · ok
- stereo_bag11 · ok
- stereo_bag12 · ok
- stereo_bag13 · ok
- stereo_bag14 · ok
- stereo_bag15 · ok
Run config · Basalt · basalt_calibrate
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T1 · command for stereo_bag1:
basalt_calibrate \
--dataset-path <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-topics /t265/fisheye1/image_raw /t265/fisheye2/image_raw \
--stamp-tolerance-ms 10.0 \
--cam-types kb4 kb415 runs; options that differ from this one (paths aside):
- stereo_bag1 · ok
- stereo_bag2 · ok
- stereo_bag3 · ok
- stereo_bag4 · ok
- stereo_bag5 · ok
- stereo_bag6 · ok
- stereo_bag7 · ok
- stereo_bag8 · ok
- stereo_bag9 · ok
- stereo_bag10 · ok
- stereo_bag11 · ok
- stereo_bag12 · ok
- stereo_bag13 · ok
- stereo_bag14 · ok
- stereo_bag15 · ok
examples/regression/basalt/targets/april_6x6_88mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.088,
"tagSpacing": 0.3
}cam2 – t265 fisheye 1 · 8 rows · ◆ 6
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 286.53 ± 0.65 (15) | 285.09 ± 2.40 (15) | 284.14 ± 0.65 (15) | +1.44 | −0.95 | ◆ −2.39 |
| fy px | 286.39 ± 0.73 (15) | 284.18 ± 2.59 (15) | 283.55 ± 0.79 (15) | +2.21 | −0.63 | ◆ −2.84 |
| cx px | 415.53 ± 0.25 (15) | 414.10 ± 0.65 (15) | 413.73 ± 0.68 (15) | ◆ +1.44 | −0.37 | ◆ −1.80 |
| cy px | 404.32 ± 0.34 (15) | 406.22 ± 0.85 (15) | 407.13 ± 0.80 (15) | ◆ −1.90 | ◆ +0.92 | ◆ +2.81 |
| dist k1 | −0.00781 ± 0.00201 (15) | −0.00487 ± 0.04819 (15) | −0.00863 ± 0.00332 (15) | −0.00294 | −0.00376 | −0.00082 |
| dist k2 | 0.03618 ± 0.00342 (15) | 0.04155 ± 0.12726 (15) | 0.04117 ± 0.00651 (15) | −0.00537 | −0.00038 | +0.00499 |
| dist k3 | −0.03390 ± 0.00417 (15) | −0.04994 ± 0.12987 (15) | −0.04155 ± 0.00637 (15) | +0.01604 | +0.00839 | ◆ −0.00765 |
| dist k4 | 0.00586 ± 0.00156 (15) | 0.01186 ± 0.04414 (15) | 0.00859 ± 0.00198 (15) | −0.00600 | −0.00327 | ◆ +0.00273 |
cam3 – t265 fisheye 2 · 9 rows · ◆ 5
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 286.53 ± 0.63 (15) | 284.93 ± 2.42 (15) | 284.02 ± 0.59 (15) | +1.60 | −0.91 | ◆ −2.51 |
| fy px | 286.10 ± 0.71 (15) | 284.48 ± 2.57 (15) | 283.29 ± 0.75 (15) | +1.62 | −1.19 | ◆ −2.81 |
| cx px | 415.07 ± 0.23 (15) | 413.88 ± 0.67 (15) | 413.82 ± 0.65 (15) | ◆ +1.19 | −0.06 | ◆ −1.25 |
| cy px | 398.65 ± 0.33 (15) | 400.45 ± 0.84 (15) | 401.47 ± 0.78 (15) | ◆ −1.80 | ◆ +1.02 | ◆ +2.82 |
| dist k1 | −0.00911 ± 0.00212 (15) | −0.00739 ± 0.05345 (15) | −0.00705 ± 0.00325 (15) | −0.00172 | +0.00034 | +0.00205 |
| dist k2 | 0.03787 ± 0.00338 (15) | 0.04182 ± 0.15804 (15) | 0.03298 ± 0.00889 (15) | −0.00395 | −0.00884 | −0.00489 |
| dist k3 | −0.03506 ± 0.00398 (15) | −0.04948 ± 0.18055 (15) | −0.03718 ± 0.00823 (15) | +0.01442 | +0.01230 | −0.00211 |
| dist k4 | 0.00603 ± 0.00152 (15) | 0.01283 ± 0.06911 (15) | 0.00772 ± 0.00250 (15) | −0.00681 | −0.00511 | +0.00169 |
| baseline to t265 fisheye 1 mm | 63.667 ± 0.036 (15) | 63.468 ± 0.099 (15) | 63.555 ± 0.135 (15) | ◆ +0.200 | +0.087 | −0.112 |
T2 · ELP RS stereo + readout
MVIS 15 of 15 · Kalibr 15 of 15 on ELP-L, 13 of 15 on ELP-R · Basalt 15 of 15, shown only
Camera · bags 01–15 · Kalibr pinhole-radtan-rs, one camera per run
Read first: Lens models differ, so only readout has a difference, and Kalibr wasn't re-run after the ELP stamp correction. Basalt is shown only.
Notes
Like for like: Kalibr has 13 of 15 recordings on ELP-R. MVIS uses an equidistant lens model, Kalibr and Basalt radtan, so fx, fy, cx, cy and distortion have no difference, and the dist[2] and dist[3] rows hold different coefficients per tool. Basalt solves this rolling-shutter pair as global shutter. Kalibr wasn't re-run after the ELP stamp correction; we expect it to be unchanged, but that wasn't tested. MVIS estimates the board shape; Kalibr assumes a flat board.
Note: Kalibr's rolling-shutter model calibrates one camera at a time, so it has no ELP stereo baseline. ELP-R bags 8 and 13 failed (autodiff overflow at bag-freq 15; the bag-freq-10 retry overflowed again on bag 8 and converged to a non-physical basin on bag 13) and are excluded.
Basalt: Basalt has no rolling-shutter model: it solves the ELP pair as global shutter with pinhole-radtan8 (seeded from kb4), so its T2 values are shown only. Since 2026-11-01 MVIS solves the ELP with the equidistant model while the Kalibr RS runs are radtan: readout is compared; fx, fy, cx, cy and distortion are shown without a difference because the lens models differ.
Run config · MVIS · run_calibration.py
Command for stereo_rs_bag1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam --only mvis_elp/<collection> runs it through the manifest.yaml row (calyx model, no variant).
python scripts/run_calibration.py \
--config examples/regression/mvis_elp/bag1.yaml \
--output results/regression/mvis_elp/stereo_rs_bag1 \
--dataset-name mvis_elp \
--collection-name stereo_rs_bag1examples/regression/mvis_elp/bag1.yaml
input:
cameras:
- camera_id: 0
name: ELP-L
source_type: rosbag_topic
source_path: <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
topic: /elp/split_sync_image_node/left/image_raw
distortion_model: equidistant
shutter_type: rolling
- camera_id: 1
name: ELP-R
source_type: rosbag_topic
source_path: <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
topic: /elp/split_sync_image_node/right/image_raw
distortion_model: equidistant
shutter_type: rolling
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
solve:
max_iterations: 15
max_init_frames: 100
pixel_sigma: 1.0
huber_threshold: 1.345
output:
path: results/regression/mvis_elp/bag1/calibration.yaml
format: yaml
reference_camera: 0
estimate:
board_points: trueRun config · Kalibr · kalibr_calibrate_rs_cameras
Command for stereo_rs_bag1_left, rebuilt from run_rs.py with the bag-freq and window that run recorded (kalibr_status.json); in docker kalibr:noetic. fx of the MVIS T2 row of the same bag (echo on stdin).
echo 434 | KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 kalibr_calibrate_rs_cameras \
--model pinhole-radtan-rs \
--target /targets/april_6x6_88mm.yaml \
--bag /data/elp_01_left.bag \
--topic /elp/split_sync_image_node/left/image_raw \
--frame-rate 30 \
--inverse-feature-variance 1 \
--bag-freq 15 \
--max-iter 30 \
--bag-from-to 60 120Bag: original 4imus_4cams bag, hard-linked per camera (Kalibr writes next to the bag); one camera per run, Kalibr has no multi-camera rolling-shutter tool; rs_overrides mvis_elp/stereo_rs (bag-freq 15, window 60–120 s), retried on autodiff overflow. Frame rate 30 is a knot-density seed, not the camera rate (25 Hz overflows Kalibr's dual-number time); runs with line delay ≤ 0 are rejected and retried.
targets/april_6x6_88mm.yaml
target_type: 'aprilgrid'
tagCols: 6
tagRows: 6
tagSize: 0.088
tagSpacing: 0.3
Runs (30; bag, topic, focal seed and the recorded bag-freq / window differ):
- stereo_rs_bag1_left · ok · bag-freq 15 · window 60–120 s · fx seed 434
- stereo_rs_bag1_right · ok · bag-freq 15 · window 60–120 s · fx seed 430
- stereo_rs_bag2_left · ok · bag-freq 15 · window 60–120 s · fx seed 436
- stereo_rs_bag2_right · ok · bag-freq 15 · window 60–120 s · fx seed 432
- stereo_rs_bag3_left · ok · bag-freq 15 · window 60–120 s · fx seed 443
- stereo_rs_bag3_right · ok · bag-freq 15 · window 0–90 s · fx seed 439 · 3 attempts
- stereo_rs_bag4_left · ok · bag-freq 15 · window 60–120 s · fx seed 434
- stereo_rs_bag4_right · ok · bag-freq 15 · window 60–120 s · fx seed 431
- stereo_rs_bag5_left · ok · bag-freq 15 · window 60–120 s · fx seed 430
- stereo_rs_bag5_right · ok · bag-freq 15 · window 60–120 s · fx seed 426
- stereo_rs_bag6_left · ok · bag-freq 15 · window 60–120 s · fx seed 437
- stereo_rs_bag6_right · ok · bag-freq 15 · window 60–120 s · fx seed 433
- stereo_rs_bag7_left · ok · bag-freq 15 · window 60–120 s · fx seed 434
- stereo_rs_bag7_right · ok · bag-freq 15 · window 60–120 s · fx seed 430
- stereo_rs_bag8_left · ok · bag-freq 15 · window 0–120 s · fx seed 431 · 4 attempts
- stereo_rs_bag8_right · failed · bag-freq 15 · fx seed 427 · 4 attempts
- stereo_rs_bag9_left · ok · bag-freq 15 · window 60–120 s · fx seed 438
- stereo_rs_bag9_right · ok · bag-freq 15 · window 60–120 s · fx seed 434
- stereo_rs_bag10_left · ok · bag-freq 15 · window 60–120 s · fx seed 437
- stereo_rs_bag10_right · ok · bag-freq 15 · window 60–120 s · fx seed 433
- stereo_rs_bag11_left · ok · bag-freq 15 · window 60–120 s · fx seed 435
- stereo_rs_bag11_right · ok · bag-freq 15 · window 60–120 s · fx seed 432
- stereo_rs_bag12_left · ok · bag-freq 15 · window 60–120 s · fx seed 456
- stereo_rs_bag12_right · ok · bag-freq 15 · window 60–120 s · fx seed 452
- stereo_rs_bag13_left · ok · bag-freq 15 · window 60–120 s · fx seed 441
- stereo_rs_bag13_right · failed · bag-freq 15 · fx seed 437 · 4 attempts
- stereo_rs_bag14_left · ok · bag-freq 15 · window 60–120 s · fx seed 435
- stereo_rs_bag14_right · ok · bag-freq 15 · window 60–120 s · fx seed 431
- stereo_rs_bag15_left · ok · bag-freq 15 · window 60–120 s · fx seed 436
- stereo_rs_bag15_right · ok · bag-freq 15 · window 60–120 s · fx seed 432
Run config · Basalt · basalt_calibrate
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T2 kb4 · command for stereo_rs_bag1:
basalt_calibrate \
--dataset-path <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-topics /elp/split_sync_image_node/left/image_raw /elp/split_sync_image_node/right/image_raw \
--cam-types kb4 kb415 runs; options that differ from this one (paths aside):
- stereo_rs_bag1 · ok
- stereo_rs_bag2 · ok
- stereo_rs_bag3 · ok
- stereo_rs_bag4 · ok
- stereo_rs_bag5 · ok
- stereo_rs_bag6 · ok
- stereo_rs_bag7 · ok
- stereo_rs_bag8 · ok
- stereo_rs_bag9 · ok
- stereo_rs_bag10 · ok
- stereo_rs_bag11 · ok
- stereo_rs_bag12 · ok
- stereo_rs_bag13 · ok
- stereo_rs_bag14 · ok
- stereo_rs_bag15 · ok
T2 · command for stereo_rs_bag1: Intrinsics seeded from Basalt row mvis_elp/stereo_rs_bag1__kb4 (--seed-intrinsics).
basalt_calibrate \
--dataset-path <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-topics /elp/split_sync_image_node/left/image_raw /elp/split_sync_image_node/right/image_raw \
--cam-types pinhole-radtan8 pinhole-radtan8 \
--seed-intrinsics <OUTPUT>/15 runs; options that differ from this one (paths aside):
- stereo_rs_bag1 · ok
- stereo_rs_bag2 · ok
- stereo_rs_bag3 · ok
- stereo_rs_bag4 · ok
- stereo_rs_bag5 · ok
- stereo_rs_bag6 · ok
- stereo_rs_bag7 · ok
- stereo_rs_bag8 · ok
- stereo_rs_bag9 · ok
- stereo_rs_bag10 · ok
- stereo_rs_bag11 · ok
- stereo_rs_bag12 · ok
- stereo_rs_bag13 · ok
- stereo_rs_bag14 · ok
- stereo_rs_bag15 · ok
examples/regression/basalt/targets/april_6x6_88mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.088,
"tagSpacing": 0.3
}cam0 – ELP-L · 9 rows
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr |
|---|---|---|---|---|
| fx px | 427.95 ± 0.76 (15) | 427.70 ± 6.59 (15) | shown 427.07 ± 1.91 (15) | ≠ model |
| fy px | 427.16 ± 0.75 (15) | 426.31 ± 6.42 (15) | shown 427.47 ± 2.23 (15) | ≠ model |
| cx px | 350.98 ± 0.47 (15) | 338.22 ± 2.94 (15) | shown 348.63 ± 1.46 (15) | ≠ model |
| cy px | 267.73 ± 0.72 (15) | 271.04 ± 8.33 (15) | shown 274.37 ± 1.48 (15) | ≠ model |
| dist k1 | −0.09115 ± 0.00168 (15) | other model −0.36695 ± 0.02361 (15) | shown 8.54347 ± 11.88550 (15) | ≠ model |
| dist k2 | −0.029 ± 0.006 (15) | other model 0.101 ± 0.020 (15) | shown 30.721 ± 18.766 (15) | ≠ model |
| dist[2] (MVIS k3, radtan p1) | 0.01878 ± 0.01280 (15) | other model −0.00041 ± 0.00285 (15) | shown −0.00195 ± 0.00054 (15) | ≠ model |
| dist[3] (MVIS k4, radtan p2) | −0.00469 ± 0.00905 (15) | other model 0.00224 ± 0.00079 (15) | shown 0.00022 ± 0.00029 (15) | ≠ model |
| readout tr ms | 14.604 ± 0.404 (15) | 16.354 ± 1.999 (15) | no RS model | −1.750 |
cam1 – ELP-R · 9 rows · ◆ 1
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr |
|---|---|---|---|---|
| fx px | 424.72 ± 0.77 (15) | 424.57 ± 3.89 (13/15) | shown 423.53 ± 1.86 (15) | ≠ model |
| fy px | 424.00 ± 0.76 (15) | 424.57 ± 3.84 (13/15) | shown 423.70 ± 2.13 (15) | ≠ model |
| cx px | 336.77 ± 0.45 (15) | 328.46 ± 2.34 (13/15) | shown 336.19 ± 1.47 (15) | ≠ model |
| cy px | 259.05 ± 0.73 (15) | 261.01 ± 3.17 (13/15) | shown 266.06 ± 1.49 (15) | ≠ model |
| dist k1 | −0.08975 ± 0.00152 (15) | other model −0.35838 ± 0.00363 (13/15) | shown −3.68841 ± 8.37771 (15) | ≠ model |
| dist k2 | −0.022 ± 0.005 (15) | other model 0.094 ± 0.003 (13/15) | shown 26.167 ± 16.306 (15) | ≠ model |
| dist[2] (MVIS k3, radtan p1) | 0.00151 ± 0.01043 (15) | other model −0.00072 ± 0.00144 (13/15) | shown −0.00213 ± 0.00051 (15) | ≠ model |
| dist[3] (MVIS k4, radtan p2) | 0.00267 ± 0.00668 (15) | other model 0.00077 ± 0.00051 (13/15) | shown −0.00044 ± 0.00034 (15) | ≠ model |
| readout tr ms | 14.601 ± 0.404 (15) | 17.369 ± 1.423 (13/15) | no RS model | ◆ −2.768 ≠n |
T7 · Mixed t265-f1 + ELP-L, aux Xsens
MVIS 15 of 15 · Kalibr 14 of 15 · Basalt not run
Camera + IMU · bags 01–15 · Kalibr with ELP-L as global shutter (bag 8 excluded)
Read first: Kalibr treats ELP-L as global shutter; its intrinsics and baselines are inputs from an MVIS export. Data settings differ: see Notes.
Notes, including why Basalt has no run
Basalt not run: Basalt cannot calibrate T7 — no rolling-shutter model for ELP-L, one IMU per run, and one time offset shared by all cameras (the t265 and ELP clocks share no frame stamps).
Like for like: Kalibr has 14 of 15 recordings (bag 8 failed). Its ELP-L readout is fixed at 0, and ELP-L's stamps were shifted by the MVIS td of the same bag before each Kalibr run. Its td and lever are solved given these inputs. MVIS uses two corners per tag, non-base cameras at 4 Hz or lower and an estimated board shape; Kalibr has none of these.
Note: MVIS solves t265 fisheye 1 (GS) + ELP-L (rolling shutter, readout estimated) + both IMUs. Kalibr's camera + IMU solver is global-shutter only, so its runs take ELP-L as a GS camera and its readout tr is reported as 0 (its global-shutter model, not an estimate). Kalibr bag 8 is excluded: its base gyro scales (1.23 / 2.23) are far from the other 14 bags (about 1.01), a failed solve; MVIS keeps bag 8, so its n is 15 and Kalibr's is 14.
Run config · MVIS · mvis cam-imu
Command for imu_mixed_bag1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam-imu --only mvis_elp_t265/<collection> runs it through the cam_imu_manifest.yaml row (variant kalibr).
python -m mvis.cli.main cam-imu -c examples/regression/mvis_elp_t265/cam_imu_mixed_bag1_kalibr.yaml
examples/regression/mvis_elp_t265/cam_imu_mixed_bag1_kalibr.yaml
input:
format: ros1
path: <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
cam_topics:
- /t265/fisheye1/image_raw
- /elp/split_sync_image_node/left/image_raw
imu_topics: ["/t265/imu", "/imu/data"]
window_mode: motion
segment_length: 80.0
cache_dir: <CACHE>
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
heights_file: examples/regression/mvis_elp/board_shape_4imus_4cams.yaml # D2: seed for the estimated shape (measured on this board 2026-10-31)
camera_input:
path: examples/regression/mvis_elp_t265/mvis_elp_t265_imu_calib.yaml
cameras:
- estimate_readout: false
- estimate_readout: true
factor_hz: 4.0
solve:
max_iterations: 40
corner_subsample: two_anti # D2: two corners per tag for speed on the VI-Rig rows (2026-11-02)
estimate_t_ga: true
sigma_t_ga: 0.010
vision_pose: imu
estimate:
board_points: true
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU (was pinned to the prior until 2026-10-18)
td: true
extrinsics: true
imu:
intrinsics: full
model: kalibr
output:
path: results/regression/mvis_elp_t265/imu_mixed_bag1_kalibr/cam_imu.jsonCamera prior examples/regression/mvis_elp_t265/mvis_elp_t265_imu_calib.yaml (intrinsics + extrinsics the solve starts from)
source: 'per-camera median of single-camera solves (cam1: 15); extrinsics + time offsets
kept from the seed'
cameras:
- id: 0
model: pinhole_equidistant
intrinsics:
fx: 286.70108975415013
fy: 286.6117585648297
cx: 413.2217155052611
cy: 405.2637982380538
distortion:
model: equidistant
coeffs:
- -0.010123007804891672
- 0.04902040062963427
- -0.0474613075366377
- 0.009541047343780409
image_size:
- 848
- 800
rolling_shutter_readout: 0.0
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 425.34123012047246
fy: 425.1826926004675
cx: 351.89600724721646
cy: 269.8255720169832
distortion:
model: equidistant
coeffs:
- -0.08744451977213301
- -0.026049910814334505
- 0.013499084424825336
- -0.0035066904826848697
image_size:
- 640
- 480
rolling_shutter_readout: 0.014839319586455808Runs (15: config · input; any other key that differs from imu_mixed_bag1 is listed, otherwise only the bag / prior / output paths change):
- imu_mixed_bag1 · cam_imu_mixed_bag1_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
- imu_mixed_bag2 · cam_imu_mixed_bag2_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_02.bag
- imu_mixed_bag3 · cam_imu_mixed_bag3_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_03.bag
- imu_mixed_bag4 · cam_imu_mixed_bag4_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_04.bag
- imu_mixed_bag5 · cam_imu_mixed_bag5_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_05.bag
- imu_mixed_bag6 · cam_imu_mixed_bag6_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_06.bag
- imu_mixed_bag7 · cam_imu_mixed_bag7_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_07.bag
- imu_mixed_bag8 · cam_imu_mixed_bag8_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_08.bag
- imu_mixed_bag9 · cam_imu_mixed_bag9_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_09.bag
- imu_mixed_bag10 · cam_imu_mixed_bag10_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_10.bag
- imu_mixed_bag11 · cam_imu_mixed_bag11_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_11.bag
- imu_mixed_bag12 · cam_imu_mixed_bag12_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_12.bag
- imu_mixed_bag13 · cam_imu_mixed_bag13_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_13.bag
- imu_mixed_bag14 · cam_imu_mixed_bag14_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_14.bag
- imu_mixed_bag15 · cam_imu_mixed_bag15_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_15.bag
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for imu_mixed_bag1_elpgs (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu0.yaml /work/imu1.yaml \
--imu-models scale-misalignment scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.2 \
--dont-show-report \
--bag-freq 10.0 \
--imu-delay-by-correlationBag: topics copied with the ELP stamps shifted by the MVIS td of the same bag (retime_bag.py). Cameras /t265/fisheye1/image_raw, /elp/split_sync_image_node/left/image_raw · IMUs /t265/imu (200 Hz), /imu/data (400 Hz) (imu0 = Kalibr's reference IMU).
Kalibr's camera + IMU solver has no rolling-shutter model: ELP-L enters as a global-shutter camera (its line_delay dropped from the chain) and its stamps are pre-shifted by the MVIS td of the same bag (retime_bag.py; Kalibr's correlation init otherwise lands 100–200 ms off). The reported td = applied shift + Kalibr's residual.
camchain.yaml: the MVIS kalibr-variant export of the same recording (cam_imu_camchain-imucam.yaml): intrinsics held fixed, T_cam_imu as the initial value, topics set to the bag's. IMU noise = the MVIS regression defaults (core/config.py), so both tools weight the IMU alike.
imu0.yaml
rostopic: /t265/imu update_rate: 200.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
imu1.yaml
rostopic: /imu/data update_rate: 400.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
camchain.yaml (imu_mixed_bag1_elpgs)
cam0:
T_cam_imu:
- - -0.9998928512573161
- -0.005837146854015893
- 0.013424370417990992
- 0.011209174377398344
- - 0.005824451084169876
- -0.9999825529863857
- -0.0009846280506937343
- 0.002223820723040014
- - 0.013429883621345767
- -0.00090633296020126
- 0.9999094042894499
- -0.004859527960821053
- - 0.0
- 0.0
- 0.0
- 1.0
camera_model: pinhole
distortion_coeffs:
- -0.005569546686507622
- 0.03713654833951611
- -0.032650050456837
- 0.0044902480579931845
distortion_model: equidistant
intrinsics:
- 286.09412697924114
- 285.77953841499897
- 415.0169244152973
- 402.9047407939439
resolution:
- 848
- 800
rostopic: /t265/fisheye1/image_raw
cam1:
T_cam_imu:
- - -0.9991952592709811
- 0.03901243798286919
- -0.009320060784628032
- -0.14209533253691708
- - -0.039691440844060163
- -0.9951902664640573
- 0.08955960617890499
- 0.0010306532594729606
- - -0.005781295193890814
- 0.08985746055743443
- 0.9959378561978903
- -0.012861028265181115
- - 0.0
- 0.0
- 0.0
- 1.0
T_cn_cnm1:
- - 0.9987353594773246
- -0.04482234445020819
- -0.02277365073251092
- -0.15330132367223312
- - 0.04669854101695125
- 0.994853539609821
- 0.08992041477161508
- -0.0012682039778988642
- - 0.018626003237076687
- -0.09087019403411715
- 0.9956885456002871
- -0.008029155035205824
- - 0.0
- 0.0
- 0.0
- 1.0
camera_model: pinhole
distortion_coeffs:
- -0.09211524451302683
- -0.009281618619549927
- -0.018456742571066824
- 0.01505655945759172
distortion_model: equidistant
intrinsics:
- 426.2439225380216
- 425.7530430736327
- 350.3822061463698
- 266.2292980347245
resolution:
- 640
- 480
rostopic: /elp/split_sync_image_node/left/image_rawRuns (14; only the bag and its camchain seed differ):
- imu_mixed_bag1_elpgs · ok · pre-shift cam1 -115.99 ms
- imu_mixed_bag2_elpgs · ok · pre-shift cam1 -116.27 ms
- imu_mixed_bag3_elpgs · ok · pre-shift cam1 -116.14 ms
- imu_mixed_bag4_elpgs · ok · pre-shift cam1 -116.02 ms
- imu_mixed_bag5_elpgs · ok · pre-shift cam1 -115.92 ms
- imu_mixed_bag6_elpgs · ok · pre-shift cam1 -115.99 ms
- imu_mixed_bag7_elpgs · ok · pre-shift cam1 -115.82 ms
- imu_mixed_bag9_elpgs · ok · pre-shift cam1 -115.95 ms
- imu_mixed_bag10_elpgs · ok · pre-shift cam1 -115.65 ms
- imu_mixed_bag11_elpgs · ok · pre-shift cam1 -115.14 ms
- imu_mixed_bag12_elpgs · ok · pre-shift cam1 -114.83 ms
- imu_mixed_bag13_elpgs · ok · pre-shift cam1 -114.86 ms
- imu_mixed_bag14_elpgs · ok · pre-shift cam1 -114.68 ms
- imu_mixed_bag15_elpgs · ok · pre-shift cam1 -114.31 ms
Run config · Basalt
No Basalt run is compared: Basalt has no rolling-shutter model for ELP-L, solves one IMU per run and shares one time offset across cameras (the t265 and ELP clocks share no frame stamps).
cam0 – t265 fisheye 1 · 11 rows · ◆ 2
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| fx px | 287.20 ± 0.44 (15) | fixed 287.20 ± 0.44 (14/15) | |
| fy px | 287.00 ± 0.53 (15) | fixed 287.09 ± 0.54 (14/15) | |
| cx px | 415.80 ± 0.35 (15) | fixed 415.78 ± 0.36 (14/15) | |
| cy px | 403.62 ± 0.28 (15) | fixed 403.62 ± 0.28 (14/15) | |
| dist k1 | −0.00587 ± 0.00128 (15) | fixed −0.00587 ± 0.00128 (14/15) | |
| dist k2 | 0.03406 ± 0.00392 (15) | fixed 0.03411 ± 0.00393 (14/15) | |
| dist k3 | −0.03129 ± 0.00489 (15) | fixed −0.03143 ± 0.00498 (14/15) | |
| dist k4 | 0.00449 ± 0.00200 (15) | fixed 0.00453 ± 0.00201 (14/15) | |
| time offset td to base IMU‡ ms | 2.045 ± 0.183 (15) | −0.684 ± 0.301 (14/15) | ◆ +2.729 ≠n |
| distance to base IMU ‖p‖ mm | 11.93 ± 0.43 (15) | 8.22 ± 2.83 (14/15) | ◆ +3.70 ≠n |
| reproj median px | 0.200 ± 0.005 (15) | 0.367 ± 0.012 (14/15) | fit |
cam1 – ELP-L · 13 rows
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| fx px | 428.33 ± 0.72 (15) | fixed 428.22 ± 0.73 (14/15) | |
| fy px | 427.90 ± 0.87 (15) | fixed 427.89 ± 0.89 (14/15) | |
| cx px | 351.02 ± 0.35 (15) | fixed 351.01 ± 0.36 (14/15) | |
| cy px | 266.49 ± 0.25 (15) | fixed 266.47 ± 0.23 (14/15) | |
| dist k1 | −0.09421 ± 0.00197 (15) | fixed −0.09431 ± 0.00200 (14/15) | |
| dist k2 | −0.02491 ± 0.00710 (15) | fixed −0.02428 ± 0.00720 (14/15) | |
| dist k3 | 0.02150 ± 0.01596 (15) | fixed 0.02013 ± 0.01638 (14/15) | |
| dist k4 | −0.01058 ± 0.01135 (15) | fixed −0.01005 ± 0.01172 (14/15) | |
| readout tr ms | 16.670 ± 0.085 (15) | fixed 0.000 (14/15) | |
| baseline to t265 fisheye 1 mm | 153.517 ± 0.160 (15) | fixed 153.504 ± 0.170 (14/15) | |
| time offset td to base IMU‡ ms | −115.919 ± 0.622 (15) | −107.879 ± 0.888 (14/15) | ≠ model |
| distance to base IMU ‖p‖ mm | 142.09 ± 0.42 (15) | 146.46 ± 2.21 (14/15) | ≠ model |
| reproj median px | 0.181 ± 0.006 (15) | 0.795 ± 0.031 (14/15) | fit |
base IMU – t265 IMU · 19 rows · ◆ 4
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 1.00001 ± 0.00108 (15) | 1.01343 ± 0.00365 (14/15) | ◆ −0.01342 ≠n |
| gyro Dw[1,1] scale y | 1.00325 ± 0.00149 (15) | 1.01249 ± 0.00268 (14/15) | ◆ −0.00924 ≠n |
| gyro Dw[2,2] scale z | 1.00426 ± 0.00029 (15) | 1.00560 ± 0.00049 (14/15) | ◆ −0.00134 ≠n |
| gyro Dw[1,0] cross | 0.00210 ± 0.00134 (15) | 0.00378 ± 0.00280 (14/15) | −0.00169 ≠n |
| gyro Dw[2,0] cross | 0.00257 ± 0.00069 (15) | −0.00599 ± 0.00327 (14/15) | ◆ +0.00856 ≠n |
| gyro Dw[2,1] cross | 0.00045 ± 0.00053 (15) | −0.00005 ± 0.00274 (14/15) | +0.00051 ≠n |
| accel Da[0,0] scale x | 1.01998 ± 0.00037 (15) | 1.01870 ± 0.00143 (14/15) | +0.00128 ≠n |
| accel Da[1,1] scale y | 1.01892 ± 0.00072 (15) | 1.01716 ± 0.00177 (14/15) | +0.00176 ≠n |
| accel Da[2,2] scale z | 1.01699 ± 0.00095 (15) | 1.01709 ± 0.00221 (14/15) | −0.00010 ≠n |
| Tg[0,0] g-sensitivity mrad·s/m | −0.034 ± 0.109 (15) | 0.040 ± 0.279 (14/15) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | −0.628 ± 0.104 (15) | 2.415 ± 0.894 (14/15) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | −0.009 ± 0.127 (15) | −0.844 ± 0.717 (14/15) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | 0.197 ± 0.099 (15) | −1.014 ± 0.165 (14/15) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.089 ± 0.114 (15) | −1.293 ± 0.351 (14/15) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | −0.059 ± 0.157 (15) | 2.639 ± 0.518 (14/15) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | −0.011 ± 0.050 (15) | −0.101 ± 0.407 (14/15) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | −0.268 ± 0.082 (15) | −2.886 ± 0.833 (14/15) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | −0.094 ± 0.100 (15) | 2.028 ± 0.593 (14/15) | ≠ model |
| t_ga gyro−accel ms | −6.693 ± 0.112 (15) | not in model |
aux IMU – Xsens MTi · 21 rows · ◆ 6
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 1.00097 ± 0.00111 (15) | 1.01352 ± 0.00356 (14/15) | ◆ −0.01255 ≠n |
| gyro Dw[1,1] scale y | 0.99882 ± 0.00020 (15) | 0.99985 ± 0.00044 (14/15) | ◆ −0.00103 ≠n |
| gyro Dw[2,2] scale z | 1.00027 ± 0.00117 (15) | 1.00994 ± 0.00274 (14/15) | ◆ −0.00967 ≠n |
| gyro Dw[1,0] cross | −0.00102 ± 0.00039 (15) | 0.00559 ± 0.00283 (14/15) | ◆ −0.00661 ≠n |
| gyro Dw[2,0] cross | 0.00258 ± 0.00085 (15) | 0.00404 ± 0.00232 (14/15) | −0.00145 ≠n |
| gyro Dw[2,1] cross | −0.00074 ± 0.00059 (15) | −0.00051 ± 0.00264 (14/15) | −0.00023 ≠n |
| accel Da[0,0] scale x | 1.00005 ± 0.00033 (15) | 1.00159 ± 0.00520 (14/15) | −0.00154 ≠n |
| accel Da[1,1] scale y | 0.99984 ± 0.00078 (15) | 1.01057 ± 0.00478 (14/15) | ◆ −0.01072 ≠n |
| accel Da[2,2] scale z | 1.00067 ± 0.00066 (15) | 1.00287 ± 0.00316 (14/15) | −0.00220 ≠n |
| Tg[0,0] g-sensitivity mrad·s/m | 0.009 ± 0.016 (15) | −0.121 ± 0.140 (14/15) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | −0.026 ± 0.078 (15) | 0.832 ± 0.570 (14/15) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | −0.036 ± 0.071 (15) | 0.791 ± 0.462 (14/15) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | −0.006 ± 0.019 (15) | −0.638 ± 0.306 (14/15) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | 0.050 ± 0.057 (15) | 0.708 ± 0.413 (14/15) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | 0.059 ± 0.068 (15) | 1.119 ± 0.429 (14/15) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | 0.018 ± 0.021 (15) | −0.096 ± 0.150 (14/15) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | 0.009 ± 0.081 (15) | −1.207 ± 0.294 (14/15) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | 0.000 ± 0.041 (15) | −0.799 ± 0.254 (14/15) | ≠ model |
| time delay td to base IMU‡ ms | 7.240 ± 0.146 (15) | 7.260 ± 0.122 (14/15) | −0.019 ≠n |
| distance to base IMU ‖p‖ mm | 124.09 ± 0.32 (15) | 114.10 ± 2.96 (14/15) | ◆ +9.99 ≠n |
| t_ga gyro−accel ms | −0.483 ± 0.218 (15) | not in model |
MVIS default IMU model (calyx) · 26 of 64 rows, model-independent only · ◆ 3
These rows use Kalibr's recordings where Kalibr has them, so they compare the same recordings.
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – t265 fisheye 1 | |||||
| fx px | 287.20 ± 0.44 (15) | 287.20 ± 0.45 (14/15) | fixed 287.20 ± 0.44 (14/15) | 0.00 ≠n | |
| fy px | 287.00 ± 0.53 (15) | 287.09 ± 0.55 (14/15) | fixed 287.09 ± 0.54 (14/15) | +0.09 ≠n | |
| cx px | 415.80 ± 0.35 (15) | 415.78 ± 0.36 (14/15) | fixed 415.78 ± 0.36 (14/15) | −0.02 ≠n | |
| cy px | 403.62 ± 0.28 (15) | 403.62 ± 0.29 (14/15) | fixed 403.62 ± 0.28 (14/15) | −0.01 ≠n | |
| dist k1 | −0.00587 ± 0.00128 (15) | −0.00574 ± 0.00131 (14/15) | fixed −0.00587 ± 0.00128 (14/15) | +0.00013 ≠n | |
| dist k2 | 0.03406 ± 0.00392 (15) | 0.03274 ± 0.00398 (14/15) | fixed 0.03411 ± 0.00393 (14/15) | −0.00131 ≠n | |
| dist k3 | −0.03129 ± 0.00489 (15) | −0.03094 ± 0.00499 (14/15) | fixed −0.03143 ± 0.00498 (14/15) | +0.00036 ≠n | |
| dist k4 | 0.00449 ± 0.00200 (15) | 0.00447 ± 0.00204 (14/15) | fixed 0.00453 ± 0.00201 (14/15) | −0.00002 ≠n | |
| time offset td to base IMU‡ ms | 2.045 ± 0.183 (15) | 2.036 ± 0.189 (14/15) | −0.684 ± 0.301 (14/15) | ◆ +2.720 | −0.009 ≠n |
| distance to base IMU ‖p‖ mm | 11.93 ± 0.43 (15) | 11.94 ± 0.44 (14/15) | 8.22 ± 2.83 (14/15) | ◆ +3.72 | +0.01 ≠n |
| reproj median px | 0.200 ± 0.005 (15) | 0.200 ± 0.006 (14/15) | 0.367 ± 0.012 (14/15) | fit | fit |
| cam1 – ELP-L | |||||
| fx px | 428.33 ± 0.72 (15) | 428.22 ± 0.75 (14/15) | fixed 428.22 ± 0.73 (14/15) | −0.11 ≠n | |
| fy px | 427.90 ± 0.87 (15) | 427.89 ± 0.90 (14/15) | fixed 427.89 ± 0.89 (14/15) | −0.01 ≠n | |
| cx px | 351.02 ± 0.35 (15) | 351.00 ± 0.37 (14/15) | fixed 351.01 ± 0.36 (14/15) | −0.02 ≠n | |
| cy px | 266.49 ± 0.25 (15) | 266.48 ± 0.23 (14/15) | fixed 266.47 ± 0.23 (14/15) | −0.01 ≠n | |
| dist k1 | −0.09421 ± 0.00197 (15) | −0.09437 ± 0.00203 (14/15) | fixed −0.09431 ± 0.00200 (14/15) | −0.00016 ≠n | |
| dist k2 | −0.02491 ± 0.00710 (15) | −0.02434 ± 0.00721 (14/15) | fixed −0.02428 ± 0.00720 (14/15) | +0.00058 ≠n | |
| dist k3 | 0.02150 ± 0.01596 (15) | 0.02018 ± 0.01641 (14/15) | fixed 0.02013 ± 0.01638 (14/15) | −0.00133 ≠n | |
| dist k4 | −0.01058 ± 0.01135 (15) | −0.00982 ± 0.01175 (14/15) | fixed −0.01005 ± 0.01172 (14/15) | +0.00077 ≠n | |
| readout tr ms | 16.670 ± 0.085 (15) | 16.680 ± 0.089 (14/15) | fixed 0.000 (14/15) | +0.010 ≠n | |
| baseline to t265 fisheye 1 mm | 153.517 ± 0.160 (15) | 153.510 ± 0.168 (14/15) | fixed 153.504 ± 0.170 (14/15) | −0.007 ≠n | |
| time offset td to base IMU‡ ms | −115.919 ± 0.622 (15) | −115.893 ± 0.631 (14/15) | −107.879 ± 0.888 (14/15) | ≠ model | +0.026 ≠n |
| distance to base IMU ‖p‖ mm | 142.09 ± 0.42 (15) | 142.05 ± 0.44 (14/15) | 146.46 ± 2.21 (14/15) | ≠ model | −0.05 ≠n |
| reproj median px | 0.181 ± 0.006 (15) | 0.182 ± 0.006 (14/15) | 0.795 ± 0.031 (14/15) | fit | fit |
| aux IMU – Xsens MTi | |||||
| time delay td to base IMU‡ ms | 7.240 ± 0.146 (15) | 7.228 ± 0.152 (14/15) | 7.260 ± 0.122 (14/15) | −0.032 | −0.013 ≠n |
| distance to base IMU ‖p‖ mm | 124.09 ± 0.32 (15) | 124.09 ± 0.33 (14/15) | 114.10 ± 2.96 (14/15) | ◆ +9.99 | 0.00 ≠n |
T8 · ELP RS stereo + two IMUs (IMUs only)
MVIS 15 of 15 · Kalibr 3 of 15, no values on ELP-L, ELP-R · Basalt not run
Camera + IMU · MVIS bags 1–15 · Kalibr bags 1–3, t265 fisheye 1 only
Read first: Kalibr has 3 of 15 recordings, IMUs only, from earlier runs with an MVIS export as camera input. Data settings differ: see Notes.
Notes, including why Basalt has no run
Basalt not run: Basalt has no rolling-shutter model.
Like for like: Kalibr's values come from separate earlier runs of bags 1–3 with t265 fisheye 1 only, so MVIS − Kalibr compares 15 recordings with 3. MVIS uses two corners per tag, non-base cameras at 4 Hz or lower and an estimated board shape; Kalibr has none of these.
Note: No RS-anchored Kalibr run exists: Kalibr's camera + IMU solver cannot use the ELP rolling-shutter cameras. T8's IMUs (t265 base, Xsens aux) are the same physical IMUs on the same bags as T7, so they are compared with separate earlier Kalibr runs of bags 1–3 (t265 fisheye 1 only), not the T7 runs. Its ELP cameras have no Kalibr counterpart and are listed with MVIS values only.
Run config · MVIS · mvis cam-imu
Command for imu_bag1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam-imu --only mvis_elp/<collection> runs it through the cam_imu_manifest.yaml row (variant kalibr).
python -m mvis.cli.main cam-imu -c examples/regression/mvis_elp/cam_imu_bag1_kalibr.yaml
examples/regression/mvis_elp/cam_imu_bag1_kalibr.yaml
# T8: ELP stereo (rolling shutter) + TWO IMUs — t265 BMI055 (/t265/imu) as
input:
format: ros1
path: <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
cam_topics:
- /elp/split_sync_image_node/left/image_raw
- /elp/split_sync_image_node/right/image_raw
imu_topics: ["/t265/imu", "/imu/data"]
window_mode: motion
segment_length: 80.0
cache_dir: <CACHE>
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
heights_file: examples/regression/mvis_elp/board_shape_4imus_4cams.yaml # D2: seed for the estimated shape (measured on this board 2026-10-31)
camera_input:
path: examples/regression/mvis_elp/mvis_elp_calib.yaml
cameras: # both ELP cams are rolling shutter — estimate readout
- estimate_readout: true
- estimate_readout: true
factor_hz: 4.0
solve:
max_iterations: 40
corner_subsample: two_anti # D2: two corners per tag for speed on the VI-Rig rows (2026-11-02)
estimate_t_ga: true
sigma_t_ga: 0.010
vision_pose: imu # IMU-propagated vision factor (imu-scale-followup, 2026-10-31; the default since 2026-11-02)
estimate:
board_points: true
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU
imu:
intrinsics: full
model: kalibr
output:
path: results/regression/mvis_elp/imu_bag1_kalibr/cam_imu.jsonCamera prior examples/regression/mvis_elp/mvis_elp_calib.yaml (intrinsics + extrinsics the solve starts from)
source: 'median of 15 camera-only solves: stereo_rs, stereo_rs_bag10, stereo_rs_bag11,
stereo_rs_bag12, stereo_rs_bag13, stereo_rs_bag14, stereo_rs_bag15, stereo_rs_bag2,
stereo_rs_bag3, stereo_rs_bag4, stereo_rs_bag5, stereo_rs_bag6, stereo_rs_bag7,
stereo_rs_bag8, stereo_rs_bag9'
cameras:
- id: 0
model: pinhole_equidistant
intrinsics:
fx: 425.34123012047246
fy: 425.1826926004675
cx: 351.89600724721646
cy: 269.8255720169832
distortion:
model: equidistant
coeffs:
- -0.08744451977213301
- -0.026049910814334505
- 0.013499084424825336
- -0.0035066904826848697
image_size:
- 640
- 480
rolling_shutter_readout: 0.014839319586455808
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 422.111063352669
fy: 421.85537995046366
cx: 337.69469599854546
cy: 260.85971063952223
distortion:
model: equidistant
coeffs:
- -0.08683058738769524
- -0.016661689319463917
- -0.0008778625099783606
- 0.003331205135595901
image_size:
- 640
- 480
rolling_shutter_readout: 0.014251881981177182
extrinsics:
reference_camera: 0
transforms:
- from: 1
to: 0
T_to_from:
- - 0.9999004763828279
- 0.003245478703805215
- -0.013729683076374094
- 0.05925437722142046
- - -0.0029475843439491015
- 0.9997610067103785
- 0.02166197608682538
- 0.0006443578242496076
- - 0.01379670525632247
- -0.0216193508097271
- 0.9996710732008994
- 0.00016214701452106834
- - 0.0
- 0.0
- 0.0
- 1.0
so3:
- -0.021643071090440745
- -0.013764725396972167
- -0.0030968760299445635
translation:
- 0.05925437722142046
- 0.0006443578242496076
- 0.00016214701452106834
time_offsets:
reference_camera: 0
offsets: []Runs (15: config · input; any other key that differs from imu_bag1 is listed, otherwise only the bag / prior / output paths change):
- imu_bag1 · cam_imu_bag1_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_01.bag
- imu_bag2 · cam_imu_bag2_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_02.bag
- imu_bag3 · cam_imu_bag3_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_03.bag
- imu_bag4 · cam_imu_bag4_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_04.bag
- imu_bag5 · cam_imu_bag5_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_05.bag
- imu_bag6 · cam_imu_bag6_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_06.bag
- imu_bag7 · cam_imu_bag7_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_07.bag
- imu_bag8 · cam_imu_bag8_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_08.bag
- imu_bag9 · cam_imu_bag9_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_09.bag
- imu_bag10 · cam_imu_bag10_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_10.bag
- imu_bag11 · cam_imu_bag11_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_11.bag
- imu_bag12 · cam_imu_bag12_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_12.bag
- imu_bag13 · cam_imu_bag13_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_13.bag
- imu_bag14 · cam_imu_bag14_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_14.bag
- imu_bag15 · cam_imu_bag15_kalibr.yaml · <DATASETS>/mvis_4imus_4cams/4imus_4cams_15.bag
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for imu_mixed_bag1 (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu0.yaml /work/imu1.yaml \
--imu-models scale-misalignment scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.1 \
--dont-show-report \
--bag-freq 10.0 \
--imu-delay-by-correlationBag: original bag, mounted read-only as /work/input.bag. Cameras /t265/fisheye1/image_raw · IMUs /t265/imu (200 Hz), /imu/data (400 Hz) (imu0 = Kalibr's reference IMU).
T8's IMUs are compared with the Kalibr T7 runs on the same bags (t265 fisheye 1 + both IMUs).
camchain.yaml: the MVIS kalibr-variant export of the same recording (cam_imu_camchain-imucam.yaml): intrinsics held fixed, T_cam_imu as the initial value, topics set to the bag's. IMU noise = the MVIS regression defaults (core/config.py), so both tools weight the IMU alike.
imu0.yaml
rostopic: /t265/imu update_rate: 200.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
imu1.yaml
rostopic: /imu/data update_rate: 400.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
camchain.yaml (imu_mixed_bag1)
cam0:
T_cam_imu:
- - -0.9998617118094075
- -0.0049538429741180275
- 0.01587503377472599
- 0.009517466089172276
- - 0.0048008493261975866
- -0.9999418064249479
- -0.009661035625577035
- 0.00016891954388651708
- - 0.01592196920321307
- -0.009583485973240026
- 0.9998273089355442
- -0.006190356233480179
- - 0.0
- 0.0
- 0.0
- 1.0
camera_model: pinhole
distortion_coeffs:
- -0.01353253648242579
- 0.05124245162390414
- -0.048829026516153985
- 0.009886399980613645
distortion_model: equidistant
intrinsics:
- 288.4502852412716
- 288.31600201205777
- 413.59182134957484
- 405.59653169921654
resolution:
- 848
- 800
rostopic: /t265/fisheye1/image_rawRuns (3; only the bag and its camchain seed differ):
- imu_mixed_bag1 · ok
- imu_mixed_bag2 · ok
- imu_mixed_bag3 · ok
Run config · Basalt
No Basalt run: rolling-shutter cameras only (Basalt has no rolling-shutter model).
cam0 – ELP-L · 12 rows
Kalibr: no run. Its camera + IMU solver can't use rolling-shutter cameras.
| Parameter | MVISKalibr IMU model | Kalibr |
|---|---|---|
| fx px | 428.05 ± 0.61 (15) | no run |
| fy px | 427.90 ± 0.77 (15) | no run |
| cx px | 350.94 ± 0.38 (15) | no run |
| cy px | 266.09 ± 0.31 (15) | no run |
| dist k1 | −0.09366 ± 0.00219 (15) | no run |
| dist k2 | −0.02558 ± 0.00741 (15) | no run |
| dist k3 | 0.01529 ± 0.01503 (15) | no run |
| dist k4 | −0.00738 ± 0.00997 (15) | no run |
| readout tr ms | 16.620 ± 0.121 (15) | no run |
| time offset td to base IMU‡ ms | −115.844 ± 0.617 (15) | no run |
| distance to base IMU ‖p‖ mm | 143.01 ± 0.40 (15) | no run |
| reproj median px | 0.162 ± 0.006 (15) | no run |
cam1 – ELP-R · 13 rows
Kalibr: no run. Its camera + IMU solver can't use rolling-shutter cameras.
| Parameter | MVISKalibr IMU model | Kalibr |
|---|---|---|
| fx px | 424.86 ± 0.65 (15) | no run |
| fy px | 424.71 ± 0.80 (15) | no run |
| cx px | 336.80 ± 0.34 (15) | no run |
| cy px | 257.25 ± 0.30 (15) | no run |
| dist k1 | −0.09144 ± 0.00236 (15) | no run |
| dist k2 | −0.02083 ± 0.00545 (15) | no run |
| dist k3 | 0.00062 ± 0.00939 (15) | no run |
| dist k4 | 0.00251 ± 0.00606 (15) | no run |
| readout tr ms | 16.596 ± 0.109 (15) | no run |
| baseline to ELP-L mm | 59.204 ± 0.085 (15) | no run |
| time offset td to base IMU‡ ms | −115.879 ± 0.598 (15) | no run |
| distance to base IMU ‖p‖ mm | 202.12 ± 0.42 (15) | no run |
| reproj median px | 0.182 ± 0.007 (15) | no run |
base IMU – t265 IMU · 19 rows · ◆ 7
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 0.99982 ± 0.00116 (15) | 1.01272 ± 0.00388 (3/15) | ◆ −0.01290 ≠n |
| gyro Dw[1,1] scale y | 1.00294 ± 0.00128 (15) | 1.01135 ± 0.00259 (3/15) | ◆ −0.00841 ≠n |
| gyro Dw[2,2] scale z | 1.00415 ± 0.00030 (15) | 1.00439 ± 0.00007 (3/15) | −0.00024 ≠n |
| gyro Dw[1,0] cross | 0.00185 ± 0.00110 (15) | 0.00541 ± 0.00141 (3/15) | ◆ −0.00356 ≠n |
| gyro Dw[2,0] cross | 0.00220 ± 0.00073 (15) | −0.00330 ± 0.00161 (3/15) | ◆ +0.00550 ≠n |
| gyro Dw[2,1] cross | −0.00101 ± 0.00101 (15) | 0.00459 ± 0.00312 (3/15) | ◆ −0.00560 ≠n |
| accel Da[0,0] scale x | 1.01989 ± 0.00038 (15) | 1.01725 ± 0.00204 (3/15) | ◆ +0.00264 ≠n |
| accel Da[1,1] scale y | 1.01905 ± 0.00064 (15) | 1.01997 ± 0.00206 (3/15) | −0.00092 ≠n |
| accel Da[2,2] scale z | 1.01668 ± 0.00109 (15) | 1.02013 ± 0.00141 (3/15) | ◆ −0.00345 ≠n |
| Tg[0,0] g-sensitivity mrad·s/m | −0.074 ± 0.093 (15) | 0.068 ± 0.443 (3/15) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | −0.433 ± 0.259 (15) | 1.885 ± 1.225 (3/15) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | 0.211 ± 0.205 (15) | −1.393 ± 1.041 (3/15) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | 0.253 ± 0.119 (15) | −0.803 ± 0.236 (3/15) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.073 ± 0.162 (15) | −0.968 ± 0.718 (3/15) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | 0.243 ± 0.236 (15) | 2.343 ± 0.104 (3/15) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | −0.114 ± 0.064 (15) | 0.679 ± 0.446 (3/15) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | −0.090 ± 0.105 (15) | −2.238 ± 1.000 (3/15) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | −0.034 ± 0.102 (15) | 1.657 ± 0.502 (3/15) | ≠ model |
| t_ga gyro−accel ms | −6.697 ± 0.135 (15) | not in model |
aux IMU – Xsens MTi · 21 rows · ◆ 9
| Parameter | MVISKalibr IMU model | Kalibr | MVIS− Kalibr |
|---|---|---|---|
| gyro Dw[0,0] scale x | 1.00085 ± 0.00119 (15) | 1.01189 ± 0.00357 (3/15) | ◆ −0.01104 ≠n |
| gyro Dw[1,1] scale y | 0.99862 ± 0.00025 (15) | 0.99906 ± 0.00013 (3/15) | ◆ −0.00044 ≠n |
| gyro Dw[2,2] scale z | 1.00039 ± 0.00131 (15) | 1.00753 ± 0.00219 (3/15) | ◆ −0.00714 ≠n |
| gyro Dw[1,0] cross | −0.00010 ± 0.00054 (15) | 0.00283 ± 0.00075 (3/15) | ◆ −0.00293 ≠n |
| gyro Dw[2,0] cross | 0.00255 ± 0.00069 (15) | 0.00558 ± 0.00170 (3/15) | ◆ −0.00303 ≠n |
| gyro Dw[2,1] cross | 0.00097 ± 0.00079 (15) | −0.00485 ± 0.00261 (3/15) | ◆ +0.00582 ≠n |
| accel Da[0,0] scale x | 0.99997 ± 0.00037 (15) | 0.98907 ± 0.00999 (3/15) | ◆ +0.01090 ≠n |
| accel Da[1,1] scale y | 0.99932 ± 0.00096 (15) | 1.00747 ± 0.00680 (3/15) | ◆ −0.00815 ≠n |
| accel Da[2,2] scale z | 1.00093 ± 0.00049 (15) | 1.00373 ± 0.00376 (3/15) | −0.00280 ≠n |
| Tg[0,0] g-sensitivity mrad·s/m | −0.008 ± 0.029 (15) | 0.018 ± 0.121 (3/15) | ≠ model |
| Tg[0,1] g-sensitivity mrad·s/m | −0.011 ± 0.092 (15) | 1.221 ± 0.746 (3/15) | ≠ model |
| Tg[0,2] g-sensitivity mrad·s/m | −0.001 ± 0.050 (15) | 0.722 ± 0.527 (3/15) | ≠ model |
| Tg[1,0] g-sensitivity mrad·s/m | −0.014 ± 0.021 (15) | −0.963 ± 0.154 (3/15) | ≠ model |
| Tg[1,1] g-sensitivity mrad·s/m | −0.011 ± 0.054 (15) | 1.057 ± 0.271 (3/15) | ≠ model |
| Tg[1,2] g-sensitivity mrad·s/m | 0.004 ± 0.048 (15) | 1.124 ± 0.514 (3/15) | ≠ model |
| Tg[2,0] g-sensitivity mrad·s/m | 0.024 ± 0.020 (15) | −0.012 ± 0.129 (3/15) | ≠ model |
| Tg[2,1] g-sensitivity mrad·s/m | −0.058 ± 0.078 (15) | −0.862 ± 0.330 (3/15) | ≠ model |
| Tg[2,2] g-sensitivity mrad·s/m | −0.032 ± 0.037 (15) | −0.737 ± 0.296 (3/15) | ≠ model |
| time delay td to base IMU‡ ms | 7.248 ± 0.115 (15) | 7.254 ± 0.027 (3/15) | −0.006 ≠n |
| distance to base IMU ‖p‖ mm | 123.94 ± 0.30 (15) | 115.85 ± 1.24 (3/15) | ◆ +8.09 ≠n |
| t_ga gyro−accel ms | −0.466 ± 0.237 (15) | not in model |
MVIS default IMU model (calyx) · 27 of 65 rows, model-independent only · ◆ 2
Only the aux IMU td and lever rows are at Kalibr's 3 recordings.
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – ELP-L | |||||
| fx px | 428.05 ± 0.61 (15) | 428.07 ± 0.62 (15) | no run | +0.02 | |
| fy px | 427.90 ± 0.77 (15) | 427.91 ± 0.77 (15) | no run | +0.01 | |
| cx px | 350.94 ± 0.38 (15) | 350.94 ± 0.38 (15) | no run | 0.00 | |
| cy px | 266.09 ± 0.31 (15) | 266.08 ± 0.32 (15) | no run | 0.00 | |
| dist k1 | −0.09366 ± 0.00219 (15) | −0.09368 ± 0.00220 (15) | no run | −0.00003 | |
| dist k2 | −0.02558 ± 0.00741 (15) | −0.02565 ± 0.00742 (15) | no run | −0.00008 | |
| dist k3 | 0.01529 ± 0.01503 (15) | 0.01540 ± 0.01504 (15) | no run | +0.00012 | |
| dist k4 | −0.00738 ± 0.00997 (15) | −0.00723 ± 0.00998 (15) | no run | +0.00015 | |
| readout tr ms | 16.620 ± 0.121 (15) | 16.618 ± 0.122 (15) | no run | −0.003 | |
| time offset td to base IMU‡ ms | −115.844 ± 0.617 (15) | −115.884 ± 0.623 (15) | no run | −0.040 | |
| distance to base IMU ‖p‖ mm | 143.01 ± 0.40 (15) | 142.98 ± 0.39 (15) | no run | −0.03 | |
| reproj median px | 0.162 ± 0.006 (15) | 0.163 ± 0.006 (15) | no run | fit | |
| cam1 – ELP-R | |||||
| fx px | 424.86 ± 0.65 (15) | 424.87 ± 0.65 (15) | no run | +0.01 | |
| fy px | 424.71 ± 0.80 (15) | 424.73 ± 0.80 (15) | no run | +0.01 | |
| cx px | 336.80 ± 0.34 (15) | 336.80 ± 0.34 (15) | no run | 0.00 | |
| cy px | 257.25 ± 0.30 (15) | 257.24 ± 0.30 (15) | no run | −0.01 | |
| dist k1 | −0.09144 ± 0.00236 (15) | −0.09147 ± 0.00237 (15) | no run | −0.00002 | |
| dist k2 | −0.02083 ± 0.00545 (15) | −0.02087 ± 0.00545 (15) | no run | −0.00004 | |
| dist k3 | 0.00062 ± 0.00939 (15) | 0.00088 ± 0.00938 (15) | no run | +0.00026 | |
| dist k4 | 0.00251 ± 0.00606 (15) | 0.00245 ± 0.00605 (15) | no run | −0.00006 | |
| readout tr ms | 16.596 ± 0.109 (15) | 16.594 ± 0.111 (15) | no run | −0.002 | |
| baseline to ELP-L mm | 59.204 ± 0.085 (15) | 59.207 ± 0.084 (15) | no run | +0.003 | |
| time offset td to base IMU‡ ms | −115.879 ± 0.598 (15) | −115.931 ± 0.604 (15) | no run | −0.052 | |
| distance to base IMU ‖p‖ mm | 202.12 ± 0.42 (15) | 202.12 ± 0.41 (15) | no run | 0.00 | |
| reproj median px | 0.182 ± 0.007 (15) | 0.183 ± 0.007 (15) | no run | fit | |
| aux IMU – Xsens MTi | |||||
| time delay td to base IMU‡ ms | 7.248 ± 0.115 (15) | 7.176 ± 0.038 (3/15) | 7.254 ± 0.027 (3/15) | ◆ −0.078 | −0.072 ≠n |
| distance to base IMU ‖p‖ mm | 123.94 ± 0.30 (15) | 124.19 ± 0.18 (3/15) | 115.85 ± 1.24 (3/15) | ◆ +8.34 | +0.25 ≠n |
TUM-VI calibration bags
No ground truth: ◆ marks disagreement, not who is right.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
Key and MVIS column
Swipe a table sideways for the other tools and differences.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
T3 · Camera stereo (raw)
MVIS 8 of 8 · Kalibr 8 of 8 · Basalt 8 of 8
Camera · cam1–cam8 · Kalibr kalibr_calibrate_cameras, pinhole-equi
Read first: Every tool ran on the same bags, filtered to view angles of 85° or less.
Notes
Note: Every tool ran on the same ≤ 85° view-filtered bags (TUM-VI corners beyond 85° break pinhole-equi in Kalibr).
Run config · MVIS · run_calibration.py
Run on the same view-filtered bags (≤ 85°) Kalibr used, read at 10 Hz so no further view is dropped.
Command for cam1 from the MVIS repo root (batch 2026-11-10a); run directly with this config, not through the regression manifest.
python scripts/run_calibration.py \
--config cam1.yaml \
--output results/regression/tum_vi_raw/cam1 \
--dataset-name tum_vi_raw \
--collection-name cam1 \
--no-rs \
--no-td \
--rerun-outliers \
--corner-subsample two_anti \
--target-hz 10.0cam1.yaml
input:
cameras:
- camera_id: 0
name: cam0
source_type: rosbag_topic
source_path: <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam1_mono8_fov85.bag
topic: /cam0/image_raw
distortion_model: equidistant
shutter_type: global
- camera_id: 1
name: cam1
source_type: rosbag_topic
source_path: <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam1_mono8_fov85.bag
topic: /cam1/image_raw
distortion_model: equidistant
shutter_type: global
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
solve:
max_iterations: 15
max_init_frames: 100
pixel_sigma: 1.0
huber_threshold: 1.345
output:
path: <OUTPUT>/
format: yaml
reference_camera: 0Runs (8: config · input; any other key that differs from cam1 is listed, otherwise only the bag / prior / output paths change):
- cam1 · cam1.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam1_mono8_fov85.bag
- cam2 · cam2.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam2_mono8_fov85.bag
- cam3 · cam3.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam3_mono8_fov85.bag
- cam4 · cam4.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam4_mono8_fov85.bag
- cam5 · cam5.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam5_mono8_fov85.bag
- cam6 · cam6.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam6_mono8_fov85.bag
- cam7 · cam7.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam7_mono8_fov85.bag
- cam8 · cam8.yaml · <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam8_mono8_fov85.bag
Run config · Kalibr · kalibr_calibrate_cameras
Command for cam1, rebuilt from run_camonly_sweep.py (Kalibr logs no command line); in docker kalibr:noetic, bag folder at /data, examples/regression/kalibr/targets at /targets. Focal init: KALIBR_MANUAL_FOCAL_LENGTH_INIT=1, each camera's seed piped on stdin 8× (fx of the MVIS camera-only row of the same recording).
KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 kalibr_calibrate_cameras \
--models pinhole-equi pinhole-equi \
--target /targets/april_6x6_88mm.yaml \
--bag /data/dataset-calib-cam1_mono8_fov85.bag \
--topics /cam0/image_raw /cam1/image_raw \
--bag-freq 10.0 \
--approx-sync 0.05 \
--dont-show-reportBag: raw mono16 bag repacked to mono8 (convert_mono16_bag.py), then cut to the 4 Hz views whose corners all lie ≤ 85° off-axis (filter_fov_bag.py: pinhole-equi is singular at 90°); read at 10 Hz so no further view is dropped. Multi-camera runs: --approx-sync 0.05 (config.yaml gs.approx_sync_s).
targets/april_6x6_88mm.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
Runs (8; only the bag differs):
- cam1 · ok · views kept 374 / 427
- cam2 · ok · views kept 185 / 274
- cam3 · ok · views kept 260 / 332
- cam4 · ok · views kept 198 / 257
- cam5 · ok · views kept 256 / 369
- cam6 · ok · views kept 261 / 347
- cam7 · ok · views kept 146 / 146
- cam8 · ok · views kept 196 / 197
Run config · Basalt · basalt_calibrate
Re-run on 2026-11-07 on the same view-filtered bags (≤ 85°) Kalibr used.
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T3 · command for cam1:
basalt_calibrate \
--dataset-path <DATASETS>/tum_vi_calib/mono8/dataset-calib-cam1_mono8_fov85.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-types kb4 kb48 runs; options that differ from this one (paths aside):
- cam1 · ok
- cam2 · ok
- cam3 · ok
- cam4 · ok
- cam5 · ok
- cam6 · ok
- cam7 · ok
- cam8 · ok
examples/regression/basalt/targets/april_6x6_88mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.088,
"tagSpacing": 0.3
}cam0 – TUM-VI cam0 · 8 rows · ◆ 2
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 381.94 ± 0.38 (8) | 381.77 ± 0.64 (8) | 381.65 ± 0.40 (8) | +0.17 | −0.12 | −0.29 |
| fy px | 381.88 ± 0.41 (8) | 381.73 ± 0.66 (8) | 381.65 ± 0.41 (8) | +0.15 | −0.08 | −0.24 |
| cx px | 509.77 ± 0.29 (8) | 510.06 ± 0.20 (8) | 510.17 ± 0.24 (8) | ◆ −0.29 | +0.11 | ◆ +0.39 |
| cy px | 513.81 ± 0.16 (8) | 514.08 ± 0.24 (8) | 514.11 ± 0.11 (8) | ◆ −0.27 | +0.03 | ◆ +0.30 |
| dist k1 | 0.00498 ± 0.00166 (8) | 0.00475 ± 0.00392 (8) | 0.00523 ± 0.00143 (8) | +0.00024 | +0.00048 | +0.00024 |
| dist k2 | −0.00159 ± 0.00279 (8) | −0.00240 ± 0.00685 (8) | −0.00137 ± 0.00203 (8) | +0.00081 | +0.00103 | +0.00023 |
| dist k3 | −0.00048 ± 0.00197 (8) | 0.00000 ± 0.00488 (8) | −0.00076 ± 0.00147 (8) | −0.00048 | −0.00076 | −0.00028 |
| dist k4 | −0.00011 ± 0.00049 (8) | −0.00023 ± 0.00118 (8) | −0.00004 ± 0.00039 (8) | +0.00012 | +0.00019 | +0.00008 |
cam1 – TUM-VI cam1 · 9 rows · ◆ 2
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 380.57 ± 0.41 (8) | 380.70 ± 0.67 (8) | 380.30 ± 0.43 (8) | −0.13 | −0.40 | −0.27 |
| fy px | 380.49 ± 0.43 (8) | 380.65 ± 0.67 (8) | 380.26 ± 0.43 (8) | −0.16 | −0.38 | −0.23 |
| cx px | 505.05 ± 0.28 (8) | 505.35 ± 0.19 (8) | 505.40 ± 0.21 (8) | ◆ −0.30 | +0.05 | ◆ +0.35 |
| cy px | 509.61 ± 0.38 (8) | 509.94 ± 0.32 (8) | 510.00 ± 0.31 (8) | −0.33 | +0.05 | ◆ +0.39 |
| dist k1 | 0.00653 ± 0.00127 (8) | 0.00592 ± 0.00318 (8) | 0.00660 ± 0.00105 (8) | +0.00061 | +0.00067 | +0.00006 |
| dist k2 | −0.00342 ± 0.00221 (8) | −0.00273 ± 0.00568 (8) | −0.00299 ± 0.00150 (8) | −0.00069 | −0.00026 | +0.00044 |
| dist k3 | 0.00054 ± 0.00161 (8) | 0.00039 ± 0.00384 (8) | 0.00050 ± 0.00098 (8) | +0.00015 | +0.00011 | −0.00004 |
| dist k4 | −0.00031 ± 0.00039 (8) | −0.00036 ± 0.00088 (8) | −0.00036 ± 0.00024 (8) | +0.00006 | 0.00000 | −0.00006 |
| baseline to TUM-VI cam0 mm | 101.048 ± 0.081 (8) | 101.049 ± 0.098 (8) | 101.047 ± 0.082 (8) | −0.001 | −0.002 | −0.001 |
T9 · Camera + IMU, raw stream
MVIS 4 of 4 · Kalibr 4 of 4 · Basalt 4 of 4
Camera + IMU · imu1–imu4 · Kalibr scale-misalignment vs MVIS (kalibr model)
Read first: Kalibr's intrinsics and baselines are inputs from an MVIS export; its td and lever are solved given them.
Run config · MVIS · mvis cam-imu
Command for imu1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam-imu --only tum_vi_raw/<collection> runs it through the cam_imu_manifest.yaml row (variant kalibr).
python -m mvis.cli.main cam-imu -c examples/regression/tum_vi_raw/cam_imu_imu1_kalibr.yaml
examples/regression/tum_vi_raw/cam_imu_imu1_kalibr.yaml
# Cam-IMU regression: TUM-VI raw (dataset-calib-imu1, dedicated IMU-excitation bag) — stereo + imu0 (single IMU).
input:
format: ros1
path: <DATASETS>/tum_vi_calib/raw/dataset-calib-imu1.bag
cam_topics:
- /cam0/image_raw
- /cam1/image_raw
imu_topics: ["/imu0"]
window_mode: motion # auto-pick the most-exciting 80 s (modern default)
segment_length: 80.0
cache_dir: <CACHE>
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
heights_file: null # D2: flat board start (no measured shape for this board)
camera_input:
path: examples/regression/tum_vi_raw/tum_vi_raw_calib.yaml
cameras: # base cam0 (global) tracks state_hz; cam1 aux at 8 Hz
- {estimate_readout: false}
- {estimate_readout: false, factor_hz: 8.0}
solve:
max_iterations: 40 # state_hz inherits modern default 30 (was 20; chord-safe)
corner_subsample: all # D2: every tag corner, the cam-IMU default; TUM-VI, Looper and MGC keep their data settings (2026-11-02)
estimate_t_ga: true
sigma_t_ga: 0.010
vision_pose: imu
estimate:
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU (was pinned to the prior until 2026-10-18)
tr: false # TUM-VI raw 1024 is global shutter
td: true
extrinsics: true
imu:
intrinsics: full
model: kalibr
output:
path: results/regression/tum_vi_raw/imu1_kalibr/cam_imu.jsonCamera prior examples/regression/tum_vi_raw/tum_vi_raw_calib.yaml (intrinsics + extrinsics the solve starts from)
source: 'median of 8 camera-only solves: cam1, cam2, cam3, cam4, cam5, cam6, cam7,
cam8'
cameras:
- id: 0
model: pinhole_equidistant
intrinsics:
fx: 381.89136541641926
fy: 381.8080974322461
cx: 509.84092114124815
cy: 513.799090774804
distortion:
model: equidistant
coeffs:
- 0.005472932544857839
- -0.002467673658959708
- 4.2746900111600266e-05
- -0.00022756669960947401
image_size:
- 1024
- 1024
rolling_shutter_readout: 0.0
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 380.61023047587287
fy: 380.5035566376936
cx: 505.0805941186228
cy: 509.66068834006353
distortion:
model: equidistant
coeffs:
- 0.0064680951133460115
- -0.0026149800337748243
- -0.00022404098463688917
- -0.00014121780081027282
image_size:
- 1024
- 1024
rolling_shutter_readout: 0.0
extrinsics:
reference_camera: 0
transforms:
- from: 1
to: 0
T_to_from:
- - 0.9999995409479292
- 0.000773574060107543
- 0.0005654087930674068
- 0.10101901137048469
- - -0.0007993767581051595
- 0.9988871516775962
- 0.04715738765260505
- 0.0013861454399770358
- - -0.0005282998470102496
- -0.047157817979556704
- 0.9988873115135053
- 0.0010053559270498784
- - 0.0
- 0.0
- 0.0
- 1.0
so3:
- -0.047175106046866234
- 0.0005470572929805814
- -0.000786767320903613
translation:
- 0.10101901137048469
- 0.0013861454399770358
- 0.0010053559270498784
time_offsets:
reference_camera: 0
offsets: []Runs (4: config · input; any other key that differs from imu1 is listed, otherwise only the bag / prior / output paths change):
- imu1 · cam_imu_imu1_kalibr.yaml · <DATASETS>/tum_vi_calib/raw/dataset-calib-imu1.bag
- imu2 · cam_imu_imu2_kalibr.yaml · <DATASETS>/tum_vi_calib/raw/dataset-calib-imu2.bag
- imu3 · cam_imu_imu3_kalibr.yaml · <DATASETS>/tum_vi_calib/raw/dataset-calib-imu3.bag
- imu4 · cam_imu_imu4_kalibr.yaml · <DATASETS>/tum_vi_calib/raw/dataset-calib-imu4.bag
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for imu1 (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu.yaml \
--imu-models scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.1 \
--dont-show-reportBag: mono16 bag repacked to mono8 (convert_mono16_bag.py). Cameras /cam0/image_raw, /cam1/image_raw · IMUs /imu0 (200 Hz) (imu0 = Kalibr's reference IMU).
camchain.yaml: the MVIS kalibr-variant export of the same recording (cam_imu_camchain-imucam.yaml): intrinsics held fixed, T_cam_imu as the initial value, topics set to the bag's. IMU noise = the MVIS regression defaults (core/config.py), so both tools weight the IMU alike.
imu.yaml
# TUM-VI BMI160 - noise set to the MVIS regression defaults (core/config.py) # so both estimators weight the IMU identically. rostopic: /imu0 update_rate: 200.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
camchain.yaml (imu1)
cam0:
camera_model: pinhole
distortion_model: equidistant
distortion_coeffs:
- 0.004773410570967341
- -0.0022324147927770444
- -6.573578199013612e-05
- -0.0002280712946356556
intrinsics:
- 382.1391913978345
- 382.26385522090845
- 509.8194655332557
- 514.5058808573493
resolution:
- 1024
- 1024
rostopic: /cam0/image_raw
T_cam_imu:
- - -0.9995405098340894
- 0.02807118676689258
- -0.011435806666192263
- 0.04729624338239875
- - 0.010483223251599715
- -0.033850292945642645
- -0.9993719326145549
- -0.048446695386088166
- - -0.028440661575733942
- -0.9990326151537757
- 0.033540462551106466
- -0.06596089309821405
- - 0.0
- 0.0
- 0.0
- 1.0
line_delay: 1.3657321965116626e-16
cam1:
camera_model: pinhole
distortion_model: equidistant
distortion_coeffs:
- 0.007551752511701923
- -0.006672380269155437
- 0.00284675116518869
- -0.0008721812078028164
intrinsics:
- 381.6772005210089
- 381.85689798849705
- 505.1731400030304
- 510.3971362708039
resolution:
- 1024
- 1024
rostopic: /cam1/image_raw
T_cam_imu:
- - -0.9995252197765558
- 0.028899338916455675
- -0.010684719969160041
- -0.05359079489736312
- - 0.011078683476304267
- 0.013506675970006453
- -0.9998474045956576
- -0.04689316775055329
- - -0.028750613959694835
- -0.999491069452065
- -0.013820429895901005
- -0.067540130333296
- - 0.0
- 0.0
- 0.0
- 1.0
line_delay: -3.3201056039174235e-16
T_cn_cnm1:
- - 0.9999993748995025
- -0.000778487867753903
- -0.0008025940718406205
- -0.1009776637012214
- - 0.0007396171082089779
- 0.9988783684243195
- -0.04734403933446564
- -0.0016586479358855926
- - 0.0008385506172195005
- 0.04734341612737712
- 0.9988783198078998
- 0.0006007475032558827
- - 0.0
- 0.0
- 0.0
- 1.0Runs (4; only the bag and its camchain seed differ):
- imu1 · ok
- imu2 · ok
- imu3 · ok
- imu4 · ok
Run config · Basalt · basalt_calibrate_imu
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T9 · command for imu1: Camera seed: Basalt camera row tum_vi_raw/cam1 of the same recording.
basalt_calibrate_imu \
--dataset-path <DATASETS>/tum_vi_calib/raw/dataset-calib-imu1.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 2 \
--init-knots poses \
--init-gyro-gap 0.1 \
--init-min-inliers 15 \
--imu-margin 1.0 \
--gyro-noise-std 0.01 \
--accel-noise-std 0.02 \
--gyro-bias-std 0.001 \
--accel-bias-std 0.002 \
--spline-dt-ms 10 \
--g-norm 9.81 \
--no-mocap \
--opt-intrinsics4 runs; options that differ from this one (paths aside):
- imu1 · ok
- imu2 · ok
- imu3 · ok
- imu4 · ok
examples/regression/basalt/targets/april_6x6_88mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.088,
"tagSpacing": 0.3
}cam0 – TUM-VI cam0 · 11 rows · ◆ 4
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 382.71 ± 0.08 (4) | fixed 382.14 (4) | 382.54 ± 0.11 (4) | ◆ −0.17 | ||
| fy px | 382.66 ± 0.08 (4) | fixed 382.26 (4) | 382.50 ± 0.12 (4) | ◆ −0.16 | ||
| cx px | 509.90 ± 0.15 (4) | fixed 509.82 (4) | 509.94 ± 0.16 (4) | +0.04 | ||
| cy px | 514.01 ± 0.04 (4) | fixed 514.51 (4) | 514.09 ± 0.05 (4) | ◆ +0.08 | ||
| dist k1 | 0.00467 ± 0.00106 (4) | fixed 0.00477 (4) | 0.00445 ± 0.00137 (4) | −0.00022 | ||
| dist k2 | −0.00324 ± 0.00190 (4) | fixed −0.00223 (4) | −0.00239 ± 0.00277 (4) | +0.00086 | ||
| dist k3 | 0.00116 ± 0.00126 (4) | fixed −0.00007 (4) | 0.00023 ± 0.00211 (4) | −0.00093 | ||
| dist k4 | −0.00057 ± 0.00027 (4) | fixed −0.00023 (4) | −0.00028 ± 0.00054 (4) | +0.00029 | ||
| time offset td to base IMU‡ ms | 0.149 ± 0.013 (4) | −0.784 ± 0.148 (4) | −0.715 ± 0.100 (4) | ◆ +0.933 | +0.069 | ◆ −0.864 |
| distance to base IMU ‖p‖ mm | 94.96 ± 0.38 (4) | 95.34 ± 0.49 (4) | 95.01 ± 0.23 (4) | −0.38 | −0.33 | +0.04 |
| reproj median px | 0.096 ± 0.006 (4) | 0.108 ± 0.007 (4) | not reported | fit |
cam1 – TUM-VI cam1 · 12 rows · ◆ 4
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 381.29 ± 0.05 (4) | fixed 381.68 (4) | 381.13 ± 0.11 (4) | ◆ −0.17 | ||
| fy px | 381.26 ± 0.05 (4) | fixed 381.86 (4) | 381.09 ± 0.13 (4) | ◆ −0.17 | ||
| cx px | 505.30 ± 0.13 (4) | fixed 505.17 (4) | 505.34 ± 0.13 (4) | +0.04 | ||
| cy px | 510.12 ± 0.12 (4) | fixed 510.40 (4) | 510.09 ± 0.12 (4) | −0.03 | ||
| dist k1 | 0.00604 ± 0.00071 (4) | fixed 0.00755 (4) | 0.00589 ± 0.00088 (4) | −0.00014 | ||
| dist k2 | −0.00378 ± 0.00130 (4) | fixed −0.00667 (4) | −0.00298 ± 0.00149 (4) | +0.00080 | ||
| dist k3 | 0.00131 ± 0.00097 (4) | fixed 0.00285 (4) | 0.00050 ± 0.00106 (4) | −0.00081 | ||
| dist k4 | −0.00052 ± 0.00025 (4) | fixed −0.00087 (4) | −0.00031 ± 0.00027 (4) | +0.00021 | ||
| baseline to TUM-VI cam0 mm | 101.137 ± 0.006 (4) | fixed 101.004 ± 0.038 (4) | 101.134 ± 0.005 (4) | −0.003 | ||
| time offset td to base IMU‡ ms | 0.151 ± 0.015 (4) | −0.787 ± 0.149 (4) | −0.715 ± 0.100 (4) | ◆ +0.938 | +0.072 | ◆ −0.866 |
| distance to base IMU ‖p‖ mm | 100.07 ± 0.40 (4) | 98.31 ± 0.33 (4) | 99.62 ± 0.35 (4) | ◆ +1.76 | ◆ +1.31 | ◆ −0.45 |
| reproj median px | 0.092 ± 0.005 (4) | 0.109 ± 0.005 (4) | not reported | fit |
base IMU – BMI160 imu0 · 19 rows · ◆ 7
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| gyro Dw[0,0] scale x | 0.94568 ± 0.00016 (4) | 0.94493 ± 0.00042 (4) | 0.94562 ± 0.00018 (4) | ◆ +0.00076 | ◆ +0.00070 | −0.00006 |
| gyro Dw[1,1] scale y | 1.09414 ± 0.00012 (4) | 1.09419 ± 0.00014 (4) | 1.09416 ± 0.00013 (4) | −0.00005 | −0.00003 | +0.00002 |
| gyro Dw[2,2] scale z | 1.01745 ± 0.00016 (4) | 1.01863 ± 0.00022 (4) | 1.01740 ± 0.00016 (4) | ◆ −0.00118 | ◆ −0.00123 | −0.00005 |
| gyro Dw[1,0] cross | 0.00113 ± 0.00015 (4) | 0.00202 ± 0.00055 (4) | 0.00135 ± 0.00044 (4) | ◆ −0.00088 | ◆ −0.00067 | +0.00021 |
| gyro Dw[2,0] cross | 0.00052 ± 0.00031 (4) | 0.00127 ± 0.00068 (4) | 0.00058 ± 0.00014 (4) | ◆ −0.00075 | ◆ −0.00069 | +0.00006 |
| gyro Dw[2,1] cross | 0.00632 ± 0.00013 (4) | 0.00497 ± 0.00013 (4) | 0.00580 ± 0.00045 (4) | ◆ +0.00135 | ◆ +0.00083 | ◆ −0.00052 |
| accel Da[0,0] scale x | 1.00719 ± 0.00087 (4) | 1.00739 ± 0.00027 (4) | 1.00736 ± 0.00005 (4) | −0.00020 | −0.00003 | +0.00017 |
| accel Da[1,1] scale y | 1.00697 ± 0.00043 (4) | 1.00622 ± 0.00054 (4) | 1.00665 ± 0.00035 (4) | ◆ +0.00075 | +0.00043 | −0.00032 |
| accel Da[2,2] scale z | 0.97126 ± 0.00090 (4) | 0.97202 ± 0.00030 (4) | 0.97239 ± 0.00044 (4) | −0.00076 | +0.00037 | ◆ +0.00113 |
| Tg[0,0] g-sensitivity mrad·s/m | 0.012 ± 0.010 (4) | 0.016 ± 0.040 (4) | not in model | ≠ model | ||
| Tg[0,1] g-sensitivity mrad·s/m | 0.084 ± 0.033 (4) | 1.043 ± 0.272 (4) | not in model | ≠ model | ||
| Tg[0,2] g-sensitivity mrad·s/m | 0.085 ± 0.086 (4) | 0.152 ± 0.105 (4) | not in model | ≠ model | ||
| Tg[1,0] g-sensitivity mrad·s/m | −0.017 ± 0.032 (4) | −0.490 ± 0.324 (4) | not in model | ≠ model | ||
| Tg[1,1] g-sensitivity mrad·s/m | −0.030 ± 0.027 (4) | −0.049 ± 0.106 (4) | not in model | ≠ model | ||
| Tg[1,2] g-sensitivity mrad·s/m | −0.025 ± 0.102 (4) | −0.015 ± 0.086 (4) | not in model | ≠ model | ||
| Tg[2,0] g-sensitivity mrad·s/m | −0.013 ± 0.025 (4) | −0.150 ± 0.041 (4) | not in model | ≠ model | ||
| Tg[2,1] g-sensitivity mrad·s/m | −0.072 ± 0.038 (4) | −0.092 ± 0.139 (4) | not in model | ≠ model | ||
| Tg[2,2] g-sensitivity mrad·s/m | 0.014 ± 0.016 (4) | 0.010 ± 0.053 (4) | not in model | ≠ model | ||
| t_ga gyro−accel ms | −1.511 ± 0.066 (4) | not in model | not in model |
MVIS default IMU model (calyx) · 23 of 42 rows, model-independent only · ◆ 3
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – TUM-VI cam0 | |||||
| fx px | 382.71 ± 0.08 (4) | 382.71 ± 0.08 (4) | fixed 382.14 (4) | 0.00 | |
| fy px | 382.66 ± 0.08 (4) | 382.66 ± 0.08 (4) | fixed 382.26 (4) | 0.00 | |
| cx px | 509.90 ± 0.15 (4) | 509.90 ± 0.15 (4) | fixed 509.82 (4) | 0.00 | |
| cy px | 514.01 ± 0.04 (4) | 514.01 ± 0.04 (4) | fixed 514.51 (4) | 0.00 | |
| dist k1 | 0.00467 ± 0.00106 (4) | 0.00467 ± 0.00106 (4) | fixed 0.00477 (4) | 0.00000 | |
| dist k2 | −0.00324 ± 0.00190 (4) | −0.00324 ± 0.00190 (4) | fixed −0.00223 (4) | 0.00000 | |
| dist k3 | 0.00116 ± 0.00126 (4) | 0.00116 ± 0.00126 (4) | fixed −0.00007 (4) | 0.00000 | |
| dist k4 | −0.00057 ± 0.00027 (4) | −0.00057 ± 0.00027 (4) | fixed −0.00023 (4) | 0.00000 | |
| time offset td to base IMU‡ ms | 0.149 ± 0.013 (4) | 0.173 ± 0.010 (4) | −0.784 ± 0.148 (4) | ◆ +0.957 | ◆ +0.024 |
| distance to base IMU ‖p‖ mm | 94.96 ± 0.38 (4) | 94.96 ± 0.38 (4) | 95.34 ± 0.49 (4) | −0.38 | 0.00 |
| reproj median px | 0.096 ± 0.006 (4) | 0.096 ± 0.007 (4) | 0.108 ± 0.007 (4) | fit | fit |
| cam1 – TUM-VI cam1 | |||||
| fx px | 381.29 ± 0.05 (4) | 381.29 ± 0.05 (4) | fixed 381.68 (4) | 0.00 | |
| fy px | 381.26 ± 0.05 (4) | 381.26 ± 0.05 (4) | fixed 381.86 (4) | 0.00 | |
| cx px | 505.30 ± 0.13 (4) | 505.30 ± 0.13 (4) | fixed 505.17 (4) | 0.00 | |
| cy px | 510.12 ± 0.12 (4) | 510.12 ± 0.12 (4) | fixed 510.40 (4) | 0.00 | |
| dist k1 | 0.00604 ± 0.00071 (4) | 0.00604 ± 0.00071 (4) | fixed 0.00755 (4) | 0.00000 | |
| dist k2 | −0.00378 ± 0.00130 (4) | −0.00378 ± 0.00130 (4) | fixed −0.00667 (4) | 0.00000 | |
| dist k3 | 0.00131 ± 0.00097 (4) | 0.00131 ± 0.00097 (4) | fixed 0.00285 (4) | 0.00000 | |
| dist k4 | −0.00052 ± 0.00025 (4) | −0.00052 ± 0.00025 (4) | fixed −0.00087 (4) | 0.00000 | |
| baseline to TUM-VI cam0 mm | 101.137 ± 0.006 (4) | 101.137 ± 0.006 (4) | fixed 101.004 ± 0.038 (4) | 0.000 | |
| time offset td to base IMU‡ ms | 0.151 ± 0.015 (4) | 0.175 ± 0.012 (4) | −0.787 ± 0.149 (4) | ◆ +0.961 | ◆ +0.024 |
| distance to base IMU ‖p‖ mm | 100.07 ± 0.40 (4) | 100.08 ± 0.40 (4) | 98.31 ± 0.33 (4) | ◆ +1.77 | +0.01 |
| reproj median px | 0.092 ± 0.005 (4) | 0.092 ± 0.005 (4) | 0.109 ± 0.005 (4) | fit | fit |
T10 · Camera + IMU, standard-512
MVIS 4 of 4 · Kalibr 4 of 4 · Basalt 4 of 4
Camera + IMU · imu1–imu4 · Kalibr scale-misalignment vs MVIS (kalibr model)
Read first: Kalibr's intrinsics and baselines are inputs from an MVIS export; its td and lever are solved given them.
Run config · MVIS · mvis cam-imu
Command for imu1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam-imu --only tum_vi_standard_512/<collection> runs it through the cam_imu_manifest.yaml row (variant kalibr).
python -m mvis.cli.main cam-imu -c examples/regression/tum_vi_standard_512/cam_imu_imu1_kalibr.yaml
examples/regression/tum_vi_standard_512/cam_imu_imu1_kalibr.yaml
# T10 (fast suite): TUM-VI standard 512 (dataset-calib-imu1_512_16, dedicated IMU-excitation bag) — stereo
input:
format: ros1
path: <DATASETS>/tum_vi_calib/standard_512/dataset-calib-imu1_512_16.bag
cam_topics:
- /cam0/image_raw
- /cam1/image_raw
imu_topics: ["/imu0"]
window_mode: motion
segment_length: 80.0
cache_dir: <CACHE>
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
heights_file: null # D2: flat board start (no measured shape for this board)
camera_input:
path: examples/regression/tum_vi_standard_512/tumvi_512_calib.yaml
cameras:
- {estimate_readout: false}
- {estimate_readout: false, factor_hz: 4.0}
solve:
max_iterations: 40
corner_subsample: all # D2: every tag corner, the cam-IMU default; TUM-VI, Looper and MGC keep their data settings (2026-11-02)
estimate_t_ga: true
sigma_t_ga: 0.010
vision_pose: imu
estimate:
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU (was pinned to the prior until 2026-10-18)
tr: false
td: true
extrinsics: true
imu:
intrinsics: full
model: kalibr
output:
path: results/regression/tum_vi_standard_512/imu1_kalibr/cam_imu.jsonCamera prior examples/regression/tum_vi_standard_512/tumvi_512_calib.yaml (intrinsics + extrinsics the solve starts from)
cameras:
- id: 0
model: pinhole_equidistant
intrinsics:
fx: 191.29743102978935
fy: 191.28709596271543
cx: 254.65678264802432
cy: 256.64072156496565
distortion:
model: equidistant
coeffs:
- 0.004844945410965611
- -0.002579036985136053
- 5.157901532391603e-05
- -0.00020741309956452084
image_size:
- 512
- 512
rolling_shutter_readout: 0.0
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 190.5945987283148
fy: 190.54906030756274
cx: 252.27171812230165
cy: 254.61249855366322
distortion:
model: equidistant
coeffs:
- 0.007014708857066542
- -0.005036269471427184
- 0.001719220159146871
- -0.0006104433254048513
image_size:
- 512
- 512
rolling_shutter_readout: 0.0
extrinsics:
reference_camera: 0
transforms:
- from: 1
to: 0
T_to_from:
- - 0.9999995121055595
- 0.0008845746524508157
- 0.00043967752569101505
- 0.10102022890398808
- - -0.0009043568762608144
- 0.998883236360334
- 0.04723835578155154
- 0.0016530195062503705
- - -0.00039740065766929024
- -0.04723873035961409
- 0.9988835489819264
- 0.0012991906392718542
- - 0.0
- 0.0
- 0.0
- 1.0
so3:
- -0.04725613707315182
- 0.0004186949766286627
- -0.0008947989082661268
translation:
- 0.10102022890398808
- 0.0016530195062503705
- 0.0012991906392718542
time_offsets:
reference_camera: 0
offsets: []
reprojection_errors:
per_camera:
- camera: 0
rms: 0.15581347326745038
mean: 0.10393299240966922
median: 0.07680604594826
p90: 0.16411166733130797
p95: 0.3206520265819123
max: 2.0626511690870393
num_observations: 33084
- camera: 1
rms: 0.1566114387634671
mean: 0.10357198529602514
median: 0.0754465335071615
p90: 0.1648331688721699
p95: 0.3349169083906262
max: 1.9233949593914925
num_observations: 33353
overall_rms: 0.1562145809832307Runs (4: config · input; any other key that differs from imu1 is listed, otherwise only the bag / prior / output paths change):
- imu1 · cam_imu_imu1_kalibr.yaml · <DATASETS>/tum_vi_calib/standard_512/dataset-calib-imu1_512_16.bag
- imu2 · cam_imu_imu2_kalibr.yaml · <DATASETS>/tum_vi_calib/standard_512/dataset-calib-imu2_512_16.bag
- imu3 · cam_imu_imu3_kalibr.yaml · <DATASETS>/tum_vi_calib/standard_512/dataset-calib-imu3_512_16.bag
- imu4 · cam_imu_imu4_kalibr.yaml · <DATASETS>/tum_vi_calib/standard_512/dataset-calib-imu4_512_16.bag
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for imu1 (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu.yaml \
--imu-models scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.1 \
--dont-show-reportBag: mono16 bag repacked to mono8 (convert_mono16_bag.py). Cameras /cam0/image_raw, /cam1/image_raw · IMUs /imu0 (200 Hz) (imu0 = Kalibr's reference IMU).
camchain.yaml: the MVIS kalibr-variant export of the same recording (cam_imu_camchain-imucam.yaml): intrinsics held fixed, T_cam_imu as the initial value, topics set to the bag's. IMU noise = the MVIS regression defaults (core/config.py), so both tools weight the IMU alike.
imu.yaml
# TUM-VI BMI160 - noise set to the MVIS regression defaults (core/config.py) # so both estimators weight the IMU identically. rostopic: /imu0 update_rate: 200.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.088 tagSpacing: 0.3
camchain.yaml (imu1)
cam0:
camera_model: pinhole
distortion_model: equidistant
distortion_coeffs:
- 0.006587544044867066
- -0.0061746904223633535
- 0.0031497662360211675
- -0.001063127950043392
intrinsics:
- 191.02613350418255
- 190.94828526418098
- 255.073279694559
- 257.35898971040154
resolution:
- 512
- 512
rostopic: /cam0/image_raw
T_cam_imu:
- - -0.9995547900304971
- 0.028292194255810844
- -0.009474886346608338
- 0.047758371504251586
- - 0.008518458674754599
- -0.03373660938505583
- -0.9993944551822402
- -0.04889842198424366
- - -0.0285947126038395
- -0.9990302262351187
- 0.03348058362263369
- -0.066005176262624
- - 0.0
- 0.0
- 0.0
- 1.0
line_delay: -1.7014140213671583e-16
cam1:
camera_model: pinhole
distortion_model: equidistant
distortion_coeffs:
- 0.007909361167438829
- -0.006554777621720328
- 0.0030411927652487167
- -0.0009722340234967245
intrinsics:
- 190.4996006275308
- 190.48375357749856
- 252.84901524645656
- 255.09827148654162
resolution:
- 512
- 512
rostopic: /cam1/image_raw
T_cam_imu:
- - -0.999529138182653
- 0.029445451307671015
- -0.00862944500702219
- -0.053218773358769726
- - 0.009004042297358773
- 0.012612946879013456
- -0.9998799131862455
- -0.04723207128422896
- - -0.029333072565775078
- -0.9994868078010404
- -0.012872136012962759
- -0.06883075218214257
- - 0.0
- 0.0
- 0.0
- 1.0
line_delay: 1.2075161902891254e-16
T_cn_cnm1:
- - 0.9999989772845485
- -0.0008836178554375105
- -0.0011245662911760178
- -0.1010945307348329
- - 0.0008305628729734296
- 0.9989256235865981
- -0.046334746221822126
- -0.0014841840329182178
- - 0.0011643002927661523
- 0.046333764811551374
- 0.9989253358701121
- -0.0006864664168855006
- - 0.0
- 0.0
- 0.0
- 1.0Runs (4; only the bag and its camchain seed differ):
- imu1 · ok
- imu2 · ok
- imu3 · ok
- imu4 · ok
Run config · Basalt · basalt_calibrate_imu
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T10 · command for imu1: Camera seed: Basalt camera row tum_vi_standard_512/cam1 of the same recording.
basalt_calibrate_imu \
--dataset-path <DATASETS>/tum_vi_calib/standard_512/dataset-calib-imu1_512_16.bag \
--dataset-type bag \
--aprilgrid <TARGETS>/april_6x6_88mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 2 \
--init-knots poses \
--init-gyro-gap 0.1 \
--init-min-inliers 15 \
--imu-margin 1.0 \
--gyro-noise-std 0.01 \
--accel-noise-std 0.02 \
--gyro-bias-std 0.001 \
--accel-bias-std 0.002 \
--spline-dt-ms 10 \
--g-norm 9.81 \
--no-mocap \
--opt-intrinsics4 runs; options that differ from this one (paths aside):
- imu1 · ok
- imu2 · ok
- imu3 · ok
- imu4 · ok
examples/regression/basalt/targets/april_6x6_88mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.088,
"tagSpacing": 0.3
}cam0 – TUM-VI cam0 · 11 rows · ◆ 6
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 191.51 ± 0.09 (4) | fixed 191.03 (4) | 191.80 ± 0.18 (4) | ◆ +0.28 | ||
| fy px | 191.49 ± 0.10 (4) | fixed 190.95 (4) | 191.77 ± 0.18 (4) | ◆ +0.28 | ||
| cx px | 254.59 ± 0.07 (4) | fixed 255.07 (4) | 254.76 ± 0.09 (4) | ◆ +0.17 | ||
| cy px | 256.65 ± 0.02 (4) | fixed 257.36 (4) | 256.82 ± 0.03 (4) | ◆ +0.17 | ||
| dist k1 | 0.00364 ± 0.00087 (4) | fixed 0.00659 (4) | 0.00259 ± 0.00230 (4) | −0.00105 | ||
| dist k2 | −0.00160 ± 0.00150 (4) | fixed −0.00617 (4) | −0.00049 ± 0.00488 (4) | +0.00111 | ||
| dist k3 | −0.00001 ± 0.00086 (4) | fixed 0.00315 (4) | −0.00056 ± 0.00394 (4) | −0.00055 | ||
| dist k4 | −0.00027 ± 0.00013 (4) | fixed −0.00106 (4) | −0.00014 ± 0.00102 (4) | +0.00013 | ||
| time offset td to base IMU‡ ms | 0.184 ± 0.016 (4) | −0.723 ± 0.165 (4) | −0.644 ± 0.124 (4) | ◆ +0.907 | +0.079 | ◆ −0.828 |
| distance to base IMU ‖p‖ mm | 94.48 ± 0.12 (4) | 95.60 ± 0.21 (4) | 94.36 ± 0.20 (4) | ◆ −1.12 | ◆ −1.24 | −0.11 |
| reproj median px | 0.077 ± 0.002 (4) | 0.081 ± 0.003 (4) | not reported | fit |
cam1 – TUM-VI cam1 · 12 rows · ◆ 7
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 190.86 ± 0.14 (4) | fixed 190.50 (4) | 191.12 ± 0.14 (4) | ◆ +0.26 | ||
| fy px | 190.84 ± 0.16 (4) | fixed 190.48 (4) | 191.11 ± 0.13 (4) | ◆ +0.27 | ||
| cx px | 252.27 ± 0.07 (4) | fixed 252.85 (4) | 252.44 ± 0.09 (4) | ◆ +0.17 | ||
| cy px | 254.70 ± 0.07 (4) | fixed 255.10 (4) | 254.84 ± 0.08 (4) | ◆ +0.14 | ||
| dist k1 | 0.00585 ± 0.00098 (4) | fixed 0.00791 (4) | 0.00330 ± 0.00171 (4) | ◆ −0.00255 | ||
| dist k2 | −0.00387 ± 0.00183 (4) | fixed −0.00655 (4) | 0.00035 ± 0.00424 (4) | +0.00422 | ||
| dist k3 | 0.00147 ± 0.00144 (4) | fixed 0.00304 (4) | −0.00149 ± 0.00415 (4) | −0.00296 | ||
| dist k4 | −0.00061 ± 0.00039 (4) | fixed −0.00097 (4) | 0.00017 ± 0.00129 (4) | +0.00078 | ||
| baseline to TUM-VI cam0 mm | 101.151 ± 0.027 (4) | fixed 101.120 ± 0.038 (4) | 101.122 ± 0.054 (4) | −0.029 | ||
| time offset td to base IMU‡ ms | 0.186 ± 0.012 (4) | −0.730 ± 0.165 (4) | −0.644 ± 0.124 (4) | ◆ +0.916 | +0.086 | ◆ −0.831 |
| distance to base IMU ‖p‖ mm | 99.20 ± 0.29 (4) | 99.66 ± 0.26 (4) | 98.79 ± 0.25 (4) | ◆ −0.47 | ◆ −0.88 | ◆ −0.41 |
| reproj median px | 0.077 ± 0.002 (4) | 0.080 ± 0.003 (4) | not reported | fit |
base IMU – BMI160 imu0 · 19 rows · ◆ 6
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| gyro Dw[0,0] scale x | 1.00182 ± 0.00015 (4) | 1.00244 ± 0.00035 (4) | 1.00175 ± 0.00027 (4) | ◆ −0.00062 | ◆ −0.00069 | −0.00007 |
| gyro Dw[1,1] scale y | 0.99995 ± 0.00014 (4) | 1.00015 ± 0.00016 (4) | 1.00000 ± 0.00014 (4) | ◆ −0.00020 | −0.00015 | +0.00005 |
| gyro Dw[2,2] scale z | 1.00117 ± 0.00017 (4) | 1.00192 ± 0.00033 (4) | 1.00087 ± 0.00029 (4) | ◆ −0.00075 | ◆ −0.00105 | ◆ −0.00030 |
| gyro Dw[1,0] cross | −0.00038 ± 0.00016 (4) | −0.00115 ± 0.00051 (4) | −0.00054 ± 0.00049 (4) | ◆ +0.00077 | ◆ +0.00062 | −0.00016 |
| gyro Dw[2,0] cross | 0.00094 ± 0.00013 (4) | 0.00079 ± 0.00081 (4) | 0.00088 ± 0.00015 (4) | +0.00016 | +0.00010 | −0.00006 |
| gyro Dw[2,1] cross | 0.00084 ± 0.00008 (4) | −0.00061 ± 0.00035 (4) | 0.00042 ± 0.00056 (4) | ◆ +0.00145 | ◆ +0.00103 | −0.00041 |
| accel Da[0,0] scale x | 1.00325 ± 0.00008 (4) | 1.00296 ± 0.00017 (4) | 1.00293 ± 0.00007 (4) | ◆ +0.00029 | −0.00003 | ◆ −0.00032 |
| accel Da[1,1] scale y | 1.00519 ± 0.00024 (4) | 1.00515 ± 0.00046 (4) | 1.00527 ± 0.00030 (4) | +0.00004 | +0.00012 | +0.00008 |
| accel Da[2,2] scale z | 1.00199 ± 0.00057 (4) | 1.00194 ± 0.00047 (4) | 1.00148 ± 0.00099 (4) | +0.00005 | −0.00046 | −0.00051 |
| Tg[0,0] g-sensitivity mrad·s/m | 0.015 ± 0.009 (4) | 0.020 ± 0.045 (4) | not in model | ≠ model | ||
| Tg[0,1] g-sensitivity mrad·s/m | −0.003 ± 0.033 (4) | 0.964 ± 0.274 (4) | not in model | ≠ model | ||
| Tg[0,2] g-sensitivity mrad·s/m | 0.000 ± 0.030 (4) | 0.108 ± 0.102 (4) | not in model | ≠ model | ||
| Tg[1,0] g-sensitivity mrad·s/m | −0.016 ± 0.030 (4) | −0.522 ± 0.343 (4) | not in model | ≠ model | ||
| Tg[1,1] g-sensitivity mrad·s/m | −0.013 ± 0.023 (4) | −0.032 ± 0.093 (4) | not in model | ≠ model | ||
| Tg[1,2] g-sensitivity mrad·s/m | 0.011 ± 0.014 (4) | −0.009 ± 0.103 (4) | not in model | ≠ model | ||
| Tg[2,0] g-sensitivity mrad·s/m | 0.011 ± 0.059 (4) | −0.096 ± 0.020 (4) | not in model | ≠ model | ||
| Tg[2,1] g-sensitivity mrad·s/m | −0.033 ± 0.048 (4) | −0.076 ± 0.098 (4) | not in model | ≠ model | ||
| Tg[2,2] g-sensitivity mrad·s/m | 0.010 ± 0.026 (4) | 0.002 ± 0.035 (4) | not in model | ≠ model | ||
| t_ga gyro−accel ms | −1.640 ± 0.061 (4) | not in model | not in model |
MVIS default IMU model (calyx) · 23 of 42 rows, model-independent only · ◆ 4
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – TUM-VI cam0 | |||||
| fx px | 191.51 ± 0.09 (4) | 191.51 ± 0.09 (4) | fixed 191.03 (4) | 0.00 | |
| fy px | 191.49 ± 0.10 (4) | 191.49 ± 0.10 (4) | fixed 190.95 (4) | 0.00 | |
| cx px | 254.59 ± 0.07 (4) | 254.59 ± 0.07 (4) | fixed 255.07 (4) | 0.00 | |
| cy px | 256.65 ± 0.02 (4) | 256.65 ± 0.02 (4) | fixed 257.36 (4) | 0.00 | |
| dist k1 | 0.00364 ± 0.00087 (4) | 0.00364 ± 0.00087 (4) | fixed 0.00659 (4) | 0.00000 | |
| dist k2 | −0.00160 ± 0.00150 (4) | −0.00161 ± 0.00150 (4) | fixed −0.00617 (4) | 0.00000 | |
| dist k3 | −0.00001 ± 0.00086 (4) | −0.00001 ± 0.00086 (4) | fixed 0.00315 (4) | 0.00000 | |
| dist k4 | −0.00027 ± 0.00013 (4) | −0.00027 ± 0.00013 (4) | fixed −0.00106 (4) | 0.00000 | |
| time offset td to base IMU‡ ms | 0.184 ± 0.016 (4) | 0.187 ± 0.004 (4) | −0.723 ± 0.165 (4) | ◆ +0.910 | +0.003 |
| distance to base IMU ‖p‖ mm | 94.48 ± 0.12 (4) | 94.48 ± 0.12 (4) | 95.60 ± 0.21 (4) | ◆ −1.12 | 0.00 |
| reproj median px | 0.077 ± 0.002 (4) | 0.077 ± 0.002 (4) | 0.081 ± 0.003 (4) | fit | fit |
| cam1 – TUM-VI cam1 | |||||
| fx px | 190.86 ± 0.14 (4) | 190.86 ± 0.14 (4) | fixed 190.50 (4) | 0.00 | |
| fy px | 190.84 ± 0.16 (4) | 190.84 ± 0.16 (4) | fixed 190.48 (4) | 0.00 | |
| cx px | 252.27 ± 0.07 (4) | 252.27 ± 0.07 (4) | fixed 252.85 (4) | 0.00 | |
| cy px | 254.70 ± 0.07 (4) | 254.70 ± 0.07 (4) | fixed 255.10 (4) | 0.00 | |
| dist k1 | 0.00585 ± 0.00098 (4) | 0.00585 ± 0.00098 (4) | fixed 0.00791 (4) | 0.00000 | |
| dist k2 | −0.00387 ± 0.00183 (4) | −0.00387 ± 0.00182 (4) | fixed −0.00655 (4) | 0.00000 | |
| dist k3 | 0.00147 ± 0.00144 (4) | 0.00147 ± 0.00144 (4) | fixed 0.00304 (4) | 0.00000 | |
| dist k4 | −0.00061 ± 0.00039 (4) | −0.00061 ± 0.00039 (4) | fixed −0.00097 (4) | 0.00000 | |
| baseline to TUM-VI cam0 mm | 101.151 ± 0.027 (4) | 101.151 ± 0.027 (4) | fixed 101.120 ± 0.038 (4) | 0.000 | |
| time offset td to base IMU‡ ms | 0.186 ± 0.012 (4) | 0.190 ± 0.002 (4) | −0.730 ± 0.165 (4) | ◆ +0.920 | +0.004 |
| distance to base IMU ‖p‖ mm | 99.20 ± 0.29 (4) | 99.20 ± 0.29 (4) | 99.66 ± 0.26 (4) | ◆ −0.47 | 0.00 |
| reproj median px | 0.077 ± 0.002 (4) | 0.077 ± 0.002 (4) | 0.080 ± 0.003 (4) | fit | fit |
Looper Robotics Insight-9
No ground truth: ◆ marks disagreement, not who is right.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
Key and MVIS column
Swipe a table sideways for the other tools and differences.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
T4 · Camera stereo
MVIS 10 of 10 · Kalibr 10 of 10 · Basalt 10 of 10
Camera · stereo01–stereo10 · Kalibr pinhole-equi
Run config · MVIS · run_calibration.py
Command for stereo01 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam --only looper_insight9/<collection> runs it through the manifest.yaml row (calyx model, no variant).
python scripts/run_calibration.py \
--config examples/regression/looper_insight9/cam_only_stereo01.yaml \
--output results/regression/looper_insight9/stereo01 \
--dataset-name looper_insight9 \
--collection-name stereo01 \
--no-rs \
--no-td \
--rerun-outliers \
--corner-subsample two_antiexamples/regression/looper_insight9/cam_only_stereo01.yaml
# Camera-only regression T4: Looper Insight-9 bag 1,
input:
cameras:
- camera_id: 0
name: cam0
source_type: euroc
source_path: <DATASETS>/looperrobotics/1/mav0/cam0
distortion_model: equidistant
shutter_type: global
- camera_id: 1
name: cam1
source_type: euroc
source_path: <DATASETS>/looperrobotics/1/mav0/cam1
distortion_model: equidistant
shutter_type: global
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.055
tag_spacing: 0.3
tag_family: t36h11
solve:
max_iterations: 15
max_init_frames: 100
pixel_sigma: 1.0
huber_threshold: 1.345
output:
path: results/regression/looper_insight9/stereo01/calibration.yaml
format: yaml
reference_camera: 0Runs (10: config · input; any other key that differs from stereo01 is listed, otherwise only the bag / prior / output paths change):
- stereo01 · cam_only_stereo01.yaml · <DATASETS>/looperrobotics/1/mav0/cam0
- stereo02 · cam_only_stereo02.yaml · <DATASETS>/looperrobotics/2/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/2/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/2/mav0/cam1
- stereo03 · cam_only_stereo03.yaml · <DATASETS>/looperrobotics/3/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/3/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/3/mav0/cam1
- stereo04 · cam_only_stereo04.yaml · <DATASETS>/looperrobotics/4/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/4/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/4/mav0/cam1
- stereo05 · cam_only_stereo05.yaml · <DATASETS>/looperrobotics/5/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/5/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/5/mav0/cam1
- stereo06 · cam_only_stereo06.yaml · <DATASETS>/looperrobotics/6/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/6/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/6/mav0/cam1
- stereo07 · cam_only_stereo07.yaml · <DATASETS>/looperrobotics/7/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/7/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/7/mav0/cam1
- stereo08 · cam_only_stereo08.yaml · <DATASETS>/looperrobotics/8/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/8/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/8/mav0/cam1
- stereo09 · cam_only_stereo09.yaml · <DATASETS>/looperrobotics/9/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/9/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/9/mav0/cam1
- stereo10 · cam_only_stereo10.yaml · <DATASETS>/looperrobotics/10/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/looperrobotics/10/mav0/cam0; input.cameras[1].source_path: <DATASETS>/looperrobotics/10/mav0/cam1
Run config · Kalibr · kalibr_calibrate_cameras
Command for stereo01, rebuilt from run_camonly_sweep.py (Kalibr logs no command line); in docker kalibr:noetic, bag folder at /data, examples/regression/kalibr/targets at /targets. Focal init: KALIBR_MANUAL_FOCAL_LENGTH_INIT=1, each camera's seed piped on stdin 8× (MVIS camera-only fx (run_batch.get_mvis_focal_lengths)).
KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 kalibr_calibrate_cameras \
--models pinhole-equi pinhole-equi \
--target /targets/april_6x6_55mm.yaml \
--bag /data/looper_1.bag \
--topics /cam0/image_raw /cam1/image_raw \
--bag-freq 4.0 \
--approx-sync 0.05 \
--dont-show-reportBag: EuRoC folder repacked to a rosbag with kalibr_bagcreater (cached in <DATASETS>/looperrobotics/kalibr_bags). Multi-camera runs: --approx-sync 0.05 (config.yaml gs.approx_sync_s).
targets/april_6x6_55mm.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.055 tagSpacing: 0.3
Runs (10; only the bag differs):
- stereo01 · ok
- stereo02 · ok
- stereo03 · ok
- stereo04 · ok
- stereo05 · ok
- stereo06 · ok
- stereo07 · ok
- stereo08 · ok
- stereo09 · ok
- stereo10 · ok
Run config · Basalt · basalt_calibrate
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T4 · command for stereo01:
basalt_calibrate \
--dataset-path <DATASETS>/looperrobotics/1 \
--dataset-type euroc \
--aprilgrid <TARGETS>/april_6x6_55mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-types kb4 kb410 runs; options that differ from this one (paths aside):
- stereo01 · ok
- stereo02 · ok
- stereo03 · ok
- stereo04 · ok
- stereo05 · ok
- stereo06 · ok
- stereo07 · ok
- stereo08 · ok
- stereo09 · ok
- stereo10 · ok
examples/regression/basalt/targets/april_6x6_55mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.055,
"tagSpacing": 0.3
}cam0 – Looper GS cam0 · 8 rows · ◆ 3
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 335.60 ± 0.38 (10) | 335.00 ± 0.19 (10) | 335.33 ± 0.38 (10) | ◆ +0.60 | +0.33 | −0.27 |
| fy px | 335.60 ± 0.37 (10) | 334.97 ± 0.19 (10) | 335.31 ± 0.38 (10) | ◆ +0.63 | +0.35 | −0.28 |
| cx px | 271.99 ± 0.11 (10) | 271.93 ± 0.17 (10) | 272.01 ± 0.11 (10) | +0.06 | +0.09 | +0.03 |
| cy px | 318.49 ± 0.05 (10) | 318.48 ± 0.05 (10) | 318.46 ± 0.03 (10) | +0.02 | −0.01 | −0.03 |
| dist k1 | −0.02356 ± 0.00109 (10) | −0.02167 ± 0.00139 (10) | −0.02323 ± 0.00079 (10) | ◆ −0.00189 | ◆ −0.00156 | +0.00033 |
| dist k2 | 0.01131 ± 0.00284 (10) | 0.01157 ± 0.00481 (10) | 0.01362 ± 0.00156 (10) | −0.00026 | +0.00205 | +0.00230 |
| dist k3 | −0.01022 ± 0.00381 (10) | −0.01366 ± 0.00588 (10) | −0.01356 ± 0.00177 (10) | +0.00344 | +0.00010 | −0.00334 |
| dist k4 | 0.00123 ± 0.00170 (10) | 0.00324 ± 0.00244 (10) | 0.00236 ± 0.00064 (10) | −0.00200 | −0.00088 | +0.00113 |
cam1 – Looper GS cam1 · 9 rows · ◆ 6
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 335.62 ± 0.40 (10) | 335.09 ± 0.20 (10) | 335.41 ± 0.38 (10) | ◆ +0.53 | +0.32 | −0.22 |
| fy px | 335.61 ± 0.40 (10) | 335.07 ± 0.20 (10) | 335.38 ± 0.38 (10) | ◆ +0.54 | +0.31 | −0.23 |
| cx px | 269.29 ± 0.12 (10) | 269.42 ± 0.16 (10) | 269.31 ± 0.09 (10) | −0.13 | −0.10 | +0.02 |
| cy px | 318.27 ± 0.07 (10) | 318.25 ± 0.05 (10) | 318.22 ± 0.05 (10) | +0.01 | −0.03 | −0.04 |
| dist k1 | −0.02366 ± 0.00110 (10) | −0.02123 ± 0.00095 (10) | −0.02336 ± 0.00103 (10) | ◆ −0.00243 | ◆ −0.00212 | +0.00030 |
| dist k2 | 0.01135 ± 0.00224 (10) | 0.00922 ± 0.00393 (10) | 0.01321 ± 0.00226 (10) | +0.00213 | ◆ +0.00399 | +0.00186 |
| dist k3 | −0.00975 ± 0.00259 (10) | −0.00998 ± 0.00515 (10) | −0.01417 ± 0.00288 (10) | +0.00022 | −0.00420 | ◆ −0.00442 |
| dist k4 | 0.00053 ± 0.00103 (10) | 0.00150 ± 0.00219 (10) | 0.00304 ± 0.00126 (10) | −0.00097 | +0.00154 | ◆ +0.00251 |
| baseline to Looper GS cam0 mm | 99.129 ± 0.176 (10) | 99.188 ± 0.238 (10) | 99.126 ± 0.183 (10) | −0.059 | −0.062 | −0.004 |
T11 · 3-cam + IMU
MVIS 10 of 10 · Kalibr 10 of 10, no values on Looper RS cam2 · Basalt 10 of 10, no values on Looper RS cam2
Camera + IMU · bags 1–10 · Kalibr from its own camera calibration
Read first: Kalibr's intrinsics and baselines are inputs from its own camera-only calibration; its td and lever are solved given them.
Notes
Like for like: Every tool uses the same IMU noise, measured at rest on this unit. Kalibr's td and lever are solved given its inputs. RS cam2 is MVIS only.
Note: Kalibr's camera + IMU solver is global-shutter only, so the RS cam2 is not in its runs. Every tool uses the same IMU noise, measured at rest on this unit.
Basalt: cam0 + cam1 (no rolling-shutter model, so no cam2).
Run config · MVIS · mvis cam-imu
IMU noise measured at rest on the same unit (white-noise density × 2.5; bias walks at the defaults), the same values Kalibr and Basalt used.
Command for bag1 from the MVIS repo root (batch 2026-11-10a); run directly with this config, not through the regression manifest.
python -m mvis.cli.main cam-imu -c t11_bag1_kalibr.yaml
t11_bag1_kalibr.yaml
# Cam-IMU regression: Looper Robotics Insight-9 (SA16 3-cam rig), bag 1 of the
input:
format: euroc
path: '<DATASETS>/looperrobotics/1/mav0'
cam_topics: ["/cam0", "/cam1", "/cam2"]
imu_topics: ["/imu0"]
window_mode: manual
t0: 0.0
window: 0.0
cache_dir: <OUTPUT>/
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.055
tag_spacing: 0.3
tag_family: t36h11
heights_file: null # D2: flat board start (no measured shape for this board)
camera_input:
path: examples/regression/looper_insight9/insight9_seed_calib.yaml
free_intrinsics: true
estimate_readout: false
cameras:
- {}
- {}
- {estimate_readout: true, rolling_mode: 0}
solve:
state_hz: 30.0
max_iterations: 40
corner_subsample: top_left # D2: one corner per tag, as blessed since the family was added; harmonise only with a re-bless (G11)
estimate_t_ga: true
sigma_t_ga: 0.010 # measured noise below (x 2.5, bias walks default)
sigma_g: 0.00021
sigma_a: 0.0032
sigma_bg: 0.001
sigma_ba: 0.002
vision_pose: imu
init_kwargs: {keyframe_hz: 2.0, scale_rel_tol: 0.3}
estimate:
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU
imu:
intrinsics: full
model: kalibr
output:
path: <OUTPUT>/Camera prior examples/regression/looper_insight9/insight9_seed_calib.yaml (intrinsics + extrinsics the solve starts from)
cameras:
- id: 0
model: pinhole_equidistant
intrinsics:
fx: 333.6926692978411
fy: 333.69369064999535
cx: 273.57832441613743
cy: 318.7152158646744
distortion:
model: equidistant
coeffs:
- -0.020844506465392272
- 0.010287389803226209
- -0.011656057368047167
- 0.002050612019258158
image_size:
- 544
- 640
rolling_shutter_readout: 0.0
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 333.98635459566003
fy: 333.98896357791523
cx: 268.4798003098496
cy: 318.56962780116675
distortion:
model: equidistant
coeffs:
- -0.011409338624257878
- -0.04294629981051422
- 0.07485660585671672
- -0.03917392318044351
image_size:
- 544
- 640
rolling_shutter_readout: 0.0
- id: 2
model: pinhole_equidistant
intrinsics:
fx: 772.4831441995177
fy: 771.7928519134275
cx: 958.7207374808979
cy: 533.575645999135
distortion:
model: equidistant
coeffs:
- -0.03537899976273113
- 0.0053864950588514956
- -0.0037040411769740248
- 0.00023336345868485165
image_size:
- 1920
- 1088
rolling_shutter_readout: 0.0
extrinsics:
reference_camera: 0
transforms: []
time_offsets:
reference_camera: 0
offsets: []Runs (10: config · input; any other key that differs from bag1 is listed, otherwise only the bag / prior / output paths change):
- bag1 · t11_bag1_kalibr.yaml · <DATASETS>/looperrobotics/1/mav0
- bag2 · t11_bag2_kalibr.yaml · <DATASETS>/looperrobotics/2/mav0
- bag3 · t11_bag3_kalibr.yaml · <DATASETS>/looperrobotics/3/mav0
- bag4 · t11_bag4_kalibr.yaml · <DATASETS>/looperrobotics/4/mav0
- bag5 · t11_bag5_kalibr.yaml · <DATASETS>/looperrobotics/5/mav0
- bag6 · t11_bag6_kalibr.yaml · <DATASETS>/looperrobotics/6/mav0
- bag7 · t11_bag7_kalibr.yaml · <DATASETS>/looperrobotics/7/mav0
- bag8 · t11_bag8_kalibr.yaml · <DATASETS>/looperrobotics/8/mav0
- bag9 · t11_bag9_kalibr.yaml · <DATASETS>/looperrobotics/9/mav0
- bag10 · t11_bag10_kalibr.yaml · <DATASETS>/looperrobotics/10/mav0
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for bag1 (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu0.yaml \
--imu-models scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.1 \
--dont-show-report \
--bag-freq 10.0Bag: EuRoC folder (cameras cam0, cam1 + imu0) repacked to a rosbag with kalibr_bagcreater. Cameras /cam0/image_raw, /cam1/image_raw · IMUs /imu0 (400 Hz) (imu0 = Kalibr's reference IMU).
camchain.yaml: Kalibr's own camera-only calibration of the same recording: intrinsics held fixed, topics set to the bag's. IMU noise measured at rest on the same unit (white-noise density × 2.5; bias walks at the defaults), the same values MVIS and Basalt used.
imu0.yaml
rostopic: /imu0 update_rate: 400.0 accelerometer_noise_density: 3.2e-3 accelerometer_random_walk: 0.002 gyroscope_noise_density: 2.1e-4 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.055 tagSpacing: 0.3
camchain.yaml (bag1)
cam0:
cam_overlaps:
- 1
camera_model: pinhole
distortion_coeffs:
- -0.023612095126595067
- 0.019566105304552397
- -0.024535979792463306
- 0.007940665352433752
distortion_model: equidistant
intrinsics:
- 334.8723776542813
- 334.84297998067694
- 271.92161904489296
- 318.45955839122377
resolution:
- 544
- 640
rostopic: /cam0/image_raw
cam1:
T_cn_cnm1:
- - 0.9999967291579409
- 0.0014186087747005355
- 0.002128197022783427
- -0.09933336316779369
- - -0.0014156720559868985
- 0.9999980446554954
- -0.001380781597290463
- 0.0002886709084256512
- - -0.0021301516503149315
- 0.0013777642519171487
- 0.9999967821046308
- -2.3072741163142306e-06
- - 0.0
- 0.0
- 0.0
- 1.0
cam_overlaps:
- 0
camera_model: pinhole
distortion_coeffs:
- -0.021860587906798346
- 0.013340672301379945
- -0.015569328591196262
- 0.0038978348980663003
distortion_model: equidistant
intrinsics:
- 334.7980689352738
- 334.76364008695566
- 269.5790715208478
- 318.2499429688059
resolution:
- 544
- 640
rostopic: /cam1/image_rawRuns (10; only the bag and its camchain seed differ):
- bag1 · ok
- bag2 · ok
- bag3 · ok
- bag4 · ok
- bag5 · ok
- bag6 · ok
- bag7 · ok
- bag8 · ok
- bag9 · ok
- bag10 · ok
Run config · Basalt · basalt_calibrate_imu
Re-run on 2026-11-08 with IMU noise measured at rest on the same unit (white-noise density × 2.5; bias walks at the defaults), the same values MVIS and Kalibr used.
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T11 · command for bag1: Camera seed: Basalt camera row looper_insight9/stereo01 of the same recording.
basalt_calibrate_imu \
--dataset-path <DATASETS>/looperrobotics/1 \
--dataset-type euroc \
--aprilgrid <TARGETS>/april_6x6_55mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 2 \
--init-knots poses \
--init-gyro-gap 0.1 \
--init-min-inliers 15 \
--imu-margin 1.0 \
--gyro-noise-std 0.00021 \
--accel-noise-std 0.0032 \
--gyro-bias-std 0.001 \
--accel-bias-std 0.002 \
--spline-dt-ms 10 \
--g-norm 9.81 \
--no-mocap \
--opt-intrinsics10 runs; options that differ from this one (paths aside):
- bag1 · ok
- bag2 · ok
- bag3 · ok
- bag4 · ok
- bag5 · ok
- bag6 · ok
- bag7 · ok
- bag8 · ok
- bag9 · ok
- bag10 · ok
examples/regression/basalt/targets/april_6x6_55mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.055,
"tagSpacing": 0.3
}cam0 – Looper GS cam0 · 11 rows · ◆ 3
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 333.93 ± 0.15 (10) | fixed 335.00 ± 0.19 (10) | 334.24 ± 0.44 (10) | +0.31 | ||
| fy px | 333.93 ± 0.16 (10) | fixed 334.97 ± 0.19 (10) | 334.19 ± 0.43 (10) | +0.26 | ||
| cx px | 272.18 ± 0.14 (10) | fixed 271.93 ± 0.17 (10) | 271.96 ± 0.15 (10) | ◆ −0.23 | ||
| cy px | 318.58 ± 0.07 (10) | fixed 318.48 ± 0.05 (10) | 318.51 ± 0.04 (10) | −0.07 | ||
| dist k1 | −0.02193 ± 0.00122 (10) | fixed −0.02167 ± 0.00139 (10) | −0.02156 ± 0.00120 (10) | +0.00037 | ||
| dist k2 | 0.01207 ± 0.00405 (10) | fixed 0.01157 ± 0.00481 (10) | 0.01092 ± 0.00243 (10) | −0.00115 | ||
| dist k3 | −0.01359 ± 0.00479 (10) | fixed −0.01366 ± 0.00588 (10) | −0.01093 ± 0.00284 (10) | +0.00266 | ||
| dist k4 | 0.00288 ± 0.00185 (10) | fixed 0.00324 ± 0.00244 (10) | 0.00135 ± 0.00111 (10) | −0.00153 | ||
| time offset td to base IMU‡ ms | 1.326 ± 0.087 (10) | −0.272 ± 0.131 (10) | 0.580 ± 0.156 (10) | ◆ +1.598 | ◆ +0.852 | ◆ −0.746 |
| distance to base IMU ‖p‖ mm | 43.73 ± 0.37 (10) | 44.56 ± 0.51 (10) | 45.05 ± 0.56 (10) | ◆ −0.83 | +0.49 | ◆ +1.33 |
| reproj median px | 0.153 ± 0.006 (10) | 0.195 ± 0.008 (10) | not reported | fit |
cam1 – Looper GS cam1 · 12 rows · ◆ 8
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 333.99 ± 0.12 (10) | fixed 335.09 ± 0.20 (10) | 334.26 ± 0.45 (10) | +0.27 | ||
| fy px | 333.90 ± 0.13 (10) | fixed 335.07 ± 0.20 (10) | 334.22 ± 0.44 (10) | +0.32 | ||
| cx px | 269.53 ± 0.12 (10) | fixed 269.42 ± 0.16 (10) | 269.25 ± 0.09 (10) | ◆ −0.28 | ||
| cy px | 318.46 ± 0.09 (10) | fixed 318.25 ± 0.05 (10) | 318.31 ± 0.06 (10) | ◆ −0.15 | ||
| dist k1 | −0.02296 ± 0.00091 (10) | fixed −0.02123 ± 0.00095 (10) | −0.02152 ± 0.00137 (10) | ◆ +0.00145 | ||
| dist k2 | 0.01788 ± 0.00332 (10) | fixed 0.00922 ± 0.00393 (10) | 0.01120 ± 0.00265 (10) | ◆ −0.00668 | ||
| dist k3 | −0.01837 ± 0.00435 (10) | fixed −0.00998 ± 0.00515 (10) | −0.01195 ± 0.00328 (10) | ◆ +0.00642 | ||
| dist k4 | 0.00396 ± 0.00181 (10) | fixed 0.00150 ± 0.00219 (10) | 0.00210 ± 0.00133 (10) | ◆ −0.00186 | ||
| baseline to Looper GS cam0 mm | 99.004 ± 0.211 (10) | fixed 99.188 ± 0.238 (10) | 98.980 ± 0.191 (10) | −0.023 | ||
| time offset td to base IMU‡ ms | 1.360 ± 0.092 (10) | −0.256 ± 0.135 (10) | 0.580 ± 0.156 (10) | ◆ +1.616 | ◆ +0.836 | ◆ −0.780 |
| distance to base IMU ‖p‖ mm | 63.96 ± 0.38 (10) | 63.33 ± 0.34 (10) | 63.21 ± 0.33 (10) | ◆ +0.63 | −0.12 | ◆ −0.74 |
| reproj median px | 0.161 ± 0.006 (10) | 0.209 ± 0.009 (10) | not reported | fit |
cam2 – Looper RS cam2 · 13 rows
Kalibr: not in its runs, which are global-shutter only.
Basalt: no rolling-shutter model.
| Parameter | MVISKalibr IMU model | Kalibr | Basalt |
|---|---|---|---|
| fx px | 775.21 ± 0.52 (10) | no run | no run |
| fy px | 775.31 ± 0.49 (10) | no run | no run |
| cx px | 960.12 ± 0.22 (10) | no run | no run |
| cy px | 535.71 ± 0.27 (10) | no run | no run |
| dist k1 | −0.03264 ± 0.00129 (10) | no run | no run |
| dist k2 | 0.00067 ± 0.00442 (10) | no run | no run |
| dist k3 | −0.00223 ± 0.00570 (10) | no run | no run |
| dist k4 | 0.00072 ± 0.00238 (10) | no run | no run |
| readout tr ms | 32.153 ± 0.232 (10) | no run | no run |
| baseline to Looper GS cam0 mm | 49.526 ± 0.116 (10) | no run | no run |
| time offset td to base IMU‡ ms | −5.672 ± 0.149 (10) | no run | no run |
| distance to base IMU ‖p‖ mm | 22.94 ± 0.43 (10) | no run | no run |
| reproj median px | 0.434 ± 0.016 (10) | no run | no run |
base IMU – Looper MEMS imu0 · 19 rows · ◆ 4
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| gyro Dw[0,0] scale x | 1.00082 ± 0.00088 (10) | 0.99846 ± 0.00131 (10) | 0.99882 ± 0.00144 (10) | ◆ +0.00236 | +0.00036 | ◆ −0.00200 |
| gyro Dw[1,1] scale y | 1.00000 ± 0.00096 (10) | 0.99998 ± 0.00068 (10) | 0.99995 ± 0.00131 (10) | +0.00002 | −0.00003 | −0.00005 |
| gyro Dw[2,2] scale z | 0.99572 ± 0.00033 (10) | 0.99575 ± 0.00034 (10) | 0.99571 ± 0.00045 (10) | −0.00003 | −0.00004 | −0.00002 |
| gyro Dw[1,0] cross | 0.00176 ± 0.00122 (10) | 0.00175 ± 0.00103 (10) | 0.00206 ± 0.00070 (10) | +0.00001 | +0.00031 | +0.00030 |
| gyro Dw[2,0] cross | −0.00078 ± 0.00046 (10) | 0.00127 ± 0.00034 (10) | 0.00008 ± 0.00048 (10) | ◆ −0.00205 | ◆ −0.00119 | ◆ +0.00086 |
| gyro Dw[2,1] cross | −0.00166 ± 0.00062 (10) | −0.00180 ± 0.00055 (10) | −0.00176 ± 0.00111 (10) | +0.00014 | +0.00004 | −0.00010 |
| accel Da[0,0] scale x | 0.99618 ± 0.00039 (10) | 0.99574 ± 0.00029 (10) | 0.99563 ± 0.00049 (10) | ◆ +0.00043 | −0.00011 | ◆ −0.00055 |
| accel Da[1,1] scale y | 0.99681 ± 0.00028 (10) | 0.99636 ± 0.00050 (10) | 0.99625 ± 0.00049 (10) | +0.00045 | −0.00011 | ◆ −0.00055 |
| accel Da[2,2] scale z | 1.00457 ± 0.00159 (10) | 1.00541 ± 0.00195 (10) | 1.00477 ± 0.00179 (10) | −0.00084 | −0.00064 | +0.00020 |
| Tg[0,0] g-sensitivity mrad·s/m | −0.077 ± 0.075 (10) | −0.234 ± 0.108 (10) | not in model | ≠ model | ||
| Tg[0,1] g-sensitivity mrad·s/m | 0.029 ± 0.038 (10) | −0.246 ± 0.118 (10) | not in model | ≠ model | ||
| Tg[0,2] g-sensitivity mrad·s/m | −0.073 ± 0.130 (10) | 0.063 ± 0.184 (10) | not in model | ≠ model | ||
| Tg[1,0] g-sensitivity mrad·s/m | −0.131 ± 0.099 (10) | 0.804 ± 0.164 (10) | not in model | ≠ model | ||
| Tg[1,1] g-sensitivity mrad·s/m | 0.006 ± 0.078 (10) | 0.021 ± 0.055 (10) | not in model | ≠ model | ||
| Tg[1,2] g-sensitivity mrad·s/m | 0.051 ± 0.162 (10) | −2.207 ± 0.370 (10) | not in model | ≠ model | ||
| Tg[2,0] g-sensitivity mrad·s/m | 0.138 ± 0.189 (10) | 0.000 ± 0.258 (10) | not in model | ≠ model | ||
| Tg[2,1] g-sensitivity mrad·s/m | −0.048 ± 0.041 (10) | 1.381 ± 0.082 (10) | not in model | ≠ model | ||
| Tg[2,2] g-sensitivity mrad·s/m | 0.001 ± 0.068 (10) | −0.018 ± 0.190 (10) | not in model | ≠ model | ||
| t_ga gyro−accel ms | −5.297 ± 0.107 (10) | not in model | not in model |
MVIS default IMU model (calyx) · 36 of 55 rows, model-independent only · ◆ 4
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – Looper GS cam0 | |||||
| fx px | 333.93 ± 0.15 (10) | 333.92 ± 0.15 (10) | fixed 335.00 ± 0.19 (10) | −0.01 | |
| fy px | 333.93 ± 0.16 (10) | 333.91 ± 0.16 (10) | fixed 334.97 ± 0.19 (10) | −0.01 | |
| cx px | 272.18 ± 0.14 (10) | 272.18 ± 0.13 (10) | fixed 271.93 ± 0.17 (10) | 0.00 | |
| cy px | 318.58 ± 0.07 (10) | 318.58 ± 0.06 (10) | fixed 318.48 ± 0.05 (10) | 0.00 | |
| dist k1 | −0.02193 ± 0.00122 (10) | −0.02197 ± 0.00122 (10) | fixed −0.02167 ± 0.00139 (10) | −0.00004 | |
| dist k2 | 0.01207 ± 0.00405 (10) | 0.01205 ± 0.00407 (10) | fixed 0.01157 ± 0.00481 (10) | −0.00002 | |
| dist k3 | −0.01359 ± 0.00479 (10) | −0.01349 ± 0.00482 (10) | fixed −0.01366 ± 0.00588 (10) | +0.00010 | |
| dist k4 | 0.00288 ± 0.00185 (10) | 0.00283 ± 0.00187 (10) | fixed 0.00324 ± 0.00244 (10) | −0.00005 | |
| time offset td to base IMU‡ ms | 1.326 ± 0.087 (10) | 1.316 ± 0.077 (10) | −0.272 ± 0.131 (10) | ◆ +1.587 | −0.011 |
| distance to base IMU ‖p‖ mm | 43.73 ± 0.37 (10) | 43.70 ± 0.37 (10) | 44.56 ± 0.51 (10) | ◆ −0.86 | −0.03 |
| reproj median px | 0.153 ± 0.006 (10) | 0.154 ± 0.006 (10) | 0.195 ± 0.008 (10) | fit | fit |
| cam1 – Looper GS cam1 | |||||
| fx px | 333.99 ± 0.12 (10) | 333.99 ± 0.12 (10) | fixed 335.09 ± 0.20 (10) | 0.00 | |
| fy px | 333.90 ± 0.13 (10) | 333.91 ± 0.13 (10) | fixed 335.07 ± 0.20 (10) | 0.00 | |
| cx px | 269.53 ± 0.12 (10) | 269.53 ± 0.12 (10) | fixed 269.42 ± 0.16 (10) | 0.00 | |
| cy px | 318.46 ± 0.09 (10) | 318.46 ± 0.08 (10) | fixed 318.25 ± 0.05 (10) | 0.00 | |
| dist k1 | −0.02296 ± 0.00091 (10) | −0.02297 ± 0.00089 (10) | fixed −0.02123 ± 0.00095 (10) | 0.00000 | |
| dist k2 | 0.01788 ± 0.00332 (10) | 0.01779 ± 0.00331 (10) | fixed 0.00922 ± 0.00393 (10) | −0.00009 | |
| dist k3 | −0.01837 ± 0.00435 (10) | −0.01823 ± 0.00433 (10) | fixed −0.00998 ± 0.00515 (10) | +0.00014 | |
| dist k4 | 0.00396 ± 0.00181 (10) | 0.00393 ± 0.00179 (10) | fixed 0.00150 ± 0.00219 (10) | −0.00003 | |
| baseline to Looper GS cam0 mm | 99.004 ± 0.211 (10) | 99.002 ± 0.212 (10) | fixed 99.188 ± 0.238 (10) | −0.002 | |
| time offset td to base IMU‡ ms | 1.360 ± 0.092 (10) | 1.350 ± 0.080 (10) | −0.256 ± 0.135 (10) | ◆ +1.606 | −0.010 |
| distance to base IMU ‖p‖ mm | 63.96 ± 0.38 (10) | 63.96 ± 0.38 (10) | 63.33 ± 0.34 (10) | ◆ +0.63 | 0.00 |
| reproj median px | 0.161 ± 0.006 (10) | 0.162 ± 0.006 (10) | 0.209 ± 0.009 (10) | fit | fit |
| cam2 – Looper RS cam2 | |||||
| fx px | 775.21 ± 0.52 (10) | 775.21 ± 0.51 (10) | no run | 0.00 | |
| fy px | 775.31 ± 0.49 (10) | 775.33 ± 0.47 (10) | no run | +0.02 | |
| cx px | 960.12 ± 0.22 (10) | 960.12 ± 0.22 (10) | no run | −0.01 | |
| cy px | 535.71 ± 0.27 (10) | 535.69 ± 0.27 (10) | no run | −0.02 | |
| dist k1 | −0.03264 ± 0.00129 (10) | −0.03266 ± 0.00131 (10) | no run | −0.00002 | |
| dist k2 | 0.00067 ± 0.00442 (10) | 0.00066 ± 0.00442 (10) | no run | −0.00001 | |
| dist k3 | −0.00223 ± 0.00570 (10) | −0.00217 ± 0.00569 (10) | no run | +0.00006 | |
| dist k4 | 0.00072 ± 0.00238 (10) | 0.00069 ± 0.00238 (10) | no run | −0.00003 | |
| readout tr ms | 32.153 ± 0.232 (10) | 32.142 ± 0.224 (10) | no run | −0.012 | |
| baseline to Looper GS cam0 mm | 49.526 ± 0.116 (10) | 49.527 ± 0.117 (10) | no run | 0.000 | |
| time offset td to base IMU‡ ms | −5.672 ± 0.149 (10) | −5.686 ± 0.141 (10) | no run | −0.014 | |
| distance to base IMU ‖p‖ mm | 22.94 ± 0.43 (10) | 22.90 ± 0.38 (10) | no run | −0.04 | |
| reproj median px | 0.434 ± 0.016 (10) | 0.434 ± 0.016 (10) | no run | fit | |
Monado SLAM Datasets (MGC)
No ground truth: ◆ marks disagreement, not who is right.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
Key and MVIS column
Swipe a table sideways for the other tools and differences.
median ± sd (recordings) · (3/15) partial · fixed Kalibr input · shown / other model, no Δ · ≠ model, fit: no Δ · ◆ |Δ| above the larger sd · ≠n different recording counts · ‡ see How to read this
On camera + IMU families the MVIS column uses Kalibr's IMU model, not the MVIS default. The default fills fewer rows and is in a closed fold under each family.
T5 · cam0 + cam1 stereo
MVIS 4 of 4 · Kalibr 4 of 4 · Basalt 4 of 4
Camera · stereo01 rounds 1–4 · Kalibr pinhole-equi, cam0 + cam1 jointly
Run config · MVIS · run_calibration.py
Command for stereo01_r1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam --only monado_mgc/<collection> runs it through the manifest.yaml row (calyx model, no variant).
python scripts/run_calibration.py \
--config examples/regression/monado_mgc/cam_stereo01.yaml \
--output results/regression/monado_mgc/stereo01_r1 \
--dataset-name monado_mgc \
--collection-name stereo01_r1 \
--no-rs \
--no-td \
--rerun-outliers \
--corner-subsample two_antiexamples/regression/monado_mgc/cam_stereo01.yaml
# T5 (fast suite): Monado MGC cam0+cam1 STEREO pair (Reverb G2, GS
input:
cameras:
- camera_id: 0
name: cam0
source_type: euroc
source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC01_camcalib01_1/mav0/cam0
distortion_model: equidistant
shutter_type: global
factor_hz: 5.0
- camera_id: 1
name: cam1
source_type: euroc
source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC01_camcalib01_1/mav0/cam1
distortion_model: equidistant
shutter_type: global
factor_hz: 5.0
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.03
tag_spacing: 0.3
tag_family: t36h11
solve:
max_iterations: 15
max_init_frames: 100
pixel_sigma: 1.0
huber_threshold: 1.345
output:
path: results/regression/monado_mgc/stereo01_r1/calibration.yaml
format: yaml
reference_camera: 0Runs (4: config · input; any other key that differs from stereo01_r1 is listed, otherwise only the bag / prior / output paths change):
- stereo01_r1 · cam_stereo01.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC01_camcalib01_1/mav0/cam0
- stereo01_r2 · cam_stereo01_r2.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC08_camcalib01_2/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC08_camcalib01_2/mav0/cam0; input.cameras[1].source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC08_camcalib01_2/mav0/cam1
- stereo01_r3 · cam_stereo01_r3.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC15_camcalib01_3/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC15_camcalib01_3/mav0/cam0; input.cameras[1].source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC15_camcalib01_3/mav0/cam1
- stereo01_r4 · cam_stereo01_r4.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC22_camcalib01_4/mav0/cam0 · input.cameras[0].source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC22_camcalib01_4/mav0/cam0; input.cameras[1].source_path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC22_camcalib01_4/mav0/cam1
Run config · Kalibr · kalibr_calibrate_cameras
Command for stereo01_r1, rebuilt from run_camonly_sweep.py (Kalibr logs no command line); in docker kalibr:noetic, bag folder at /data, examples/regression/kalibr/targets at /targets. Focal init: KALIBR_MANUAL_FOCAL_LENGTH_INIT=1, each camera's seed piped on stdin 8× (fx of the MVIS T5 stereo row of the same round).
KALIBR_MANUAL_FOCAL_LENGTH_INIT=1 kalibr_calibrate_cameras \
--models pinhole-equi pinhole-equi \
--target /targets/april_6x6_30mm.yaml \
--bag /data/mgc_stereo01_r1.bag \
--topics /cam0/image_raw /cam1/image_raw \
--bag-freq 4.0 \
--approx-sync 0.05 \
--dont-show-reportBag: camcalib01 EuRoC folders (cam0 + cam1) repacked with kalibr_bagcreater. Multi-camera runs: --approx-sync 0.05 (config.yaml gs.approx_sync_s).
targets/april_6x6_30mm.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.03 tagSpacing: 0.3
Runs (4; only the bag differs):
- stereo01_r1 · ok
- stereo01_r2 · ok
- stereo01_r3 · ok
- stereo01_r4 · ok
Run config · Basalt · basalt_calibrate
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T5 · command for stereo01_r1:
basalt_calibrate \
--dataset-path <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC01_camcalib01_1 \
--dataset-type euroc \
--aprilgrid <TARGETS>/april_6x6_30mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-types kb4 kb44 runs; options that differ from this one (paths aside):
- stereo01_r1 · ok
- stereo01_r2 · ok
- stereo01_r3 · ok
- stereo01_r4 · ok
T5 radtan8 · command for stereo01_r1: Intrinsics seeded from Basalt row monado_mgc/stereo01_r1 (--seed-intrinsics).
basalt_calibrate \
--dataset-path <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC01_camcalib01_1 \
--dataset-type euroc \
--aprilgrid <TARGETS>/april_6x6_30mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 1 \
--cam-types pinhole-radtan8 pinhole-radtan8 \
--seed-intrinsics <OUTPUT>/4 runs; options that differ from this one (paths aside):
- stereo01_r1 · ok
- stereo01_r2 · ok
- stereo01_r3 · ok
- stereo01_r4 · ok
examples/regression/basalt/targets/april_6x6_30mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.03,
"tagSpacing": 0.3
}cam0 – Reverb G2 cam0 · 8 rows · ◆ 1
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 270.01 ± 0.05 (4) | 269.92 ± 0.80 (4) | 269.87 ± 0.17 (4) | +0.09 | −0.05 | −0.15 |
| fy px | 270.15 ± 0.08 (4) | 270.02 ± 0.76 (4) | 269.92 ± 0.15 (4) | +0.13 | −0.10 | ◆ −0.23 |
| cx px | 322.44 ± 0.22 (4) | 322.46 ± 0.33 (4) | 322.41 ± 0.33 (4) | −0.03 | −0.05 | −0.02 |
| cy px | 229.09 ± 0.19 (4) | 229.12 ± 0.19 (4) | 229.10 ± 0.22 (4) | −0.03 | −0.02 | +0.01 |
| dist k1 | 0.08259 ± 0.00215 (4) | 0.07701 ± 0.03126 (4) | 0.08125 ± 0.00202 (4) | +0.00558 | +0.00424 | −0.00133 |
| dist k2 | −0.04528 ± 0.00772 (4) | −0.02100 ± 0.11101 (4) | −0.03825 ± 0.00381 (4) | −0.02428 | −0.01726 | +0.00702 |
| dist k3 | 0.23454 ± 0.01129 (4) | 0.20501 ± 0.14995 (4) | 0.22596 ± 0.00445 (4) | +0.02952 | +0.02095 | −0.00857 |
| dist k4 | −0.13254 ± 0.00538 (4) | −0.12148 ± 0.06777 (4) | −0.12902 ± 0.00210 (4) | −0.01106 | −0.00753 | +0.00353 |
cam1 – Reverb G2 cam1 · 9 rows · ◆ 4
| Parameter | MVIS | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 268.76 ± 0.18 (4) | 268.72 ± 0.10 (4) | 268.65 ± 0.17 (4) | +0.04 | −0.07 | −0.11 |
| fy px | 268.79 ± 0.15 (4) | 268.74 ± 0.11 (4) | 268.66 ± 0.16 (4) | +0.05 | −0.08 | −0.13 |
| cx px | 323.71 ± 0.23 (4) | 323.55 ± 0.34 (4) | 323.50 ± 0.31 (4) | +0.16 | −0.05 | −0.21 |
| cy px | 236.66 ± 0.16 (4) | 237.05 ± 0.29 (4) | 237.04 ± 0.27 (4) | ◆ −0.39 | −0.01 | ◆ +0.38 |
| dist k1 | 0.08219 ± 0.00310 (4) | 0.07818 ± 0.00473 (4) | 0.07953 ± 0.00125 (4) | +0.00401 | +0.00135 | −0.00266 |
| dist k2 | −0.05120 ± 0.01356 (4) | −0.03220 ± 0.01665 (4) | −0.04379 ± 0.00323 (4) | ◆ −0.01900 | −0.01159 | +0.00741 |
| dist k3 | 0.24337 ± 0.02005 (4) | 0.21896 ± 0.02197 (4) | 0.23718 ± 0.00457 (4) | ◆ +0.02441 | +0.01822 | −0.00619 |
| dist k4 | −0.13566 ± 0.00944 (4) | −0.12585 ± 0.00978 (4) | −0.13368 ± 0.00224 (4) | ◆ −0.00982 | −0.00783 | +0.00198 |
| baseline to Reverb G2 cam0 mm | 108.434 ± 0.051 (4) | 108.424 ± 0.043 (4) | 108.416 ± 0.040 (4) | +0.010 | −0.008 | −0.018 |
T12 · cam0 + cam1 + IMU
MVIS 4 of 4 · Kalibr 4 of 4 · Basalt 4 of 4
Camera + IMU · imucalib01 rounds 1–4 · Kalibr scale-misalignment vs MVIS (kalibr model)
Read first: Kalibr's intrinsics and baselines are inputs from an MVIS export; its td and lever are solved given them.
Notes
Note: the camera + IMU twin of T5 (same pair, same 4 sessions). Both tools start from the camera calibration of the same round: MVIS from T5 camera-only (refined in cam-IMU), Kalibr from the MVIS T12 export (fixed).
Basalt: the kb4 rows, seeded from Basalt's T5 round.
Run config · MVIS · mvis cam-imu
Command for imucalib01_r1 from the MVIS repo root (batch 2026-11-10a); scripts/run_regression.py --mode cam-imu --only monado_mgc/<collection> runs it through the cam_imu_manifest.yaml row (variant kalibr).
python -m mvis.cli.main cam-imu -c examples/regression/monado_mgc/cam_imu_imucalib01_kalibr.yaml
examples/regression/monado_mgc/cam_imu_imucalib01_kalibr.yaml
# T12 (fast suite, since 2026-10-18): Monado MGC (HP Reverb G2) cam0+cam1 + imu0,
input:
format: euroc
path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC04_imucalib01_1/mav0
cam_topics:
- cam0
- cam1
imu_topics: ["imu0"]
window_mode: motion
segment_length: 80.0
cache_dir: <CACHE>
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.03
tag_spacing: 0.3
tag_family: t36h11
heights_file: null # D2: flat board start (no measured shape for this board)
camera_input:
path: examples/regression/monado_mgc/mgc_imucalib01_prior_r1.yaml
cameras: # base cam0 (global) tracks state_hz; cam1 aux at 8 Hz
- {estimate_readout: false}
- {estimate_readout: false, factor_hz: 8.0}
solve:
max_iterations: 40
pnp_method: ippe # planar-safe board PnP (the 2026-08-15 MOC fix)
corner_subsample: all # D2: every tag corner, the cam-IMU default; TUM-VI, Looper and MGC keep their data settings (2026-11-02)
estimate_t_ga: true
sigma_t_ga: 0.010
vision_pose: imu
estimate:
camera:
intrinsics: true # refine camera intrinsics jointly with the IMU
tr: false # global shutter
td: true
extrinsics: true
imu:
intrinsics: full
model: kalibr
output:
path: results/regression/monado_mgc/imucalib01_r1_kalibr/cam_imu.jsonCamera prior examples/regression/monado_mgc/mgc_imucalib01_prior_r1.yaml (intrinsics + extrinsics the solve starts from)
# T12 round 1 camera prior = the blessed T5 camera-only result of the same round
cameras:
- id: 0
model: pinhole_equidistant
intrinsics:
fx: 269.9154988353057
fy: 270.1639315764602
cx: 322.2774167654674
cy: 229.2334373077041
distortion:
model: equidistant
coeffs:
- 0.08039005581263511
- -0.038352918144278554
- 0.2268129489080706
- -0.1287337109935817
image_size:
- 640
- 480
rolling_shutter_readout: 0.0
- id: 1
model: pinhole_equidistant
intrinsics:
fx: 268.41693051361847
fy: 268.4742234545675
cx: 323.4354914652441
cy: 236.95340427564318
distortion:
model: equidistant
coeffs:
- 0.08985440303521922
- -0.07575530008376431
- 0.27511610577019574
- -0.14907191929517877
image_size:
- 640
- 480
rolling_shutter_readout: 0.0
extrinsics:
reference_camera: 0
transforms:
- from: 1
to: 0
T_to_from:
- - 0.9949378541611863
- -0.09976027956774004
- 0.012105906727724852
- 0.005062539896953468
- - 0.0982184599848183
- 0.9398649254545056
- -0.32711932993726506
- -0.1068241549231462
- - 0.021255598682341375
- 0.3266524276979448
- 0.9449054931598693
- -0.0178830990625229
- - 0.0
- 0.0
- 0.0
- 1.0
so3:
- 0.3336013349205784
- -0.0046688303900017875
- 0.10102298092460457
translation:
- 0.005062539896953468
- -0.1068241549231462
- -0.0178830990625229
time_offsets:
reference_camera: 0
offsets: []Runs (4: config · input; any other key that differs from imucalib01_r1 is listed, otherwise only the bag / prior / output paths change):
- imucalib01_r1 · cam_imu_imucalib01_kalibr.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC04_imucalib01_1/mav0
- imucalib01_r2 · cam_imu_imucalib01_r2_kalibr.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC11_imucalib01_2/mav0 · input.path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC11_imucalib01_2/mav0
- imucalib01_r3 · cam_imu_imucalib01_r3_kalibr.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC18_imucalib01_3/mav0 · input.path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC18_imucalib01_3/mav0
- imucalib01_r4 · cam_imu_imucalib01_r4_kalibr.yaml · <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC25_imucalib01_4/mav0 · input.path: <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC25_imucalib01_4/mav0
Run config · Kalibr · kalibr_calibrate_imu_camera
Command for imucalib01_r1 (run_imu.py), in docker kalibr:noetic with the work folder at /work.
kalibr_calibrate_imu_camera \
--bag /work/input.bag \
--cams /work/camchain.yaml \
--imu /work/imu0.yaml \
--imu-models scale-misalignment \
--target /work/target.yaml \
--timeoffset-padding 0.1 \
--dont-show-report \
--bag-freq 10.0Bag: EuRoC folder (cameras cam0, cam1 + imu0) repacked to a rosbag with kalibr_bagcreater. Cameras /cam0/image_raw, /cam1/image_raw · IMUs /imu0 (1000 Hz) (imu0 = Kalibr's reference IMU).
camchain.yaml: the MVIS kalibr-variant export of the same recording (cam_imu_camchain-imucam.yaml): intrinsics held fixed, T_cam_imu as the initial value, topics set to the bag's. IMU noise = the MVIS regression defaults (core/config.py), so both tools weight the IMU alike.
imu0.yaml
rostopic: /imu0 update_rate: 1000.0 accelerometer_noise_density: 0.02 accelerometer_random_walk: 0.002 gyroscope_noise_density: 0.01 gyroscope_random_walk: 0.001
target.yaml
target_type: 'aprilgrid' tagCols: 6 tagRows: 6 tagSize: 0.03 tagSpacing: 0.3
camchain.yaml (imucalib01_r1)
cam0:
T_cam_imu:
- - 0.04238044829850808
- 0.9648666532849991
- -0.2592995159668086
- -0.008956820416771915
- - -0.9854329626987864
- -0.002414905071426555
- -0.1700471824529534
- -0.05034683082950913
- - -0.1646990395500519
- 0.2627289660697881
- 0.9507090599963743
- -0.019539701178549748
- - 0.0
- 0.0
- 0.0
- 1.0
camera_model: pinhole
distortion_coeffs:
- 0.08235969213927674
- -0.039898021344994435
- 0.2245259326356189
- -0.12704293011012008
distortion_model: equidistant
intrinsics:
- 269.9973082443671
- 270.2821993737013
- 322.56117436529576
- 229.1367160047742
resolution:
- 640
- 480
rostopic: /cam0/image_raw
cam1:
T_cam_imu:
- - -0.0581272090783328
- 0.9651369828142387
- -0.255209388481286
- -0.008441102789534957
- - -0.9843976698537747
- -0.012883859112257636
- 0.17548570813839443
- 0.053998598788120446
- - 0.16607966507439145
- 0.2614280217930049
- 0.9508274997443931
- -0.020224307260017355
- - 0.0
- 0.0
- 0.0
- 1.0
T_cn_cnm1:
- - 0.9949407042938595
- 0.09834739110783658
- 0.02051305929213238
- 0.005822700935617567
- - -0.09965377975482906
- 0.9402481753448022
- 0.32558024040372435
- 0.10680627420797249
- - 0.012732600669800975
- -0.3259772375842418
- 0.9452918710414956
- -0.018051463790641046
- - 0.0
- 0.0
- 0.0
- 1.0
camera_model: pinhole
distortion_coeffs:
- 0.0784961583744538
- -0.03445067903517099
- 0.21839736481193675
- -0.12383648506758116
distortion_model: equidistant
intrinsics:
- 268.9560327564323
- 268.8956731820946
- 323.8912847422612
- 236.98479005363296
resolution:
- 640
- 480
rostopic: /cam1/image_rawRuns (4; only the bag and its camchain seed differ):
- imucalib01_r1 · ok
- imucalib01_r2 · ok
- imucalib01_r3 · ok
- imucalib01_r4 · ok
Run config · Basalt · basalt_calibrate_imu
Recorded command of each row (basalt_status.json), from scripts/basalt_regression/run_basalt.py with examples/regression/basalt/config.yaml; our headless build of Basalt. Original bags / EuRoC folders, no copies.
T12 · command for imucalib01_r1: Camera seed: Basalt camera row monado_mgc/stereo01_r1 of the same recording.
basalt_calibrate_imu \
--dataset-path <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC04_imucalib01_1 \
--dataset-type euroc \
--aprilgrid <TARGETS>/april_6x6_30mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 2 \
--init-knots poses \
--init-gyro-gap 0.1 \
--init-min-inliers 15 \
--imu-margin 1.0 \
--gyro-noise-std 0.01 \
--accel-noise-std 0.02 \
--gyro-bias-std 0.001 \
--accel-bias-std 0.002 \
--spline-dt-ms 10 \
--g-norm 9.81 \
--no-mocap \
--opt-intrinsics4 runs; options that differ from this one (paths aside):
- imucalib01_r1 · ok
- imucalib01_r2 · ok
- imucalib01_r3 · ok
- imucalib01_r4 · ok
T12 radtan8 · command for imucalib01_r1: Camera seed: Basalt camera row monado_mgc/stereo01_r1__radtan8 of the same recording.
basalt_calibrate_imu \
--dataset-path <DATASETS>/monado_msd/M_monado_datasets/MG_reverb_g2/MGC_calibration/MGC04_imucalib01_1 \
--dataset-type euroc \
--aprilgrid <TARGETS>/april_6x6_30mm.json \
--result-path <OUTPUT>/ \
--no-gui \
--max-iter 200 \
--stall-iter 5 \
--ftol 1e-06 \
--skip-images 2 \
--init-knots poses \
--init-gyro-gap 0.1 \
--init-min-inliers 15 \
--imu-margin 1.0 \
--gyro-noise-std 0.01 \
--accel-noise-std 0.02 \
--gyro-bias-std 0.001 \
--accel-bias-std 0.002 \
--spline-dt-ms 10 \
--g-norm 9.81 \
--no-mocap \
--opt-intrinsics4 runs; options that differ from this one (paths aside):
- imucalib01_r1 · ok
- imucalib01_r2 · ok
- imucalib01_r3 · ok
- imucalib01_r4 · ok
examples/regression/basalt/targets/april_6x6_30mm.json
{
"tagCols": 6,
"tagRows": 6,
"tagSize": 0.03,
"tagSpacing": 0.3
}cam0 – Reverb G2 cam0 · 11 rows · ◆ 8
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 269.83 ± 0.14 (4) | fixed 269.88 ± 0.12 (4) | 269.71 ± 0.14 (4) | −0.13 | ||
| fy px | 270.09 ± 0.14 (4) | fixed 270.08 ± 0.15 (4) | 269.89 ± 0.15 (4) | ◆ −0.20 | ||
| cx px | 322.56 ± 0.05 (4) | fixed 322.62 ± 0.06 (4) | 322.44 ± 0.12 (4) | −0.11 | ||
| cy px | 229.25 ± 0.06 (4) | fixed 229.22 ± 0.06 (4) | 229.16 ± 0.07 (4) | ◆ −0.09 | ||
| dist k1 | 0.08375 ± 0.00147 (4) | fixed 0.08285 ± 0.00123 (4) | 0.08021 ± 0.00183 (4) | ◆ −0.00354 | ||
| dist k2 | −0.04776 ± 0.00277 (4) | fixed −0.04607 ± 0.00447 (4) | −0.03643 ± 0.00581 (4) | ◆ +0.01133 | ||
| dist k3 | 0.23500 ± 0.00295 (4) | fixed 0.23258 ± 0.00600 (4) | 0.22293 ± 0.00819 (4) | ◆ −0.01206 | ||
| dist k4 | −0.13155 ± 0.00126 (4) | fixed −0.13055 ± 0.00271 (4) | −0.12743 ± 0.00364 (4) | ◆ +0.00412 | ||
| time offset td to base IMU‡ ms | −1.261 ± 0.115 (4) | −0.203 ± 0.246 (4) | −0.436 ± 0.074 (4) | ◆ −1.058 | −0.232 | ◆ +0.825 |
| distance to base IMU ‖p‖ mm | 53.89 ± 0.04 (4) | 53.73 ± 0.11 (4) | 53.67 ± 0.17 (4) | ◆ +0.16 | −0.06 | ◆ −0.22 |
| reproj median px | 0.117 ± 0.004 (4) | 0.142 ± 0.064 (4) | not reported | fit |
cam1 – Reverb G2 cam1 · 12 rows · ◆ 3
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| fx px | 268.63 ± 0.16 (4) | fixed 268.71 ± 0.21 (4) | 268.50 ± 0.14 (4) | −0.13 | ||
| fy px | 268.62 ± 0.14 (4) | fixed 268.71 ± 0.18 (4) | 268.49 ± 0.13 (4) | −0.13 | ||
| cx px | 323.62 ± 0.10 (4) | fixed 323.67 ± 0.12 (4) | 323.55 ± 0.14 (4) | −0.07 | ||
| cy px | 236.95 ± 0.09 (4) | fixed 236.98 ± 0.10 (4) | 237.10 ± 0.11 (4) | ◆ +0.16 | ||
| dist k1 | 0.07970 ± 0.00203 (4) | fixed 0.07948 ± 0.00166 (4) | 0.07921 ± 0.00150 (4) | −0.00049 | ||
| dist k2 | −0.04154 ± 0.00748 (4) | fixed −0.04137 ± 0.00538 (4) | −0.03966 ± 0.00467 (4) | +0.00188 | ||
| dist k3 | 0.22782 ± 0.00999 (4) | fixed 0.22814 ± 0.00677 (4) | 0.22831 ± 0.00597 (4) | +0.00049 | ||
| dist k4 | −0.12833 ± 0.00445 (4) | fixed −0.12854 ± 0.00305 (4) | −0.12953 ± 0.00246 (4) | −0.00120 | ||
| baseline to Reverb G2 cam0 mm | 108.501 ± 0.037 (4) | fixed 108.507 ± 0.054 (4) | 108.408 ± 0.012 (4) | ◆ −0.093 | ||
| time offset td to base IMU‡ ms | −1.265 ± 0.115 (4) | −0.213 ± 0.238 (4) | −0.436 ± 0.074 (4) | ◆ −1.052 | −0.223 | ◆ +0.829 |
| distance to base IMU ‖p‖ mm | 58.46 ± 0.04 (4) | 58.31 ± 0.97 (4) | 58.31 ± 0.25 (4) | +0.15 | −0.01 | −0.16 |
| reproj median px | 0.121 ± 0.010 (4) | 0.140 ± 0.066 (4) | not reported | fit |
base IMU – Reverb G2 IMU · 19 rows · ◆ 5
| Parameter | MVISKalibr IMU model | Kalibr | Basalt | MVIS− Kalibr | Basalt− Kalibr | Basalt− MVIS |
|---|---|---|---|---|---|---|
| gyro Dw[0,0] scale x | 1.00125 ± 0.00071 (4) | 1.00286 ± 0.05848 (4) | 1.00135 ± 0.00060 (4) | −0.00161 | −0.00151 | +0.00010 |
| gyro Dw[1,1] scale y | 1.00005 ± 0.00103 (4) | 1.00248 ± 0.06067 (4) | 1.00129 ± 0.00050 (4) | −0.00243 | −0.00119 | ◆ +0.00124 |
| gyro Dw[2,2] scale z | 1.00030 ± 0.00017 (4) | 1.00037 ± 0.01617 (4) | 0.99974 ± 0.00023 (4) | −0.00007 | −0.00063 | ◆ −0.00056 |
| gyro Dw[1,0] cross | −0.00007 ± 0.00037 (4) | 0.00012 ± 0.03447 (4) | 0.00005 ± 0.00038 (4) | −0.00019 | −0.00007 | +0.00012 |
| gyro Dw[2,0] cross | 0.00003 ± 0.00011 (4) | 0.00046 ± 0.02642 (4) | 0.00025 ± 0.00042 (4) | −0.00043 | −0.00021 | +0.00021 |
| gyro Dw[2,1] cross | −0.00039 ± 0.00066 (4) | −0.00066 ± 0.04892 (4) | 0.00080 ± 0.00046 (4) | +0.00027 | +0.00146 | ◆ +0.00120 |
| accel Da[0,0] scale x | 1.00779 ± 0.00010 (4) | 1.00721 ± 0.01747 (4) | 1.00679 ± 0.00081 (4) | +0.00058 | −0.00042 | ◆ −0.00100 |
| accel Da[1,1] scale y | 1.01190 ± 0.00039 (4) | 1.01291 ± 0.01257 (4) | 1.01173 ± 0.00393 (4) | −0.00101 | −0.00118 | −0.00017 |
| accel Da[2,2] scale z | 1.00899 ± 0.00089 (4) | 1.00999 ± 0.04037 (4) | 1.00655 ± 0.00020 (4) | −0.00100 | −0.00344 | ◆ −0.00244 |
| Tg[0,0] g-sensitivity mrad·s/m | −0.034 ± 0.083 (4) | −0.020 ± 5.076 (4) | not in model | ≠ model | ||
| Tg[0,1] g-sensitivity mrad·s/m | 0.062 ± 0.071 (4) | 0.510 ± 1.130 (4) | not in model | ≠ model | ||
| Tg[0,2] g-sensitivity mrad·s/m | −0.054 ± 0.065 (4) | −2.304 ± 11.510 (4) | not in model | ≠ model | ||
| Tg[1,0] g-sensitivity mrad·s/m | −0.007 ± 0.065 (4) | −0.576 ± 0.875 (4) | not in model | ≠ model | ||
| Tg[1,1] g-sensitivity mrad·s/m | −0.010 ± 0.065 (4) | −0.284 ± 4.087 (4) | not in model | ≠ model | ||
| Tg[1,2] g-sensitivity mrad·s/m | 0.001 ± 0.116 (4) | −0.452 ± 17.028 (4) | not in model | ≠ model | ||
| Tg[2,0] g-sensitivity mrad·s/m | −0.031 ± 0.044 (4) | 1.674 ± 3.397 (4) | not in model | ≠ model | ||
| Tg[2,1] g-sensitivity mrad·s/m | −0.043 ± 0.066 (4) | −0.415 ± 0.838 (4) | not in model | ≠ model | ||
| Tg[2,2] g-sensitivity mrad·s/m | 0.007 ± 0.078 (4) | 0.074 ± 4.868 (4) | not in model | ≠ model | ||
| t_ga gyro−accel ms | 2.518 ± 0.018 (4) | not in model | not in model |
MVIS default IMU model (calyx) · 23 of 42 rows, model-independent only · ◆ 3
| Parameter | MVISKalibr IMU model | MVIS default | Kalibr | default− Kalibr | default− Kalibr IMU model |
|---|---|---|---|---|---|
| cam0 – Reverb G2 cam0 | |||||
| fx px | 269.83 ± 0.14 (4) | 269.83 ± 0.14 (4) | fixed 269.88 ± 0.12 (4) | 0.00 | |
| fy px | 270.09 ± 0.14 (4) | 270.09 ± 0.14 (4) | fixed 270.08 ± 0.15 (4) | 0.00 | |
| cx px | 322.56 ± 0.05 (4) | 322.56 ± 0.05 (4) | fixed 322.62 ± 0.06 (4) | 0.00 | |
| cy px | 229.25 ± 0.06 (4) | 229.25 ± 0.06 (4) | fixed 229.22 ± 0.06 (4) | 0.00 | |
| dist k1 | 0.08375 ± 0.00147 (4) | 0.08375 ± 0.00147 (4) | fixed 0.08285 ± 0.00123 (4) | 0.00000 | |
| dist k2 | −0.04776 ± 0.00277 (4) | −0.04776 ± 0.00277 (4) | fixed −0.04607 ± 0.00447 (4) | 0.00000 | |
| dist k3 | 0.23500 ± 0.00295 (4) | 0.23499 ± 0.00296 (4) | fixed 0.23258 ± 0.00600 (4) | 0.00000 | |
| dist k4 | −0.13155 ± 0.00126 (4) | −0.13155 ± 0.00126 (4) | fixed −0.13055 ± 0.00271 (4) | 0.00000 | |
| time offset td to base IMU‡ ms | −1.261 ± 0.115 (4) | −1.261 ± 0.118 (4) | −0.203 ± 0.246 (4) | ◆ −1.058 | 0.000 |
| distance to base IMU ‖p‖ mm | 53.89 ± 0.04 (4) | 53.89 ± 0.04 (4) | 53.73 ± 0.11 (4) | ◆ +0.16 | 0.00 |
| reproj median px | 0.117 ± 0.004 (4) | 0.117 ± 0.004 (4) | 0.142 ± 0.064 (4) | fit | fit |
| cam1 – Reverb G2 cam1 | |||||
| fx px | 268.63 ± 0.16 (4) | 268.63 ± 0.16 (4) | fixed 268.71 ± 0.21 (4) | 0.00 | |
| fy px | 268.62 ± 0.14 (4) | 268.62 ± 0.14 (4) | fixed 268.71 ± 0.18 (4) | 0.00 | |
| cx px | 323.62 ± 0.10 (4) | 323.62 ± 0.10 (4) | fixed 323.67 ± 0.12 (4) | 0.00 | |
| cy px | 236.95 ± 0.09 (4) | 236.95 ± 0.09 (4) | fixed 236.98 ± 0.10 (4) | 0.00 | |
| dist k1 | 0.07970 ± 0.00203 (4) | 0.07970 ± 0.00203 (4) | fixed 0.07948 ± 0.00166 (4) | 0.00000 | |
| dist k2 | −0.04154 ± 0.00748 (4) | −0.04154 ± 0.00748 (4) | fixed −0.04137 ± 0.00538 (4) | 0.00000 | |
| dist k3 | 0.22782 ± 0.00999 (4) | 0.22782 ± 0.00999 (4) | fixed 0.22814 ± 0.00677 (4) | 0.00000 | |
| dist k4 | −0.12833 ± 0.00445 (4) | −0.12833 ± 0.00445 (4) | fixed −0.12854 ± 0.00305 (4) | 0.00000 | |
| baseline to Reverb G2 cam0 mm | 108.501 ± 0.037 (4) | 108.501 ± 0.037 (4) | fixed 108.507 ± 0.054 (4) | 0.000 | |
| time offset td to base IMU‡ ms | −1.265 ± 0.115 (4) | −1.265 ± 0.118 (4) | −0.213 ± 0.238 (4) | ◆ −1.053 | 0.000 |
| distance to base IMU ‖p‖ mm | 58.46 ± 0.04 (4) | 58.46 ± 0.04 (4) | 58.31 ± 0.97 (4) | +0.15 | 0.00 |
| reproj median px | 0.121 ± 0.010 (4) | 0.121 ± 0.009 (4) | 0.140 ± 0.066 (4) | fit | fit |
About
What this is. The calibration results of MVIS, Kalibr and Basalt, per dataset. There is no ground truth for these recordings, so differences show disagreement between tools, not who is right, and spread shows repeatability across recordings, not accuracy. A tool can repeat well and still be biased. The page gives no overall result.
Who ran it. The MVIS authors run this board and made every run, including Kalibr and Basalt. We know our own tool most closely, and the other tools' settings may not be optimal. If a Kalibr or Basalt setting looks wrong, tell us. The VI-Rig datasets, listed first, are our own recordings.
Families. Each family (T1–T12, plus T6c) is one test: a fixed set of recordings of one rig, calibrated by every tool that can. T6c is the camera-only calibration of T6's recordings. Experiment families T7g and T8g aren't included.
When each tool ran. Every MVIS row was re-run on 2026-11-10 on one MVIS version, with the IMU-propagated vision factor. Kalibr on T6 and T11 was re-run on 2026-11-08 from its own camera calibration, and on T7 on 2026-11-02 on the corrected bags. Basalt was re-run on T3 on 2026-11-07 and on T11 on 2026-11-08. On T6 and T11 every tool uses the same IMU noise, measured at rest (white-noise density × 2.5, bias walks at the defaults); elsewhere the MVIS regression defaults. Other Kalibr and Basalt runs are older, from 2026-10-22 or earlier, except T1 bag 09, run 2026-11-04. Kalibr on T2 wasn't re-run after the corrections; we expect it to be unchanged, but that wasn't tested. Kalibr's T8 values come from separate earlier runs of bags 1–3 with t265 fisheye 1 only.
Different data settings. On T6, T7 and T8 the MVIS rows use two corners per tag and non-base cameras at 4 Hz or lower; T6c's MVIS rows use two corners per tag. Kalibr has no such settings. Basalt has no run on T6, T7 or T8. On all VI-Rig families (T1, T2, T6, T6c, T7, T8) MVIS also estimates the board shape, which moves focal lengths by a few tenths of a percent and makes them less repeatable across recordings; Kalibr assumes a flat board. On T3 every tool ran on bags filtered to view angles of 85° or less.
Unequal recordings. Kalibr has 3 of 15 recordings on T8, 14 of 15 on T7 and 13 of 15 on T2 ELP-R. Differences on those rows compare different recording sets, and a marker can change when both tools use the same recordings.
Tools.
- Kalibr: its camera + IMU runs take their camera calibration as input, from an MVIS export on T7–T10 and T12 and from its own camera-only calibration of the same recording on T6 and T11, and keep intrinsics and baselines at that input, marked
fixed. Its td, lever and IMU rows are solved given that input, so where it comes from MVIS they aren't independent of MVIS. On T7, ELP-L's stamps were also shifted by the MVIS td of the same bag before each Kalibr run, and its readout is held at 0. Its camera-only runs (T1–T5, T6c) solve their own intrinsics; the focal length they start from comes from an MVIS result. - MVIS (Kalibr IMU model): MVIS with Kalibr's IMU model. It's the main column on camera + IMU families because it has every row and shares Kalibr's IMU model. It isn't the MVIS default. Its medians use every recording MVIS solved.
- MVIS default IMU model (calyx): fills only rows that don't depend on the IMU model, 23–41 per family, on the recordings Kalibr solved where those exist. It's in a closed fold under each camera + IMU family, and it's identical to the main column on T1–T5 and T6c. On T6c MVIS runs camera-only, the Blackfly alone and the t265 pair.
- Basalt: our headless build, with intrinsics free. It has no rolling-shutter model and uses one IMU per run, so it can't run T6, T7 or T8, and T2 is shown only as a global-shutter fit.
When there is no difference. Kalibr inputs, shown-only values, missing values, reprojection error, Tg (Kalibr's model absorbs the gyro–accel offset), t_ga (only MVIS estimates it), T2 intrinsics and distortion (lens models differ), and T7 ELP-L td and lever (Kalibr treats it as global shutter). The values are still listed.
Time offsets. td has the same sign in all three tools. MVIS splits the IMU into gyro (td) and accel (td + t_ga), and Kalibr and Basalt have one timeline, so differences with MVIS reflect that too.
Rotations. No rotation parameters appear in these results; extrinsics appear as baseline and lever-arm lengths.
Family numbers changed on 2026-11-02, so the VI-Rig datasets come first. New (old): T1 (T3), T2 (T4), T3 (T1), T4 (T2), T5 (T5), T6 (T11), T7 (T8), T8 (T12), T9 (T6), T10 (T7), T11 (T10), T12 (T9).
How to cite. If you use these results or the Calibench datasets, cite Calibench, and also the dataset papers listed on the dataset card.
@misc{calibench2026,
author = {Yang, Yulin},
title = {Calibench-VI: the visual-inertial calibration benchmark},
year = {2026},
howpublished = {Hugging Face Datasets},
note = {https://huggingface.co/datasets/calibench-vi/datasets}
}If you compare against these results or ran the MVIS toolbox, also cite the OpenMVIS project (Zenodo concept DOI), naming the batch:
@misc{openmvis,
title = {{OpenMVIS}: open-source multi-visual-inertial sensor calibration},
author = {{OpenMVIS Contributors}},
year = {2026},
doi = {10.5281/zenodo.24239182},
url = {https://openmvis.com}
}Data. calibench-vi/results · batch 2026-11-10a · results 537de7c. Per-recording values aren't published here; only median, sd and n.
Every benchmark dataset and the sensors behind it. Each name links to its wiki page: a dataset page lists its sensors and which tools calibrated it; a sensor page lists which datasets use it and what calibrations exist. Got a sensor not here? Contribute a dataset.
Datasets
| dataset | configs | cams | shutter | lens | IMU(s) | sensors | license | on this board |
|---|---|---|---|---|---|---|---|---|
| Looper Robotics Insight-9 (SA16) | 2 | 3 | GS+RS | wide FOV (equidistant/KB4 fit well; radtan degrades cam-IMU reproj ~4x) | 1x IMU @ 400 Hz (2.5 ms quantized stamps) | Looper Robotics SA16 'Insight-9' sensor head: 2x GS mono (hw-synced stereo, ~100 mm baseline) + 1x RS color | CC BY-NC 4.0 (partner-approved hosting 2026-08-29) | MVIS, Kalibr, Basalt |
| Monado SLAM Datasets — MGC (Reverb G2) | 2 | 2 | GS | equidistant model on this board | Reverb G2 IMU (T12); T5 is camera-only | Reverb G2 cam0, cam1 and IMU | CC BY 4.0 | MVIS, Kalibr, Basalt (T5, T12: MGC Reverb G2, not MIC) |
| VI-rig 4 IMUs + 4 cams (ours) | 4 | 2 | GS+RS | ELP standard-wide; T265 ~163 deg fisheye | MicroStrain GX3-25 @ 500 Hz, GX3-35 @ 100 Hz, Xsens MTi-100 @ 400 Hz, T265 BMI055 @ 200 Hz | ELP-960P2CAM-V90-VC stereo module, Intel RealSense T265, MicroStrain 3DM-GX3-25, MicroStrain 3DM-GX3-35, Xsens MTi-100 | CC BY-NC 4.0 (commercial licenses on request; gated) | MVIS, Kalibr, Basalt |
| TUM-VI calibration bags | 3 | 2 | GS | fisheye Lensagon BF2M2020S23 (195 deg) | Bosch BMI160 @ 200 Hz | IDS uEye UI-3241LE-M-GL, Lensagon BF2M2020S23, Bosch BMI160 | CC BY 4.0 | MVIS, Kalibr, Basalt |
| VI-rig 4 IMUs + 3 cams (ours) | 1 | 3 | GS | Blackfly standard; T265 ~163 deg fisheye | MicroStrain GX3-25 @ 500 Hz, GX3-35 @ 100 Hz, Xsens MTi-100 @ 400 Hz, T265 BMI055 @ 200 Hz | FLIR Blackfly S BFS-U3-16S2M, Intel RealSense T265, MicroStrain 3DM-GX3-25, MicroStrain 3DM-GX3-35, Xsens MTi-100 | CC BY-NC 4.0 (commercial licenses on request; gated) | MVIS, Kalibr, Basalt |
| EuRoC MAV calibration bags | 0 | 2 | GS | standard (~80 deg H) | ADIS16448 @ 200 Hz | Skybotix VI-Sensor | CC BY (attribution) | — |
| Hilti-Oxford 2022 calibration bag | 0 | 1/2 | GS | fisheye-ish wide (126x92 deg) | Bosch BMI085 @ 400 Hz (FPGA-synced) | Sevensense Alphasense Core | CC BY-NC-SA 3.0 (NonCommercial!) | — |
| Hilti 2023 handheld ('Phasma') calibration bag | 0 | 1/2 | GS | fisheye-ish wide (~126x92 deg) | Bosch BMI085 @ 200 Hz (published rate) | Sevensense Alphasense Core | CC BY-NC-SA 3.0 (NonCommercial!) | — |
| PennCOSYVIO GoPro intrinsic calibration | 0 | 1 | GS | wide (118x70 deg, not full fisheye) | none used (rig's VI-Sensor ADIS16488 @ 200 Hz not part of these sets) | GoPro Hero 4 Black | no license stated — citation-only, no redistribution grant | — |
| Double Sphere paper calibration sequences | 0 | 1 | GS | 195 / 183 / 126 / 122 / 150 deg FOV per lens | none (camera-only) | IDS uEye UI-3241LE-M-GL, Lensagon BF2M2020S23, Lensagon BF5M13720, Lensagon BM4018S118, Lensagon BM2820, GoPro replacement lens | not specified by the dataset authors (verified 2026-06-14) — recipe-only, linked not re-hosted | — |
| TUM RGB-D calibration bags | 0 | 1 | RS | standard | none used (Kinect accelerometer present in bags) | Microsoft Kinect v1, Asus Xtion Pro Live | CC BY 4.0 | — |
| TUM rolling-shutter dataset calib | 0 | 2 | GS | Lensagon BM4018S118 (~126 deg) | Bosch BMI160 @ 200 Hz | IDS uEye UI-3241LE-M-GL, Lensagon BM4018S118, Bosch BMI160 | not specified by the dataset authors (verified 2026-06-14) — recipe-only, linked not re-hosted | — |
| TUM-VIE calibration (frame cameras) | 0 | 2 | GS | Lensagon BM4018S118 (101x76 deg) | Bosch BMI160 @ 200 Hz (not used: camera-only image folders) | IDS uEye UI-3241LE-M-GL, Lensagon BM4018S118, Bosch BMI160 | CC BY 4.0 | — |
| ImprovedOcamCalib fisheye sets | 0 | 1 | GS | ~185 deg (Fisheye1/2), GoPro wide | none (camera-only stills) | Lensation BF2M15520 (f=1.55mm), Lensation BF2M12520 (f=1.25mm), GoPro Hero (model unstated) | GPL v2 (copyleft!) | — |
| VI-rig 5 IMUs + 4 cams (ours) | 0 | 4 | GS | T265 ~163 deg fisheye (x2 units) | MicroStrain GX3-25 @ 500 Hz, GX3-35 @ 100 Hz, Xsens MTi @ 400 Hz, 2x T265 BMI055 @ 200 Hz (5 IMUs) | Intel RealSense T265, MicroStrain 3DM-GX3-25, MicroStrain 3DM-GX3-35, Xsens MTi-100 | CC BY-NC 4.0 (commercial licenses on request; gated) | — |