docs: update README and next_steps with sprint 1 VO migration results

README:
- Stack table: VO row shows CuVSLAMMonoDepthVisualOdometry (Mono-Depth mode)
- Test coverage: 195+8 → 216+8 (new mono_depth tests, AnyLoc markers, GPS_INPUT encoding)
- Added test_gps_input_encoding.py row
- F07 component table: dev/prod shows Mono-Depth variants
- "Next steps" rewritten: sprint 1 complete, sprint 2 queued

next_steps.md:
- New §5.1a documenting sprint 1 execution (7 commits, 3 decisions recorded)
- §5.3 week-1 marked numpy pin / Mono-Depth class / GPS_INPUT encoding as done
- Week-2 updated with harness wiring and CuVSLAMVisualOdometry deletion tasks

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Yuzviak
2026-04-18 16:37:50 +03:00
parent 759766d737
commit 1618190105
2 changed files with 50 additions and 20 deletions
+21 -5
View File
@@ -136,6 +136,20 @@ Research документ `docs/superpowers/specs/2026-04-18-oss-stack-tech-audi
- Результат не залежить від scale: ESKF ATE ≈ 1236-1343 м, GPS ATE ≈ 1770 км.
- [decision 2026-04-18: VPAIR **не можна зробити PASS на поточному стеку**. Фундаментальні блокери: (а) немає raw IMU → ESKF дрейфує за рахунок тільки VO; (б) Mock satellite index повертає координати «в іншій півкулі світу» (не реальні tiles України), тому Mahalanobis gate відхиляє satellite estimates як outliers (Δ²~10⁹). Залишаємо xfail із задокументованою причиною. Розблокувати зможе: реальні satellite tiles (MapTiler MBTiles) **АБО** cuVSLAM Mono-Depth з барометром (dataset-level synthetic IMU).]
### 5.1a Sprint 1 VO migration — виконано (2026-04-18 ніч)
Plan: `docs/superpowers/plans/2026-04-18-sprint1-vo-migration.md`. 7 комітів, 216 passed / 8 skipped.
- [x] **CuVSLAMMonoDepthVisualOdometry** додано (`src/gps_denied/core/vo.py`). Приймає `depth_hint_m` (барометрична висота) як параметр, dev/CI fallback масштабує ORB translation на `depth_hint_m / 600.0`. Клас чітко вказує у docstring що `solution.md` говорить `INERTIAL mode` — але цей режим потребує stereo, тому фактично використовується `MONO_DEPTH`.
- [x] **`create_vo_backend()`** оновлено з параметрами `prefer_mono_depth` і `depth_hint_m`.
- [x] **GlobalPlaceRecognition** маркований як AnyLoc-VLAD-DINOv2 baseline. Selection rationale (NetVLAD deprecated, SP+LG не валідований для cross-view) — в docstring. 2 marker-тести: 4096-d descriptor + DINOv2 engine name через mock.
- [x] **GPS_INPUT field encoding** — 12 unit-тестів в `tests/test_gps_input_encoding.py` проти `_eskf_to_gps_input` (degE7 lat/lon, ENU→NED velocity, ConfidenceTier→fix_type, synthetic satellites_visible=10, hdop floor).
- [x] **EuRoC Mono-Depth regression guard** (`test_euroc_mh01_mono_depth_within_ceiling`) — smoke test + ORB pipeline ceiling 0.5 м. Baseline незмінний: 0.2046 м.
- [x] **`update_depth_hint` tests** — clamp at 1.0 м і per-call scale update через mock.
- [decision 2026-04-18: **не переписуємо solution.md** (Inertial → Mono-Depth). Це окрема задача з §1. Поточний код явно документує розходження в docstring класу + design doc + next_steps.md §5.1a. Аудит `solution.md` — окремий спринт.]
- [decision 2026-04-18: **не створюємо новий AnyLocGPR клас**`GlobalPlaceRecognition` у docstring вже стверджував «AnyLoc (DINOv2)». Замість дублювання — розширили docstring і додали marker-тести.]
- [decision 2026-04-18: **E2E harness поки не wireує Mono-Depth через pipeline** — harness хардкодить `ORBVisualOdometry()`. Додати `vo_backend` параметр і прогнати Mono-Depth через pipeline — sprint 2 task. TODO marker у vo.py.]
### 5.2 Відкореговано в плані (наступні дії)
**cuVSLAM стратегія** (research §1, §2):
@@ -167,19 +181,21 @@ Research документ `docs/superpowers/specs/2026-04-18-oss-stack-tech-audi
**Тиждень 1 (починається 2026-04-19):**
- [x] numpy pin ← зроблено 2026-04-18
- [x] Prototype CuVSLAMMonoDepthVisualOdometry class з dev/CI scaled ORB fallback ← зроблено 2026-04-18 (§5.1a)
- [x] GPS_INPUT field encoding tests ← зроблено 2026-04-18 (§5.1a)
- [ ] Перевірити FC processor (H743 vs F405) — спитати постачальника
- [ ] Перевірити поточний IMU rate через MAVLink (за замовчуванням ArduPilot шле 50 Hz, треба ≥100 Hz для Mono-Inertial; для Mono-Depth не критично)
- [ ] Prototype cuVSLAM Mono-Depth з барометром як synthetic depth (на EuRoC — IMU дає altitude, нема барометра, але можна подавати GT altitude як proxy)
- [ ] Прогнати [aero-vloc](https://github.com/prime-slam/aero-vloc) benchmark на VPAIR nadir кадрах до того як фіксувати Faiss index дизайн
**Тиждень 2:**
- [ ] cuVSLAM Mono-Depth інтеграція в E2EHarness (новий `_ScaledVO` analog, але scale береться per-frame з GT altitude)
- [ ] Порівняти ATE: ORB (поточний baseline 0.205 м на MH_01) vs cuVSLAM Mono-Depth
- [ ] AnyLoc offline setup + перший тест на satellite tiles
- [ ] Wire CuVSLAMMonoDepthVisualOdometry через E2EHarness (додати `vo_backend` параметр, прогнати Mono-Depth через pipeline замість хардкоду ORB)
- [ ] Порівняти ATE: ORB (поточний baseline 0.2046 м на MH_01) vs CuVSLAMMonoDepthVisualOdometry через pipeline
- [ ] Колапс дуплікатного коду між `CuVSLAMVisualOdometry` (Inertial) і `CuVSLAMMonoDepthVisualOdometry` — видалити Inertial варіант
- [ ] AnyLoc offline setup + перший тест на реальних MapTiler tiles
**Тиждень 3:**
- [ ] XFeat TRT export для satellite matching (окремий трек від VO — не VO fallback)
- [ ] MAVLink GPS_INPUT injection тест на SITL
- [ ] MAVLink GPS_INPUT injection тест на SITL (docker-compose.sitl.yml)
- [ ] Визначити чи варто піднімати IMU rate для майбутнього Mono-Inertial
### 5.4 Відкриті питання (research §7)