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?
1. With t_ga = 0, the three tools agree
Section titled “1. With t_ga = 0, the three tools agree”- Two datasets: Looper Insight 9 (looper_1) and Intel T265 (VI-Rig april_01).
- Prepared so
t_gais 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
tdwithin 0.3 ms of 0. The IMU scales are within 0.4 % of 1, except Basalt on the T265 (below).
| Tool | Looper Insight 9 | Intel T265 | ||
|---|---|---|---|---|
| td (ms) | scale error (%) | td (ms) | scale error (%) | |
| MVIS | −0.01 | 0.01 | +0.07 | 0.30 |
| Kalibr | −0.04 | 0.13 | −0.19 | 0.34 |
| Basalt | −0.04 | 0.21 | −0.28 | 1.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.
2. Add a t_ga: delay the accelerometer
Section titled “2. Add a t_ga: delay the accelerometer”- 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_gain each is τ. - Run all three tools on every bag, with the same settings as above.
- MVIS reports the delay as
t_ga(slope 1.00 on both devices). Itstdstays flat, and its IMU scales change by under 0.01 %. - Kalibr and Basalt have no
t_ga, so theirtdtakes a steady share of τ. A share of 0.64 meanstdmoves 0.64 ms for every 1 ms oft_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.
3. Real devices have a t_ga
Section titled “3. Real devices have a t_ga”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.
| Device | t_ga on the raw bag (MVIS) | Kalibr: share → td moved | Basalt: share → td moved |
|---|---|---|---|
| Looper Insight 9 | −5.03 ± 0.02 ms | 0.64 → −3.21 ms | 0.59 → −2.97 ms |
| Intel T265 | −5.69 ± 0.43 ms | 0.30 → −1.72 ms | 0.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.
4. On the running example
Section titled “4. On the running example”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_gaon (as in step 4). The Xsens is the base IMU. t_gaper IMU (± 0.02 ms on each, from the run’s result table):
| IMU | t_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_gaon 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 cameratdof −0.03 and −0.04 ms.t_gagoes from −6.97 to +0.17 ms. - Without
t_ga: the second calibration finds −1.47 mstdon 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.
Limits
Section titled “Limits”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):
calibench-vi/datasets→looper-insight9/tga-sweepcalibench-vi/datasets→virig-4imus-3cams/tga-sweep
Licence CC BY-NC 4.0, gated; commercial use by request. Please cite the VI-Rig dataset and MVIS.