VI-Rig: 4 IMUs + 4 cameras
T265 fisheye pair (global) + ELP stereo (rolling) + 4 IMUs (100–500 Hz) on one frame

- 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
Demo and values
Section titled “Demo and values”One MVIS camera + IMU run on recording 4imus_4cams_01: all four cameras and all four IMUs solved together.
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.
Calibration process
Section titled “Calibration process”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.
Solved rig
Section titled “Solved rig”The solved positions and orientations, to scale in the IMU frame. Drag sideways to orbit. Tap a sensor to see its values.
| Sensor | fx, fy, cx, cy px | Lever mm | log(R) rad | td ms | Readout ms | t_ga ms | Reprojection px |
|---|---|---|---|---|---|---|---|
| cam0 | 286.5, 286.3, 414.9, 402.6 | [+64.3, −110.6, −27.1] | [−0.0318, −2.2176, +2.2151] | −5.41 | global | 0.253 | |
| cam1 | 286.5, 286.1, 414.4, 397.0 | [+0.7, −108.9, −27.1] | [−0.0392, −2.2123, +2.2155] | −7.47 | global | 0.245 | |
| cam2 | 426.9, 426.4, 350.4, 265.9 | [−89.0, −112.4, −22.3] | [−0.0039, −2.0835, +2.2769] | −123.25 | 16.68 | 0.229 | |
| cam3 | 423.6, 423.1, 336.5, 256.9 | [−148.3, −110.2, −20.9] | [+0.0135, −2.1129, +2.2597] | −123.30 | 16.73 | 0.243 | |
| IMU (base) | 0 | 0 | 0 | −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.
Check against a reference
Section titled “Check against a reference”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 →
Config and run
Section titled “Config and run”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.0board: board_type: apriltag rows: 6 cols: 6 tag_size: 0.088 tag_spacing: 0.3 tag_family: t36h11 heights_file: board_shape_4imus_4cams.yamlcamera_input: path: camera_prior.yaml cameras: - {} - factor_hz: 4.0 - estimate_readout: true factor_hz: 4.0 - estimate_readout: true factor_hz: 4.0solve: 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.002estimate: board_points: true camera: intrinsics: true tr: false td: true extrinsics: true imu: intrinsics: dw_da model: calyx extrinsics: true td: trueoutput: path: cam_imu.jsonmvis cam-imu -c virig_4imus_4cams_cam_imu.yamlThe 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
Dataset
Section titled “Dataset”- 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.