Skip to content

Comparison vs Kalibr / Basalt

Use this page to see where MVIS sits next to Kalibr and Basalt, the two open-source camera–IMU toolboxes most people use. Kalibr is mature and widely validated, and MVIS does not aim to replace it where it works well.

  • Checked against: MVIS 0.1.0 and our benchmark runs of 10 November 2026 (Methodology).
  • The numbers: per-dataset results of all three tools are on the Leaderboard.
CapabilityMVISKalibrBasalt
Camera intrinsics + distortion✅✅✅
Distortion modelsradtan, kb4, equidistant, FOV, DS, EUCM, UCM, omni_radtan (experimental)radtan, equidistant, FOV, omni, omni-radtan, DS, EUCMradtan, KB4, DS, EUCM, UCM
Different models in one rig✅✅✅
Camera–IMU extrinsics + time offset✅✅✅
Multiple IMUs in one solve✅✅✖ one IMU per run
Gyro-only mode per auxiliary IMU✅✖✖
IMU intrinsics (scale, misalignment)✅ — 3 conventions (kalibr, rpng, calyx)✅✅ scale + misalignment
G-sensitivity Tg✅✅✖
Gyro↔accel offset t_ga✅ on by default✖✖
Board shape (one height per corner)✅ estimate.board_points✖ flat board✖ flat board
KB4-type polynomial past 90°✅ kb4, what fisheye means✖ pinhole-equi needs rays in front of the camera✅ KB4
Rolling-shutter readout✅ in camera and camera–IMU solvescamera-only, separate tool✖
Global + rolling shutter + IMUs in one solve✅ readout per camera✖✖
Corrected-dataset export✅ apply-calib✖✖
Digital-twin simulation✅ mvis.simulation✖✖
Round-trip PASS/FAIL validation✅ roundtrip✖✖
Batch sweep over a dataset family✅ input.bags✖✖
Dataset download + check✅ mvis datasets✖✖
Trajectory modeldiscrete factor graphcontinuous-time B-splinecontinuous-time B-spline
BoardsAprilGrid, chessboard, ArUcoAprilGrid, chessboard, circlesAprilGrid
InputROS1/ROS2 bag, EuRoC, image foldersROS bagROS bag, EuRoC
Runs without ROS✅ pure Python✖✅ C++ build, no ROS
PlatformsLinux, macOS (Python 3.11–3.12)Linux (ROS 1, or Docker)Linux, macOS
Kalibr interop✅ read + write camchain, read AprilGrid targetsnative✖
  • No ROS, no C++ build. MVIS installs with pip and reads ROS1 and ROS2 bags itself. Kalibr needs a ROS workspace; Basalt needs a C++ build. Requirements.
  • More than one IMU, each with its own mode. MVIS puts every IMU in one graph, and each auxiliary IMU (every IMU but the base) can run gyro-only when its accelerometer is unreliable. Kalibr also solves several IMUs in one run. Basalt takes one IMU per run, so a four-IMU rig is calibrated IMU by IMU and composed.
  • It fits the gyro–accel offset. t_ga is the time offset between the gyroscope and accelerometer channels of one IMU. It is on by default in camera–IMU runs. Kalibr and Basalt give an IMU one clock.
    • On two real IMUs (the Looper Insight 9 and the T265) MVIS measures a t_ga of about −5 to −6 ms.
    • There, Kalibr’s and Basalt’s camera time offset td differs from MVIS by about 1.6–3.2 ms. A sweep in which we delay only the accel predicts most of that gap from t_ga alone.
    • Not yet tested: which td is closer to the truth. Details.
  • It can solve the board shape. With estimate.board_points: true MVIS solves one height per corner. Kalibr and Basalt take the board as flat. On our VI-Rig mount a flat solve shifts the focal length, gyro scale and lever. Details.
  • Rolling shutter in the camera–IMU solve. MVIS solves the readout time together with the IMU. Kalibr’s rolling-shutter tool is camera-only.
  • Validation is a command. mvis roundtrip applies the calibration to its own recording, calibrates again and prints PASS or FAIL. A PASS needs the IMU intrinsics to come back as identity and the geometry to stay put. Neither Kalibr nor Basalt ships a check like it. Round-trip validation.
  • Discrete-time. MVIS places pose, velocity and bias states at a fixed rate (state_hz, 30 Hz by default). Kalibr and Basalt fit a B-spline, a smooth curve in continuous time.