mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-23 00:31:12 +00:00
Refactor documentation for splittable artifacts and update references
Updated various documentation files to clarify the handling of splittable artifacts, allowing for folder equivalents of key markdown files when they exceed size limits. Adjusted references in multiple sections to reflect this new structure, ensuring consistency across the research methodology. Enhanced clarity on the saving actions and artifact organization, particularly for `01_source_registry.md`, `02_fact_cards.md`, and `06_component_fit_matrix.md`. This change aims to improve usability and maintainability of the research documentation.
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
# Component Fit Matrix — Index & Summary
|
||||
|
||||
> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate, structured per-component candidate-selection table). One row per component area (C1–C10 from `../00_question_decomposition.md`); each row enumerates candidates with status, license, key fit dimensions, and a cite of the per-numbered-Restriction × per-numbered-AC sub-matrix in [`../02_fact_cards/`](../02_fact_cards/) that supports the status. Rows are filled progressively as SQ3+SQ4 closes per component.
|
||||
|
||||
This folder replaces the previous monolithic `06_component_fit_matrix.md` (284 lines, dominated by very wide tables that no longer fit in a single editor view). Each component lives in its own file. Open the file matching the component you need — every status verdict and Plan-phase decision is preserved verbatim.
|
||||
|
||||
---
|
||||
|
||||
## Status vocabulary (per engine rule)
|
||||
|
||||
| Status | Meaning |
|
||||
|---|---|
|
||||
| **Selected** | Documentary verification ✅ + Jetson Orin Nano Super hardware MVE ✅; promoted as the implementation choice for the project |
|
||||
| **Documentary lead** | Documentary verification ✅ (mode pinned, MVE block, sub-matrix); Jetson MVE pending; eligible for Selected promotion in the dedicated bring-up phase |
|
||||
| **Experimental only** | Documentary verification surfaced a partial mismatch or contradiction; cannot be Selected without the deferred Jetson MVE explicitly resolving the contradiction (per Per-Mode API Capability Verification rule) |
|
||||
| **Conditional** | Candidate fits only as a sub-component of a hybrid design; cannot be a drop-in lead (e.g., VO-only candidate that requires an external IMU wrapper) |
|
||||
| **Mandatory simple-baseline** | Candidate is required by the engine's Component Option Breadth rule as a runnable fallback / regression baseline; not a lead |
|
||||
| **Rejected — disqualified** | Documentary evidence explicitly contradicts a hard project disqualifier (e.g., AC-4.2 memory budget, license blocks dual-use); excluded from further consideration |
|
||||
| **N/A** | Candidate is not applicable to this component area (cataloged for completeness only) |
|
||||
|
||||
---
|
||||
|
||||
## Component index
|
||||
|
||||
| File | Component | Closure status | Top documentary leads | Hard disqualifiers |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| [`C1_vio.md`](C1_vio.md) | **C1** — Visual / Visual-Inertial Odometry | Closed at documentary level (2026-05-08) | OKVIS2/OKVIS2-X (BSD/permissive track lead), OpenVINS (GPL-3.0 track lead), VINS-Mono (GPL-3.0 alternate, sub-20-Hz caveat), Pure VO + ESKF (mandatory simple-baseline) | DROID-SLAM (>11 GB VRAM exceeds AC-4.2), RTAB-Map + ORB-SLAM3 (rejected by SPRIN-D evidence at >1 km / >2 m/s) |
|
||||
| [`C2_vpr.md`](C2_vpr.md) | **C2** — Visual Place Recognition | Mandatory pre-screen CLOSED at 5/5 (2026-05-08); conditional AnyLoc/BoQ/DINOv2-VLAD GATED on INT8 survey | EigenPlaces (MIT, viewpoint-robust, simplest CNN), MixVPR (MIT, ResNet50 + MLP-Mixer), SelaVPR (MIT, DINOv2-L two-stage, best cross-season Tokyo24/7), SALAD (GPL-3.0, DINOv2-B + optimal-transport), NetVLAD (mandatory simple-baseline) | SuperGlue-as-reranker (matcher-class, not VPR-class) |
|
||||
| [`C3_matchers.md`](C3_matchers.md) | **C3** — Cross-domain registration (Matchers) | Closed at 5/N (2026-05-08); mandatory simple-baseline COMPLETE; modern-competitive-lead axis MATERIALLY EXPANDED | DISK+LightGlue (D-C3-1 RECOMMENDED-PRIMARY: clean Apache-2.0 throughout, +7.99 AUC@5° over SP), XFeat (D-C3-1 ALTERNATE: clean Apache-2.0, strongest embedded signal, cheapest retrain), ALIKED+LightGlue (D-C3-1 SECONDARY), SP+LightGlue (documentary baseline), SuperGlue+SuperPoint (mandatory simple-baseline) | SuperPoint Magic Leap noncommercial-research SLA blocks dual-use deployment (canonical SP+LightGlue + SuperGlue+SuperPoint); SuperGlue training code never released; MASt3R/RoMa/DKM/LoFTR dense matchers fail AC-4.1 latency |
|
||||
| [`C4_pose_estimation.md`](C4_pose_estimation.md) | **C4** — Pose estimation (PnP + RANSAC + LM) | IN PROGRESS at 3/N (mandatory simple-baseline + 2 modern-competitive-leads COMPLETE 2026-05-08); D-C4-1 (3-DoF vs 4-DoF vs 6-DoF lift) carried forward from Fact #20 + REINFORCED by Fact #52; D-C4-2 (covariance-recovery-strategy) NEW from Fact #52 + UPDATED by Fact #54 (GTSAM Marginals NATIVE); D-C4-3 (license-clearance verification) + D-C4-4 (maintenance-staleness mitigation) NEW from Fact #53 (OpenGV-only) | OpenCV `cv::solvePnPRansac` (mandatory simple-baseline, clean Apache-2.0 throughout, JetPack 6 canonical distribution = zero-effort Jetson deployment); **GTSAM `Marginals.marginalCovariance`** (modern-competitive-lead-covariance-honest, clean BSD-3-Clause throughout, **NATIVE 6×6 pose covariance — only C4 candidate to satisfy AC-NEW-4 NATIVELY**, daily-active maintenance, 1121 context7 code snippets); OpenGV `absolute_pose::AbsolutePoseSacProblem(KNEIP)` (modern-competitive-lead-richer-minimal-solver, BSD-3-Clause-equivalent CONTINGENT on D-C4-3, ~3-year stale CONTINGENT on D-C4-4, NO planar-scene solver) | (none yet) |
|
||||
| [`C5_state_estimator.md`](C5_state_estimator.md) | **C5** — State estimator / sensor fusion | **CLOSED at 2/N (batch 1 closed 2026-05-08)** — mandatory simple-baseline + 1 modern-competitive-lead-factor-graph COMPLETE | Manual ESKF (Solà 2017 canonical aerial/quaternion reference, public-domain academic preprint + project's Apache-2.0 implementation, mandatory simple-baseline, native 6×6 covariance via analytic Jacobian propagation); **GTSAM iSAM2 + CombinedImuFactor (Forster et al. RSS 2015) + smart factors + Marginals.marginalCovariance + IncrementalFixedLagSmoother** (modern-competitive-lead-factor-graph, clean BSD-3-Clause throughout, **architecturally couples with C4 Fact #54 GTSAM Marginals via shared substrate**, **NATIVE AC-4.5 look-back refinement**, daily-active maintenance) | (none yet) |
|
||||
| [`C6_tile_cache_spatial_index.md`](C6_tile_cache_spatial_index.md) | **C6** — Tile cache + spatial index | **CLOSED at 2/N (batch 1 closed 2026-05-08)** — mandatory simple-baseline + 1 modern-competitive-lead-spatial-extension COMPLETE; **Cand 1 RECOMMENDED PRIMARY** | **Cand 1 (RECOMMENDED PRIMARY)**: Manual mirror of existing parent-suite `satellite-provider` pattern — PostgreSQL btree composite on slippy-map `(tile_zoom, tile_x, tile_y, version)` + bytea descriptor blobs + app-side FAISS HNSW loaded at takeoff + filesystem tile storage at `./tiles/{zoom}/{x}/{y}.{image_type}` (clean PostgreSQL License + MIT + LGPL/MIT-Apache; trivial dependency footprint; project-pattern alignment; empirically-confirmed Postgres-on-Jetson viability per Source #97 March 2026); **Cand 2 (DEFERRED secondary)**: PostgreSQL + PostGIS GiST on geography(POINT,4326) + pgvector HNSW for descriptor ANN + filesystem tile storage (modern-competitive-lead-spatial-extension; native KNN + radius + combined-SQL capabilities BUT 5-10× slower geographic lookup vs Cand 1 + heavier dependency + GPL-2.0-or-later license complexity + DIVERGENT from suite pattern + improvements marginal-to-negative in project's specific 3 Hz spatial-grid query operating context) | PostGIS GPL-2.0-or-later may CONTINGENT REJECT Cand 2 under D-C1-1 = (b) BSD/permissive-only-track |
|
||||
| [`C7_inference_runtime.md`](C7_inference_runtime.md) | **C7** — On-Jetson inference runtime | **CLOSED at 3/N (batch 1 closed 2026-05-08)** — top-2 documentary leads + mandatory simple-baseline COMPLETE; **Cand 1 RECOMMENDED PRIMARY** | **Cand 1 (RECOMMENDED PRIMARY)**: TensorRT native — JetPack 6.2 bundled TensorRT 10.3 + `IInt8EntropyCalibrator2` + `BuilderFlag.FP16+INT8` mixed-precision + engines built directly on Jetson Orin Nano Super SM 87 (clean Apache-2.0 in TensorRT 10.x; ships with JetPack so zero-effort install; lowest-latency primary path; 2-3× speedup at INT8 vs FP16 per Source #102 YOLO26 evidence); **Cand 2 (interop alternate)**: ONNX Runtime + TensorRT EP — `onnxruntime-gpu` via Jetson AI Lab JP6/CU126 wheel index + `TensorrtExecutionProvider` config + automatic CUDA EP / CPU EP subgraph fallback (clean MIT throughout; cross-architecture portability for replay/SITL on x86 dev hosts; modern-competitive-lead-cross-architecture-portability); **Cand 3 (mandatory simple-baseline)**: pure PyTorch FP16 — `torch.amp.autocast` + `model.half()` + Jetson AI Lab PyTorch 2.5 ARM64 wheel (clean BSD-3-Clause throughout; zero-conversion regression baseline; reference-correctness oracle for accuracy validation of TRT-built engines) | INT8-only candidates marked Experimental until D-C7-1 calibration dataset materializes; matchers (LightGlue, XFeat, XFeat+LighterGlue) are FP16-only — NO INT8 — per D-C7-6 cross-component model-family precision policy due to Source #103 quantization-sensitivity finding |
|
||||
| [`C8_fc_adapter.md`](C8_fc_adapter.md) | **C8** — MAVLink / MSP2 FC adapter | **CLOSED at 3/N (batch 1 closed 2026-05-08)** — top-1 per FC for ArduPilot + parallel-evaluation per FC for iNav after mid-batch contradiction recovery COMPLETE; **Cand 1 RECOMMENDED PRIMARY for AP, Cand 2 RECOMMENDED PRIMARY for iNav** | **Cand 1 (RECOMMENDED PRIMARY for ArduPilot)**: pymavlink → MAVLink `GPS_INPUT` (msg 232) cooperative-path; `master.mav.gps_input_send(...)` periodic injection at 5 Hz over MAVLink (UART/USB/UDP); FC-side `GPS1_TYPE=14` MAVLink + `EK3_SRC1_POSXY=3` GPS source-set drives EKF3 ingestion via `AP_GPS_MAV` (LGPL-3.0 pymavlink linkable from Apache-2.0 app per LGPL §6; canonical ArduPilot stack); **Cand 2 (RECOMMENDED PRIMARY for iNav)**: `MSP2_SENSOR_GPS` (id 7939 / 0x1F03) via Python MSP V2 implementation YAMSPy or INAV-Toolkit `msp_v2_encode`; `mspGPSReceiveNewData()` direct passthrough; covariance fields `hPosAccuracy/vPosAccuracy/hVelAccuracy` align directly with AP `GPS_INPUT.horiz_accuracy/vert_accuracy/speed_accuracy` (MIT throughout; clean dual-use compatible; locked SQ6 + AC-4.3 transport); **Cand 3 (DEFERRED secondary for iNav)**: UBX impersonation via pyubx2 NAV-PVT — forging u-blox NAV-PVT frames through standard GPS pipeline; iNav-side `gpsMapFixType()` validation gate requires `flags & 0x01 = 1` (gnssFixOK) AND `fixType ∈ {2,3}`; pyubx2 BSD-3-Clause; **does NOT clear user's "significant-improvement-only" bar over Cand 2** (richer protocol surface + AC-NEW-7 forgery posture + stricter validation gate + AP-path field-name divergence outweigh pyubx2 library-maturity advantage). **Mid-batch correction**: I caught a contradiction between my own initial AskQuestion phrasing ("UBX impersonation as ONLY iNav path") and locked SQ6 + AC-4.3 + restrictions.md verdicts (MSP2_SENSOR_GPS as iNav primary); user re-locked scope via `c8_inav_recovery=B` to evaluate both as parallel candidates | (none yet — pymavlink LGPL-3.0 license posture handled via D-C8-3 = (a) bundle-unmodified-with-version-pin per LGPL §6 standard compliance) |
|
||||
| [`C10_preflight_provisioning.md`](C10_preflight_provisioning.md) | **C10** — Pre-flight cache provisioning (CROSS-COUPLING MINIMAL scope per 2026-05-08 user choice C; operator CLI/desktop tooling, sector classification, freshness schema deferred to Plan-phase) | **CLOSED at 2/N (batch 1 closed 2026-05-08)** — D-C6-3 + D-C7-7 cross-component gates closed; no further C10 batches required at research layer | **D-C6-3 confirmation**: direct `faiss.write_index` / `faiss.read_index` Python API + `python-atomicwrites` + content-hash verification gate at takeoff + manifest-hash-driven rebuild trigger + `IO_FLAG_MMAP_IFC` mmap load (FAISS MIT, atomicwrites MIT throughout); **D-C7-7 confirmation**: hybrid Polygraphy CLI primary for INT8-calibrating builds + `trtexec` for cache-reuse fast rebuilds + direct `IBuilderConfig` Python API for unusual models (LightGlue dynamic shapes) — Polygraphy + TensorRT 10.x Apache-2.0 throughout, calibration corpus per D-C7-1 closure | (none — both candidates Apache-2.0/MIT clean; FAISS "no internal integrity check" warning mitigated by content-hash gate; `trtexec --int8` random-data caveat mitigated by project-side wrapper enforcing `--calib=<existing_cache>` non-empty precondition) |
|
||||
| [`99_cross_component_gates.md`](99_cross_component_gates.md) | **Cross-component process gates** | Open — Plan-phase Choose blocks raised by C1+C2+C3+C4+C5+C6+C7+C8+C10 closures | D-C1-1 license posture, D-C1-2 Jetson MVE, D-C2-1..11 (VPR retrain/cache/dim), D-C3-1..6 (matcher mitigation/runtime/K-pairs/ALIKED-mode/DISK-weights/XFeat-mode), D-C4-1..4, **D-C5-1..5 (Manual ESKF + GTSAM iSAM2)**, **D-C6-1..7**, **D-C7-1..9**, **D-C8-1..8**, **D-C10-1 (descriptor-cache rebuild trigger — manifest-hash-driven recommended, NEW from Fact #100)**, **D-C10-2 (descriptor-cache atomic-write strategy — `python-atomicwrites` recommended, NEW from Fact #100)**, **D-C10-3 (content-hash verification gate at takeoff load — reject + STATUSTEXT + refuse takeoff recommended, NEW from Fact #100, CROSS-COMPONENT with AC-NEW-7)**, **D-C10-4 (descriptor-cache load path — mmap with `madvise(MADV_WILLNEED)` pre-fault recommended, NEW from Fact #100)**, **D-C10-5 (TensorRT engine-build orchestration tool — hybrid Polygraphy + trtexec + direct API recommended, NEW from Fact #101, CROSS-COMPONENT with C7)**, **D-C10-6 (TensorRT calibration-cache reuse strategy — rebuild-on-calib-corpus-SHA-256-change recommended, NEW from Fact #101, CROSS-COMPONENT with D-C7-1)**, **D-C10-7 (TensorRT engine on-disk filename schema — self-describing `<model>_sm<SM>_jp<JP>_trt<TRT>_<precision>.engine` recommended, NEW from Fact #101)**, **D-C10-8 (TensorRT prebuilt-fallback engine generation venue — reference Jetson at HQ + deployed-Jetson-copy-to-archive recommended, NEW from Fact #101)**, Fact #40 dual-rate camera pipeline | n/a |
|
||||
|
||||
---
|
||||
|
||||
## Reading order
|
||||
|
||||
For first-time readers:
|
||||
|
||||
1. **Start here** — read this index plus the status vocabulary above.
|
||||
2. Read the closed component rows in order: [`C1_vio.md`](C1_vio.md) → [`C2_vpr.md`](C2_vpr.md) → [`C3_matchers.md`](C3_matchers.md). These three are the dense rows; each carries its own per-license-track preliminary ranking and per-row Plan-phase deliverables.
|
||||
3. Skim [`C4_pose_estimation.md`](C4_pose_estimation.md) for the pinned input/output contract and D-C4-1 carry-forward.
|
||||
4. Skim [`C5_state_estimator.md`](C5_state_estimator.md) for the pinned input/output contract + GTSAM-as-shared-C4+C5-substrate hybrid path D-C5-5 = (c) recommendation.
|
||||
5. Skim [`C6_tile_cache_spatial_index.md`](C6_tile_cache_spatial_index.md) for the pinned input/output contract + Cand 1 (mirror-suite-pattern) RECOMMENDED PRIMARY rationale + Cand 2 (PostGIS+pgvector) DEFERRED-secondary criteria.
|
||||
6. Skim [`C7_inference_runtime.md`](C7_inference_runtime.md) for the pinned input/output contract + TensorRT-native RECOMMENDED PRIMARY rationale + per-model-family precision policy (D-C7-6).
|
||||
7. Skim [`C8_fc_adapter.md`](C8_fc_adapter.md) for the pinned per-FC input/output contract + pymavlink-GPS_INPUT (AP) + MSP2_SENSOR_GPS (iNav) RECOMMENDED PRIMARY rationale + UBX-impersonation DEFERRED-secondary criteria (Cand 3 vs Cand 2 comparative-improvement verdict).
|
||||
8. Skim [`C10_preflight_provisioning.md`](C10_preflight_provisioning.md) for the C10 cross-coupling-minimal scope (D-C6-3 descriptor-cache rebuild + D-C7-7 TensorRT engine build confirmation pipelines; operator tooling design deferred to Plan).
|
||||
9. Cross-reference [`99_cross_component_gates.md`](99_cross_component_gates.md) when reviewing Plan-phase decisions; it consolidates every D-Cx-y gate raised across rows with the owner and resolution path.
|
||||
|
||||
For session-by-session updates: append to the matching row file. The summary table here only needs an update when a row's closure state, top documentary leads, or hard disqualifiers change.
|
||||
|
||||
---
|
||||
|
||||
## Editing rules
|
||||
|
||||
1. Each row file owns its candidate table, per-license-track ranking, and Plan-phase deliverables. Do not duplicate that content here; just refresh the one-line "Top documentary leads" / "Hard disqualifiers" cells when a row's verdict moves.
|
||||
2. Keep the "Sub-matrix cite" column in row files pointing at `../02_fact_cards/Cx_*.md` (not the deprecated `02_fact_cards.md`).
|
||||
3. New cross-cutting Plan-phase decisions (D-Cx-y) go into [`99_cross_component_gates.md`](99_cross_component_gates.md) under the matching component owner.
|
||||
4. When a C-row's candidate list changes, also touch the matching `../02_fact_cards/Cx_*.md` so the fact bindings stay aligned.
|
||||
@@ -0,0 +1,74 @@
|
||||
# Component Fit Matrix — Cross-component process gates
|
||||
|
||||
> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate). Plan-phase Choose blocks raised by C1, C2, C3, C4, C5, C6, C7, C8, and C10 closures. Each gate names its owner and the resolution path. Backing fact cards live in [`../02_fact_cards/`](../02_fact_cards/) by component.
|
||||
>
|
||||
> Index: [`00_summary.md`](00_summary.md). Per-component rows: [C1](C1_vio.md), [C2](C2_vpr.md), [C3](C3_matchers.md), [C4](C4_pose_estimation.md), [C5](C5_state_estimator.md), [C6](C6_tile_cache_spatial_index.md), [C7](C7_inference_runtime.md), [C8](C8_fc_adapter.md), [C10](C10_preflight_provisioning.md). C9 dropped per 2026-05-08 restructure — see `../00_question_decomposition.md`.
|
||||
|
||||
---
|
||||
|
||||
## Cross-component process gates open (raised this session and prior)
|
||||
|
||||
| Gate | Owner | Resolution path |
|
||||
|---|---|---|
|
||||
| **D-C1-1 GPL-3.0 license posture** | User | Plan-phase Choose block (A/B/C) before any C1 candidate is locked Selected |
|
||||
| **D-C1-2 Jetson Orin Nano Super hardware MVE phase** | Project bring-up team | Dedicated bring-up phase between research and Plan; produces single Jetson-MVE artifact that promotes Documentary leads to Selected (covers C1 AND C2 candidates per D-C2-4) |
|
||||
| **Fact #40: single-rate vs dual-rate nav-camera pipeline** | Plan-phase architect | Plan-time decision; affects C1 candidate ranking; affects C2/C3 candidate scoring |
|
||||
| **D-C2-1 VPR canonical-weights vs aerial-retrain vs aerial-community-checkpoint** (raised by MixVPR closure 2026-05-08; reaffirmed by SALAD + SelaVPR closures) | User + Plan-phase architect | Plan-phase Choose block (A/B/C) before any C2 candidate is locked Selected; applies to **every** ground-level-pretrained C2 candidate (MixVPR + SALAD + SelaVPR all street-view-trained); SelaVPR README recommends MSLS-finetuned variant for "diverse scenes" cross-domain transfer as default |
|
||||
| **D-C2-2 descriptor-cache carve-out vs raw-tile-cache budget** (raised by MixVPR closure 2026-05-08; harshened by SALAD; **materially-changed-shape by SelaVPR**) | Plan-phase architect | Plan-time decision; AC-8.3 explicitly requires this. **Per-candidate global-descriptor cache**: SelaVPR 1024-D ~3.2% (smallest); MixVPR 2048-D ~6.5%; SALAD-slim 544-D ~1.7%; SALAD-full 8448-D ~27%. **NEW SelaVPR local-feature-cache pressure**: ~150 GB if naive cache → forces D-C2-7 mitigation choice. Conditional candidates (AnyLoc/BoQ/DINOv2-VLAD) at higher dimensionality push descriptor cache to ~10 GB alone, forcing carve-out |
|
||||
| **D-C2-3 input-resolution shape (224×224 vs 320×320 vs 322×322 vs higher)** (raised by MixVPR closure 2026-05-08; harshened by SelaVPR's 224×224) | Plan-phase architect | Plan-phase decision after all C2 candidates have per-Mode entries; trade-off span: SelaVPR's 224×224 (most aggressive downscale) → MixVPR's 320×320 / SALAD's 322×322 (medium) → AnyLoc/BoQ at 322+ ViT (highest, next sessions) |
|
||||
| **D-C2-4 deferred Jetson Orin Nano Super hardware MVE phase coverage for C2** (raised by MixVPR closure 2026-05-08; scope-broadened by SALAD; **broadened further by SelaVPR**) | Project bring-up team | Same artifact as D-C1-2 must produce per-C2-candidate latency + memory + AerialExtreMatch Recall@K numbers + DINOv2 ViT-B AND ViT-L → TensorRT fp16/INT8 export quality + SelaVPR two-stage re-ranking latency profile + on-demand local-feature extraction performance |
|
||||
| **D-C2-5 DINOv2 ViT-export to TensorRT fp16/INT8 path on Jetson Orin Nano Super** (raised by SALAD closure 2026-05-08; **harshened by SelaVPR closure**) | Project bring-up team + C7 inference-runtime owner | Jetson MVE phase must validate DINOv2-B AND DINOv2-L export paths before any ViT-based C2 candidate (SALAD, SelaVPR, AnyLoc, BoQ, DINOv2-VLAD) advances from Documentary lead to Selected. SelaVPR's ViT-L is 3.5× larger than SALAD's ViT-B; counter-mitigation by SelaVPR's frozen-backbone canonical export pathway (FB AI Public Files distribution) |
|
||||
| **D-C2-6 SALAD descriptor-size choice (8448-D / 2112-D / 544-D)** (raised by SALAD closure 2026-05-08; SALAD-only, does not apply to SelaVPR) | Plan-phase architect | Plan-time decision; full variant best R@1 but consumes ~27% of AC-8.3 cache budget; slim 544-D fits within 1.7% but loses ~5 R@1 points on MSLS Challenge. Interacts with D-C2-2 carve-out decision |
|
||||
| **D-C2-7 SelaVPR re-ranking strategy choice (full re-rank with on-demand local-feature extraction / cache top-K local features per likely query path / disable re-ranking entirely and use SelaVPR-global-only mode)** (NEW from SelaVPR closure 2026-05-08; SelaVPR-only, first two-stage C2 candidate) | Plan-phase architect | Plan-time decision conditional on SelaVPR being elevated to Selected. Full re-rank at rerank_num=100 fails AC-4.1 latency budget on Jetson extrapolation; rerank_num=20 fits but tight; on-demand local-feature extraction + global-only-cache (~320 MB) is most cache-efficient; precompute-top-K-local-features (~3 GB at K=20 with selective coverage) is moderate; disable-rerank gives single-stage parity (MSLS-challenge R@1=69.6 vs full's 73.5, still ahead of MixVPR's 64.0). **Three-way interaction with D-C2-2 + AC-8.3 + AC-4.1** |
|
||||
| **D-C2-8 NetVLAD PyTorch-port-strategy choice (Nanne/pytorch-NetVlad with license-uncertainty / re-port from canonical Relja/netvlad with MIT preservation / OpenVPRLab-NetVLAD-on-ResNet50 as separately-cataloged sibling mode)** (NEW from NetVLAD closure 2026-05-08; NetVLAD-only, first canonical-MATLAB-stack C2 candidate) | Plan-phase architect + license-posture decision-maker | Plan-time decision; canonical implementation is MATLAB + MatConvNet (not deployable on JetPack 6) — PyTorch port required. Nanne port is fastest path but README does NOT cite a LICENSE file → Plan-phase verification gate is a hard prerequisite before adoption; re-port from canonical Relja/netvlad MATLAB to PyTorch directly preserves MIT licensing alignment with MixVPR + SelaVPR on the BSD/permissive track but requires ~1 week of engineering + cluster-init prerequisite + retraining or weight-transfer; OpenVPRLab-NetVLAD-on-ResNet50 is apples-to-apples vs MixVPR but is a *different mode* per Per-Mode API rule (different backbone, different pretrained checkpoint provenance) and would be cataloged as a separate sibling candidate. **Recommendation: re-port from canonical** to preserve MIT licensing alignment |
|
||||
| **D-C2-9 NetVLAD descriptor-dimension choice (canonical 4096-D PCA-whitened / 512-D `cropToDim` for tighter cache / 256-D `cropToDim` for tightest cache)** (NEW from NetVLAD closure 2026-05-08; NetVLAD-only; analogous to D-C2-6 SALAD descriptor-size choice but for NetVLAD's PCA-whitened output) | Plan-phase architect | Plan-time decision; canonical 4096-D consumes ~1.3 GB / 13% of 10 GB AC-8.3 cache budget — **largest single-stage descriptor cache** of any C2 candidate evaluated so far; 512-D `cropToDim` reduces to ~160 MB / 1.6% at additional Recall@K loss; 256-D `cropToDim` reduces to ~80 MB / 0.8% at further loss. Only valid for `+whitening` networks. Interacts with D-C2-2 carve-out decision. Given NetVLAD's mandatory-baseline role (NOT a competitive lead), the 256-D / 512-D `cropToDim` variants may be more appropriate to free cache budget for the modern lead's larger descriptor — but Plan must decide explicitly |
|
||||
| **D-C2-10 EigenPlaces descriptor-dimension choice (canonical 2048-D / 512-D / 256-D / 128-D — eleven backbone+dim sibling modes PyTorch-Hub-distributed)** (NEW from EigenPlaces closure 2026-05-08; EigenPlaces-only; analogous to D-C2-6 SALAD and D-C2-9 NetVLAD descriptor-dimension choices) | Plan-phase architect | Plan-time decision; canonical ResNet-50 + 2048-D consumes ~650 MB / 6.5% of AC-8.3 cache budget (identical to MixVPR-2048 for direct apples-to-apples comparison); 512-D variant reduces to ~160 MB / 1.6% at modest Recall@1 loss (paper Tab 3: Pitts30k 91.9 at 512 vs 92.5 at 2048 = -0.6, Tokyo24/7 89.8 at 512 vs 93.0 at 2048 = -3.2 — extreme cross-domain hurts most); 256-D reduces to ~80 MB / 0.8% at moderate Recall@K loss; 128-D reduces to ~40 MB / 0.4% at substantial Recall@K loss on cross-domain (paper §4.3 explicit observation). Eleven canonical pretrained checkpoints PyTorch-Hub-distributed give the project the widest range of cache-footprint sibling modes of any C2 candidate evaluated. Interacts with D-C2-2 carve-out decision |
|
||||
| **D-C2-11 (CONDITIONAL) MegaLoc successor evaluation as separately-cataloged sibling candidate** (NEW from EigenPlaces closure 2026-05-08; raised by canonical EigenPlaces README explicit pointer "EigenPlaces is quite old. Looking for SOTA Visual Place Recognition (VPR)? Check out MegaLoc") | User + Plan-phase architect | Plan-phase decision: (a) treat MegaLoc as a separately-cataloged sibling candidate at Plan time (would require its own per-mode API capability verification + sub-matrix), (b) defer MegaLoc evaluation to a post-research session if EigenPlaces fails Jetson MVE, (c) skip MegaLoc and rely on the closed mandatory pre-screen (5/5: MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces). **Recommendation**: defer to post-research session — EigenPlaces closes the mandatory pre-screen at the documentary-required floor, and MegaLoc's Plan-phase relevance depends on which D-C1-1 license-track is chosen and how Jetson MVE results land |
|
||||
| **D-C1-1 license-posture interaction with C2** (already raised by C1; sharpened by SALAD-GPL-3.0; materially-positive update from SelaVPR-MIT 2026-05-08; further-positive update from NetVLAD-MIT canonical 2026-05-08 with Nanne-port license-uncertainty Plan-phase verification gate; **fully-positive update from EigenPlaces-MIT 2026-05-08 closing the BSD/permissive C2 axis**) | User + Plan-phase architect | **BSD/permissive C2 axis (mandatory pre-screen COMPLETE 2026-05-08)** (under D-C1-1 = (b) or default (c)): MixVPR (CNN-ResNet50 + MLP-Mixer, MIT) + **SelaVPR (DINOv2 ViT-L/14 two-stage, MIT)** + **NetVLAD (CNN-VGG16 + soft-assignment-VLAD, MIT canonical / license-uncertain Nanne PyTorch port — D-C2-8 verification gate, mandatory simple-baseline)** + **EigenPlaces (CNN-ResNet50 + GeM + FC viewpoint-robust training paradigm, MIT)**. **GPL-3.0 C2 axis** (under D-C1-1 = (a) or default (c)): SALAD (DINOv2 ViT-B + optimal-transport, GPL-3.0) + (conditional next-sessions: AnyLoc/BoQ/DINOv2-VLAD pending license verification + INT8 quantization survey prerequisite). EigenPlaces's MIT-canonical placement materially completes the BSD/permissive C2 axis with **four materially-different design points** spanning 2016 (NetVLAD baseline VLAD) → 2023 (MixVPR ResNet50+MLP-Mixer) → 2023 (EigenPlaces ResNet50+GeM+viewpoint-robust-training) → 2024 (SelaVPR DINOv2-L+two-stage). The BSD/permissive C2 axis now has the **most diverse design-point coverage of any license track in any component row in the project** |
|
||||
| **D-C3-1 (NEW from SP+LightGlue closure 2026-05-08) — SuperPoint-replacement-strategy choice (DISK+LightGlue with Apache-2.0 + paper Table 6 superiority [RECOMMENDED] / ALIKED+LightGlue with BSD-3-Clause+Apache-2.0 / SuperPoint-reproduction-with-permissive-license / accept-Magic-Leap-noncommercial-with-swap-commitment / SIFT+LightGlue classical-baseline-fallback)** | User + Plan-phase architect + license-posture decision-maker | Mandatory Plan-phase decision; canonical SuperPoint pretrained weights LICENSE (Source #72 Magic Leap noncommercial-research-only Software License Agreement) is a **HARD DISQUALIFIER** on the canonical SP+LightGlue mode in the project's dual-use deployment context (eastern/southern Ukraine fixed-wing UAV with AC-NEW-2 spoofing-promotion path is dual-use military by every reasonable interpretation, and the project's question_decomposition.md hard disqualifier list includes "anything whose license blocks military / dual-use deployment"). **Recommendation: D-C3-1 = (a) DISK+LightGlue** — Apache-2.0 throughout AND paper Appendix A Table 6 documentary technical superiority over canonical SP+LightGlue (+7.99 absolute AUC@5° on IMC 2020 stereo). Interacts with D-C1-1 (license-posture overall) + D-C2-1 (aerial-domain training, since DISK+LightGlue retrain is the cleanest license-compliant + retrain-friendly pathway) |
|
||||
| **D-C3-2 (NEW from SP+LightGlue closure 2026-05-08) — LightGlue-inference-runtime choice (PyTorch-fp16 / Torch-TensorRT / ONNX Runtime + TensorRT EP via Source #73 / pure TensorRT via trtexec + Polygraphy via Source #73 / FP8 ModelOpt-on-Jetson if Ampere FP8 emulation works)** | Project bring-up team + C7 inference-runtime owner | Plan-phase decision conditional on D-C3-1 lock + Jetson MVE results; Source #73 (`fabio-sim/LightGlue-ONNX`) is the canonical reference for ONNX / TensorRT / OpenVINO / FP16 / FP8 export pathway with January 2026 active maintenance. **CRITICAL Jetson Orin Nano Super FP8 emulation gate**: Source #73 documents FP8 ModelOpt workflow on Hopper/Ada/Blackwell — Jetson Orin Nano Super is Ampere architecture (NOT FP8-native); FP8 ModelOpt path applies only with INT8 emulation fallback (verification at Jetson MVE phase). Likely rolls into the C7 cross-cutting integration row |
|
||||
| **D-C3-3 (NEW from SP+LightGlue closure 2026-05-08) — K-pairs-per-frame budget choice (reduce K from 10 to 3-5 / reduce keypoints from 1024 to 512 / accept TIGHT 300-600 ms standard ÷ 150-300 ms adaptive margin and validate at Jetson MVE / parallelize matcher across multiple Jetson GPU streams / elevate ONNX Runtime + TensorRT EP + adaptive depth)** | Plan-phase architect | Plan-phase decision; canonical RTX-3080 throughput 150 FPS @ 1024 keypoints with adaptivity → Jetson Orin Nano Super extrapolation ~30-60 ms per pair → at K=10 top-K retrieval pairs per UAV frame = 300-600 ms standard / 150-300 ms adaptive against AC-4.1 400 ms budget — TIGHT before C1+C2+C5+C8 costs added. **Three-way interaction with AC-4.1 latency budget + AC-3.3 re-localization recall + AC-1.1/1.2 frame-center pose accuracy**. Adaptive-depth path (paper §5.4 1.86× speedup on easy pairs) is the most-favorable structural trade-off if many of the K pairs are high-overlap UAV-vs-cached-tile pairs. **MORE-TIGHT D-C3-3 gate for ALIKED+LightGlue** vs DISK+LightGlue or SP+LightGlue due to PyTorch-fp16-only restriction (ALIKED-export-absence in LightGlue-ONNX) — likely requires K reduction from 10 to 3-5 OR ALIKED-T(16) 64-D sibling mode for AC-4.1 satisfaction |
|
||||
| **D-C3-4 (NEW from ALIKED+LightGlue closure 2026-05-08) — ALIKED-sibling-mode choice (ALIKED-T(16) 64-D Jetson-friendliest @ 1.37 GFLOPs / ALIKED-N(16) 128-D canonical baseline @ 4.05 GFLOPs / ALIKED-N(16rot) 128-D rotation-augmented @ same arch as N(16) / ALIKED-N(32) 128-D higher-SDDH-sample-count Aachen-best @ 4.62 GFLOPs)** | Plan-phase architect | Plan-phase decision conditional on D-C3-1 = (b) ALIKED+LightGlue secondary mitigation being selected; for project's UAV multi-heading 1 km AGL flights + Jetson PyTorch-fp16-only deployment (forced by ALIKED-export-absence in LightGlue-ONNX), **recommendation is ALIKED-N(16rot)** (rotation-augmentation aligns with multi-heading aerial flights; 4.05 GFLOPs leaves K=10 pairs/frame headroom; same 128-D descriptor as canonical N(16)). ALIKED-T(16) is the latency-fallback if AC-4.1 budget pressure forces 64-D descriptor reduction; ALIKED-N(32) is the accuracy-prioritization choice if Aachen-Day-Night documentary lift is the primary axis (paper Table VII at 2048 keypoints / 0.25m,2° tier = 77.6 best-in-paper). Interacts with D-C3-3 K-pairs-per-frame budget choice (T(16)'s 1.37 GFLOPs allows higher K than N(16)/N(32)'s 4.05/4.62 GFLOPs) |
|
||||
| **D-C3-5 (NEW from DISK+LightGlue closure 2026-05-08) — DISK-pretrained-weights-choice (`save-depth.pth` canonical default RECOMMENDED / `save-epipolar.pth` supplementary-material alternate -0.5 to -1 absolute AUC trade-off / project-domain retrain on aerial nadir corpus via canonical `colmap/colmap2dataset.py` workflow at ~2 weeks on 32 GB V100 cost)** | Plan-phase architect | Plan-phase decision conditional on D-C3-1 = (a) DISK+LightGlue RECOMMENDED-PRIMARY-MITIGATION being selected; for project's pinned UAV-vs-satellite-tile registration use case **`save-depth.pth` is the recommended canonical default** (strongest documentary IMW2020 stereo + multiview AUC numbers per canonical paper Table 1 + cross-paper Aachen Day-Night transitive lift via ALIKED paper Table VII). `save-epipolar.pth` is the fallback if depth-map ground-truth is unavailable for aerial-domain retrain (paper §4 epipolar reward variant trades 0.5-1 absolute AUC for not requiring depth maps). Interacts with D-C2-1 retrain decision (DISK retrain via `colmap/colmap2dataset.py` is well-documented but materially expensive ~2 weeks on 32 GB V100 / ~2 weeks at smaller batch on 12 GB low-memory variant — vs ALIKED's ~24 hours on RTX 3090) |
|
||||
| **D-C3-6 (NEW from XFeat closure 2026-05-08) — XFeat-mode-choice (XFeat sparse with MNN matching for SIMPLEST deployment / XFeat\* semi-dense with MNN+MLP-offset-refinement for HIGHEST inlier count per pair / XFeat+LighterGlue paired-matcher for MODERN learned-matcher accuracy)** | Plan-phase architect | Plan-phase decision conditional on XFeat being selected (D-C3-1 ALTERNATE-MODERN-COMPETITIVE-LEAD role alongside DISK+LightGlue's RECOMMENDED-PRIMARY-MITIGATION); for project's pinned UAV-vs-satellite-tile registration use case + AC-NEW-7 cache-poisoning safety budget + AC-3.3 re-localization stability, **(b) XFeat\* semi-dense is the strongest documentary structural choice** (4× more inliers per pair via lightweight MLP refinement provides best RANSAC stability at lowest engineering complexity — no LightGlue dependency, no productized-export dependency). (a) XFeat sparse is SIMPLEST deployment (D-C3-2 fully sidesteps cvg/LightGlue dependency; documentary AUC@5° materially below LightGlue-siblings); (c) XFeat+LighterGlue narrows MegaDepth-1500 gap to -2.5 to -2.8 absolute below SP+LightGlue at the cost of D-C3-2 reuse (community-contribution-needed for productized LighterGlue export pathway). Interacts with D-C2-1 retrain decision (XFeat is the cheapest retrain candidate among all C3 candidates evaluated at 36 hours single RTX 4090 + 6.5 GB VRAM total per Source #81 §3.3) and D-C3-2 (only XFeat+LighterGlue mode reuses D-C3-2 cvg/LightGlue runtime path; sparse + semi-dense modes sidestep entirely) |
|
||||
| **D-C4-1 (CARRIED FORWARD from Fact #20 C2 closure; REINFORCED by OpenCV `cv::solvePnPRansac` closure 2026-05-08 Fact #52) — 2D-3D-lift architectural decision (3-DoF acceptance with attitude-from-IMU/VIO prior + 2D ortho-only cache / 4-DoF acceptance with flat-earth + altitude-from-IMU+barometer prior + planar-scene homography → 4-DoF pose extraction / 6-DoF via aerial-photogrammetry-DSM-acquisition + paired DSM at 0.94 m/px / 6-DoF via ALOS 30m DSM with 4× accuracy collapse per Source #41)** | User + Plan-phase architect | Plan-phase decision; **for the project's pinned 2D-ortho-only cache + IMU-attitude-prior context, recommendation is (b) 4-DoF flat-earth + IMU+barometer altitude + VIO/IMU attitude → planar-scene homography → 4-DoF pose extraction** — pairs naturally with `flags=SOLVEPNP_IPPE` (Source #83 explicit "Object points must be coplanar" minimal-solver designed for D-C4-1 = 4-DoF flat-earth case); ALOS-30m-DSM secondary mitigation if 4-DoF accuracy proves insufficient at AC-1.1/1.2 50m/20m bars at the tighter tail. **CRITICAL REINFORCEMENT from Fact #52**: solvePnPRansac requires 3D-2D correspondences (Source #83 explicit `objectPoints` Nx3 + `imagePoints` Nx2 signature) — D-C4-1 lift is a HARD prerequisite for ANY C4 candidate (OpenCV / OpenGV / GTSAM-PnP / Theia / Ceres-only), not unique to OpenCV |
|
||||
| **D-C4-2 (NEW from OpenCV `cv::solvePnPRansac` closure 2026-05-08 Fact #52; UPDATED by GTSAM closure 2026-05-08 Fact #54) — covariance-recovery-strategy choice (post-hoc Jacobian-based via `cv::projectPoints` Jacobian + Schur complement / wrap solvePnPRansac result in GTSAM `Marginals` posterior / project-defined heuristic covariance scaling — likely AC-NEW-4 REJECT / migrate to OpenGV `absolute_pose::optimize_nonlinear` with custom Jacobian propagation through bearing-vector residuals)** | Plan-phase architect | Plan-phase decision; `cv::solvePnPRansac` returns `retval, rvec, tvec, inliers` only (Source #83 function signature); OpenGV's `optimize_nonlinear` has no covariance output API (Source #85) — **NO direct 6×6 covariance output from either OpenCV or OpenGV**. **GTSAM IS THE EXCEPTION**: `Marginals(graph, result).marginalCovariance(pose_key)` emits 6×6 posterior covariance NATIVELY (Source #87 multiple snippets). AC-NEW-4 covariance-honesty contract requires explicit recovery strategy. **Recommendation by primary path**: D-C4-2 = (b) **wrap solvePnPRansac result in GTSAM `Marginals` posterior** via `BetweenFactor<Pose3>` prior + per-inlier `GenericProjectionFactorCal3_S2` factors → `LevenbergMarquardtOptimizer.optimize()` → `Marginals.marginalCovariance` (canonical Plan-phase pathway documented in Fact #54; **STRONGLY RECOMMENDED for the OpenCV-as-RANSAC + GTSAM-as-covariance-recovery hybrid path** — couples Fact #52 mandatory-simple-baseline + Fact #54 modern-competitive-lead-covariance-honest); D-C4-2 = (a) post-hoc Jacobian-based via `cv::projectPoints` Jacobian + Schur complement on inlier residuals (~1 day engineering; pure OpenCV API) for the OpenCV-only-no-GTSAM path if Plan-phase Jetson MVE shows GTSAM's ~30-90 ms latency + ~50-200 MB memory footprint exceeds AC-4.1 / AC-4.2 budgets; D-C4-2 = (c) is likely AC-NEW-4 REJECT; D-C4-2 = (d) couples with D-C4-1 + D-C4-3 + D-C4-4 selection of OpenGV-as-primary at ~3-5 days engineering for OpenGV-internal Jacobian propagation through bearing-vector residuals (harder than OpenCV's pixel Jacobian per Fact #53 closure). **Three-way interaction with AC-NEW-4 covariance-honesty + D-C4-1 lift architectural decision + C5 fusion contract** (Fact #20 + #21 closures) |
|
||||
| **D-C4-3 (NEW from OpenGV closure 2026-05-08 Fact #53) — license-clearance verification choice (counsel-review of License.txt to confirm BSD-3-Clause-equivalent / request author + ShanghaiTech Mobile Perception Lab to relicense to OSI canonical / treat NOASSERTION as effective disqualifier and pivot to OpenCV-as-primary / elevate D-C4-3 to D-C1-1 and treat OpenGV as eligible only on GPL-3.0 or keep-both-tracks-open)** | License-posture decision-maker + Plan-phase architect | Plan-phase decision conditional on OpenGV being elevated to Selected; Source #84 GitHub API license metadata reports `license.spdx_id: "NOASSERTION"` for canonical `laurentkneip/opengv` repo; Source #84 direct WebFetch of License.txt confirms BSD-3-Clause-equivalent boilerplate (3 numbered redistribution conditions + non-endorsement clause + "Copyright 2013 Laurent Kneip, ANU. All rights reserved." attribution) but the file does NOT use OSI canonical BSD-3-Clause template text. **Recommendation**: D-C4-3 = (a) counsel-review (~1-2 hours legal review) for the OpenGV-as-secondary path; D-C4-3 = (c) pivot to OpenCV-as-primary if Plan-phase Jetson MVE shows OpenCV's mandatory-simple-baseline coverage is sufficient without OpenGV's richer-minimal-solver-coverage. Interacts with D-C4-4 maintenance-staleness mitigation (if D-C4-3 fails, D-C4-4 also pivots to OpenCV-as-primary or Ceres-only fallback) |
|
||||
| **D-C4-4 (NEW from OpenGV closure 2026-05-08 Fact #53) — maintenance-staleness-mitigation strategy choice (accept-as-is + freeze upstream / fork into project-controlled branch + apply Eigen-3.4+ + JetPack-6 + ARM Cortex-A78AE patches in-house / migrate to Ceres-only manual implementation as fallback / downgrade OpenGV to experimental status and pivot to OpenCV-as-primary)** | Plan-phase architect + project bring-up team | Plan-phase decision conditional on OpenGV being elevated to Selected; Source #84 last pushed 2023-06-07T18:14:14Z = ~2 years 11 months stale at access time 2026-05-08; Doxygen portal generated 2018-01-08 = 8.3 years old documentation; ShanghaiTech Mobile Perception Lab's claimed maintenance contradicted by commit history. **Recommendation**: D-C4-4 = (b) fork-and-patch (~1-2 weeks engineering) for the OpenGV-as-secondary path; D-C4-4 = (d) pivot to OpenCV-as-primary if Plan-phase Jetson MVE shows OpenCV's coverage is sufficient; D-C4-4 = (c) Ceres-only fallback (~2-4 weeks) only if (b) patches not feasible. Interacts with D-C4-3 license-clearance verification |
|
||||
| **D-C5-1 (NEW from Manual ESKF Solà 2017 closure 2026-05-08 Fact #88) — reference-implementation-license-verification choice (counsel-review of repo for LICENSE file in subdirectory ~1 hour engineering RECOMMENDED first step / treat as GPL-equivalent and write project implementation from Solà 2017 paper directly without code reuse ~1-2 weeks engineering vs ~3-5 days with reference template / contact author for LICENSE clarification ~1-3 weeks turnaround if author responsive)** | License-posture decision-maker + Plan-phase architect | Plan-phase decision conditional on project electing to reuse `ludvigls/ESKF` (Python ESKF for fixed-wing UAVs DIRECTLY MATCHING project hardware family) OR `cggos/imu_x_fusion` (C++/ROS multi-source loosely-coupled fusion) OR `koledickarlo/ESKF-ESP32` (microcontroller-class with explicit Solà 2017 citation) at the source-code level; Source #89 README front-pages do NOT declare LICENSE for these three repos. `EliaTarasov/ESKF` is PX4-derived (PX4 is dual BSD/Apache-2.0, ecl is BSD-3-Clause) so license-clearance is easier. `joansola/slamtb` is MATLAB-only and not deployable on JetPack 6 (algorithmic reference only). **Recommendation**: D-C5-1 = (b) write directly from canonical Solà 2017 paper for cleanest license-compliance story; reference implementations serve as documentary templates (read for understanding, not copy-paste). Final lock at Plan phase after counsel-review per D-C5-1 = (a). Interacts with D-C1-1 license-posture overall |
|
||||
| **D-C5-2 (NEW from Manual ESKF Solà 2017 closure 2026-05-08 Fact #88) — long-cruise-observability-strategy choice (accept observability degradation in long-cruise segments + monitor via covariance growth + alert operator if covariance > threshold RECOMMENDED / require operator to perform synthetic S-turns periodically every ~30 min to maintain bias observability / tighten bias-stationarity prior — lower IMU bias random-walk noise — at the cost of accepting more bias drift between updates)** | Plan-phase architect | Plan-phase decision; standard EKF/ESKF fusion of IMU + visual measurements requires sufficient excitation (non-pure-rotation, non-zero acceleration) for IMU bias observability per Solà §5.1 reference + classical observability literature. For a fixed-wing UAV in cruise (level flight at ~60 km/h with minimal acceleration), bias drift is the dominant error source; periodic accelerations (turns, climbs, level-to-bank transitions) re-excite observability. **Recommendation**: D-C5-2 = (a) accept + monitor. Mitigation = project's pinned mission profile per restrictions.md provides natural re-excitation via sharp turns up to ±20° bank per AC-3.1 + sharp-turn frames may share <5% overlap per AC-3.2. Covariance growth alert is consistent with AC-NEW-8 blackout failsafe escalation thresholds. **GTSAM iSAM2 Fact #89 partially mitigates** via incremental smoothing's look-back refinement of bias estimates over the entire sliding window (vs Manual ESKF's recursive forward-time-only bias estimation). Applies primarily to Manual ESKF Fact #88; partially-mitigated for GTSAM iSAM2 Fact #89 |
|
||||
| **D-C5-3 (NEW from GTSAM iSAM2 closure 2026-05-08 Fact #89) — sliding-window-primitive-choice (`gtsam_unstable.IncrementalFixedLagSmoother` with K=10-20 keyframes covering ~3-7 s of recent history RECOMMENDED ~30 minutes engineering / custom marginalization via `ISAM2.marginalizeLeaves(keys_to_marginalize)` ~2-3 days engineering / accept unbounded ISAM2 graph growth simplest ~0 minutes engineering but tested at Jetson MVE phase — likely fails AC-4.2 budget at K_total = 86400 keyframes × ~1 KB per keyframe state = ~86 MB raw + factor-graph overhead)** | Plan-phase architect | Plan-phase decision conditional on D-C5-row final lock including GTSAM iSAM2; `IncrementalFixedLagSmoother` is in `gtsam_unstable` namespace per Source #91 (canonical fixed-lag smoother class but requires opt-in to gtsam_unstable APIs; not in stable `gtsam` namespace). **Recommendation**: D-C5-3 = (a) IncrementalFixedLagSmoother with K=10-20 keyframes covering ~3-7 s of recent history. Interacts with D-C5-5 factor-density-choice (lower K reduces per-update factor count proportionally) |
|
||||
| **D-C5-4 (NEW from GTSAM iSAM2 closure 2026-05-08 Fact #89) — IMU-gap-handling-strategy choice (accept canonical pattern + monitor + adaptive integration covariance inflation RECOMMENDED ~1 day engineering / restart PIM on detected gaps with conservative initial covariance more aggressive ~3-5 days engineering / buffer IMU samples in a queue with explicit gap-fill via interpolation most aggressive ~1 week engineering)** | Plan-phase architect | Plan-phase decision conditional on D-C5-row final lock including GTSAM iSAM2; `CombinedImuFactor` requires CONTIGUOUS IMU samples between keyframes per Source #90 canonical pattern; if IMU samples are dropped mid-flight (network jitter, MAVLink frame loss), `pim.preintMeasCov()` 9×9 covariance becomes optimistic vs reality. **Recommendation**: D-C5-4 = (a) accept + monitor + adaptive inflation (track `last_imu_timestamp` and inflate `params.setIntegrationCovariance` adaptively if gap > expected). Project's pinned MAVLink IMU pipeline at ~100-200 Hz Pixhawk-class is delivered over UART or USB serial — dropped samples are rare. Interacts with C8 MAVLink/MSP2 FC adapter row (when opened) for IMU-pipeline-jitter characterization |
|
||||
| **D-C5-5 (NEW from GTSAM iSAM2 closure 2026-05-08 Fact #89) — factor-density-choice (per-correspondence `GenericProjectionFactorCal3DS2` highest fidelity 1000+ factors per keyframe at K=10 image pairs × 100 inliers per pair ~50-150 ms per update on Jetson Orin Nano Super CPU tight AC-4.1 satisfaction / smart-projection-pose-factor canonical landmark-marginalization-at-construction-time 1 factor per landmark per keyframe ~10× speedup at minimal accuracy loss ~5-15 ms per update on Jetson Orin Nano Super CPU / `PriorFactorPose3` only with C4 GTSAM Marginals satellite-anchor 6×6 covariance — couples C4 Fact #54 D-C4-2 = (b) with C5 Fact #89 architectural integration via shared GTSAM substrate ~1 factor per keyframe ~2-5 ms per update on Jetson Orin Nano Super CPU CLEANEST cross-component coupling RECOMMENDED for the GTSAM-as-shared-C4+C5-substrate hybrid path)** | Plan-phase architect | Plan-phase decision conditional on D-C5-row final lock including GTSAM iSAM2; iSAM2 per-update latency depends critically on factor density per keyframe. **Recommendation**: D-C5-5 = (c) for the GTSAM-as-shared-C4+C5-substrate hybrid path (project's recommended C5 architecture per Fact #89 closure); D-C5-5 = (b) for the C5-as-secondary-with-smoothing path if Plan-phase Jetson MVE shows (c) accuracy is insufficient at AC-1.1/1.2 tail. **Three-way interaction with D-C4-2 covariance-recovery-strategy + AC-4.1 latency budget + AC-1.1/1.2 frame-center pose accuracy**. Strongest cross-component lever in the C4+C5 design space — D-C5-5 = (c) operationalizes the GTSAM-shared-substrate architectural advantage identified in C4 Fact #54 + C5 Fact #89 |
|
||||
| **D-C6-1 (NEW from Cand 1 closure 2026-05-08 Fact #92; mirrored by Cand 2 D-C6-6) — descriptor-storage-format choice (full-precision float32 in `bytea` column ~8 KB/tile-at-2048-D / **halfvec via app-side conversion + storage as 2-byte half-floats ~4 KB/tile-at-2048-D ~50% cache savings ~0-2% Recall@K loss RECOMMENDED** / INT8 quantized + per-vector scale parameter ~1 KB/tile-at-2048-D ~87.5% cache savings + ~1 day engineering for quantization-aware loader)** | Plan-phase architect | Plan-phase decision; trade-off between AC-8.3 cache footprint vs Recall@K accuracy loss vs engineering complexity. **Recommendation**: D-C6-1 = (b) halfvec for descriptor storage at ~2× cache-footprint-saving with ~0-2% Recall@K loss. Interacts with D-C2-9 NetVLAD descriptor-dimension choice + D-C2-10 EigenPlaces descriptor-dimension choice + D-C2-6 SALAD descriptor-size choice + AC-8.3 10 GB cache budget |
|
||||
| **D-C6-2 (NEW from Cand 1 closure 2026-05-08 Fact #92, Cand-1-only) — FAISS index variant choice for app-side descriptor ANN (`IndexFlatL2` brute-force exact-distance for small caches <10K tiles ~1-3 ms per query / **`IndexHNSWFlat(d, M=32)` graph-based approximate for primary path 100K-1M tiles ~1-3 ms per query w/ efSearch=64 RECOMMENDED** / `IndexIVFFlat` inverted-file approximate w/ training requirement / `IndexIVFPQ` for additional product-quantizer compression at ~10% Recall@K loss)** | Plan-phase architect | Plan-phase decision conditional on Cand 1 (mirror-suite-pattern) being selected as primary; trade-off between memory footprint vs query accuracy vs query latency. **Recommendation**: D-C6-2 = (b) IndexHNSWFlat M=32 for primary path; IndexFlatL2 fallback for small caches per Source #96 contextual guidance |
|
||||
| **D-C6-3 (NEW from Cand 1 closure 2026-05-08 Fact #92, Cand-1-only, CROSS-COMPONENT with C10) — descriptor-cache-rebuild-trigger strategy (rebuild on every cache modification ~simplest but slow ~5-30 sec per rebuild blocks readiness / incremental add via `index.add()` ~faster but HNSW does not support delete cleanly per Source #96 / **periodic rebuild during pre-flight provisioning ~most robust requires C10 coordination + serialize via `faiss.write_index` + reload at takeoff in <5 sec RECOMMENDED**)** | Plan-phase architect + C10 owner | Plan-phase decision conditional on Cand 1 being selected; jointly owned with C10 pre-flight cache provisioning row (when opened). **Recommendation**: D-C6-3 = (c) periodic rebuild during C10 pre-flight provisioning. Strongest C6+C10 cross-component coupling |
|
||||
| **D-C6-4 (NEW from Cand 1 closure 2026-05-08 Fact #92, Cand-1-only) — geographic-spatial-grid radius `k` choice (fixed-1 = 3x3 grid simplest / fixed-2 = 5x5 grid covers AC-3.x sharp turns more robustly / fixed-4 = 9x9 grid for very high-bank or low-zoom / **dynamic derived from zoom + ground-speed projected over next 5 sec RECOMMENDED**)** | Plan-phase architect | Plan-phase decision conditional on Cand 1 being selected; trade-off between per-query candidate count vs spatial coverage vs latency. **Recommendation**: D-C6-4 = dynamic |
|
||||
| **D-C6-5 (NEW from Cand 2 closure 2026-05-08 Fact #93, Cand-2-only contingent) — Jetson PostGIS + pgvector co-installation Plan-phase verification choice (**verify on Jetson MVE phase as part of D-C1-2 dedicated bring-up phase RECOMMENDED — already-required Jetson hardware bring-up cycle absorbs this work cheaply** / fork PostGIS+pgvector ARM64 builds in-house if upstream packages incomplete ~1-3 days engineering / pivot to Cand 1 if PostGIS+pgvector co-installation reveals blocking incompatibility)** | Project bring-up team + C7 inference-runtime owner | Plan-phase decision conditional on Cand 2 being elevated to primary; Source #94 search results explicit limitation: "do not provide specific information about PostGIS 3.4's compatibility with ARM64 architecture on Jetson devices, nor do they document the installation footprint"; Source #97 March 2026 article confirms Postgres+pgvector but not explicitly+PostGIS. **Recommendation**: D-C6-5 = (a) verify on Jetson MVE. Interacts with D-C1-2 Jetson MVE phase + D-C7 (when opened) |
|
||||
| **D-C6-6 (NEW from Cand 2 closure 2026-05-08 Fact #93, Cand-2-only contingent; mirrors D-C6-1 for the pgvector-side) — pgvector descriptor-storage-type choice (`vector` full-precision float32 with 2,000-dim max for HNSW per Source #95 — JUST EXCEEDED by MixVPR 2048-D / **`halfvec` half-precision 2-byte with 16,000-dim max + 50% cache savings + ~0-2% Recall@K loss RECOMMENDED — covers all C2 VPR descriptor candidates consistently** / `sparsevec` for sparse descriptors / `bit` for binary descriptors via Hamming distance)** | Plan-phase architect | Plan-phase decision conditional on Cand 2 being elevated to primary; trade-off between cache footprint vs accuracy vs descriptor compatibility with C2 VPR candidate output format. **Recommendation**: D-C6-6 = (b) halfvec. Interacts with D-C2-9 + D-C2-10 + D-C2-6 descriptor-dimension choices |
|
||||
| **D-C6-7 (NEW from C6 batch 1 closure 2026-05-08 Fact #92 + Fact #93, CROSS-COMPONENT — affects both Cand 1 and Cand 2; forced by Cand 2 selection) — IF Cand 2 selected → cascade-changes-back-to-suite-satellite-provider strategy choice (cascade PostGIS+pgvector adoption back to satellite-provider for cross-suite consistency ~1-3 days engineering at suite + onboard / keep satellite-provider on btree-only and gps-denied-onboard on PostGIS+pgvector ~accept divergence + maintenance burden / migrate satellite-provider to PostGIS+pgvector in a separate ticket post-MVP / **leave satellite-provider unchanged + maintain Cand 1 throughout — no cascade needed RECOMMENDED if Cand 1 selected as primary which is the closure verdict**)** | User + Plan-phase architect + suite satellite-provider owner | Plan-phase decision conditional on Cand 2 being elevated to primary at C6; per user's session-start clarification "if improvement is small, then there is no sense to change anything at all" — IF Cand 2's MATERIAL improvement justifies adoption (currently NO per closure verdict in Fact #92 + Fact #93 comparative analysis), cascade via separate ticket; OTHERWISE stay with Cand 1 throughout the suite. **Cross-component cascade decision affecting parent-suite `satellite-provider` component** |
|
||||
| **D-C7-1 (CLOSED IN C7 batch 1 2026-05-08, per C9 / SQ7 restructure user choice A) — calibration-dataset-strategy** | Plan-phase architect (CLOSED at research time — no Plan-phase decision remains) | **Closed at C7 batch 1**: strategy = **real UAV nadir flight footage at ~1 km AGL over season-matched satellite tiles** as the calibration corpus distribution (matches the Project Constraint Matrix's "Inputs available" pinning + provides realistic noise/illumination/season distribution that the deployed system will see). Specific fixture-file pin (AerialVL S03 vs project's Mavic + Derkachi flight clips vs other corpora) is fixture-class and **DELEGATED to Test Spec (greenfield Step 5)**. Synthetic-tile augmentation via random homography is the documented low-data fallback, only invoked if real flight footage is insufficient for Recall@K-target calibration. ~500–1,500 representative samples per the C7 batch 1 closure constraint. **No Plan-phase Choose block remains** — the architectural decision is locked at C7 batch 1 closure. **Cross-component coupling with C9 dropped** per restructure; coupling moves to C7 ↔ Test Spec for fixture-file pinning. |
|
||||
| **D-C7-2 (NEW from Cand 1 TensorRT-native closure 2026-05-08 Fact #94, Cand-1-only) — TensorRT mixed-precision flag matrix per model family (single FP16-only flag for entire pipeline / **INT8+FP16 for VPR backbones + FP16-only for matchers + FP16-only for VIO frontends [hybrid per-family per D-C7-6] RECOMMENDED** / per-layer precision overrides via `setPrecision`)** | Plan-phase architect | Plan-phase decision conditional on Cand 1 (TensorRT-native) being selected as primary. **Recommendation**: D-C7-2 = (b) ladder per D-C7-6 per-model-family precision policy. Interacts with D-C7-6 cross-component model-family precision policy (AC-NEW-3 covariance honesty + AC-1.1/1.2 frame-center accuracy preserved at FP16 for matchers per Source #103 evidence) |
|
||||
| **D-C7-3 (NEW from Cand 2 ONNX Runtime+TRT EP closure 2026-05-08 Fact #95, Cand-2-only) — ORT-Jetson-wheel-index-pin choice (`pypi.jetson-ai-lab.io/jp6/cu126` for JetPack 6.2 / `pypi.jetson-ai-lab.io/jp6/cu129` for JetPack 6.x with newer CUDA / **mirror the wheel index to a project-controlled artifact registry for offline-deployment robustness RECOMMENDED ~50 MB per wheel set; pre-flight provisioning step + cu126 variant for JetPack 6.2 alignment**)** | Plan-phase architect + C10 owner | Plan-phase decision conditional on Cand 2 (ONNX Runtime + TRT EP) being elevated to primary; standard `pip install onnxruntime-gpu` does NOT work on Jetson Tegra per Source #100 Issue #20503 — Microsoft does not publish prebuilt aarch64 wheels with CUDA/TensorRT EPs. **Recommendation**: D-C7-3 = (c) mirror to project artifact registry + cu126 variant. Interacts with R-NEW-2 no-cloud-at-flight (offline-deployment requires wheel mirror) + C10 pre-flight cache provisioning |
|
||||
| **D-C7-4 (NEW from Cand 2 ONNX Runtime+TRT EP closure 2026-05-08 Fact #95, Cand-2-only) — numpy-version-pin choice (**`numpy<2.0.0` per Source #100 Issue #27562 RECOMMENDED until upstream rebuild** / wait for upstream onnxruntime-gpu rebuild against numpy>=2 / pin to a specific onnxruntime-gpu version known to work with numpy<2)** | Plan-phase architect | Plan-phase decision conditional on Cand 2 being elevated to primary; onnxruntime-gpu v1.23.0 wheels for JetPack 6 were built against `numpy<2.0.0`; importing under `numpy>=2.0.0` raises a compatibility error per Source #100 Issue #27562. **Recommendation**: D-C7-4 = (a) `numpy<2.0.0` until upstream rebuild; track Issue #27562 status at Plan phase |
|
||||
| **D-C7-5 (NEW from Cand 3 pure-PyTorch-FP16 closure 2026-05-08 Fact #96, Cand-3-only) — PyTorch-Jetson-wheel-pin choice (**PyTorch 2.5 + torchvision 0.20 stable RECOMMENDED ~most-stable combination per NVIDIA Developer Forum** / PyTorch 2.9 + torchvision latest / track Jetson AI Lab cadence)** | Plan-phase architect | Plan-phase decision conditional on Cand 3 (pure PyTorch FP16) being selected as mandatory simple-baseline. Standard `pip install torch` does NOT include CUDA support on Jetson per Source #101 NVIDIA Developer Forum threads; must use Jetson AI Lab community wheels. Known dependency issues with `libcudss.so.0` and `libnvdla_runtime.so` on PyTorch 2.9 cu129 wheel under JetPack 6.2 (CUDA 12.6) — version-mismatch sensitive. **Recommendation**: D-C7-5 = (a) PyTorch 2.5 + torchvision 0.20 for the project's first deployment; revisit at Plan phase based on Jetson MVE results |
|
||||
| **D-C7-6 (NEW from C7 batch 1 closure 2026-05-08 Fact #94 + Fact #95 + Fact #96, CROSS-COMPONENT — affects C2 + C3 + C1 + C7) — INT8-vs-FP16-per-model-family-precision-policy (single INT8 across all model families with sensitivity-fallback / **per-family precision policy: VPR INT8+FP16 fallback, matchers FP16-only, VIO frontends FP16-only RECOMMENDED — operationalizes Source #103 matcher-INT8-quantization-sensitivity finding + Source #102 VPR-CNN-INT8-tolerability finding** / FP16 across all model families until calibration data validates per-family INT8)** | User + Plan-phase architect | **Strongest cross-component lever in the C2+C3+C7 design space.** Plan-phase decision; Source #103 evidence shows LightGlue FP8 caused "match counts dropped sometimes hard" (FP8 is structurally similar to INT8 in dynamic-range reduction) — feature-matching networks are quantization-sensitive in a way that detection / VPR networks are not. Source #102 confirms YOLO26n CNN at INT8 has -6.5% mAP50-95 vs FP16 — acceptable for VPR Recall@K granularity. **Recommendation**: D-C7-6 = (b) per-family policy: VPR backbones (CNN-class MixVPR/EigenPlaces/NetVLAD) → INT8+FP16 mixed; ViT-class VPR backbones (SelaVPR DINOv2-L, conditional AnyLoc/BoQ/DINOv2-VLAD) → FP16-only initially with INT8 deferred to Jetson MVE per D-C2-5; matchers (LightGlue with SP/DISK/ALIKED, XFeat, XFeat+LighterGlue) → **FP16-only — NO INT8**; learned VIO frontends (if any selected at C1) → FP16-only initially, INT8 deferred to Jetson MVE per D-C7-2. **Three-way interaction with AC-1.1/1.2 frame-center accuracy + AC-4.1 latency budget + AC-NEW-3 (FDR for INT8 calibration cache provenance)** |
|
||||
| **D-C7-7 (NEW from Cand 1 TensorRT-native closure 2026-05-08 Fact #94, Cand-1-only CROSS-COMPONENT with C10) — engine-build-on-Jetson-vs-prebuilt-engine-shipping strategy (build engines at pre-flight on the deployed Jetson / build engines on a known-good "reference Jetson" then ship the same `.engine` files to all production Jetsons / **both — primary path build-on-target with reference-Jetson-built engines as a fallback if pre-flight build fails RECOMMENDED ~handles SM-version drift + future TensorRT minor version updates**)** | Plan-phase architect + C10 owner | Plan-phase decision conditional on Cand 1 (TensorRT-native) being selected as primary; per Source #105 constraints #2 + #3, TensorRT engines are hardware-specific (SM 87 for Orin Nano Super) and CANNOT be transferred between devices. **Recommendation**: D-C7-7 = (c) primary build-on-deployed-Jetson during pre-flight; fallback prebuilt engines for emergency provisioning. **Strongest C7+C10 cross-component coupling — C10 owns the engine-build pipeline + calibration-dataset assembly per D-C7-1** |
|
||||
| **D-C7-8 (NEW from Cand 1 TensorRT-native closure 2026-05-08 Fact #94, Cand-1-only) — `config.max_workspace_size` cap to avoid tactic-profile segfault during build (**1 GB safe default RECOMMENDED** / 2 GB for richer kernel-fusion search / 3 GB for fastest-possible engine but high segfault risk on 8 GB shared budget)** | Plan-phase architect | Plan-phase decision conditional on Cand 1 being selected as primary; per Source #105 constraint #4, TensorRT engine builds on Jetson under memory pressure can segfault during tactic profiling (8 GB shared CPU+GPU is tight; rich layer-fusion search consumes peak RAM during `tactic.profile` phase). **Recommendation**: D-C7-8 = (a) 1 GB safe default; raise to 2 GB only if Plan-phase Jetson MVE shows engine quality is materially worse at 1 GB |
|
||||
| **D-C7-9 (NEW from Cand 1 TensorRT-native closure 2026-05-08 Fact #94, Cand-1-only) — TensorRT version pin within JetPack lifecycle (**lock to JetPack 6.2 + TensorRT 10.3 for the project's first deployment RECOMMENDED** / track JetPack 6.x minor releases / lock the exact JetPack point release for cross-deployment reproducibility)** | Plan-phase architect | Plan-phase decision conditional on Cand 1 being selected as primary; JetPack 6.2 ships TensorRT 10.3 + CUDA 12.6 + cuDNN 9.3 (Source #104). Upgrading TensorRT independently of JetPack is not officially supported per Source #105. **Recommendation**: D-C7-9 = (a) lock to JetPack 6.2 + TensorRT 10.3 for the project's first deployment; revisit at Plan phase per JetPack release cadence |
|
||||
| **D-C8-1 (NEW from Cand 1 pymavlink-GPS_INPUT closure 2026-05-08 Fact #97, Cand-1-only) — pymavlink connection-string transport choice (`udpout:127.0.0.1:14550` for in-process companion+autopilot UDP / `serial:/dev/ttyTHS1:921600` for direct UART to AP TELEM port / `tcp:127.0.0.1:5760` for SITL replay / **all three configurable via env var, default UART for production deployment, UDP for SITL replay, TCP for unit tests RECOMMENDED**)** | Plan-phase architect | Plan-phase decision conditional on Cand 1 (pymavlink → GPS_INPUT) being selected as primary AP path; pymavlink supports all three transports identically. **Recommendation**: D-C8-1 = (d) all three configurable + default UART production. Reduces moving parts in production while preserving testability paths |
|
||||
| **D-C8-2 (NEW from Cand 1 pymavlink-GPS_INPUT closure 2026-05-08 Fact #97, Cand-1-only CROSS-COMPONENT with AC-NEW-2) — `MAV_CMD_SET_EKF_SOURCE_SET` companion-driven switch ownership pattern (companion always claims source-set 1 + FC keeps real-GPS at source-set 2 + companion is reactive only / **companion publishes to source-set 2 + auto-switches FC to set 2 on first valid fix + switches back to set 1 when companion is unavailable RECOMMENDED ~mirrors NGPS/Auterion pattern** / operator manually flips source-set via RC aux switch option 90)** | Plan-phase architect + AC-NEW-2 owner | Plan-phase decision conditional on Cand 1 being selected as primary AP path; per SQ6 Fact #3 "no GCSs are currently known to implement" companion-driven `MAV_CMD_SET_EKF_SOURCE_SET` — but it works at firmware level. **Recommendation**: D-C8-2 = (b) companion publishes to source-set 2 + auto-switches FC; project gets to define the canonical pattern; mirrors NGPS/Auterion deployment pattern from SQ1 lookup |
|
||||
| **D-C8-3 (NEW from Cand 1 pymavlink-GPS_INPUT closure 2026-05-08 Fact #97, Cand-1-only) — pymavlink LGPL-3.0 license-posture verification (**bundle pymavlink unmodified + publish requirements.txt with version pin RECOMMENDED ~standard LGPL §6 compliance** / statically link via Cython compilation [LGPL §6 obligation: provide relinkable form] / wrap pymavlink behind a thin C++/Rust process boundary to keep companion-app fully Apache-2.0 [over-engineered])** | Plan-phase architect + license owner | Plan-phase decision conditional on Cand 1 being selected as primary; LGPL §6 allows linking from Apache-2.0 app without "infecting" application license. **Recommendation**: D-C8-3 = (a) bundle unmodified + requirements.txt; aligns with D-C1-1 license-posture-track decision; pymavlink LGPL-3.0 vs project Apache-2.0 dual-use track is straightforward |
|
||||
| **D-C8-4 (NEW from Cand 2 MSP2_SENSOR_GPS closure 2026-05-08 Fact #99, Cand-2-only) — Python MSP V2 implementation choice (**YAMSPy [community-blessed for iNav external-device comms per Issue #4465; MIT; widest community usage] RECOMMENDED PRIMARY** / INAV-Toolkit `msp_v2_encode` primitive lifted into the project [951-line MIT module, direct primary-source reference] SECONDARY / thin custom encoder using `struct.pack` + CRC-8 DVB-S2 helper [50-line bespoke fallback] FALLBACK / project-side fork of one of the above)** | Plan-phase architect | Plan-phase decision conditional on Cand 2 (MSP2_SENSOR_GPS) being selected as primary iNav path; all options are MIT and produce identical wire bytes. **Recommendation**: D-C8-4 = (a) YAMSPy primary + (c) thin custom encoder fallback if YAMSPy lacks MSP2_SENSOR_GPS support. Choice depends on maintainability vs minimum-dependency-surface preference |
|
||||
| **D-C8-5 (NEW from Cand 2 MSP2_SENSOR_GPS closure 2026-05-08 Fact #99, Cand-2-only) — MSP2_SENSOR_GPS injection rate (**5 Hz periodic RECOMMENDED ~matches GPS_INPUT 5 Hz cadence on AP side, single-rate cross-FC consistency** / 10 Hz to match iNav nav-cycle frequency / variable rate matching estimator publication rate [3 Hz nominal, up to 10 Hz when matcher confidence is high])** | Plan-phase architect | Plan-phase decision conditional on Cand 2 being selected as primary; estimator publishes at 3 Hz nominal (per pinned dual-rate camera pipeline Fact #40). **Recommendation**: D-C8-5 = (a) 5 Hz periodic; spare headroom for IMU-propagation between estimator updates; cross-FC consistency with AP path |
|
||||
| **D-C8-6 (NEW from Cand 3 UBX-impersonation closure 2026-05-08 Fact #98, Cand-3-only contingent) — IF Cand 3 selected → UBX-version-advertisement strategy (**advertise hwVersion ≥ M9 + swVersion ≥ 15.00 via NAV-VER (CLASS=0x0A, ID=0x04) at startup + every reset; force iNav into NAV-PVT-only protocol surface RECOMMENDED ~simplest** / advertise hwVersion = M8 + swVersion = 14.x to drive iNav into legacy NAV-POSLLH+NAV-SOL+NAV-VELNED+NAV-TIMEUTC quad mode [more messages but historical iNav-friendly path] / implement adaptive advertisement based on iNav firmware-version probe)** | Plan-phase architect | Plan-phase decision conditional on Cand 3 (UBX impersonation) being elevated to primary at iNav side; per Source #110 lines 1024-1060, iNav configures the simpler NAV-PVT-only path for u-blox version ≥ 15.0. **Recommendation**: D-C8-6 = (a) advertise version ≥ 15.0 to minimize protocol surface |
|
||||
| **D-C8-7 (NEW from Cand 3 UBX-impersonation closure 2026-05-08 Fact #98, Cand-3-only contingent CROSS-COMPONENT with AC-NEW-7) — IF Cand 3 selected → AC-NEW-7 audit-trail posture (**explicit FDR audit entry on every UBX impersonation session start, naming companion as the UBX source + providing operator-consent provenance check at boot RECOMMENDED** / silent operation with user-manual disclosure only / require runtime parameter `gps-denied-onboard.enable_ubx_impersonation = true` to be set explicitly by the user via QGC [active opt-in])** | Plan-phase architect + AC-NEW-7 owner | Plan-phase decision conditional on Cand 3 being elevated to primary at iNav side; UBX impersonation is unambiguously a forgery posture (companion impersonates u-blox receiver). **Recommendation**: D-C8-7 = (a) explicit FDR audit entry on every impersonation session start; AC-NEW-7 (no covert GPS spoofing without consent) requires an audit trail |
|
||||
| **D-C8-8 (NEW from Cand 1 + Cand 2 closure 2026-05-08 Fact #97 + Fact #99, CROSS-COMPONENT — affects both Cand 1 and Cand 2; CROSS-COMPONENT with C5 covariance contract) — covariance-honesty cross-FC enforcement strategy (project always publishes the SAME covariance value to both FCs [single shared contract, simpler test surface] / **per-FC covariance unit conversion: AP `GPS_INPUT.horiz_accuracy` (m) vs iNav `MSP2_SENSOR_GPS.hPosAccuracy` (mm) — companion publishes the same source covariance, formatted per-FC RECOMMENDED** / per-FC covariance smoothing [different filter parameters per FC; over-engineered + monotonicity-violation risk under C5 D-C5-2])** | Plan-phase architect + AC-NEW-4 owner | Plan-phase decision; AC-NEW-4 covariance-honesty obligation is the same for both FCs; only the unit + field-name change. **Recommendation**: D-C8-8 = (b) per-FC covariance unit conversion; same source covariance, formatted per-FC. **Strongest C5+C8 cross-component coupling** — extracts 2×2 horizontal sub-matrix from C5 GTSAM `Marginals.marginalCovariance` 6×6 matrix, computes 95% confidence ellipse semi-major axis `sqrt(2.0 * 5.991 * λ_max)`, emits as `horiz_accuracy` (m) for AP / `hPosAccuracy` (mm) for iNav |
|
||||
| **D-C10-1 (NEW from Sub-area 1 closure 2026-05-08 Fact #100, C10-only) — descriptor-cache rebuild trigger choice (rebuild on every pre-flight invocation simplest but slow / **manifest-hash-driven (rebuild iff `SHA-256(descriptor_blobs[*] + IndexHNSWFlat params)` differs from last-recorded manifest hash) RECOMMENDED + `--force-rebuild` operator override** / time-based (rebuild every N days irrespective of content drift, AC-8.2-aligned))** | Plan-phase architect + C10 owner | Plan-phase decision; trade-off between rebuild latency (5-30 sec at 100K tiles) blocking pre-flight readiness vs unnecessary work when descriptor blobs haven't changed. **Recommendation**: D-C10-1 = (b) manifest-hash-driven + `--force-rebuild` override. Operationalizes the "incremental add unsafe with HNSW deletes" Source #96 finding by treating any descriptor-blob churn as a full rebuild trigger. Operator override allows AC-NEW-3 FDR-required rebuild for cache-poisoning recovery without operator hash-debugging |
|
||||
| **D-C10-2 (NEW from Sub-area 1 closure 2026-05-08 Fact #100, C10-only) — descriptor-cache atomic-write strategy (write directly to target path simplest but unsafe — partial-write leaves a corrupt FAISS file that `read_index` will load successfully per Source #114 "no internal integrity check" warning / **`python-atomicwrites` package — write-to-temp + `fsync` + atomic rename + parent-dir fsync per Source #116 RECOMMENDED ~3-line addition** / hand-rolled `os.rename` via `tempfile.NamedTemporaryFile(dir=parent_dir)` + manual `fsync` ~10-line equivalent)** | Plan-phase architect + AC-NEW-7 owner | Plan-phase decision; without atomic-write, a power loss or process kill mid-`faiss.write_index` leaves a truncated/partial file that loads successfully and produces silently-wrong descriptor matches at takeoff — **direct violation of AC-NEW-7 cache-poisoning safety + AC-3.3 re-localization stability**. **Recommendation**: D-C10-2 = (b) `python-atomicwrites`. Cross-platform; pure-Python; auditable; established pattern per Source #116. Interacts with D-C10-3 content-hash verification (atomic-write prevents the truncated-file class of corruption; content-hash gate catches malicious tampering separately) |
|
||||
| **D-C10-3 (NEW from Sub-area 1 closure 2026-05-08 Fact #100, C10-only CROSS-COMPONENT with AC-NEW-7) — content-hash verification gate at takeoff load (skip verification — accept FAISS file as-is per "trusted local filesystem" assumption / **compute `SHA-256(faiss_index_file)` at takeoff load + compare against manifest-recorded hash + reject load + emit STATUSTEXT to FC + refuse takeoff if mismatch RECOMMENDED — directly satisfies AC-NEW-7 cache-poisoning safety obligation** / verify only on first takeoff after rebuild + cache the verification result)** | Plan-phase architect + AC-NEW-7 owner | Plan-phase decision; FAISS Source #114 explicit security warning: "No attempt is made to check the correctness of loaded data. A faulty or malicious file could lead to out-of-memory errors or code execution. Users are responsible for verifying that files loaded with `read_index` have not been altered since being written by `write_index`." **Recommendation**: D-C10-3 = (b) reject-and-refuse-takeoff. The hash check is ~50 ms one-time cost vs the unbounded cost of silent descriptor-cache poisoning leading to incorrect VPR retrieval feeding the rest of the pipeline. **Strongest C10 ↔ AC-NEW-7 coupling**. Couples with D-C10-2 (atomic-write prevents truncation; content-hash catches tampering). Final lock at Plan phase after AC-NEW-7 owner reviews STATUSTEXT format + FC FDR audit-entry shape |
|
||||
| **D-C10-4 (NEW from Sub-area 1 closure 2026-05-08 Fact #100, C10-only) — descriptor-cache load path (full read into RAM via `faiss.read_index(path)` simplest + warmest cache after first query / **mmap via `faiss.read_index(path, faiss.IO_FLAG_MMAP_IFC)` + `madvise(MADV_WILLNEED)` pre-fault to smooth p99 latency RECOMMENDED — eliminates ~430 MB read at takeoff, supports large indices that exceed shared 8 GB RAM budget per AC-4.2** / both — Plan-phase Jetson MVE benchmark to pick the lower-p99-latency path)** | Plan-phase architect + Jetson MVE bring-up team | Plan-phase decision conditional on Jetson MVE bench results; mmap eliminates the takeoff load read entirely (FAISS supports mmap on `IndexHNSWFlat` per Source #114 `IO_FLAG_MMAP_IFC` flag); but post-load search performance is "slightly slower initially due to memory layout and cache effects" per Source #115 Issue #622, requiring a warmup-search-pass at takeoff. **Recommendation**: D-C10-4 = (b) mmap with `madvise(MADV_WILLNEED)` pre-fault — fastest path for the project's <5 s takeoff load budget; or (c) bench both at Jetson MVE and pick the lower-p99-latency path empirically. Interacts with AC-4.2 8 GB shared CPU+GPU memory budget (mmap reduces peak RAM during load) |
|
||||
| **D-C10-5 (NEW from Sub-area 2 closure 2026-05-08 Fact #101, C10-only CROSS-COMPONENT with C7) — TensorRT engine-build orchestration tool choice (`trtexec` only — single binary, simplest deployment, but `--int8` without `--calib` falls back to random calibration data per Source #119 — collapses INT8 accuracy / Polygraphy CLI only — handles INT8 calibration via `--data-loader-script` per Source #117 + canonical NVIDIA-blessed wrapper / direct `IBuilderConfig` Python API only — most flexible but most engineering cost per Source #121 + duplicates Polygraphy's calibration-cache management / **hybrid: Polygraphy CLI primary for INT8-calibrating builds + `trtexec` for cache-reuse fast rebuilds + direct `IBuilderConfig` Python API as escape hatch for unusual models like LightGlue dynamic-shape inputs RECOMMENDED ~best of all three for the project's mixed model family**)** | Plan-phase architect + C7 inference-runtime owner + C10 owner | Plan-phase decision conditional on Cand 1 (TensorRT-native) per D-C7-7 = (c) being selected as primary; trade-off between operational simplicity vs feature coverage vs maintenance footprint. **Recommendation**: D-C10-5 = (d) hybrid; pin canonical recipes per model family (VPR backbone INT8+FP16 via Polygraphy; matchers FP16-only via Polygraphy; LightGlue dynamic-shapes via direct API; cache-reuse rebuilds via trtexec). **Strongest C7+C10 cross-component coupling** — operationalizes D-C7-7 closure |
|
||||
| **D-C10-6 (NEW from Sub-area 2 closure 2026-05-08 Fact #101, C10-only CROSS-COMPONENT with D-C7-1) — TensorRT calibration-cache reuse strategy (rebuild calibration on every engine build slowest but always uses freshest corpus / **rebuild calibration only when `SHA-256(calibration_corpus)` changes from last-recorded manifest hash + reuse cached scales otherwise per Source #117 cache-reuse pattern RECOMMENDED + `--force-trt-rebuild` operator override** / never recalibrate after first successful build — risks per-model accuracy drift if the underlying model graph changes via fine-tune)** | Plan-phase architect + C7 owner | Plan-phase decision conditional on Cand 1 being selected as primary; calibration cache binary-blob is keyed by `SHA-256(calib_corpus)` + onnx-graph hash + TRT version per Source #117 + Source #118 design. Without reuse, every engine build re-runs the ~10-30 minute calibration on the 500-1500-image corpus per D-C7-1 closure. **Recommendation**: D-C10-6 = (b) rebuild on `SHA-256(calib_corpus)` change + `--force-trt-rebuild` override. Subsequent rebuilds <30 sec via cache reuse per Source #117. **Strongest D-C7-1 ↔ C10 coupling** — operationalizes the calibration-corpus closure into the build pipeline |
|
||||
| **D-C10-7 (NEW from Sub-area 2 closure 2026-05-08 Fact #101, C10-only) — TensorRT engine on-disk filename schema (single `<model>.engine` per model — simplest but breaks under TRT/JetPack version drift / **self-describing `<model>_sm<SM>_jp<JP>_trt<TRT>_<precision>.engine` filename + sidecar `manifest.json` per Source #105 hardware-tied-engine constraint RECOMMENDED ~enables side-by-side multi-version coexistence + reference-Jetson-built fallback engines per D-C7-7 = (c)** / single-bucket directory with manifest-only routing)** | Plan-phase architect + C10 owner | Plan-phase decision conditional on Cand 1 being selected as primary; per Source #105, TRT engines are tied to (SM version, JetPack version, TRT version, precision mode) — moving an engine across any of these dimensions silently fails or quietly degrades. **Recommendation**: D-C10-7 = (b) self-describing filename. Filename schema example: `mixvpr_sm87_jp62_trt103_int8fp16.engine`, `lightglue_disk_sm87_jp62_trt103_fp16.engine`. Sidecar manifest.json captures full provenance for AC-NEW-3 FDR. Couples with D-C7-9 JetPack version pin |
|
||||
| **D-C10-8 (NEW from Sub-area 2 closure 2026-05-08 Fact #101, C10-only) — TensorRT prebuilt-fallback engine generation venue (build only on the deployed Jetson — minimal infra but blocks deployment until first build succeeds / build only on a reference Jetson at HQ — fastest deployment but loses per-target reproducibility per D-C7-7 = (c) primary path / **reference Jetson at HQ as canonical fallback corpus + deployed-Jetson-copy-to-archive on first successful local build RECOMMENDED — opportunistic redundancy + per-target validation + canonical fallback in case of pre-flight build failure**)** | Plan-phase architect + project bring-up team + C10 owner | Plan-phase decision conditional on Cand 1 being selected as primary; per D-C7-7 = (c), primary path is build-on-deployed-Jetson; fallback is reference-Jetson-built engines. **Recommendation**: D-C10-8 = (c) reference Jetson at HQ + deployed-Jetson-copy-to-archive on first successful local build. Reference Jetson must match deployed Jetson on (SM 87, JetPack 6.2, TensorRT 10.3, CUDA 12.6, cuDNN 9.3) per Source #105 + D-C7-9 lock. Provides AC-NEW-1 (8 h endurance, no infield infra) tolerance for the case where a freshly-deployed Jetson cannot complete a per-mission rebuild before takeoff |
|
||||
@@ -0,0 +1,72 @@
|
||||
# Component Fit Matrix — C10: Pre-flight cache provisioning (cross-coupling minimal scope)
|
||||
|
||||
> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate). C10 was promoted to its own row file on 2026-05-08 after user-locked scope narrowing (`c10_scope=C` cross-coupling minimal — see [`../00_question_decomposition.md` → "C10 Scope Restructure"](../00_question_decomposition.md)). Operator CLI/desktop tooling, sector classification heuristics, and tile age-stamping/freshness schema are **deferred to Plan-phase as `operator tooling design` out-of-research-scope**. C10 batch 1 covers only the two cross-coupling confirmation sub-areas: D-C6-3 (descriptor-cache rebuild trigger pipeline) and D-C7-7 (TensorRT engine-build pipeline).
|
||||
>
|
||||
> Index: [`00_summary.md`](00_summary.md). Sibling components: [C1 VIO](C1_vio.md), [C2 VPR](C2_vpr.md), [C3 Matchers](C3_matchers.md), [C4 Pose](C4_pose_estimation.md), [C5 State estimator](C5_state_estimator.md), [C6 Tile cache + spatial index](C6_tile_cache_spatial_index.md), [C7 On-Jetson inference runtime](C7_inference_runtime.md), [C8 MAVLink / MSP2 FC adapter](C8_fc_adapter.md). Cross-component gates: [`99_cross_component_gates.md`](99_cross_component_gates.md). C9 dropped per 2026-05-08 restructure.
|
||||
|
||||
---
|
||||
|
||||
## C10 — Pre-flight cache provisioning + sector classification (CROSS-COUPLING MINIMAL scope)
|
||||
|
||||
**Status**: IN PROGRESS at 0/2 (batch 1 = 2 sub-areas; opened 2026-05-08).
|
||||
|
||||
**Pinned input/output contract (per the locked C10 scope)**:
|
||||
- inputs:
|
||||
- `descriptor_blobs[*]` per tile = the per-tile global VPR descriptor (per D-C2-9 / D-C2-10 / D-C2-6 final lock: dimension d ∈ {256, 512, 1024, 2048, 4096} float32 or halfvec) — produced offline at C10 pre-flight by running C2 VPR backbone over each cached tile image.
|
||||
- `onnx_models[*]` per inference target = the ONNX-exported model graphs for C2 VPR backbone + C3 matcher + (optional) C1 learned VIO frontend, exported on the dev machine via `torch.onnx.export`.
|
||||
- `calibration_corpus` = real UAV nadir flight footage at ~1 km AGL over season-matched satellite tiles (per D-C7-1 closure, fixture-file pin delegated to Test Spec) — ~500-1,500 representative samples; binary tensor format `[N, C, H, W]`.
|
||||
- `target_jetson_uri` = SSH/serial address of the deployed Jetson Orin Nano Super target (or `localhost` when build runs on the deployed Jetson directly).
|
||||
- outputs:
|
||||
- **`/var/lib/onboard/cache/faiss/v_<descriptor_dim>_M<HNSW_M>.index`** = FAISS HNSW index file written via `faiss.write_index(index, path)`; loaded at takeoff via `faiss.read_index(path)`; sized at ~`(n_tiles × d × 2 B halfvec) + (n_tiles × M × 4 B graph links)`. Per-takeoff load latency target <5 s.
|
||||
- **`/var/lib/onboard/cache/trt/<model>_sm87_jp62_trt103_<precision>.engine`** = serialized TensorRT engine file produced by `trtexec` or `IBuilderSerializationConfig.serialize()`; loaded at takeoff via `IRuntime.deserializeCudaEngine`; tied to SM 87 (Jetson Orin Nano Super Ampere) per Source #105.
|
||||
- **Build/rebuild manifest** = single JSON file recording `(model_name, precision_mode, calib_data_sha256, build_start_iso8601, build_duration_sec, engine_sha256, target_sm, jetpack_version, trt_version)` per engine; `(descriptor_dim, n_tiles, faiss_M, ef_construction, build_duration_sec, faiss_sha256)` per FAISS index. Fed into AC-NEW-3 FDR.
|
||||
- runtime context:
|
||||
- **Pre-flight only**, NOT runtime. Build/rebuild cost amortized across all takeoffs that use the same artifacts. Per-mission rebuild only if `calibration_corpus` or `descriptor_blobs[*]` changed (manifest-hash-driven).
|
||||
- Build runs ON the deployed Jetson Orin Nano Super (per D-C7-7 = primary build-on-target). Reference-Jetson-prebuilt engine fallback supported (per D-C7-7 = fallback path) when pre-flight build fails or is skipped.
|
||||
|
||||
---
|
||||
|
||||
## Candidate matrix (batch 1 CLOSED at 2/N on 2026-05-08)
|
||||
|
||||
| Sub-area | Candidate | Pinned Mode/Config | Option Family | Intended Role | API Capability Evidence | Mismatches / Disqualifiers | Status | Decision Rationale |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| **Sub-area 1: D-C6-3 confirmation** | Direct `faiss.write_index` / `faiss.read_index` Python API + `python-atomicwrites` + content-hash verification gate at takeoff + manifest-hash-driven rebuild trigger + `IO_FLAG_MMAP_IFC` mmap load | `faiss.IndexHNSWFlat(d=descriptor_dim, M=32)` build per pre-flight when `manifest_hash` changed; `faiss.write_index(index, temp_path)` + atomic-rename + content-hash; takeoff load via `faiss.read_index(target_path, faiss.IO_FLAG_MMAP_IFC)` after content-hash verification | Established production (FAISS MIT + python-atomicwrites MIT) + project-side orchestration wrapper | C6 ↔ C10 cross-component gate closure (D-C6-3 confirmation) | MVE: see [`../02_fact_cards/C10_preflight_provisioning.md` Fact #100](../02_fact_cards/C10_preflight_provisioning.md); docs: Source #114 (FAISS API), Source #115 (size formula), Source #116 (atomic write pattern) | None — content-hash gate mitigates the documented FAISS "no internal integrity check" warning per Source #114 | **Selected** | Closes D-C6-3 with idempotent + crash-safe + AC-NEW-7-compliant pipeline; license-clean; minimal abstraction surface; ~430 MB cache file at 2048-D halfvec × 100K tiles fits AC-8.3 + AC-4.2 + AC-NEW-1 budgets comfortably |
|
||||
| **Sub-area 2: D-C7-7 confirmation** | Hybrid orchestration: Polygraphy CLI primary for INT8-calibrating builds + `trtexec` for cache-reuse fast rebuilds + direct `IBuilderConfig` Python API for unusual models (LightGlue dynamic shapes) | `polygraphy convert <model>.onnx --int8 --fp16 --data-loader-script ./calib_data_loader.py --calibration-cache <calib_cache> --workspace=1000000000 -o <engine>_sm87_jp62_trt103_<prec>.engine` (primary); `trtexec --onnx=... --saveEngine=... --fp16 --int8 --calib=... --shapes=...` (cache-reuse fallback); direct `IBuilderConfig` + `IInt8EntropyCalibrator2` Python API (escape hatch) | Established production NVIDIA-blessed orchestration (Polygraphy Apache-2.0; trtexec bundled with TensorRT 10.x Apache-2.0; direct API bundled with TensorRT 10.x) | C7 ↔ C10 cross-component gate closure (D-C7-7 confirmation) | MVE: see [`../02_fact_cards/C10_preflight_provisioning.md` Fact #101](../02_fact_cards/C10_preflight_provisioning.md); docs: Source #117 (Polygraphy CLI), Source #118 (Polygraphy Calibrator class), Source #119 (trtexec CLI), Source #120 (calib corpus size guidance), Source #121 (direct API cross-cite from C7 Source #105) | None — `trtexec --int8` without `--calib` random-data-fallback caveat is mitigated by project-side wrapper that enforces `--calib=<existing_cache>` non-empty as precondition | **Selected** | Closes D-C7-7 with hybrid tool matrix matching D-C10-5 = (d); operationalizes D-C7-1 closure (real UAV nadir flight footage corpus) via Polygraphy `--data-loader-script`; calibration-cache reuse keeps subsequent rebuilds <30 sec; license-clean Apache-2.0 throughout; engine cache files ~100-500 MB on disk separate from AC-8.3 tile cache budget |
|
||||
|
||||
---
|
||||
|
||||
## Working conclusions and decisions
|
||||
|
||||
**Selected primary**:
|
||||
- **D-C6-3 confirmation** (Sub-area 1): direct `faiss.write_index` / `faiss.read_index` Python API + `python-atomicwrites` + content-hash verification gate + manifest-hash-driven rebuild trigger + optional `IO_FLAG_MMAP_IFC` mmap load. **Closes the C6 ↔ C10 cross-component gate.**
|
||||
- **D-C7-7 confirmation** (Sub-area 2): hybrid Polygraphy + `trtexec` + direct `IBuilderConfig` Python API matrix per D-C10-5 = (d). Calibration corpus per D-C7-1 closure (real UAV nadir flight footage at ~1 km AGL over season-matched satellite tiles; specific fixture-file pin delegated to Test Spec). **Closes the C7 ↔ C10 cross-component gate.**
|
||||
|
||||
**Decisions raised (D-C10-N gates)** — see [`99_cross_component_gates.md`](99_cross_component_gates.md):
|
||||
|
||||
- **D-C10-1** (Fact #100) — descriptor-cache rebuild trigger choice — RECOMMENDED manifest-hash-driven + `--force-rebuild` override
|
||||
- **D-C10-2** (Fact #100) — descriptor-cache atomic-write strategy — RECOMMENDED `python-atomicwrites`; fallback hand-rolled
|
||||
- **D-C10-3** (Fact #100, CROSS-COMPONENT with AC-NEW-7) — content-hash verification gate at takeoff load — RECOMMENDED reject + STATUSTEXT + refuse takeoff
|
||||
- **D-C10-4** (Fact #100) — descriptor-cache load path — RECOMMENDED mmap with `madvise(MADV_WILLNEED)` pre-fault (or both for Plan-phase Jetson MVE)
|
||||
- **D-C10-5** (Fact #101, CROSS-COMPONENT with C7) — TensorRT engine-build orchestration tool choice — RECOMMENDED hybrid (Polygraphy + trtexec + direct API by use case)
|
||||
- **D-C10-6** (Fact #101, CROSS-COMPONENT with D-C7-1) — TensorRT calibration-cache reuse strategy — RECOMMENDED rebuild-on-calib-corpus-SHA-256-change + `--force-trt-rebuild` override
|
||||
- **D-C10-7** (Fact #101) — TensorRT engine on-disk filename schema — RECOMMENDED self-describing `<model>_sm<SM>_jp<JP>_trt<TRT>_<precision>.engine` filename + manifest.json side-cache
|
||||
- **D-C10-8** (Fact #101) — TensorRT prebuilt-fallback engine generation venue — RECOMMENDED reference Jetson at HQ + deployed-Jetson-copy-to-archive on first successful local build (opportunistic redundancy)
|
||||
|
||||
**C10 batch 1 closed at 2/N on 2026-05-08.** **No further C10 batches required at the research layer** — D-C6-3 and D-C7-7 cross-component gates are now closed; remaining C10 questions (operator CLI/desktop tooling, sector classification heuristics, freshness pipeline workflow) are deferred to Plan-phase per the 2026-05-08 `c10_scope=C` user choice.
|
||||
|
||||
---
|
||||
|
||||
## Out-of-research-scope items (deferred to Plan-phase)
|
||||
|
||||
The following items were originally part of C10's "Required outputs" per `../00_question_decomposition.md` line 78 but were narrowed out of research scope by user choice C on 2026-05-08:
|
||||
|
||||
| Deferred item | Plan-phase owner | Why it doesn't need research |
|
||||
|---|---|---|
|
||||
| Operator-side CLI/desktop tool design | Plan-phase architect + UX | Tool shape is a UX/integration decision; doesn't bind any architectural contract |
|
||||
| Sector classification (active-conflict vs stable rear) heuristics + interface | Plan-phase architect + operations team | AC-8.2 freshness threshold (6 mo vs 12 mo) is operational; heuristic source TBD (operator-marked geofence vs Suite Service metadata) |
|
||||
| Tile age-stamping schema beyond restrictions.md mandate | Plan-phase architect | Restrictions.md already mandates per-tile capture date in manifest; additional sector-class tag is a Plan-phase decision |
|
||||
| Freshness pipeline workflow | Plan-phase architect + operations team | When to re-pull from Suite Sat Service (every flight, weekly, on operator demand, on sector-class change) is operational |
|
||||
|
||||
These items will be revisited at Plan-phase. Their cross-coupling with the runtime architecture is mediated entirely by the descriptor-cache file (D-C6-3) and the TensorRT engine cache file (D-C7-7) — both pinned by C10 batch 1 confirmations.
|
||||
|
||||
---
|
||||
@@ -0,0 +1,47 @@
|
||||
# Component Fit Matrix — C1: Visual / Visual-Inertial Odometry
|
||||
|
||||
> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate, structured per-component candidate-selection table). Status vocabulary in [`00_summary.md`](00_summary.md). Detailed fact cards backing every status verdict live in [`../02_fact_cards/C1_vio.md`](../02_fact_cards/C1_vio.md).
|
||||
>
|
||||
> Index: [`00_summary.md`](00_summary.md). Sibling components: [C2 VPR](C2_vpr.md), [C3 Matchers](C3_matchers.md), [C4 Pose](C4_pose_estimation.md), [C5–C10 pending](C5-C10_pending.md). Cross-component gates: [`99_cross_component_gates.md`](99_cross_component_gates.md).
|
||||
|
||||
---
|
||||
|
||||
## C1 — Visual / Visual-Inertial Odometry [closed at documentary level, 2026-05-08]
|
||||
|
||||
**Pinned mode**: monocular + IMU on Jetson Orin Nano Super (8 GB shared, JetPack 6, ROS 2 Humble); inputs `{1× ADTi 20MP nav frame stream + FC IMU via MAVLink/SCALED_IMU2}`; outputs `{6-DoF pose at IMU rate with metric scale + 6×6 covariance + source label visual_propagated when no satellite anchor}`.
|
||||
|
||||
**Locked-in research-time defaults** (per Fact #41, after user-skipped clarification on D-C1-1 and D-C1-2):
|
||||
- D-C1-1 = (c) **keep both license tracks open** through Plan; final license decision deferred to post-Jetson-MVE.
|
||||
- D-C1-2 = (b) **defer Jetson Orin Nano Super hardware MVE to a dedicated bring-up phase** between research and Plan; research closes with documentary ranking + per-candidate `Verify` gates.
|
||||
|
||||
| # | Candidate | License | Per-mode verification | Status | Lead reason / disqualifier | Sub-matrix cite |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | **OKVIS2 / OKVIS2-X** | BSD-3 (no copyleft) | ✅ Fact #39 + Source #56 | **Documentary lead — BSD/permissive track** | Strongest documentary mode-fit; structural sub-20-Hz tolerance via keyframe-based architecture (Fact #40); OKVIS2-X (T-RO 2025) GNSS fusion architecturally aligned with AC-NEW-2 spoof-promotion path | `../02_fact_cards/C1_vio.md` → "OKVIS2 / OKVIS2-X — per-numbered binding" |
|
||||
| 2 | **OpenVINS** | GPL-3.0 (copyleft) | ✅ Fact #37 + Source #54 | **Documentary lead — GPL-3.0 track** | Best Jetson Orin Nano Dev Kit + JetPack 6 + ROS 2 Humble build evidence (rpng/open_vins issue #421 + fdcl-gwu setup guide); MSCKF formulation more memory-efficient than full sliding-window optimization; documented Xavier NX 270 ms latency baseline at 640×480 | `../02_fact_cards/C1_vio.md` → "OpenVINS — per-numbered binding" |
|
||||
| 3 | **VINS-Mono** | GPL-3.0 (copyleft) | ✅ Fact #38 + Source #55 (with caveat) | **Experimental only — GPL-3.0 track alternate** | Single-mode by construction (mono+IMU); proven on original Jetson Nano (2021 KAIST + 2024 RPi CM4); ⚠️ documentary minimum image rate 20 Hz vs project 3 fps (Fact #40) → must be Jetson-MVE-validated at sub-20-Hz OR Plan must commit to dual-rate camera pipeline (Fact #40) before promotion | `../02_fact_cards/C1_vio.md` → "VINS-Mono — per-numbered binding" |
|
||||
| 4 | **Pure VO + external ESKF (C5)** | OpenCV-Apache-2.0 + project-internal | ✅ Source #53 + Fact #35 | **Mandatory simple-baseline** | Per Component Option Breadth rule — runnable fallback if all VIO leads fail Jetson MVE; trivial latency + memory footprint; FAILS C1's IMU-fusion + covariance bindings inherently (those are owned by the external C5 wrapper) | `../02_fact_cards/C1_vio.md` → "Pure VO baseline — per-numbered binding" |
|
||||
| 5 | **VINS-Fusion** | GPL-3.0 | (see Fact #29) | **Documentary lead — GPL-3.0 track redundant** | Same authors as VINS-Mono with multi-sensor superset; mono+IMU mode shares VINS-Mono's algorithmic core; fails to run on Jetson TX2 (KAIST 2021); within HKUST family, VINS-Mono is the cleaner C1 candidate for the project's pinned mode | (covered transitively by VINS-Mono row above; VINS-Fusion-specific Jetson TX2 failure is Fact #29) |
|
||||
| 6 | **Kimera-VIO** | BSD-2 | (see Fact #32) | **Conditional secondary fallback** | Permissive license is attractive but resource overhead (3D mesh + semantic mesher) is poor fit under co-resident process pressure; failed Xavier NX 8 GB shared in KAIST 2021 multi-process benchmark | (no per-numbered sub-matrix this session; deferred — only lifts to lead if both BSD lead OKVIS2 and the GPL-3.0 leads fail Jetson MVE) |
|
||||
| 7 | **DPVO / DPV-SLAM** | MIT | (see Fact #34) | **Conditional — VO not VIO** | Mono VO only (no native IMU fusion); requires external IMU wrapper to satisfy the C1 mandate; DPVO-QAT++ (Nov 2025) shows 1.02 GB peak memory on RTX 4060; Jetson Orin Nano untested; operational complexity of teacher-student QAT pipeline is high vs classical candidates | (no per-numbered sub-matrix this session; lifted from C1 as VO-only candidate per Fact #34) |
|
||||
| 8 | **DROID-SLAM** | (project repo) | (see Fact #33) | **Rejected — disqualified by AC-4.2** | ≥11 GB GPU VRAM inference budget exceeds the project's 8 GB shared LPDDR5; mono VO/SLAM (no IMU fusion); arbitrary scale (no metric recovery without external alignment) | (no sub-matrix; rejected on AC-4.2 alone) |
|
||||
| 9 | **RTAB-Map** | BSD | (see Fact #16) | **Rejected — disqualified by SPRIN-D evidence** | Failed beyond 1 km / above 2 m/s flight in SPRIN-D environment; project cruise (≤17 m/s, kilometers between satellite anchors) explicitly excludes | (no sub-matrix; rejected on Fact #16) |
|
||||
| 10 | **ORB-SLAM3** | GPL-3.0 | (see Fact #16) | **Rejected — disqualified by SPRIN-D evidence** | Same as RTAB-Map | (no sub-matrix; rejected on Fact #16) |
|
||||
|
||||
### C1 — Per-license-track preliminary ranking (final ranking pending Jetson MVE)
|
||||
|
||||
**BSD/permissive track** (track lead under D-C1-1 = (b) or default (c)):
|
||||
1. **OKVIS2 / OKVIS2-X** — Documentary lead; structural sub-20-Hz advantage; OKVIS2-X GNSS-fusion architectural alignment with AC-NEW-2.
|
||||
2. (alternates) Kimera-VIO (Conditional); Pure VO + external ESKF (Mandatory simple-baseline).
|
||||
|
||||
**GPL-3.0 track** (track lead under D-C1-1 = (a) or default (c)):
|
||||
1. **OpenVINS** — Documentary lead; best Jetson Orin Nano build evidence; MSCKF memory advantage.
|
||||
2. **VINS-Mono** — Experimental only until Jetson MVE validates sub-20-Hz operation OR Plan commits to dual-rate pipeline (Fact #40).
|
||||
3. (alternate) VINS-Fusion — within HKUST family, VINS-Mono is the cleaner pick.
|
||||
|
||||
### C1 — Plan-phase deliverables raised by closure
|
||||
|
||||
1. **D-C1-1 license posture A/B/C** — must be presented to user as a structured Choose block at Plan time, with the documentary evidence above as input.
|
||||
2. **D-C1-2 Jetson Orin Nano Super hardware MVE** — must be executed as a dedicated bring-up phase between research and Plan; produces a single MVE artifact that promotes the surviving Documentary leads to Selected.
|
||||
3. **Single-rate vs dual-rate nav-camera pipeline (Fact #40)** — must be decided at Plan time; affects which C1 candidates remain on documentary lead vs Experimental status; affects C2/C3 candidate scoring in their respective rows.
|
||||
|
||||
---
|
||||
@@ -0,0 +1,87 @@
|
||||
# Component Fit Matrix — C2: Visual Place Recognition (VPR)
|
||||
|
||||
> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate, structured per-component candidate-selection table). Status vocabulary in [`00_summary.md`](00_summary.md). Detailed fact cards backing every status verdict live in [`../02_fact_cards/C2_vpr.md`](../02_fact_cards/C2_vpr.md).
|
||||
>
|
||||
> Index: [`00_summary.md`](00_summary.md). Sibling components: [C1 VIO](C1_vio.md), [C3 Matchers](C3_matchers.md), [C4 Pose](C4_pose_estimation.md), [C5–C10 pending](C5-C10_pending.md). Cross-component gates: [`99_cross_component_gates.md`](99_cross_component_gates.md).
|
||||
|
||||
---
|
||||
|
||||
## C2 — Visual Place Recognition (VPR) [mandatory pre-screen CLOSED at documentary level 2026-05-08; conditional candidates AnyLoc/BoQ/DINOv2-VLAD remain GATED on prerequisite INT8 quantization survey]
|
||||
|
||||
**Pinned mode** (per-frame retrieval contract, identical for every C2 candidate; per-candidate mode variations are: input image size, backbone, descriptor dimensionality, training-domain provenance, inference runtime):
|
||||
|
||||
- inputs: `{1× ADTi 20MP nav frame stream → center-cropped + bilinearly downscaled to candidate's native input size + ImageNet-normalised}` on `Jetson Orin Nano Super (8 GB shared, JetPack 6, ROS 2 Humble; PyTorch fp16 baseline; final inference runtime selection deferred to C7)`
|
||||
- outputs: `{global descriptor per frame; cosine top-K (K=10 per Fact #25) retrieval against pre-cached descriptor table over the project's ~400 km² operational area's tiles at AC-8.1 resolution floor (≥0.5 m/px)}` feeding C3 (cross-domain matcher)
|
||||
|
||||
**Locked-in research-time defaults** (carried forward from C1 — Fact #41):
|
||||
- D-C1-1 = (c) **keep both license tracks open** through Plan; final license decision deferred to post-Jetson-MVE.
|
||||
- D-C1-2 = (b) **defer Jetson Orin Nano Super hardware MVE to a dedicated bring-up phase** between research and Plan; research closes with documentary ranking + per-candidate `Verify` gates.
|
||||
- **C2-specific**: most C2 candidates are MIT/Apache permissive — license-track concern is less material than C1's GPL-3.0 vs BSD split; this row tracks license but does not split by track.
|
||||
|
||||
| # | Candidate | License | Per-mode verification | Status | Lead reason / disqualifier | Sub-matrix cite |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | **MixVPR** (ResNet50+MixVPR @ 320×320 → 2048-D) | MIT (BSD/permissive track) | ✅ Fact #42 + Source #57 + #58 | **Documentary lead with aerial-domain-training caveat** | OpenVPRLab canonical reference implementation; runnable per-mode example with project's pinned config; FAISS retrieval harness; descriptor cache ~650 MB fp16 within 10 GB AC-8.1 budget; 1.21 ms A100 latency baseline extrapolates well within AC-4.1 budget. **Caveat**: canonical weights are GSV-Cities (street-view) trained — Plan-phase decision required between (a) project-domain retrain on AerialVL, (b) aerial-trained community checkpoint, (c) elevate alternate C2 candidate | `../02_fact_cards/C2_vpr.md` → "MixVPR — per-numbered binding" |
|
||||
| 2 | **SALAD** (DINOv2 ViT-B/14 + SALAD aggregator @ 322×322 → 8448-D full / 2112-D / 544-D slim) | **GPL-3.0** (canonical, GPL-3.0 track) | ✅ Fact #43 + Source #59 + #60 + #61 | **Documentary lead with aerial-domain-training caveat + GPL-3.0-license-track caveat + DINOv2-ViT-export risk caveat** | Canonical CVPR 2024 implementation (`serizba/salad`); Torch-Hub one-liner `torch.hub.load("serizba/salad", "dinov2_salad")` for full variant; eval CLI ships three pretrained checkpoints (full 8448-D, slim 2112-D, slim 544-D); 2.41 ms RTX 3090 latency baseline extrapolates ~20–30 ms on Jetson Orin Nano Super at fp16 with TensorRT; **+11 R@1 absolute over MixVPR on MSLS Challenge** (75.0 vs 64.0 per paper Table 1) and **+17.6 R@1 on NordLand** (76.0 vs 58.4) — strongest cross-season generalization signal among the documented C2 candidates. Single-stage design (no re-ranking), built-in dustbin discards uninformative regions, optimal-transport assignment is bidirectional (feature-to-cluster + cluster-to-feature). **Three caveats vs MixVPR**: (i) GPL-3.0 license places SALAD on copyleft track — interacts with D-C1-1 license posture; under BSD/permissive lock at Plan, SALAD is excluded; (ii) DINOv2 ViT-B export to TensorRT fp16/INT8 on Jetson is paper-acknowledged "slower than ResNet" + industry-known harder than CNN export — D-C2-5 deferred Jetson MVE risk; (iii) full 8448-D descriptor cache consumes ~2.7 GB / ~27% of 10 GB AC-8.3 cache budget vs MixVPR's ~650 MB / 6.5% — D-C2-6 descriptor-size-choice trade-off; slim 544-D variant restores feasibility (~0.17 GB / 1.7%) at cost of ~5 R@1 points on MSLS Challenge | `../02_fact_cards/C2_vpr.md` → "SALAD — per-numbered binding" |
|
||||
| 3 | **SelaVPR** (DINOv2 ViT-L/14 frozen + Global+Local Adaptation adapters @ 224×224 → 1024-D global + 61×61×128 dense local; two-stage retrieval+rerank) | **MIT** (BSD/permissive track) | ✅ Fact #44 + Source #62 + #63 + #61 | **Documentary lead with aerial-domain-training caveat + DINOv2-ViT-L-export risk caveat (HARSHER than SALAD-ViT-B) + two-stage-latency-and-local-feature-cache-strategy risk caveat** | Canonical ICLR 2024 implementation (`Lu-Feng/SelaVPR`); training+eval CLIs (`python3 train.py --foundation_model_path=/path/to/dinov2_vitl14_pretrain.pth`, `python3 eval.py --rerank_num={20,100}`); two pretrained checkpoints (MSLS-finetuned for diverse scenes / Pitts30k-further-finetuned for urban) + optional `--registers` variant. **First DINOv2-based C2 candidate on BSD/permissive track — materially expands BSD/permissive C2 axis options vs MixVPR-only state**. RTX-3090 baseline 0.027 s extraction + 0.085 s matching (rerank_num=100) = 0.112 s total per query (paper Table 3). Extrapolation to Jetson Orin Nano Super: ~200–270 ms extraction + ~150 ms matching at rerank_num=20 = ~350 ms (tight against AC-4.1 400 ms budget; **rerank_num=100 FAILS budget**). Global descriptor 1024-D = ~320 MB cache (smallest of all C2 candidates, 3.2% of 10 GB AC-8.3 budget); **dense 61×61×128 local-feature cache ~150 GB across operational area = INFEASIBLE without D-C2-7 mitigation strategy** (cache global only + on-demand local-feature re-extraction, OR precompute top-K, OR disable rerank). **Three caveats vs MixVPR**: (i) DINOv2-ViT-L (300M params) backbone is 3.5× larger than SALAD-ViT-B's 86M and 12× larger than MixVPR-ResNet50's 25M — D-C2-5 export risk **harshest in C2 row so far**; counter-mitigation by frozen-backbone canonical TensorRT export pathway (FB AI Public Files); (ii) two-stage retrieval+rerank is structurally novel — D-C2-7 strategy choice; (iii) input size 224×224 is more aggressive downscale from 5472×3648 than MixVPR's 320×320 / SALAD's 322×322. **Documentary advantage**: Tokyo24/7 R@1=94.0 (best in paper Table 2 across all compared methods, +9 absolute over MixVPR's 85.1, +5.4 over prior SOTA R²Former 88.6); Nordland-test R@1=85.2 (vs SALAD's 76.0 and MixVPR's 58.4) — strongest cross-illumination + cross-season generalization signal among C2 candidates so far on ground-level (aerial unverified — D-C2-1) | `../02_fact_cards/C2_vpr.md` → "SelaVPR — per-numbered binding" |
|
||||
| 4 | **NetVLAD** (VGG-16 cropped at conv5_3 + NetVLAD pooling `vlad_preL2_intra` K=64 + PCA-whitening @ 224×224 → 4096-D global descriptor; canonical Pittsburgh-30k-pretrained variant) | **MIT** canonical (`Relja/netvlad`); **license-uncertain** Nanne PyTorch port (BSD/permissive track on canonical) | ✅ Fact #45 + Source #64 + #65 + #66 | **Mandatory simple-baseline** with MIT license + license-uncertain-Nanne-port caveat + established-baseline-accuracy-deficit-as-feature + runtime-stack-port-risk caveat + 4096-D-descriptor-cache caveat + aerial-domain-training caveat | Canonical learned-VLAD reference baseline for the entire VPR field (CVPR 2016, > 4000 citations); cited as the baseline in every subsequent VPR paper (MixVPR Table 1+4, SALAD Table 1, SelaVPR Table 2+3, AnyLoc, BoQ). Role per engine Component Option Breadth rule: **mandatory simple-VLAD baseline that establishes the long-established reference point against which modern C2 leads must show measurable advantage to justify added complexity**. Documented Recall@K deficit vs modern leads is expected and IS the role's purpose: Pitts30k-test R@1=84.1 (paper) / 85.2 (PyTorch reproduction) — **5-11 absolute below** MixVPR/SALAD/SelaVPR; Tokyo24/7 R@1=73.3 — **11.8-20.7 absolute below**; Nordland-test R@1≈33 — **25-52 absolute below**. **POSITIVE structural advantage**: VGG-16 backbone + single-stage retrieval = **LOWEST D-C2-4 + D-C2-5 risk among C2 candidates** (VGG-16 has the most-export-friendly TensorRT pathway; no DINOv2 ViT export-risk applies; no two-stage re-ranking latency variance; no local-feature cache pressure). **NEW caveats vs prior C2 candidates**: (i) runtime-stack port-risk (canonical MATLAB + MatConvNet not deployable on JetPack 6 → PyTorch port required); (ii) Nanne port license-uncertainty (README does NOT cite LICENSE file → Plan-phase verification gate); (iii) 4096-D PCA-whitened descriptor consumes ~13% of AC-8.3 cache budget — largest single-stage descriptor cache so far (256-D / 512-D `cropToDim` variants documented for tighter budgets at cost of further Recall@K loss). | `../02_fact_cards/C2_vpr.md` → "NetVLAD — per-numbered binding" |
|
||||
| 5 | **EigenPlaces** (ResNet50 + GeM + FC @ 224×224 → 2048-D global descriptor; canonical PyTorch-Hub best-Recall@K variant) | **MIT** (BSD/permissive track) | ✅ Fact #46 + Source #67 + #68 | **Documentary lead with aerial-domain-training caveat + structurally-simplest-modern-competitive-CNN advantage + 60%-less-VRAM-retrain advantage + viewpoint-robust-training-paradigm advantage + extreme-cross-season-third-place caveat** | Canonical ICCV 2023 implementation (`gmberton/EigenPlaces`); PyTorch Hub one-liner `torch.hub.load("gmberton/eigenplaces", "get_trained_model", backbone="ResNet50", fc_output_dim=2048)`; eleven canonical pretrained checkpoints PyTorch-Hub-distributed (more than any other C2 candidate evaluated); companion `gmberton/VPR-methods-evaluation` fair-comparison harness. **Three POSITIVE structural advantages vs all prior C2 candidates**: (i) **STRUCTURALLY-SIMPLEST MODERN COMPETITIVE CNN ARCHITECTURE** in C2 row (ResNet-50 + GeM + FC — fewer moving parts than MixVPR's MLP-Mixer / SALAD's optimal-transport+DINOv2-B / SelaVPR's two-stage DINOv2-L+adapters / NetVLAD's soft-assignment+PCA-whitening) → **lowest D-C2-4 + D-C2-5 risk among modern competitive C2 leads**, ~15-30 ms total per frame on Jetson Orin Nano Super extrapolation, ~58 MB total weights at fp16 (smallest model footprint of any C2 candidate evaluated); (ii) **60%-LESS-VRAM-RETRAIN advantage** vs MixVPR (paper §4.4: <7 GB VRAM training vs MixVPR's 18 GB at canonical batch) → **most retrain-friendly C2 candidate for D-C2-1 aerial-domain retrain decision**; (iii) **VIEWPOINT-ROBUST TRAINING PARADIGM** (paper §3 lateral+frontal CosFace dual loss with SVD-based class construction — explicitly designed for viewpoint shifts) → **most semantically-aligned training prior for aerial nadir VPR** where UAV multi-heading flights generate exactly the multi-viewpoint training signal EigenPlaces is designed to exploit. **Documented Recall@1 vs other C2 candidates (best-config-of-each)**: Pitts30k 92.5 (vs MixVPR 91.5, SALAD 95.1 different paper, SelaVPR 92.8, NetVLAD 84.1); Tokyo24/7 **93.0** (best in EigenPlaces paper Tab 3 across all compared methods, second only to SelaVPR's 94.0 in C2 row); AmsterTime **48.9** (BEST in C2 row for extreme decade-scale cross-time domain shift — relevant to Ukraine-active-conflict scene-change scenarios); SF-XL test v1 **84.1** (BEST in row, +44 over NetVLAD); Nordland 71.2 (third in C2 row — SelaVPR wins by +14 absolute; viewpoint-robustness comes at the cost of being weaker than DINOv2-based on extreme cross-season); SVOX-Night 58.9 (fourth — MixVPR-4096 wins by +5.5). Cache footprint at 2048-D = ~650 MB / 6.5% (identical to MixVPR-2048; smaller sibling modes 128/256/512-D documented as PyTorch-Hub-distributed). **Closes the BSD/permissive C2 axis with a 4th materially-different design point** alongside MixVPR + SelaVPR + NetVLAD. README explicitly recommends MegaLoc as a SOTA successor — for the project's mandatory-pre-screen role this is acceptable; Plan-phase may want to also evaluate MegaLoc as a separately-cataloged sibling/successor candidate | `../02_fact_cards/C2_vpr.md` → "EigenPlaces — per-numbered binding" |
|
||||
| 6 | **AnyLoc** (DINOv2 ViT-G+VLAD) | (TBD) | NOT STARTED — conditional on INT8 quantization | **Conditional** | DINOv2 ViT-G is too large for Jetson Orin Nano Super at fp16; INT8 quantization path is the only route to inclusion (per Fact #26 pre-screen rule) | (conditional next session) |
|
||||
| 7 | **BoQ** (DINOv2 ViT-B+BoQ) | MIT | NOT STARTED — conditional on INT8 quantization | **Conditional** | Same author as MixVPR (amaralibey); also bundled in OpenVPRLab; transformer-based aggregation with learnable queries; Jetson cost of DINOv2 ViT-B + BoQ requires INT8 path | (conditional next session) |
|
||||
| 8 | **DINOv2-VLAD** (DINOv2 direct + VLAD pooling) | (TBD) | NOT STARTED — conditional on INT8 quantization | **Conditional** | Heaviest of the conditional candidates; only worthwhile if INT8 path proven for any other DINOv2-based candidate first | (conditional next session) |
|
||||
| 9 | **SuperGlue-as-reranker** | (N/A) | (pruned outright per pre-screen) | **Pruned outright** | Matcher-class, not VPR-class; no global-descriptor stage | (no entry; pruned at SQ3+SQ4 pre-screen) |
|
||||
|
||||
### C2 — Plan-phase deliverables raised by MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces closures (mandatory pre-screen complete; conditional candidates may compound)
|
||||
|
||||
1. **D-C2-1 VPR canonical-weights vs aerial-retrain vs aerial-community-checkpoint** (raised by MixVPR; reaffirmed by SALAD + SelaVPR with identical caveat) — must be presented to user as a structured Choose block at Plan time; applies to **every** ground-level-pretrained C2 candidate, so the decision is project-wide. Options: (a) project-domain retrain on AerialVL / AerialExtreMatch, (b) source aerial-trained community checkpoint at Plan time, (c) elevate a candidate with already-aerial-trained weights as the C2 lead.
|
||||
2. **D-C2-2 descriptor-cache carve-out vs raw-tile-cache budget** (raised by MixVPR; harshened by SALAD; **materially-changed-shape by SelaVPR**) — AC-8.3 explicitly requires Plan-phase decision on whether the C2 descriptor table is part of the 10 GB cache budget or carved out separately. Per-variant lower bounds (global-descriptor stage only): **SelaVPR 1024-D ~320 MB fp16 / 3.2%** (smallest of all C2 candidates so far); MixVPR 2048-D ~650 MB fp16 / 6.5%; SALAD-slim 544-D ~0.17 GB / 1.7%; SALAD-slim 2112-D ~0.68 GB / 6.8%; **SALAD-full 8448-D ~2.7 GB / 27%**; conditional candidates (AnyLoc 49152-D, BoQ 16384-D, DINOv2-VLAD) push descriptor cache to ~10 GB alone, forcing the carve-out decision. **NEW SelaVPR-specific local-feature-cache pressure**: 61×61×128 dense local features × 160k tiles × 2 bytes (fp16) = ~150 GB — fundamentally infeasible without D-C2-7 mitigation strategy.
|
||||
3. **D-C2-3 input-resolution shape (224×224 vs 320×320 vs 322×322 vs higher)** (raised by MixVPR/SALAD at 320–322; **harshened by SelaVPR's 224×224**) — SelaVPR's 224×224 is more aggressive downscale from 5472×3648 than MixVPR's 320×320 / SALAD's 322×322; SelaVPR is at the small-input extreme of the C2 candidate space, MixVPR + SALAD are at the medium-input baseline, AnyLoc + BoQ may be at the higher-resolution end (next sessions). Plan-phase decision after all C2 candidates have per-Mode entries.
|
||||
4. **D-C2-4 deferred Jetson Orin Nano Super hardware MVE phase coverage** (raised by MixVPR; broadened by SALAD; **broadened further by SelaVPR**) — same artifact as D-C1-2; must now also produce DINOv2 ViT-B AND ViT-L → TensorRT fp16/INT8 export-quality numbers + per-C2-candidate latency + memory + AerialExtreMatch Recall@K numbers + SelaVPR two-stage re-ranking latency profile + on-demand local-feature extraction performance; promotes Documentary leads to Selected.
|
||||
5. **D-C2-5 DINOv2 ViT-export to TensorRT fp16/INT8 path on Jetson Orin Nano Super** (raised by SALAD; **harshened by SelaVPR**) — applies to every ViT-based C2 candidate (SALAD-ViT-B, SelaVPR-ViT-L, AnyLoc-ViT-G, BoQ-ViT-B, DINOv2-VLAD). SelaVPR's ViT-L is 3.5× larger than SALAD's ViT-B; export risk profile materially elevated. Counter-mitigation by frozen-backbone canonical TensorRT export pathway (SelaVPR's frozen DINOv2-L weights have a well-documented optimization path via FB AI Public Files distribution, vs SALAD's fine-tuned-backbone). Jetson MVE prerequisite for any ViT-based C2 candidate to advance from Documentary lead to Selected. Likely rolls into D-C1-2 + the C7 inference-runtime row.
|
||||
6. **D-C2-6 SALAD descriptor-size choice (8448-D / 2112-D / 544-D)** (raised by SALAD only — does not apply to SelaVPR which has fixed 1024-D global descriptor) — Plan-phase trade-off; full variant gives best R@1 (MSLS Challenge 75.0) but consumes ~27% of cache budget; slim 2112-D variant (R@1 73.7) consumes ~6.8%; slim 544-D variant (R@1 70.8) fits within 1.7% of cache budget. Interacts with D-C2-2.
|
||||
7. **D-C2-7 (NEW from SelaVPR closure 2026-05-08) — SelaVPR re-ranking strategy choice (full re-rank with on-demand local-feature extraction / cache top-K local features per likely query path / disable re-ranking entirely and use SelaVPR-global-only mode)** — only applies to SelaVPR (first two-stage C2 candidate evaluated). Plan-phase decision; full re-rank at rerank_num=100 fails AC-4.1 latency budget on Jetson extrapolation; rerank_num=20 fits but tight; on-demand local-feature extraction + global-only-cache (~320 MB) is the most cache-efficient mitigation; precompute-top-K-local-features (~3 GB at K=20 with selective coverage) is the moderate option; disable-rerank gives back the two-stage advantage but drops MSLS-challenge R@1 from 73.5 to 69.6 (still ahead of MixVPR's 64.0). **Three-way interaction with D-C2-2 (cache carve-out) and AC-8.3 (10 GB budget) and AC-4.1 (400 ms latency budget)**.
|
||||
8. **D-C2-8 (NEW from NetVLAD closure 2026-05-08) — NetVLAD PyTorch-port-strategy choice (Nanne/pytorch-NetVlad with license-uncertainty / re-port from canonical Relja/netvlad with MIT preservation / OpenVPRLab-NetVLAD-on-ResNet50 as separately-cataloged sibling mode)** — only applies to NetVLAD (canonical implementation is MATLAB + MatConvNet, not deployable on JetPack 6). Plan-phase decision; Nanne port is fastest path but README does NOT cite a LICENSE file — Plan-phase verification gate is required before Nanne adoption; re-port from canonical Relja/netvlad MATLAB to PyTorch directly preserves MIT licensing but requires ~1 week of engineering + cluster-init prerequisite; OpenVPRLab-NetVLAD-on-ResNet50 (per Source #57) is apples-to-apples vs MixVPR but is a *different mode* per Per-Mode API rule (different backbone, different pretrained checkpoint provenance) and would be cataloged as a separate sibling candidate. Recommendation: re-port from canonical to preserve MIT licensing alignment with MixVPR + SelaVPR on the BSD/permissive track.
|
||||
9. **D-C2-9 (NEW from NetVLAD closure 2026-05-08) — NetVLAD descriptor-dimension choice (canonical 4096-D PCA-whitened / 512-D `cropToDim` for tighter cache / 256-D `cropToDim` for tightest cache)** — only applies to NetVLAD; analogous to D-C2-6 SALAD descriptor-size choice but for NetVLAD's PCA-whitened output. Plan-phase decision; canonical 4096-D consumes ~1.3 GB / 13% of 10 GB AC-8.3 cache budget — largest single-stage descriptor cache of any C2 candidate so far; 512-D `cropToDim` reduces to ~160 MB / 1.6% at additional Recall@K loss; 256-D `cropToDim` reduces to ~80 MB / 0.8% at further loss. Only valid for `+whitening` networks. Interacts with D-C2-2 carve-out decision.
|
||||
10. **D-C2-10 (NEW from EigenPlaces closure 2026-05-08) — EigenPlaces descriptor-dimension choice (canonical 2048-D / 512-D / 256-D / 128-D — eleven backbone+dim sibling modes documented PyTorch-Hub-distributed)** — only applies to EigenPlaces; analogous to D-C2-6 SALAD and D-C2-9 NetVLAD descriptor-dimension choices. Plan-phase decision; canonical ResNet-50 + 2048-D consumes ~650 MB / 6.5% of AC-8.3 cache budget (identical to MixVPR-2048 for direct apples-to-apples comparison); 512-D variant reduces to ~160 MB / 1.6% at modest Recall@1 loss (paper Tab 3: Pitts30k 91.9 at 512 vs 92.5 at 2048 = -0.6, Tokyo24/7 89.8 at 512 vs 93.0 at 2048 = -3.2 — extreme cross-domain hurts most); 256-D reduces to ~80 MB / 0.8% at moderate Recall@K loss; 128-D reduces to ~40 MB / 0.4% at substantial Recall@K loss on cross-domain (paper §4.3 explicit observation that lower-D variants struggle on AmsterTime/Tokyo24/7/SVOX-Night). Interacts with D-C2-2 carve-out decision.
|
||||
11. **D-C2-11 (NEW from EigenPlaces closure 2026-05-08, conditional) — MegaLoc successor evaluation as separately-cataloged sibling candidate** — EigenPlaces canonical README explicitly recommends MegaLoc as a SOTA successor ("EigenPlaces is quite old. Looking for SOTA Visual Place Recognition (VPR)? Check out MegaLoc"). Plan-phase decision: (a) treat MegaLoc as a separately-cataloged sibling candidate at Plan time (would require its own per-mode API capability verification + sub-matrix), (b) defer MegaLoc evaluation to a post-research session if EigenPlaces fails Jetson MVE, (c) skip MegaLoc and rely on the closed mandatory pre-screen (5/5: MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces). Recommendation: defer to post-research session — EigenPlaces closes the mandatory pre-screen at the documentary-required floor, and MegaLoc's Plan-phase relevance depends on which D-C1-1 license-track is chosen and how Jetson MVE results land.
|
||||
|
||||
### C2 — Per-candidate ranking (mandatory pre-screen complete at 5 of 5; final ranking deferred to Jetson MVE phase)
|
||||
|
||||
Status: **5 of 5 mandatory pre-screen candidates** have per-Mode entries (MixVPR + SALAD + SelaVPR + NetVLAD + EigenPlaces). Final ranking deferred to D-C1-2 + D-C2-4 dedicated Jetson Orin Nano Super hardware MVE phase between research and Plan. **Conditional pre-screen candidates (AnyLoc / BoQ / DINOv2-VLAD) remain GATED on a prerequisite INT8 quantization survey** before they can be added to per-mode rows (per Fact #26 pre-screen rule).
|
||||
|
||||
Per-license-track preliminary picture (mandatory pre-screen final picture; will be re-ranked at Jetson MVE phase if conditional candidates are added):
|
||||
|
||||
**BSD/permissive track** (track lead under D-C1-1 = (b) or default (c)):
|
||||
1. **SelaVPR** — Documentary lead with three caveats (MIT, 1024-D global + 61×61×128 dense local, 224×224 input, DINOv2 ViT-L/14 frozen backbone, two-stage retrieval+rerank, `Lu-Feng/SelaVPR` canonical implementation). **Strongest documentary cross-illumination + cross-season recall numbers** among C2 candidates so far on ground-level: Tokyo24/7 R@1=94.0 (best in paper Table 2 across all compared methods including SOTA R²Former 88.6) and Nordland-test R@1=85.2 (vs SALAD's 76.0 and MixVPR's 58.4). Carries D-C2-5 (DINOv2-ViT-L export risk, harshest in C2 row) + D-C2-7 (re-ranking strategy choice, NEW) + D-C2-3 (smallest-input downscale-from-5472×3648).
|
||||
2. **MixVPR** — Documentary lead with aerial-domain-training caveat (MIT, 2048-D descriptor, 320×320 input, ResNet50 backbone, OpenVPRLab canonical implementation). Cleanest BSD/permissive-track candidate: simplest backbone + simplest export path + smallest model footprint + medium descriptor cache.
|
||||
3. **EigenPlaces** — Documentary lead with five distinguishing characteristics (MIT, 2048-D / 512-D / 256-D / 128-D PyTorch-Hub-distributed sibling modes [eleven canonical pretrained checkpoints total — most of any C2 candidate], 224×224 input, ResNet-50 + GeM + FC structurally-simplest-modern-competitive-CNN backbone, single-stage retrieval, `gmberton/EigenPlaces` canonical implementation). **Distinguishing positive structural advantages vs MixVPR + SelaVPR + NetVLAD on this track**: (i) STRUCTURALLY-SIMPLEST modern competitive CNN (lowest D-C2-4 + D-C2-5 runtime risk among modern competitive C2 leads; smallest model footprint ~58 MB at fp16); (ii) 60%-LESS-VRAM-RETRAIN advantage vs MixVPR (most retrain-friendly C2 candidate for D-C2-1 aerial-domain decision); (iii) VIEWPOINT-ROBUST training paradigm (most semantically-aligned training prior for aerial nadir VPR — UAV multi-heading flights generate the multi-viewpoint training signal). **Documented Recall@K**: BEST in C2 row on multi-view (Pitts30k 92.5, AmsterTime 48.9 [BEST in C2 row for extreme decade-scale cross-time], SF-XL-v1 84.1) and second-only-to-SelaVPR on Tokyo24/7 (93.0 vs 94.0 — with much lower deployment risk than SelaVPR); third-place on extreme cross-season Nordland (71.2 vs SelaVPR 85.2 = -14) and SVOX-Night (58.9 vs MixVPR-4096 64.4 = -5.5). Carries NEW D-C2-10 (descriptor-dimension choice) + conditional D-C2-11 (MegaLoc successor evaluation deferral).
|
||||
4. **NetVLAD** — Mandatory simple-baseline (MIT canonical / license-uncertain Nanne PyTorch port, 4096-D PCA-whitened / 512-D / 256-D `cropToDim` variants, 224×224 input, VGG-16 cropped-at-conv5_3 backbone, single-stage retrieval, `Relja/netvlad` canonical MATLAB + `Nanne/pytorch-NetVlad` PyTorch reproduction + canonical paper Arandjelović 2016). **Long-established VPR reference baseline** — cited as the baseline in every modern VPR paper. **Documented Recall@K deficit vs modern leads (5-25 absolute R@1 across Pitts30k/Tokyo24/7/Nordland) IS the role's purpose** per engine Component Option Breadth rule. **POSITIVE structural advantages**: LOWEST D-C2-4 + D-C2-5 risk overall (VGG-16 → TensorRT is the most-export-friendly path of any C2 candidate; no DINOv2 ViT export-risk; no two-stage re-ranking variance; no local-feature cache pressure). Carries NEW D-C2-8 (PyTorch port-strategy choice) + NEW D-C2-9 (descriptor-dimension choice).
|
||||
|
||||
**Comparison: MixVPR vs SelaVPR vs EigenPlaces vs NetVLAD on BSD/permissive track** — four materially-different design points on the same license track (modern competitive lead [MLP-Mixer] vs modern competitive lead [DINOv2-L two-stage] vs modern competitive lead [viewpoint-robust ResNet-50] vs long-established baseline [VLAD]):
|
||||
|
||||
| Dimension | MixVPR | SelaVPR | EigenPlaces | NetVLAD (mandatory baseline) |
|
||||
|---|---|---|---|---|
|
||||
| Backbone | ResNet50 (~25M params) | DINOv2 ViT-L/14 (~300M params, FROZEN) | ResNet50 (~25M params) | VGG-16 cropped at conv5_3 (~50-60M params) |
|
||||
| Aggregator/Adapter | MLP-Mixer aggregation | Lightweight serial+parallel adapters per ViT block + LocalAdapt up-conv | **GeM (Generalized Mean Pooling, parameter-free) + single FC layer** | NetVLAD soft-assignment-VLAD pooling K=64 + PCA-whitening |
|
||||
| Input size | 320×320 | 224×224 (more aggressive downscale) | 224×224 (same as SelaVPR + NetVLAD) | 224×224 (same as SelaVPR + EigenPlaces) |
|
||||
| Global descriptor | 2048-D | 1024-D | **2048-D** canonical / 512-D / 256-D / 128-D / VGG16+512-D PyTorch-Hub-distributed sibling modes (eleven canonical pretrained checkpoints) | **4096-D PCA-whitened** (canonical) / 512-D / 256-D `cropToDim` variants |
|
||||
| Retrieval architecture | Single-stage | Two-stage (top-K via global + rerank via local MNN cross-match) | **Single-stage** | Single-stage |
|
||||
| Global descriptor cache (~400 km² @ 0.5 m/px) | ~650 MB fp16 / 6.5% | ~320 MB fp16 / 3.2% | **~650 MB fp16 / 6.5% (canonical 2048-D — identical to MixVPR-2048)** / ~160 MB / 1.6% (512-D) / ~80 MB / 0.8% (256-D) / ~40 MB / 0.4% (128-D) | **~1.3 GB fp16 / 13%** (canonical 4096-D) / ~160 MB / 1.6% (512-D) / ~80 MB / 0.8% (256-D) |
|
||||
| Local-feature cache | (none — single-stage) | 61×61×128 dense local features = ~150 GB if naive cache; needs D-C2-7 mitigation | (none — single-stage) | (none — single-stage) |
|
||||
| Model footprint at fp16 | ~50 MB (ResNet50 + MLP-Mixer) | ~600 MB (DINOv2-L + adapters + LocalAdapt) | **~58 MB (smallest of any C2 candidate evaluated — ResNet50 + GeM + FC)** | ~400 MB (VGG-16 + NetVLAD + PCA-whitening) |
|
||||
| RTX-3090 latency baseline | 1.21 ms (paper Table 4, A100) | 27 ms extraction + 85 ms matching @ rerank_num=100 = 112 ms total (paper Table 3) | ~5 ms (ResNet-50 fp16 + GeM + FC contemporary benchmark extrapolation; paper §4.4 says "extraction time negligible at scale") | ~10-20 ms VGG-16 forward pass + ~1-2 ms NetVLAD aggregation + ~1-2 ms PCA-whitening MatMul |
|
||||
| Jetson Orin Nano Super extrapolated latency | ~10–30 ms | ~200–270 ms extraction + ~150 ms matching @ rerank_num=20 = ~350 ms total (FAILS AC-4.1 at rerank_num=100) | **~15-30 ms total (LOWEST among modern competitive C2 leads; D-C2-5 ViT-export-risk does not apply)** | ~40-60 ms total (LOWEST runtime risk overall in C2 row; D-C2-5 ViT-export-risk does not apply but VGG-16 is older + larger than ResNet-50) |
|
||||
| Training GPU memory cost (canonical batch) | ~18 GB (paper §4.4) | ~24 GB (DINOv2-L finetune; estimated) | **<7 GB (paper §4.4 — 60% LESS than MixVPR)** | (not directly reported; canonical training is on cluster) |
|
||||
| MSLS-Val R@1 | 87.2 (@4096) / 83.6 (@512) | 90.8 | **89.1 (@2048)** | (not in MSLS-Val paper Table; documented as baseline floor) |
|
||||
| Pitts30k-test R@1 (canonical) | ~90 | 92.8 | **92.5 (@2048)** | **84.1 (paper) / 85.2 (PyTorch reproduction)** — baseline floor |
|
||||
| Tokyo24/7 R@1 (cross-illumination day/night) | 85.1 | **94.0** (best in SelaVPR paper Table 2) | **93.0 (@2048; second-place in C2 row, with much lower deployment risk than SelaVPR)** | **73.3** — baseline floor (-11.8 to -20.7 absolute vs modern leads) |
|
||||
| AmsterTime R@1 (extreme decade-scale cross-time) | 40.2 (@4096) | (not reported in SelaVPR paper) | **48.9 (BEST in C2 row — relevant to Ukraine-active-conflict scene-change scenarios)** | 16.3 (VGG16+4096) — baseline floor |
|
||||
| Nordland-test R@1 (extreme cross-season) | 58.4 (canonical paper) / 76.2 (EigenPlaces paper Tab 4 @4096) | **85.2** | 71.2 (@2048; third-place, viewpoint-robustness comes at the cost of being weaker than DINOv2 on extreme cross-season) | **~33** (per MixVPR paper Table 1 baseline) — baseline floor |
|
||||
| SVOX-Night R@1 (extreme illumination) | 64.4 (@4096) | (not reported in SelaVPR paper) | 58.9 (@2048; fourth-place; MixVPR-4096 wins by +5.5) | 8.0 (VGG16+4096) — baseline floor |
|
||||
| Aerial-domain training | None (D-C2-1 applies) | None (D-C2-1 applies) | None (D-C2-1 applies) **but EigenPlaces is the MOST retrain-friendly candidate** at <7 GB GPU VRAM — D-C2-1 = (a) project-domain retrain on AerialVL is materially cheaper to execute on EigenPlaces than on any other candidate | None (D-C2-1 applies) — but NetVLAD's mandatory-baseline role does NOT require aerial-domain training to be useful |
|
||||
| Training paradigm semantic alignment with aerial nadir VPR | Standard metric learning (multi-similarity loss on GSV-Cities) — generic | DINOv2 frozen + adapter fine-tuning (parameter-efficient transfer learning) — generic | **Lateral+Frontal CosFace dual loss with SVD-based viewpoint-shift class construction** — most semantically-aligned training prior for UAV multi-heading flights generating multi-viewpoint training signal | Weakly supervised triplet ranking with hard negative mining on Google Street View Time Machine — generic |
|
||||
| Role per engine Component Option Breadth | Modern competitive lead (compact-descriptor leader) | Modern competitive lead (best documented cross-illumination/cross-season ground-level recall via two-stage) | Modern competitive lead (**viewpoint-robust + structurally-simplest + most retrain-friendly + best AmsterTime cross-time**) | **Mandatory simple-VLAD reference baseline** that establishes the long-established floor against which modern leads must measurably exceed |
|
||||
|
||||
**GPL-3.0 track** (track lead under D-C1-1 = (a) or default (c)):
|
||||
1. **SALAD** — Documentary lead with three caveats (GPL-3.0, 8448-D / 2112-D / 544-D descriptor variants, 322×322 input, DINOv2 ViT-B/14 backbone with last 4 blocks fine-tuned, `serizba/salad` canonical implementation). Strongest single-stage MSLS Challenge R@1 (75.0 full vs SelaVPR's 73.5 and MixVPR's 64.0). Carries DINOv2-ViT-B export risk (D-C2-5, harsher than MixVPR's CNN, lighter than SelaVPR's ViT-L) and descriptor-cache budget pressure (D-C2-6).
|
||||
2. (no other GPL-3.0 C2 leads pending in the mandatory pre-screen — SelaVPR landed on the BSD/permissive track, contradicting the prior session's assumption that it would be the "most likely additional GPL-3.0 candidate").
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,47 @@
|
||||
# Component Fit Matrix — C4: Pose estimation (PnP + RANSAC + LM)
|
||||
|
||||
> Mode A Phase 2 — engine Step 7.5 (Component Applicability Gate, structured per-component candidate-selection table). Status vocabulary in [`00_summary.md`](00_summary.md). Backing fact cards: [`../02_fact_cards/SQ2_canonical_pipeline.md`](../02_fact_cards/SQ2_canonical_pipeline.md) (canonical PnP+RANSAC+LM pipeline) and [`../02_fact_cards/C3_matchers.md`](../02_fact_cards/C3_matchers.md) (C3 → C4 input contract).
|
||||
>
|
||||
> Index: [`00_summary.md`](00_summary.md). Sibling components: [C1 VIO](C1_vio.md), [C2 VPR](C2_vpr.md), [C3 Matchers](C3_matchers.md), [C5–C10 pending](C5-C10_pending.md). Cross-component gates: [`99_cross_component_gates.md`](99_cross_component_gates.md).
|
||||
|
||||
---
|
||||
|
||||
## C4 — Pose estimation (PnP + RANSAC + LM)
|
||||
|
||||
**Status**: IN PROGRESS — **3 of N candidates** complete at documentary level (mandatory-simple-baseline role STRUCTURALLY COMPLETE — OpenCV `cv::solvePnPRansac` per Fact #52; modern-competitive-lead-richer-minimal-solver role — OpenGV per Fact #53; modern-competitive-lead-covariance-honest role — GTSAM per Fact #54). Subsequent candidates (Theia / Ceres-only) will be cataloged in subsequent sessions if needed.
|
||||
|
||||
**Definition correction (2026-05-08, locked by user)**: the original `00_question_decomposition.md` line 72 taxonomy table named C4 "Single-frame orthorectification" but the dominant convention through C1+C2+C3 closures (line 160 + 194 of `00_question_decomposition.md`, ALL C3-row pinned outputs `feeding C4 PnP+RANSAC pose estimator`, Fact #20 + #21 + #45 through #51 audience lines) treats C4 as "Pose estimation (PnP + RANSAC + LM)" — taking C3's 2D-2D correspondences and producing 6-DoF camera pose w.r.t. tile, feeding C5 estimator. **User-locked C4 definition is Pose estimation**. The orphaned "Single-frame orthorectification" responsibility (AC-8.4 mid-flight tile generation, write-side path) is reassigned-pending-final-row-decision to **C6 (tile cache + spatial index)** as a write-side cache concern (since AC-8.4 is fundamentally `pose-from-C5 + nav-frame-from-C1 → ortho-rectified-tile → C6 cache write`, and C6 already owns tile cache write per Fact #21 binding `AC-8.4 ... bound by ... C6 (tile cache write)`). Final placement of orthorectification will be confirmed when the C6 row is opened. **No new component slot is created**; the original C4–C10 numbering is preserved; only C4's responsibility is changed.
|
||||
|
||||
**Pinned mode** (per-frame pose-from-correspondences contract for the project's C4 row):
|
||||
|
||||
- inputs: `{up to 1024 2D-2D correspondences with confidence scores per (UAV-frame, satellite-tile) image pair from C3 (DISK+LightGlue D-C3-1 RECOMMENDED-PRIMARY / ALIKED+LightGlue D-C3-1 SECONDARY / XFeat D-C3-1 ALTERNATE / SP+LightGlue documentary-baseline / SuperGlue+SuperPoint mandatory-simple-baseline) + per-tile geo metadata (WGS84 corner coordinates + ortho resolution per AC-8.1) from C6 tile cache read + 3D lift via DSM (if available; AC + restrictions specify 2D ortho only — Fact #23 closure deferred 2D-3D-lift architectural decision means 2D-only operation is the project default)}` on `Jetson Orin Nano Super (8 GB shared, JetPack 6, ROS 2 Humble; final inference runtime selection deferred to C7 + D-C3-2 reuse)`; per-frame compute = K=10 image pairs × 1 PnP+RANSAC+LM call per Fact #25 + AC-3.3 re-localization
|
||||
- outputs: `{6-DoF camera pose w.r.t. tile (R, t) + per-correspondence inlier mask + reprojection error + 6×6 covariance + inlier ratio + RANSAC iteration count + source label satellite_anchor for the fused C5 estimate}` per Fact #20 + #21 + AC-NEW-4 (covariance honesty)
|
||||
|
||||
**Locked-in research-time defaults** (carried forward from C1 + C2 + C3 — Fact #41):
|
||||
- D-C1-1 = (c) **keep both license tracks open** through Plan; final license decision deferred to post-Jetson-MVE.
|
||||
- D-C1-2 = (b) **defer Jetson Orin Nano Super hardware MVE to a dedicated bring-up phase** between research and Plan; research closes with documentary ranking + per-candidate `Verify` gates.
|
||||
|
||||
**Interactions with prior C-row closures**:
|
||||
- C3 D-C3-1 extractor choice determines the C4 RANSAC inlier-count distribution (DISK 2424.8 multiview NL vs ALIKED-N(16) 1975.4 vs XFeat\* 1885 vs SP 1500 — varies the C4 PnP+RANSAC failure rate; high-inlier extractors give more-stable RANSAC).
|
||||
- C3 outputs include per-correspondence confidence — C4 PnP+RANSAC must consume the τ=0.1 cosine-confidence-threshold-filtered subset, not the full match list, to avoid bias from low-confidence outliers (consistent with cvg/LightGlue paper Table 3 Aachen Day-Night pipeline shape via Source #71 cross-cite).
|
||||
- C5 covariance-honesty contract (AC-NEW-4) requires C4 to produce a HONEST 6×6 covariance, not a placeholder identity-matrix stub. Fact #20 closure (DSM lift architectural decision) interacts: 2D-only pose-from-homography produces a 3-DoF homography that lifts to 6-DoF only with attitude-from-IMU/VIO prior — D-C4-1 NEW (3-DoF-acceptance / DSM-coarseness-acceptance / aerial-photogrammetry-DSM-acquisition-cost) was raised at Fact #20 closure and remains the canonical Plan-phase decision for C4.
|
||||
|
||||
| # | Candidate | License | Per-mode verification | Status | Lead reason / disqualifier | Sub-matrix cite |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | **OpenCV `cv::solvePnPRansac` + paired `cv::solvePnPRefineLM`** (canonical `opencv/opencv` calib3d module; mandatory simple-baseline) | Apache-2.0 (clean throughout) — Source #82 GitHub API metadata `license.spdx_id: "Apache-2.0"`; 87385 stars + last pushed 2026-05-08 = TODAY at access time | ✅ Mode enumeration via WebFetch fallback (context7 MCP-validation-error) — 9 `SolvePnPMethod` enum values + 2 function signatures (classical + USAC) + paired `solvePnPRefineLM`/`solvePnPRefineVVS`/`solvePnPGeneric` + 7 USAC RANSAC variants documented in Source #83; ✅ runnable example in canonical PnP tutorial; ✅ canonical defaults `iterationsCount=100, reprojectionError=8.0, confidence=0.99, flags=SOLVEPNP_ITERATIVE`; ⚠️ **3D-2D INPUT CONTRACT, NOT 2D-2D** — requires D-C4-1 lift (inherent to all PnP candidates); ⚠️ **NO DIRECT 6×6 COVARIANCE** — D-C4-2 NEW gate raised; ⚠️ **2 of 9 enum values BROKEN** (SOLVEPNP_DLS + SOLVEPNP_UPNP fall back to EPNP per explicit docstring); ⚠️ `solvePnPRefineLM` rotation update NOT on SO(3) (alternate `solvePnPRefineVVS` is SO(3)-correct) | **Mandatory-simple-baseline reference** (engine Component Option Breadth rule role — structurally analogous to NetVLAD's role in C2 row + SuperGlue+SuperPoint's role in C3 row); deployment-ready under every D-C1-1 license-posture choice; final ranking deferred to Jetson MVE phase per D-C1-2 | **TWO CONVERGING POSITIVE structural advantages**: (i) clean Apache-2.0 throughout (tied with cvg/LightGlue + DISK + XFeat for cleanest license-compliance story); (ii) dominant industry-standard reference (87385 stars + daily-active maintenance + JetPack 6 canonical distribution = zero-effort Jetson deployment). **TWO NEGATIVE-BUT-MITIGABLE structural findings** (inherent to PnP class, apply identically to all C4 candidates): (iii) 3D-2D input contract → D-C4-1 2D→3D lift required; (iv) no direct 6×6 covariance → D-C4-2 NEW covariance-recovery-strategy required. **TWO MINOR CAVEATS**: (v) 2 BROKEN enum values eliminated; valid set is `EPNP / AP3P / IPPE / SQPNP` plus 2 special-case (`P3P` for exactly-3, `IPPE_SQUARE` for 4-fixed-pattern markers); (vi) `solvePnPRefineLM` not on SO(3) — alternate `solvePnPRefineVVS` is preferred for high-accuracy. Recommended pairing for D-C4-1 = 4-DoF flat-earth lift: **`flags=SOLVEPNP_IPPE`** (planar-scene minimal-solver designed for coplanar object points) with **`SOLVEPNP_SQPNP`** as the modern globally-optimal fallback for the 6-DoF DSM-lift case | Fact #52 in [`../02_fact_cards/C4_pose_estimation.md`](../02_fact_cards/C4_pose_estimation.md) (per-mode entry + per-numbered-Restriction × per-numbered-AC sub-matrix block) |
|
||||
| 2 | **OpenGV `absolute_pose::AbsolutePoseSacProblem(KNEIP)` + paired `absolute_pose::optimize_nonlinear`** (canonical `laurentkneip/opengv` library; modern-competitive-lead-richer-minimal-solver) | BSD-3-Clause-equivalent CONTINGENT on D-C4-3 NEW Plan-phase license-clearance verification — Source #84 License.txt direct WebFetch verified BSD-3-Clause boilerplate (3 numbered redistribution conditions + non-endorsement clause), but GitHub SPDX detector reports `license.spdx_id: "NOASSERTION"` due to non-canonical-OSI-template formatting; 1109 stars + 358 forks + last pushed **2023-06-07 = ~2y 11mo stale** at access time (D-C4-4 NEW maintenance-staleness mitigation gate) | ✅ Mode enumeration via WebFetch fallback (context7 NOT INDEXED — only OpenCV variants returned for OpenGV query) — 4 absolute-pose minimal solvers (`p2p / p3p_kneip / p3p_gao / upnp`) + 2 non-minimal solvers (`epnp / upnp`) + 2 generalized-camera solvers (`gp3p / gpnp`) + 1 LM optimizer (`optimize_nonlinear`) + 4 RANSAC algorithm enums (`KNEIP / GAO / EPNP / GP3P`) documented in Source #85; ✅ runnable example with `sac::Ransac` + `AbsolutePoseSacProblem` integration; ⚠️ **BEARING-VECTOR INPUT CONTRACT, NOT 2D PIXEL** — requires project-side adapter or pre-computed inverse-intrinsic projection from C3's pixel correspondences; ⚠️ **3D-ANGLE RANSAC THRESHOLD** — conversion required from project's pixel-reprojection-error budget; ⚠️ **NO DIRECT 6×6 COVARIANCE OUTPUT** from `optimize_nonlinear` (D-C4-2 applies identically; harder to mitigate than OpenCV since OpenGV's residuals are bearing-vector not pixel); ⚠️ **NO PLANAR-SCENE DEDICATED SOLVER** equivalent to OpenCV's `flags=SOLVEPNP_IPPE` — DOCUMENTARY NEGATIVE for D-C4-1 = 4-DoF flat-earth case | **Modern-competitive-lead-richer-minimal-solver-coverage** (engine Component Option Breadth rule role); deployment-ready CONTINGENT on D-C4-3 license-clearance + D-C4-4 maintenance-staleness mitigation; final ranking deferred to Jetson MVE phase per D-C1-2 | **TWO CONVERGING POSITIVE structural advantages**: (i) **richer minimal-solver coverage than OpenCV** (4 algorithm-selectable RANSAC enums + 2 P3P variants [Kneip 2011 + Gao 2003] + 1 UPnP global-optimal alternate + 1 generalized-camera GP3P; vs OpenCV's effectively-4-valid SolvePnPMethod after 2 BROKEN entries removed; OpenGV provides Kneip's original 2011 P3P that OpenCV does NOT distribute — only Ke & Roumeliotis 2017 AP3P); (ii) **generalized-camera + non-central absolute pose support** — `absolute_pose::gp3p` + `absolute_pose::gpnp` for multi-camera rigs; not directly applicable to project's pinned 1× ADTi 20MP nav frame but architecturally cleaner if project later adds side-looking camera. **FIVE NEGATIVE-BUT-MITIGABLE structural findings**: (iii) bearing-vector input contract → adapter engineering required; (iv) 3D-angle RANSAC threshold → conversion required; (v) no direct 6×6 covariance → D-C4-2 applies identically (recommendation = option (b) wrap in GTSAM Marginals since OpenGV-internal Jacobian recovery is ~3-5 days vs ~1 day for OpenCV); (vi) **~3 years maintenance staleness** → D-C4-4 NEW gate; (vii) **NOASSERTION SPDX-detector status** → D-C4-3 NEW Plan-phase license-clearance verification gate. **ONE MAJOR DOCUMENTARY NEGATIVE finding vs OpenCV**: (viii) NO planar-scene dedicated minimal solver vs OpenCV's `flags=SOLVEPNP_IPPE` — for project's locked-in D-C4-1 = 4-DoF flat-earth lift recommendation, OpenGV requires using Kneip's P3P or EPNP without the planar-scene specialization advantage. Net trade-off favors OpenCV-as-primary for the project's D-C4-1 = 4-DoF flat-earth case; OpenGV-as-secondary-evaluation if Plan-phase Jetson MVE shows the need for non-central or generalized-camera support | Fact #53 in [`../02_fact_cards/C4_pose_estimation.md`](../02_fact_cards/C4_pose_estimation.md) (per-mode entry; per-numbered-Restriction × per-numbered-AC sub-matrix deferred to next session per scope-discipline) |
|
||||
| 3 | **GTSAM `LevenbergMarquardtOptimizer` + `GenericProjectionFactorCal3_S2` + `Marginals.marginalCovariance`** (canonical `borglab/gtsam` library by Frank Dellaert et al. + Georgia Tech Borg Lab; modern-competitive-lead-covariance-honest) | BSD-3-Clause (clean throughout) — Source #86 LICENSE.BSD direct WebFetch verified `Copyright (c) 2010, Georgia Tech Research Corporation` with 3 numbered redistribution conditions + non-endorsement clause; bundled deps clean (BSD-3 + Apache-2.0 + MPL2 file-level — all dual-use compatible); 3424 stars + 927 forks + last pushed **2026-05-08T13:00:22Z = TODAY** at access time (fresher than OpenCV by 6 hours = daily-active maintenance) | ✅ Mode enumeration via context7 INDEXED PASS at `/borglab/gtsam` version 4.3a1 with **1121 code snippets** (best context7 indexing of any C4 candidate evaluated) — `GenericProjectionFactorCal3_S2` + `LevenbergMarquardtOptimizer` + `Marginals.marginalCovariance` + `NonlinearFactorGraph` + `Cal3_S2` / `Cal3DS2` + `Pose3` + `noiseModel.Diagonal.Sigmas` / `noiseModel.Isotropic.Sigma` + `noiseModel.Robust.Create` + `mEstimator.Huber.Create` + `GncOptimizer` documented in Source #87; ✅ runnable example via `python/gtsam/examples/CameraResectioning.ipynb` canonical PnP pattern; ✅ **NATIVE 6×6 POSE COVARIANCE via `Marginals(graph, result).marginalCovariance(pose_key)`** — only C4 candidate to date that satisfies AC-NEW-4 covariance-honesty NATIVELY; ⚠️ **NO NATIVE RANSAC** (canonical pattern is external-RANSAC-via-OpenCV-for-inliers → GTSAM-factor-graph-from-inliers OR in-graph robust noise model OR `GncOptimizer`); ⚠️ **~50-200 MB library footprint** (heaviest C4 candidate to date but well within AC-4.2 budget); ⚠️ **TIGHT AC-4.1 latency margin** (~30-90 ms per call extrapolated to Jetson Orin Nano Super = 300-900 ms total at K=10 pairs/frame vs 400 ms budget); ⚠️ **NO JetPack 6 canonical distribution** (~1-2 days cross-compilation engineering) | **Modern-competitive-lead-covariance-honest** (engine Component Option Breadth rule role; **directly addresses AC-NEW-4-binding-constraint axis** that drives C4 row's primary architectural concern); deployment-ready under every D-C1-1 license-posture choice; final ranking deferred to Jetson MVE phase per D-C1-2 | **THREE CONVERGING POSITIVE structural advantages**: (i) **NATIVE 6×6 POSE COVARIANCE via `Marginals.marginalCovariance`** — the **only C4 candidate to date that satisfies AC-NEW-4 covariance-honesty NATIVELY without D-C4-2 mitigation work**; **directly addresses the AC-NEW-4-binding-constraint axis**; (ii) clean BSD-3-Clause throughout (tied with cvg/LightGlue + DISK + XFeat + OpenCV for cleanest license-compliance story); bundled deps clean (BSD-3 + Apache-2.0 + MPL2 file-level); (iii) daily-active maintenance + best context7 indexing of any C4 candidate (1121 code snippets at version 4.3a1). **ONE ADDITIONAL POSITIVE structural advantage**: (iv) **ARCHITECTURAL EXTENSION TO C5 VIA iSAM2** — factor-graph paradigm scales naturally from C4 single-frame PnP to C5 multi-frame state estimation via `iSAM2` + `BetweenFactor<Pose3>` + `PriorFactorPose3`; would simplify C5 implementation if both C4 and C5 are GTSAM-based, providing a forward-looking architectural integration advantage that no other C4 candidate provides. **ONE NEGATIVE-BUT-MITIGABLE structural finding**: (v) NO native RANSAC → canonical pattern is external-RANSAC-via-OpenCV (couples C4 = GTSAM-as-primary with OpenCV-RANSAC-as-inlier-detector); alternative is in-graph M-estimator robust noise model OR `GncOptimizer` (Yang et al. RAL 2020). **THREE CAVEATS**: (vi) ~50-200 MB library footprint; (vii) no JetPack 6 canonical distribution (~1-2 days cross-compilation engineering); (viii) tight AC-4.1 latency margin requiring Plan-phase Jetson MVE phase verification — mitigation strategies include reduce K from 10 to 3-5 (couples with D-C3-3) OR GTSAM-as-secondary-only for satellite-anchor frames OR batch GTSAM optimization across multiple frames via iSAM2 incremental update. **Recommended C4 architecture for the project**: **OpenCV solvePnPRansac as mandatory simple-baseline reference floor + per-frame inlier detection + initial pose estimate + GTSAM factor-graph posterior recovery for AC-NEW-4 covariance-honest output** (couples Fact #52 + Fact #54 closures via D-C4-2 = (b)) | Fact #54 in [`../02_fact_cards/C4_pose_estimation.md`](../02_fact_cards/C4_pose_estimation.md) (per-mode entry; per-numbered-Restriction × per-numbered-AC sub-matrix deferred to next session per scope-discipline) |
|
||||
|
||||
### C4 — Plan-phase deliverables raised by prior closures (will compound as candidates close)
|
||||
|
||||
1. **D-C4-1 (CARRIED FORWARD from Fact #20 closure 2026-05-XX) — 2D-3D-lift architectural decision** (3-DoF acceptance with attitude-from-IMU/VIO prior + 2D ortho-only cache / 4-DoF acceptance with flat-earth + altitude-from-IMU+barometer prior / 6-DoF via aerial-photogrammetry-DSM-acquisition + paired DSM at 0.94 m/px / 6-DoF via ALOS 30m DSM with 4× accuracy collapse per Source #41) — **carried forward from C2 row deferred resolution** (Fact #20 surfaced this decision but the C2 row closure left it for the C4 row to consolidate). Plan-phase decision; **for the project's pinned 2D-ortho-only cache + IMU-attitude-prior context, recommendation is 4-DoF with flat-earth assumption (altitude from IMU+barometer + attitude from VIO/IMU + planar-scene homography → 4-DoF pose extraction)** — this is the "flat-steppe Donetsk/Kharkiv operational area" assumption made plausible by Source #38 Skoltech survey + restrictions on 2D-ortho-only cache. ALOS-30m-DSM fallback is the secondary mitigation if 4-DoF accuracy proves insufficient at AC-1.1/1.2 50m/20m bars at the tighter tail.
|
||||
|
||||
2. **D-C4-2 NEW (raised by OpenCV `cv::solvePnPRansac` closure 2026-05-08, Fact #52; UPDATED by GTSAM closure 2026-05-08 Fact #54) — covariance-recovery-strategy** — `cv::solvePnPRansac` returns `retval, rvec, tvec, inliers` only; OpenGV's `optimize_nonlinear` has no covariance output API; **NO direct 6×6 covariance output from either OpenCV or OpenGV** per Source #83 + Source #85 function signatures. **GTSAM IS THE EXCEPTION** — `Marginals(graph, result).marginalCovariance(pose_key)` emits 6×6 posterior covariance NATIVELY (Source #87 multiple snippets). AC-NEW-4 covariance-honesty contract requires Plan-phase choice between: **(a)** post-hoc Jacobian-based covariance recovery via `cv::projectPoints` Jacobian + Schur complement on inlier residuals (~1 day engineering; pure OpenCV API; covariance approximation of equivalent quality to ROS `tf2`'s standard recipe; **recommended for OpenCV-as-primary mandatory-simple-baseline path**); **(b)** **wrap solvePnPRansac result in GTSAM `Marginals` posterior** via `BetweenFactor<Pose3>` prior + per-inlier `GenericProjectionFactorCal3_S2` factors → `LevenbergMarquardtOptimizer.optimize()` → `Marginals.marginalCovariance` (canonical Plan-phase pathway documented in Fact #54; **STRONGLY RECOMMENDED for the GTSAM-as-covariance-recovery hybrid path** — couples Fact #52 OpenCV solvePnPRansac mandatory-simple-baseline + Fact #54 GTSAM modern-competitive-lead-covariance-honest); **(c)** project-defined heuristic covariance scaling from inlier residual statistics (lowest engineering, lowest correctness — **likely AC-NEW-4 REJECT** since it's effectively an identity-matrix-placeholder family); **(d)** migrate to OpenGV's `absolute_pose::optimize_nonlinear` with custom Jacobian propagation through bearing-vector residuals (~3-5 days engineering vs ~1 day for OpenCV; couples D-C4-2 with D-C4-1 selection of OpenGV-as-primary; STRONGER NEGATIVE than expected per Fact #53 closure — OpenGV's bearing-vector Jacobian is harder to recover than OpenCV's pixel Jacobian). **Recommendation**: D-C4-2 = (b) for the OpenCV-as-RANSAC + GTSAM-as-covariance-recovery hybrid path (project's recommended C4 architecture per Fact #54 closure) — provides AC-NEW-4 covariance honesty NATIVELY via GTSAM's `Marginals` posterior while keeping OpenCV's mandatory-simple-baseline RANSAC inlier detection at zero-effort Jetson deployment. D-C4-2 = (a) Jacobian-based recovery for the OpenCV-only-no-GTSAM path if Plan-phase Jetson MVE shows GTSAM's ~30-90 ms latency + ~50-200 MB memory footprint exceeds AC-4.1 / AC-4.2 budgets. Final lock at Plan phase after Jetson MVE.
|
||||
|
||||
3. **D-C4-3 NEW (raised by OpenGV closure 2026-05-08, Fact #53) — license-clearance verification** — Source #84 GitHub API license metadata reports `license.spdx_id: "NOASSERTION"` for canonical `laurentkneip/opengv` repo; Source #84 direct WebFetch of License.txt confirms BSD-3-Clause-equivalent boilerplate (3 numbered redistribution conditions + non-endorsement clause + "Copyright 2013 Laurent Kneip, ANU. All rights reserved." attribution) but the file does NOT use OSI canonical BSD-3-Clause template text, causing GitHub SPDX detector to fail to identify the license. Plan-phase decision-maker MUST choose between: **(a)** counsel-review of License.txt to confirm BSD-3-Clause-equivalent dual-use compatibility (~1-2 hours legal review; recommended for OpenGV adoption), **(b)** request author Laurent Kneip + ShanghaiTech Mobile Perception Lab to relicense canonical License.txt to OSI canonical BSD-3-Clause boilerplate (~1-3 weeks turnaround if responsive, may not be responsive given ~3-year staleness), **(c)** treat NOASSERTION as effective disqualifier and pivot to OpenCV-as-primary instead of OpenGV-as-primary (lowest risk, but loses OpenGV's richer-minimal-solver-coverage advantage), **(d)** elevate D-C4-3 to D-C1-1 license-posture decision and treat OpenGV as eligible only on D-C1-1 = (a) GPL-3.0 track or (c) keep-both-tracks-open (since BSD-3-Clause-equivalent without canonical template formatting is more ambiguous than GPL-3.0). **Recommendation**: D-C4-3 = (a) counsel-review for the OpenGV-as-secondary path; D-C4-3 = (c) pivot to OpenCV-as-primary if Plan-phase Jetson MVE shows OpenCV's mandatory-simple-baseline coverage is sufficient without OpenGV's richer-minimal-solver-coverage. Applies only if D-C4-row final lock includes OpenGV.
|
||||
|
||||
4. **D-C4-4 NEW (raised by OpenGV closure 2026-05-08, Fact #53) — maintenance-staleness-mitigation strategy** — Source #84 GitHub API `pushed_at` field shows `laurentkneip/opengv` last commit at 2023-06-07T18:14:14Z = ~2 years 11 months stale at access time 2026-05-08; Doxygen documentation portal generation timestamp 2018-01-08 21:43:04 = 8.3 years old documentation. ShanghaiTech Mobile Perception Lab's claimed maintenance is contradicted by commit history. Plan-phase decision-maker MUST choose between: **(a)** accept-as-is + freeze upstream at git commit ea7c66f5e (lowest engineering; assumes Eigen 3.3.x continues to compile on JetPack 6 ARM Cortex-A78AE without patches; risk: future Eigen 3.4+ migration breaks build), **(b)** fork into project-controlled branch + apply Eigen-3.4+ + JetPack-6 + ARM Cortex-A78AE patches in-house (~1-2 weeks engineering; medium risk; allows future upstream-patch contribution), **(c)** migrate to Ceres-only manual implementation as fallback if OpenGV-specific patches not feasible at Jetson MVE phase (highest engineering at ~2-4 weeks; lowest dependency-lock risk), **(d)** downgrade OpenGV to "experimental" status and pivot to OpenCV-as-primary if D-C4-3 license-clearance fails OR Jetson MVE shows OpenCV's coverage is sufficient. **Recommendation**: D-C4-4 = (b) fork-and-patch for the OpenGV-as-secondary path; D-C4-4 = (d) pivot to OpenCV-as-primary if Plan-phase Jetson MVE shows OpenCV's coverage is sufficient. Applies only if D-C4-row final lock includes OpenGV.
|
||||
|
||||
5. (additional D-C4-N gates will be added as candidates close)
|
||||
|
||||
---
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user