Skip to content

A real front end's errors and the stochastic clone (WB-3); ADR-0023 - #80

Merged
Telschow merged 7 commits into
mainfrom
claude/real-front-end
Oct 11, 2026
Merged

Telschow merged 7 commits into
mainfrom
claude/real-front-end

Conversation

@Telschow

Copy link
Copy Markdown
Owner

What

  • navkit.vo_frontend: a NumPy-only two-view front end (Shi-Tomasi, pyramidal Lucas-Kanade with a forward-backward check, eight-point RANSAC, cheirality), chained across frames.
  • navkit euroc fetch --images: fetches left-camera frames of a window of one sequence, from a stored, compressed or whole local archive.
  • navkit euroc vo: measures the front end's rotation and translation error against the ground truth, outliers and correlation time, and checks the stochastic clone against the measured errors (a Gaussian surrogate and a replay of the real error series).
  • docs/real_front_end.md, committed CSVs, tests that check each statement against them, and ADR-0023 (accepted).

Result (EuRoC MH_01_easy, 30 s, 20 Hz)

  • One-frame errors are small (0.08 deg, 8 mm with the true scale) and correlated for 0.2 to 0.25 s, below the 0.5 to 2 s where ADR-0017 found the clone failing. Outliers grow with the gap (2% to 13%).
  • A Gaussian surrogate with that size and correlation time keeps the clone inside the gate (NEES 5.6, 93%).
  • Replaying the measured errors does not: NEES 27, 55% coverage. Assuming four times the measured noise brings it back: NEES 4.3, 91%.
  • The single anchor fails on the same errors (NEES in the tens of thousands).

Limits

One sequence, one 30 s window, and one replayed error series (the seeds change only the simulated GNSS, so 91% has no spread behind it). The front end is mine and plain, and the translation has the true scale, which a monocular front end lacks. The default is unchanged; the clone stays opt-in.

Full suite (1298 passed), lint, types, links, strict docs build, SRS trace and metrics pass locally. Coverage 94.34%. The camera frames are not in the repository (git-ignored, non-commercial terms); the tests use synthetic frames and the committed CSVs.

🤖 Generated with Claude Code

Comment thread src/navkit/vo_error.py
Comment on lines +342 to +343
"| Variant | Runs | Median mean NEES | Median 2-sigma coverage | Median final error m | Median claimed sigma m "
"| Meets the gate (NEES < 10, coverage > 90%) |",
Comment thread src/navkit/vo_error.py
Comment on lines +386 to +388
"| Gap, frames | Pairs | Median baseline m | Rotation RMS deg | Lateral RMS m | Median direction error deg "
"| Outlier share | Rotation lag-1 autocorrelation | Lateral lag-1 autocorrelation "
"| Rotation correlation time s | Lateral correlation time s |",
Comment thread tests/test_vo_page.py
direction = [by[g]["dir_median_deg"] for g in (1, 2, 4, 6, 10)]
outliers = [by[g]["outlier_share"] for g in (1, 2, 4, 6, 10)]
lateral = [by[g]["lat_rms_m"] for g in (1, 2, 4, 6, 10)]
assert direction == sorted(direction, reverse=True) and direction[0] > 10 > 2 > direction[-1] - 0.0
Comment thread tests/test_vo_error.py
R = rot_exp(np.array([0.01, -0.02, 0.03]))
u = np.array([0.6, 0.0, 0.8])

class Truth:
Telschow and others added 2 commits October 11, 2026 12:49
…cannot delete an open file)

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
@Telschow
Telschow merged commit 3abc6ba into main Oct 11, 2026
19 checks passed
@Telschow
Telschow deleted the claude/real-front-end branch October 11, 2026 14:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants