Follow-up to the #211 dynamic-VI-init epic (closed functional). Dynamic init now fires on real EuRoC data, recovers gravity (correct sign)/scale/velocity/yaw, and stays bounded — but on a low-excitation moving start (MH_05, ~0.1 m/s) the metric scale and gravity direction are both excitation-starved, so forced-dynamic MH_05 lands ~19 m ATE (post-init), short of the 1.5 m gate. Static on the same data is 0.79 m.
This is an observability floor, not a defect: best_metric_motion is only ~6 cm and scale = 0.0607; a ~20% scale error over the ~100 m trajectory alone explains the ~19 m, and the residual gravity direction is ~2.3°. The accelerometer is not a usable roll/pitch fallback on a moving start (contaminated by motion acceleration — see #247).
Directions (lower priority, estimator-quality):
- A scale-vs-groundtruth diagnostic to apportion the 19 m between scale error and gravity-direction drift.
- Tighter scale observability: defer firing to a higher-excitation window, or a second scale-refinement pass once more motion is integrated.
- Online intrinsics/extrinsics + a stronger initializer.
- Validate on a faster moving-start sequence where excitation is sufficient.
Acceptance: forced-dynamic lands within gate on at least one moving-start sequence; then tighten tests/sdk/vio_euroc.cpp forced-dynamic MH_05 to expect_converged=true.
Background: #211 (epic), #247 (root-cause gravity-sign fix), #245 (extrinsics).
Follow-up to the #211 dynamic-VI-init epic (closed functional). Dynamic init now fires on real EuRoC data, recovers gravity (correct sign)/scale/velocity/yaw, and stays bounded — but on a low-excitation moving start (MH_05, ~0.1 m/s) the metric scale and gravity direction are both excitation-starved, so forced-dynamic MH_05 lands ~19 m ATE (post-init), short of the 1.5 m gate. Static on the same data is 0.79 m.
This is an observability floor, not a defect:
best_metric_motionis only ~6 cm andscale = 0.0607; a ~20% scale error over the ~100 m trajectory alone explains the ~19 m, and the residual gravity direction is ~2.3°. The accelerometer is not a usable roll/pitch fallback on a moving start (contaminated by motion acceleration — see #247).Directions (lower priority, estimator-quality):
Acceptance: forced-dynamic lands within gate on at least one moving-start sequence; then tighten
tests/sdk/vio_euroc.cppforced-dynamic MH_05 toexpect_converged=true.Background: #211 (epic), #247 (root-cause gravity-sign fix), #245 (extrinsics).