VI-Rig: 5 IMUs + 4 cameras
Two T265 fisheye pairs (global) + 5 IMUs (100–500 Hz) on one frame

- 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
Demo and values
Section titled “Demo and values”One MVIS camera + IMU run on recording 5imus_4cams_01: all four cameras and all five 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 | t_ga ms | Reprojection px |
|---|---|---|---|---|---|---|
| cam0 | 286.4, 285.6, 415.1, 404.4 | [−158.3, −108.7, −26.5] | [+1.5620, −0.0073, −0.0249] | −0.19 | 0.188 | |
| cam1 | 286.5, 285.4, 414.0, 398.8 | [−94.8, −109.5, −27.8] | [+1.5646, −0.0044, −0.0205] | −0.15 | 0.192 | |
| cam2 | 286.2, 285.1, 416.3, 401.1 | [−160.5, −110.4, −49.8] | [+1.5664, +0.0216, −0.0566] | −0.30 | 0.204 | |
| cam3 | 286.5, 285.5, 412.7, 399.8 | [−97.2, −111.1, −53.2] | [+1.5732, +0.0216, −0.0512] | −0.27 | 0.215 | |
| IMU (base) | 0 | 0 | 0 | −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.
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 7 recordings: Dataset eval →
Config and run
Section titled “Config and run”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.0board: board_type: apriltag rows: 6 cols: 6 tag_size: 0.088 tag_spacing: 0.3 tag_family: t36h11camera_input: path: camera_prior.yaml cameras: - {} - factor_hz: 4.0 - factor_hz: 4.0 - factor_hz: 4.0solve: estimate_t_ga: true max_iterations: 40 corner_subsample: two_antiestimate: camera: intrinsics: true td: true extrinsics: true tr: false imu: intrinsics: dw_da model: calyx extrinsics: true td: true board_points: trueoutput: path: cam_imu.jsonmvis cam-imu -c virig_5imus_4cams_cam_imu.yamlThe 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
Dataset
Section titled “Dataset”- 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.