mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-04-23 01:56:37 +00:00
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:
+21
-5
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user