Summary
FusionCore ATE RMSE 3D: 98.3 m. robot_localization EKF: 10.6 m. This is the larger of the two FC losses and the most instructive failure mode.
Root cause
The raw GPS stream for this sequence contains 105 mode-3 GPS fixes that are 720-840 m off the RTK ground truth. These appear in gps.csv as valid mode-3 fixes but are excluded from gps_rtk.csv (the ground-truth preprocessor rejects them). They cluster in a 24-second window at the end of the second GPS blackout (t=66 min).
This is an adversarial pattern for any chi2-based gating scheme.
Blackout structure
The sequence has two GPS blackouts:
- Blackout 1: 228 seconds at t=42.2 min
- Blackout 2: 211 seconds at t=62.5 min
During blackouts, FusionCore's coast mode relaxes the chi2 gate (coast_q_factor) to allow re-acquisition when GPS returns. This relaxation is necessary: after 3-4 minutes of dead-reckoning, the predicted GPS covariance is large and the Mahalanobis distance of a valid returning fix can exceed the normal gate threshold.
The 105 corrupt fixes arrive at exactly the moment the relaxed gate is open for re-acquisition after Blackout 2. The gate accepts them. The filter jumps 720+ meters. It then recovers over the next 2 minutes as subsequent valid fixes pull the estimate back.
Per-minute trajectory analysis
| Time window |
FC error |
Status |
| 0 - 42 min |
1 - 10 m |
Normal GPS coverage |
| 43 - 46 min |
spike to ~100 m, recovers in 2-3 min |
Blackout 1 (228s): boundary errors up to ~70 m |
| 47 - 62 min |
3 - 10 m |
Full recovery |
| 63 - 67 min |
spike to ~788 m, recovers in 2 min |
Blackout 2 (211s): 105 fixes 720-840 m off RTK |
| 68 - 82 min |
5 - 10 m |
Full recovery for remaining 15 minutes |
The 98 m ATE RMSE is driven almost entirely by those two transients. Outside those windows FC achieves 5-10 m, on par with RL-EKF.
Why RL wins here
RL-EKF also sees the same corrupt GPS stream. It wins for an unrelated structural reason: RL-EKF's GPS covariance handling (trusting the raw position_covariance from the driver) keeps the Mahalanobis gate tighter during normal operation. On this particular sequence, the corrupt fixes do not land inside RL-EKF's narrower gate at that moment.
This is not evidence that RL-EKF is better at outlier rejection in general. On three other sequences (2012-02-04, 2012-03-31, 2012-09-28), RL-EKF's tight gate causes it to reject valid GPS fixes and lose GPS for long stretches, producing 55-265 m ATE. FusionCore wins those sequences precisely because its gate is calibrated to real sensor noise.
The fundamental tradeoff
coast_q_factor controls how much the chi2 gate relaxes during blackout recovery. It is a direct tradeoff:
- Lower
coast_q_factor: tighter gate during recovery, more likely to reject corrupt fixes at the boundary, but also more likely to reject valid returning fixes after long blackouts.
- Higher
coast_q_factor: looser gate, accepts valid fixes reliably after long blackouts, but also accepts adversarial clusters like this one.
The 24-second cluster at exactly the blackout boundary is a worst-case input for this tradeoff. Any gate calibrated to accept valid fixes after a 211-second blackout will accept 105 corrupt fixes 720 m off if they arrive at the same moment.
What would fix this
Two directions under investigation:
-
Cluster-based gating. A single fix 720 m off is suspicious. 105 fixes in 24 seconds all clustered 720-840 m off the dead-reckoned position is a distinguishable pattern. A secondary consistency check (e.g., reject if last N fixes all land more than K meters from the predicted position) could catch this without affecting single-fix outlier behavior.
-
Velocity-consistency check. These 105 fixes imply the robot teleported 720 m in one GPS epoch (200 ms). The implied velocity is ~3600 m/s. A GPS-reported velocity check (where available) or a position-delta rate check would flag this before the position update.
Neither is implemented yet. Contributions welcome.
Reproduce
bash benchmarks/run_one.sh 2012-08-20
Results write to benchmarks/nclt/2012-08-20/results_full/.
Summary
FusionCore ATE RMSE 3D: 98.3 m. robot_localization EKF: 10.6 m. This is the larger of the two FC losses and the most instructive failure mode.
Root cause
The raw GPS stream for this sequence contains 105 mode-3 GPS fixes that are 720-840 m off the RTK ground truth. These appear in
gps.csvas valid mode-3 fixes but are excluded fromgps_rtk.csv(the ground-truth preprocessor rejects them). They cluster in a 24-second window at the end of the second GPS blackout (t=66 min).This is an adversarial pattern for any chi2-based gating scheme.
Blackout structure
The sequence has two GPS blackouts:
During blackouts, FusionCore's coast mode relaxes the chi2 gate (
coast_q_factor) to allow re-acquisition when GPS returns. This relaxation is necessary: after 3-4 minutes of dead-reckoning, the predicted GPS covariance is large and the Mahalanobis distance of a valid returning fix can exceed the normal gate threshold.The 105 corrupt fixes arrive at exactly the moment the relaxed gate is open for re-acquisition after Blackout 2. The gate accepts them. The filter jumps 720+ meters. It then recovers over the next 2 minutes as subsequent valid fixes pull the estimate back.
Per-minute trajectory analysis
The 98 m ATE RMSE is driven almost entirely by those two transients. Outside those windows FC achieves 5-10 m, on par with RL-EKF.
Why RL wins here
RL-EKF also sees the same corrupt GPS stream. It wins for an unrelated structural reason: RL-EKF's GPS covariance handling (trusting the raw
position_covariancefrom the driver) keeps the Mahalanobis gate tighter during normal operation. On this particular sequence, the corrupt fixes do not land inside RL-EKF's narrower gate at that moment.This is not evidence that RL-EKF is better at outlier rejection in general. On three other sequences (2012-02-04, 2012-03-31, 2012-09-28), RL-EKF's tight gate causes it to reject valid GPS fixes and lose GPS for long stretches, producing 55-265 m ATE. FusionCore wins those sequences precisely because its gate is calibrated to real sensor noise.
The fundamental tradeoff
coast_q_factorcontrols how much the chi2 gate relaxes during blackout recovery. It is a direct tradeoff:coast_q_factor: tighter gate during recovery, more likely to reject corrupt fixes at the boundary, but also more likely to reject valid returning fixes after long blackouts.coast_q_factor: looser gate, accepts valid fixes reliably after long blackouts, but also accepts adversarial clusters like this one.The 24-second cluster at exactly the blackout boundary is a worst-case input for this tradeoff. Any gate calibrated to accept valid fixes after a 211-second blackout will accept 105 corrupt fixes 720 m off if they arrive at the same moment.
What would fix this
Two directions under investigation:
Cluster-based gating. A single fix 720 m off is suspicious. 105 fixes in 24 seconds all clustered 720-840 m off the dead-reckoned position is a distinguishable pattern. A secondary consistency check (e.g., reject if last N fixes all land more than K meters from the predicted position) could catch this without affecting single-fix outlier behavior.
Velocity-consistency check. These 105 fixes imply the robot teleported 720 m in one GPS epoch (200 ms). The implied velocity is ~3600 m/s. A GPS-reported velocity check (where available) or a position-delta rate check would flag this before the position update.
Neither is implemented yet. Contributions welcome.
Reproduce
Results write to
benchmarks/nclt/2012-08-20/results_full/.