Skip to content

Why calibrate t_ga

t_ga is the time offset between the gyroscope and the accelerometer inside one IMU. td is the time offset between the camera and the IMU. MVIS fits both. Kalibr and Basalt fit only td: they treat the IMU as one clock.

This page asks one question: what happens to a camera–IMU calibration when the IMU has a t_ga?

  • Two datasets: Looper Insight 9 (looper_1) and Intel T265 (VI-Rig april_01).
  • Prepared so t_ga is 0: MVIS calibrated each raw recording. We then resampled the camera and IMU streams with that result. So on the new bag, by MVIS’s estimate, td = 0, t_ga = 0 and the IMU scales are 1.
  • Settings: each tool’s usual settings. T265: camera intrinsics pinned; Looper: intrinsics free.
  • Result: all three tools read td within 0.3 ms of 0. The IMU scales are within 0.4 % of 1, except Basalt on the T265 (below).
ToolLooper Insight 9Intel T265
td (ms)scale error (%)td (ms)scale error (%)
MVIS−0.010.01+0.070.30
Kalibr−0.040.13−0.190.34
Basalt−0.040.21−0.281.50

Corrected bag, no injected delay. Scale error is the largest |scale − 1| over the six IMU axes.

Two scales are further off: Basalt on the T265 reads gyro x and accel z about 1.2 % and 1.5 % from 1. That is already there with no offset, so it is not caused by t_ga.

  • Sweep: delay only the accel by τ = −50, −20, −10, −5, −2, 0, 2, 5, 10, 20 and 50 ms. Everything else is unchanged. That is 11 bags per device, and the true t_ga in each is τ.
  • Run all three tools on every bag, with the same settings as above.
Accel delayed by τ. MVIS puts it in t_ga (solid blue) and keeps td flat (dashed); Kalibr and Basalt have no t_ga, so their td takes a steady share of τ.
  • MVIS reports the delay as t_ga (slope 1.00 on both devices). Its td stays flat, and its IMU scales change by under 0.01 %.
  • Kalibr and Basalt have no t_ga, so their td takes a steady share of τ. A share of 0.64 means td moves 0.64 ms for every 1 ms of t_ga. The shares are 0.64 (Kalibr) and 0.59 (Basalt) on Looper, and 0.30 and 0.28 on the T265.
  • Their IMU scales drift too: mostly under 0.2 % within ±10 ms (Basalt on the T265: accel 0.3 % at ±2 ms), and up to about 1.8 % at ±50 ms.
  • No warning: every run of every tool converged.

This is not a bug in Kalibr or Basalt. With one IMU clock, the closest fit puts td somewhere between the gyro and the accel. Where depends on the recording, likely on how much the gyro and the accel each drive the fit; that is not tested here.

MVIS measures t_ga on the raw bags: −5.03 ms on Looper and −5.69 ms on the T265. A tool without t_ga moves td by its share of that.

Devicet_ga on the raw bag (MVIS)Kalibr: share → td movedBasalt: share → td moved
Looper Insight 9−5.03 ± 0.02 ms0.64 → −3.21 ms0.59 → −2.97 ms
Intel T265−5.69 ± 0.43 ms0.30 → −1.72 ms0.28 → −1.60 ms

On the raw bags, Kalibr's td really differs from MVIS's by about this much (−3.16 ms on Looper, −1.91 ms on the T265).

Conclusion: t_ga matters for camera–IMU calibration. On these two devices, a tool without it moves td by about 1.6–3.2 ms.

MVIS fits t_ga by default (solve.estimate_t_ga: true, with a weak 10 ms prior, sigma_t_ga: 0.010), as in these runs. See Estimate t_ga. To use a tool without t_ga, remove the offset first with corrected-dataset export.

The guides use the VI-Rig recording virig-4imus-4cams. It has four IMUs on one rig, so it shows t_ga on four devices at once.

  • One run, bag 01: MVIS solved all four cameras and all four IMUs together, with t_ga on (as in step 4). The Xsens is the base IMU.
  • t_ga per IMU (± 0.02 ms on each, from the run’s result table):
IMUt_ga (ms)
Xsens MTi-100 (base)−0.82
MicroStrain GX3-25+0.10
MicroStrain GX3-35+0.01
T265 IMU−6.74
  • Only the T265 IMU has a large offset. The other three read within 1 ms of 0.
  • It repeats over 15 bags: in the results, the T265 IMU reads −6.693 ms (sd 0.112) in T7 and −6.697 ms (sd 0.135) in T8. In those two runs the T265 IMU is the base.

Older run (July 2026): round trip with and without t_ga

Section titled “Older run (July 2026): round trip with and without t_ga”
  • Setup: bag 01, T265 cameras and the T265 IMU, older MVIS code with camera intrinsics pinned. We ran a round trip twice: calibrate, correct the bag, calibrate again. The only change was t_ga on or off.
  • Both runs pass. The IMU scales and biases go back to 1 and 0 in both.
  • With t_ga: the second calibration finds camera td of −0.03 and −0.04 ms. t_ga goes from −6.97 to +0.17 ms.
  • Without t_ga: the second calibration finds −1.47 ms td on both cameras. It does not go to 0. This is the gyro–accel offset that was not modelled, showing up as a camera time error.

So t_ga is what makes a corrected dataset consistent in time.

The test favours MVIS. The zero point is MVIS’s own calibration, and the sweep injects exactly the shift MVIS models (a pure accel delay). Which tool’s td is right on raw data is not tested. A real offset need not be a pure shift: on the T265 it shrinks with frequency, from −6.8 ms at 2–4 Hz to −3.6 ms at 16–22 Hz (less certain above 22 Hz), so one t_ga is a compromise. One recording per device, and the MVIS authors ran all three tools.

The sweep bags are on the Hub, with a README, the MVIS calibration used for the correction and a provenance.json (sign, τ, crop, sha256 per bag):

Licence CC BY-NC 4.0, gated; commercial use by request. Please cite the VI-Rig dataset and MVIS.