OpenMVIS
Open-source multi-visual-inertial system calibration
Calibrate a whole rig at once
From one recording to a full sensor model.
MVIS is the calibration library behind the OpenMVIS benchmark. It solves camera intrinsics and distortion, extrinsics, time offsets, rolling-shutter readout, board poses and (optionally) the board shape, camera–IMU transforms, IMU intrinsics and biases in a single GTSAM factor graph.
It reads ROS1 and ROS2 bags through rosbags, so ROS does not need to be installed. It also reads EuRoC/ASL folders, image folders and timestamped images.
# cameras only $ mvis cam -c camera.yaml # cameras + IMUs, jointly $ mvis cam-imu -c cam_imu.yaml # apply the result and recalibrate; PASS / FAIL $ mvis roundtrip -c cam_imu.yaml
One self-contained HTML report per run.
Not in Kalibr or Basalt
Six things the common tools do not do.
Kalibr and Basalt are the open-source camera–IMU toolboxes most people use. Neither covers these six cases. See the full comparison.
-
Rolling shutter + IMU
A rolling-shutter camera reads its rows one after another. MVIS solves that readout time together with the IMU. Kalibr's rolling-shutter tool is camera-only; Basalt has none.
-
Global + rolling shutter + IMU
Global-shutter and rolling-shutter cameras on one rig, solved with all its IMUs in one run. Our VI-Rig recording has 2 global-shutter cameras, 2 rolling-shutter cameras and 4 IMUs.
-
Board shape and pose
MVIS solves the board pose and, optionally, one height per corner (
estimate.board_points). Kalibr and Basalt assume a flat board. On our VI-Rig mount, a flat solve biases the focal length by up to 1 % and the gyro scale by about 1 %. -
Gyro-to-accel time offset
t_gais the time offset between an IMU's gyroscope and its accelerometer. MVIS fits it by default in camera–IMU runs. Kalibr and Basalt use one IMU clock, so the offset leaks into the camera time offset. -
Digital-twin simulation
A digital twin is a simulated copy of your recording where the truth is known. MVIS re-solves it and reports the error of each parameter, so you can test the solver on your own rig.
-
Round-trip verification
mvis roundtripapplies the calibration to its own data and calibrates again. It reports PASS or FAIL without ground truth, and exits non-zero on FAIL so it can run in CI.
What the graph estimates
The state, not a sequence of stages.
| Quantity | Symbol | Per | Unit | Notes |
|---|---|---|---|---|
| Intrinsics + distortion | f, c, k | camera | px | Eight models, mixable within one rig |
| Camera–IMU extrinsics | T_CtoI | camera | m · log(R) rad | Every camera to the base IMU, the reference IMU of the rig |
| Camera time offset | t_d | camera | ms | About −123 ms of USB lag on the VI-Rig ELP stereo |
| Rolling-shutter readout | t_r | camera | ms | Each corner projected at its own row time |
| IMU–IMU extrinsics | T_IstoI | aux IMU | m · log(R) rad | Plus a per-IMU time offset |
| IMU intrinsics | D_w, D_a | IMU | — | kalibr, rpng or calyx convention |
| Gyro–accel offset | t_ga | IMU | ms | About −5.7 ms on the T265 IMU; why it matters |
| Biases | b_g, b_a | IMU | rad/s · m/s² | Along the whole trajectory |
| Board pose + trajectory | T_BinW, T_ItoW(t) | recording | m · log(R) rad | Chessboard, AprilGrid or ArUco targets |
| Board shape | z_k | corner | mm | Optional, off by default; on for our VI-Rig runs; why it matters |
Camera models
Eight projection models.
radtanPinhole, radial–tangentialkb4Kannala–Brandt fisheye, the default; whyequidistantKB polynomial, under 90°fovField-of-view modeldouble_sphereWide-angle fisheyeeucmExtended unified cameraucmUnified cameraomni_radtanOmnidirectional
Benchmark
Checked against Kalibr on TUM-VI.
largest median focal-length (fx, fy) difference from Kalibr; principal point within 0.35 px. Camera-only stereo, 8 raw recordings, view angles cut to 85° or less for every tool
median stereo-baseline difference, inside the 0.1 mm run-to-run spread; same 8 recordings
largest median lever-arm difference (camera position in the IMU frame), 4 raw and 4 512×512 recordings. Kalibr was given MVIS's intrinsics and baseline here
median camera time offset above Kalibr's; Basalt is within 0.1 ms of Kalibr. MVIS also fits t_ga (−1.5 to −1.6 ms here), which Kalibr does not have
Benchmark batch 2026-11-10a. See the Leaderboard and each device's calibration.
It checks its own work
A low residual is not the test.
A low reprojection error says a calibration fits its own data, not that it is right. In a round trip, PASS needs the IMU intrinsics and biases to collapse to identity and zero, and the geometry to hold. See Round-trip validation.
- Inputs
- ROS1 and ROS2 bags, EuRoC/ASL folders, image folders, timestamped images
- Targets
- AprilGrid, chessboard, ArUco
- Interop
- Reads and writes Kalibr
camchainandcamchain-imucam - Export
mvis apply-calibwrites a copy of a raw ROS1 bag with the calibration applied
Cite
If you use the toolbox or the benchmark.
@misc{openmvis,
title = {{OpenMVIS}: A Benchmark for Multi-Visual-Inertial Sensor Calibration},
author = {{OpenMVIS Contributors}},
year = {2026},
url = {https://openmvis.com}
} @article{yang2024mvis,
title = {Multi-visual-inertial system: Analysis, calibration, and estimation},
author = {Yang, Yulin and Geneva, Patrick and Huang, Guoquan},
journal = {The International Journal of Robotics Research},
year = {2024},
volume = {43},
number = {13},
pages = {1995--2026},
doi = {10.1177/02783649241245726}
} Cite leaderboard results as OpenMVIS leaderboard, batch 2026-11-10a.
Community
Bring your rig.
OpenMVIS is open: the toolbox, the benchmark records and our own VI-Rig recordings. Add your device, your dataset or your results, or tell us where MVIS breaks.