Skip to content
Our rigOpenMVIS

VI-Rig: 5 IMUs + 4 cameras

Two T265 fisheye pairs (global) + 5 IMUs (100–500 Hz) on one frame

VI-Rig frame, shown in its 3-camera setup; this recording carries two T265 units and five IMUs
Photo: OpenMVIS (3-camera setup)
Cameras
4 global shutter: two T265 fisheye pairs
IMUs
5: Xsens MTi (base), 2 MicroStrain, 2 T265
Board
AprilGrid 6×6, tag 88 mm
Format
ROS1 bag
Licence
CC BY-NC 4.0

One MVIS camera + IMU run on recording 5imus_4cams_01: all four cameras and all five IMUs solved together.

The scene MVIS recovered from this dataset, as on the homepage. The values beside it come from this page's run.
Reprojection median0.20 px
cam0–cam1 baseline63.5 mm
cam0 td−0.19 ms
cam0 lever arm193.8 mm

Reprojection is how far, in pixels, the detected corners lie from where the solve puts them. td is the camera–IMU time offset, and the lever arm is the camera–IMU position offset.

MVIS's own player, from this run: the detected board corners, then the rig's path as the solve refines it. Press Play or drag the bar; pick a camera card to look through that camera. We publish no camera images.

The solved positions and orientations, to scale in the IMU frame. Drag sideways to orbit. Tap a sensor to see its values.

Sensorfx, fy, cx, cy pxLever mmlog(R) radtd mst_ga msReprojection px
cam0286.4, 285.6, 415.1, 404.4[−158.3, −108.7, −26.5][+1.5620, −0.0073, −0.0249]−0.190.188
cam1286.5, 285.4, 414.0, 398.8[−94.8, −109.5, −27.8][+1.5646, −0.0044, −0.0205]−0.150.192
cam2286.2, 285.1, 416.3, 401.1[−160.5, −110.4, −49.8][+1.5664, +0.0216, −0.0566]−0.300.204
cam3286.5, 285.5, 412.7, 399.8[−97.2, −111.1, −53.2][+1.5732, +0.0216, −0.0512]−0.270.215
IMU (base)000−0.56 ± 0.17
IMU gx3_25[−122.0, −46.9, −2.9][−2.2372, −2.1947, +0.0186]−0.43+0.12 ± 0.20
IMU gx3_35[−82.3, −47.4, −3.4][−2.2388, −2.1989, +0.0128]−2.01+0.01 ± 0.21
IMU t265_01[−145.8, −104.2, −25.9][−0.0085, −2.1884, +2.1962]−7.03−6.58 ± 0.18
IMU t265_03[−148.2, −105.5, −51.0][+0.0221, −2.1744, +2.1712]−7.12−6.59 ± 0.17

Lever arms and rotations are each sensor in the base IMU frame; rotation is log(R) in rad. td is the time offset to the base IMU, t_imu = t_sensor + td. Reprojection is the median per camera (all cameras: median 0.196 px): how well the model fits the corners, not how accurate it is.

No published reference. No published calibration exists for this rig, so this page has nothing to compare against. What we can show is how much each value moves from one recording to the next. All 7 recordings: Dataset eval →

virig_5imus_4cams_cam_imu.yaml
input:
format: ros1
path: 5imus_4cams_01.bag
cam_topics:
- /t265_01/fisheye1/image_raw
- /t265_01/fisheye2/image_raw
- /t265_03/fisheye1/image_raw
- /t265_03/fisheye2/image_raw
imu_topics:
- /mti/sensor/imu_raw
- /gx3_25/data
- /gx3_35/imu/data
- /t265_01/imu
- /t265_03/imu
window_mode: motion
segment_length: 80.0
board:
board_type: apriltag
rows: 6
cols: 6
tag_size: 0.088
tag_spacing: 0.3
tag_family: t36h11
camera_input:
path: camera_prior.yaml
cameras:
- {}
- factor_hz: 4.0
- factor_hz: 4.0
- factor_hz: 4.0
solve:
estimate_t_ga: true
max_iterations: 40
corner_subsample: two_anti
estimate:
camera:
intrinsics: true
td: true
extrinsics: true
tr: false
imu:
intrinsics: dw_da
model: calyx
extrinsics: true
td: true
board_points: true
output:
path: cam_imu.json
shell
mvis cam-imu -c virig_5imus_4cams_cam_imu.yaml

The marked lines are the choices that matter for this rig:

  • input.imu_topics: Five IMU topics. The first is the base IMU; the other four are solved against it.
  • input.window_mode: MVIS picks the 80 s window with the most motion; this recording is shorter, so all of it is used.
  • camera_input.cameras: The three cameras after the first are added to the graph at 4 Hz, which keeps the solve small.
  • camera_input.path: The starting camera intrinsics, from camera-only solves of all 7 recordings.
  • solve.estimate_t_ga: Estimates t_ga, the time offset between the gyroscope and the accelerometer. The T265 IMUs need it most.
  • estimate.board_points: The printed board is not quite flat, so its shape is estimated too.
  • estimate.camera.intrinsics: Camera intrinsics stay free in the camera + IMU solve.

This is the config of the run on this page, with every path cut to its file name. Point the paths at your copy.

The solve took about 7 min on one desktop. It writes cam_imu.json, a calibration YAML and a report beside the config.

MVIS
MVIS main, 2026-11-10
Run date
2026-11-10
Data
VI-Rig datasets →
Config
virig_5imus_4cams_cam_imu.yaml, above
Command
mvis cam-imu -c virig_5imus_4cams_cam_imu.yaml
  • Recording 5imus_4cams_01, one of the 7 recordings of this rig. It is about 59 s long, shorter than the 80 s window MVIS asks for, so the whole recording is used.
  • Cameras: the fisheye pairs of two T265 units, all global shutter, with the equidistant lens model. Each pair is synced inside its unit, but the two units are not synced to each other; their time offsets are solved against the base IMU.
  • IMUs: the Xsens MTi is the base IMU; the two MicroStrain units and the two T265 IMUs are solved against it.
  • Board: AprilGrid 6×6, tag 88 mm, spacing 0.3, t36h11.
  • Solve window: 58.7 s.

Download: VI-Rig datasets → The recordings are listed there, not copied here.

AprilGrid 6 × 6, 660 × 660 mm. Standard pattern, to scale