Skip to content
Our rigOpenMVIS

VI-Rig: 4 IMUs + 4 cameras

T265 fisheye pair (global) + ELP stereo (rolling) + 4 IMUs (100–500 Hz) on one frame

VI-Rig frame, shown in its 3-camera setup; this recording swaps the Blackfly for an ELP rolling-shutter stereo pair
Photo: OpenMVIS (3-camera setup)
Cameras
4: T265 fisheye pair (global shutter) + ELP stereo pair (rolling shutter)
IMUs
4: Xsens MTi (base), 2 MicroStrain, T265
Board
AprilGrid 6×6, tag 88 mm
Format
ROS1 bag
Licence
CC BY-NC 4.0

One MVIS camera + IMU run on recording 4imus_4cams_01: all four cameras and all four 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.25 px
cam0–cam1 baseline63.7 mm
cam0 td−5.41 ms
cam0 lever arm130.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 msReadout mst_ga msReprojection px
cam0286.5, 286.3, 414.9, 402.6[+64.3, −110.6, −27.1][−0.0318, −2.2176, +2.2151]−5.41global0.253
cam1286.5, 286.1, 414.4, 397.0[+0.7, −108.9, −27.1][−0.0392, −2.2123, +2.2155]−7.47global0.245
cam2426.9, 426.4, 350.4, 265.9[−89.0, −112.4, −22.3][−0.0039, −2.0835, +2.2769]−123.2516.680.229
cam3423.6, 423.1, 336.5, 256.9[−148.3, −110.2, −20.9][+0.0135, −2.1129, +2.2597]−123.3016.730.243
IMU (base)000−0.82 ± 0.02
IMU gx3_25[−122.8, −45.3, −3.1][+2.2502, +2.1849, −0.0279]−0.69+0.10 ± 0.02
IMU gx3_35[−82.3, −46.2, −3.5][+2.2304, +2.2070, −0.0192]−2.07+0.01 ± 0.02
IMU t265[+54.7, −107.4, −30.3][+1.5724, −0.0054, −0.0113]−7.17−6.74 ± 0.02

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.246 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 15 recordings and tools: Dataset eval →

virig_4imus_4cams_cam_imu.yaml
input:
format: ros1
path: 4imus_4cams_01.bag
cam_topics:
- /t265/fisheye1/image_raw
- /t265/fisheye2/image_raw
- /elp/split_sync_image_node/left/image_raw
- /elp/split_sync_image_node/right/image_raw
imu_topics:
- /imu/data
- /gx3_25/data
- /gx3_35/imu/data
- /t265/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
heights_file: board_shape_4imus_4cams.yaml
camera_input:
path: camera_prior.yaml
cameras:
- {}
- factor_hz: 4.0
- estimate_readout: true
factor_hz: 4.0
- estimate_readout: true
factor_hz: 4.0
solve:
max_iterations: 40
corner_subsample: two_anti
estimate_t_ga: true
sigma_t_ga: 0.01
vision_pose: imu
sigma_g: 0.00065
sigma_a: 0.0026
sigma_bg: 0.001
sigma_ba: 0.002
estimate:
board_points: true
camera:
intrinsics: true
tr: false
td: true
extrinsics: true
imu:
intrinsics: dw_da
model: calyx
extrinsics: true
td: true
output:
path: cam_imu.json
shell
mvis cam-imu -c virig_4imus_4cams_cam_imu.yaml

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

  • input.imu_topics: Four IMU topics. The first is the base IMU; the other three are solved against it.
  • input.window_mode: MVIS picks the 80 s window with the most motion.
  • camera_input.cameras: The ELP cameras are rolling shutter, so their readout time is estimated. The three cameras after the first are added to the graph at 4 Hz, which keeps the solve small.
  • solve.sigma_g: The same IMU noise values as the 3-camera example, which has the same Xsens base IMU.
  • 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 12 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 4 IMUs + 4 cams dataset page →
Config
virig_4imus_4cams_cam_imu.yaml, above
Command
mvis cam-imu -c virig_4imus_4cams_cam_imu.yaml
  • Recording 4imus_4cams_01, one of the 15 recordings of this rig. MVIS picks the 80 s window with the most motion.
  • Cameras: the two T265 fisheye cameras (global shutter) and the ELP stereo pair (rolling shutter), all with the equidistant lens model.
  • IMUs: the Xsens MTi is the base IMU; the two MicroStrain units and the T265's own IMU are solved against it.
  • Board: AprilGrid 6×6, tag 88 mm, spacing 0.3, t36h11.
  • Solve window: 80.0 s.

Download: VI-Rig 4 IMUs + 4 cams dataset page → The recordings are listed there, not copied here.

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