Skip to content
v0.1Toolbox + public benchmark

OpenMVIS

Open-source multi-visual-inertial system calibration

    Cycling through eleven recordings
    Sensors
    3 cam · 4 IMU
    Reproj median
    0.82 px
    Window
    80.0 s
    Base cam offset
    −2.77 ms
    Kalibr baseline
    Δp 2.6 mm
    Corners / frame
    93–119

    Recovered by MVIS from virig_4imus_3cams / april_01. The outlined camera is the one shown in 3-D. The board corners it detects take its colour.

    Details: all cameras and readout
    Base cam offset
    −2.77 ms
    Kalibr baseline
    Δp 2.6 mm
    Corners / frame
    93–119

    Recovered by MVIS from virig_4imus_3cams / april_01. Each camera has its own colour. The outlined camera is the one shown in 3-D. The board corners it detects take that colour. In the camera views, coloured circles are detected corners. White crosses are reprojections: where the calibration places each corner.

      Recording: VI-Rig 4 IMUs + 3 cameras, OpenMVIS; CC BY-NC 4.0.

      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.

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

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

      3. 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 %.

      4. Gyro-to-accel time offset

        t_ga is 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.

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

      6. Round-trip verification

        mvis roundtrip applies 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.

      QuantitySymbolPerUnitNotes
      Intrinsics + distortionf, c, kcamerapxEight models, mixable within one rig
      Camera–IMU extrinsicsT_CtoIcameram · log(R) radEvery camera to the base IMU, the reference IMU of the rig
      Camera time offsett_dcameramsAbout −123 ms of USB lag on the VI-Rig ELP stereo
      Rolling-shutter readoutt_rcameramsEach corner projected at its own row time
      IMU–IMU extrinsicsT_IstoIaux IMUm · log(R) radPlus a per-IMU time offset
      IMU intrinsicsD_w, D_aIMU—kalibr, rpng or calyx convention
      Gyro–accel offsett_gaIMUmsAbout −5.7 ms on the T265 IMU; why it matters
      Biasesb_g, b_aIMUrad/s · m/s²Along the whole trajectory
      Board pose + trajectoryT_BinW, T_ItoW(t)recordingm · log(R) radChessboard, AprilGrid or ArUco targets
      Board shapez_kcornermmOptional, off by default; on for our VI-Rig runs; why it matters

      Camera models

      Eight projection models.

      • radtanPinhole, radial–tangential
      • kb4Kannala–Brandt fisheye, the default; why
      • equidistantKB polynomial, under 90°
      • fovField-of-view model
      • double_sphereWide-angle fisheye
      • eucmExtended unified camera
      • ucmUnified camera
      • omni_radtanOmnidirectional

      Benchmark

      Checked against Kalibr on TUM-VI.

      0.2px

      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

      <0.1mm

      median stereo-baseline difference, inside the 0.1 mm run-to-run spread; same 8 recordings

      1.8mm

      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

      0.9ms

      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.

      The VI-Rig frame with its IMUs and cameras
      VI-Rig, our own rig: up to 5 IMUs and 4 cameras across its recordings. They are in Datasets.

      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 camchain and camchain-imucam
      Export
      mvis apply-calib writes a copy of a raw ROS1 bag with the calibration applied

      Cite

      If you use the toolbox or the benchmark.

      Benchmark
      @misc{openmvis,
        title  = {{OpenMVIS}: A Benchmark for Multi-Visual-Inertial Sensor Calibration},
        author = {{OpenMVIS Contributors}},
        year   = {2026},
        url    = {https://openmvis.com}
      }
      Method
      @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.

      Visitors to this page.