Skip to content

VI-Rig — 4 IMUs + 3 cameras

Three global-shutter cameras and four IMUs on one frame, recorded in front of an AprilGrid. The Quickstart uses this set.

The VI-Rig: the Blackfly camera at top right, the T265 at bottom right and the IMUs on the plate

Rates are measured from the bags. Shutter: every camera here is global shutter.

SensorTypeRateImage sizeROS topic
FLIR Blackfly S BFS-U3-16S2Mcamera, standard lens30 Hz720×540 (2×2 binned)/blackfly/image_raw
RealSense T265, leftcamera, fisheye (about 163°)30 Hz848×800/t265/fisheye1/image_raw
RealSense T265, rightcamera, fisheye (about 163°)30 Hz848×800/t265/fisheye2/image_raw
Xsens MTi-100IMU400 Hz–/imu/data
MicroStrain 3DM-GX3-25IMU500 Hz–/gx3_25/data
MicroStrain 3DM-GX3-35IMU100 Hz–/gx3_35/imu/data
RealSense T265 IMU (BMI055)IMU200 Hz–/t265/imu
  • Board: AprilGrid, 6×6 tags of family t36h11, tag size 88 mm, spacing 0.3 of the tag size. The target file april.yaml is in the folder.
  • Board shape: the printed board is not flat (about 2.4 mm rms). Our runs estimate its shape; see Why calibrate the board shape.
  • Drivers: we recorded with these ROS drivers.
  • More on the T265: device page.
  • Count: 10 ROS1 bags, virig_4imus_3cams_april_01.bag to virig_4imus_3cams_april_10.bag.
  • Length: 131 to 161 s each, 24 minutes in total.
  • Size: 6.9 to 8.5 GB each, 76 GB in total.

The folder also holds tga-sweep/: 11 versions of recording 01, cut to a shorter window, with the T265 accelerometer delayed by a known amount (−50 to +50 ms). They test whether a tool can find the delay between gyroscope and accelerometer (tgat_{ga}). Each copy is 3.3 GB. A README, the MVIS calibration used for the correction and a provenance.json are beside them. See Why calibrate t_ga.

Accept the terms on the Hub page and set HF_TOKEN to a read token from your Hugging Face settings (or run hf auth login once, after pip install huggingface_hub). Then either:

Terminal window
# with MVIS: checks size and SHA-256, saves to $MVIS_DATASETS/mvis_4imus_3cams/
mvis datasets list --dataset mvis_4imus_3cams
mvis datasets download --select mvis_4imus_3cams/april_01 # one recording, 6.9 GB
mvis datasets download --dataset mvis_4imus_3cams # all 10, 76 GB
Terminal window
# with the Hugging Face CLI: the 10 recordings and the board file, without the sweep
hf download calibench-vi/datasets --repo-type dataset \
--include "virig-4imus-3cams/virig_*.bag" "virig-4imus-3cams/april.yaml" \
--local-dir ./calibench

We ran MVIS and Kalibr on every recording, and Basalt on the camera-only runs (batch 2026-11-10a). The results page shows every value and its spread.

RunRecordings solved
Camera only. Kalibr: the 3 cameras together. MVIS and Basalt: the Blackfly alone and the T265 pair, so no baseline to the BlackflyMVIS 10 of 10 · Kalibr 10 of 10 · Basalt 10 of 10
Camera + IMU, 3 cameras + 4 IMUsMVIS 10 of 10 · Kalibr 10 of 10 · Basalt not run (one IMU per run)

A few MVIS values from the camera + IMU runs. Each is the median over the 10 recordings, ± the standard deviation between recordings. This shows how well MVIS repeats, not that it is right.

  • Blackfly focal length fxf_x: 448.30 ± 0.61 px
  • Lever arm of the GX3-25 from the Xsens: 131.31 ± 0.20 mm
  • Time offset of the T265 IMU to the Xsens: 2.83 ± 0.21 ms
  • Reprojection error, median: 0.35 px (Blackfly), 0.23 and 0.24 px (T265 pair)

The worked example shows one full run with its config.

The reference results in calibench-vi/results hold one file per tool, batch and run (for example MVIS/2026-11-10a/T6.json) and the configs behind them in configs/T6/ (camera + IMU) and configs/T6c/ (camera only). Kalibr and MVIS name the sensors in the same order. The base IMU is the one the other sensors are referred to.

SensorBlackflyT265 leftT265 rightXsens MTi-100GX3-25GX3-35T265 IMU
Kalibrcam0cam1cam2imu0imu1imu2imu3
MVIScam0cam1cam2base IMUaux IMU 1aux IMU 2aux IMU 3

Please cite Calibench and the MVIS paper. The BibTeX is on the overview page.