# Solution Draft ## Product Solution Description Build an onboard GPS-denied localization service that runs on the companion Jetson, consumes the fixed nadir navigation camera plus flight-controller IMU/attitude/altitude, and emits ArduPilot-compatible `GPS_INPUT` estimates with honest covariance. The solution is a hybrid estimator: ```text Nav camera + FC telemetry | v Image quality + calibration + orthorectification | +--> Steady state: VO/IMU propagation --> ESKF --> GPS_INPUT + QGC + FDR | +--> Re-anchor triggers: VPR top-K --> local match/RANSAC --> ESKF anchor update | +--> Tile generation: ortho tile + quality sidecar --> local cache --> post-flight Satellite Service upload ``` The steady-state path is intentionally lightweight. Heavy global retrieval and cross-domain local matching run only on cold start, VO failure, sharp turns, disconnected segments, covariance growth, or stale-anchor age. ## Existing / Competitor Solutions Analysis Recent fixed-wing GPS-denied research supports the same high-level mechanism: monocular visual odometry alone accumulates scale/drift error, while satellite-image comparison can periodically correct it. Aerial VPR surveys also show why the implementation cannot be naive: weather, season, scale mismatch, repetitive fields, tile overlap, and re-ranking runtime all matter. The selected design borrows the proven structure but rejects an all-in-one SLAM dependency as the product core. OpenVINS and ORB-SLAM3 are useful benchmark/reference implementations, but their GPL-family licensing and broader SLAM lifecycle do not fit a default production dependency for this project. ## Architecture ### Component: Camera Ingest, Calibration, And Geometry | Solution | Tools | Pinned Mode/Config | Advantages | Limitations | Requirements | Security | Cost | API Capability Evidence | Fit | |----------|-------|--------------------|------------|-------------|--------------|----------|------|-------------------------|-----| | OpenCV geometry utility layer | OpenCV 4.x | Camera calibration, undistortion, RANSAC homography, reprojection-error measurement | Mature, local, fast, exact API fit | Not a full estimator | Calibration target, fixed intrinsics/extrinsics, lens/FOV selection | Local-only, no network | Low | MVE: `_docs/00_research/02_fact_cards.md`; Source #5 | Selected | **Exact-fit evidence**: - Project constraints checked: fixed nadir camera, calibration, homography, MRE gates. - Disqualifiers: none. - Restrictions × AC matrix: `_docs/00_research/06_component_fit_matrix.md`. ### Component: VO / IMU Propagation And Estimator | Solution | Tools | Pinned Mode/Config | Advantages | Limitations | Requirements | Security | Cost | API Capability Evidence | Fit | |----------|-------|--------------------|------------|-------------|--------------|----------|------|-------------------------|-----| | Custom VO/IMU ESKF | OpenCV + custom estimator | Frame-to-frame homography/features + FC IMU/attitude/altitude fused in a custom ESKF with source modes | Owns covariance, source labels, degraded modes, ArduPilot output semantics | More implementation work than adopting VIO library | Synchronized frames/IMU, calibration, replay tests | No third-party cloud; deterministic local logs | Medium | Facts #1, #4, #5, #16 | Selected | | OpenVINS reference | OpenVINS | Monocular camera + IMU EKF/MSCKF reference runs | Strong VIO reference and evaluation tools | GPL-3 production dependency risk | Dataset/replay adapter | Local only | Low for benchmark | Source #3 | Reference only | | ORB-SLAM3 alternative | ORB-SLAM3 | Monocular-inertial SLAM | Mature SLAM benchmark | GPLv3, heavier map lifecycle, initialization complexity | Calibration, vocabulary, runtime tuning | Local only | Medium | Source #4 | Rejected for production | **Exact-fit evidence**: - Project constraints checked: one camera + IMU, frame-by-frame output, covariance labels, blackout/spoofing modes. - Runtime quality gate: validate drift and covariance on EuRoC-style and representative fixed-wing replay. ### Component: Satellite Retrieval And Local Anchor | Solution | Tools | Pinned Mode/Config | Advantages | Limitations | Requirements | Security | Cost | API Capability Evidence | Fit | |----------|-------|--------------------|------------|-------------|--------------|----------|------|-------------------------|-----| | DINOv2-VLAD + FAISS + LightGlue | DINOv2/AnyLoc-style descriptors, FAISS, DISK/ALIKED+LightGlue, OpenCV RANSAC | Offline precomputed VPR chunk descriptors; conditional query descriptor; top-K FAISS; local matching on candidates | Matches AC-8.6; scalable top-K; local geometry verifies anchors | Needs Jetson profiling and model-size pruning | Fresh satellite cache, descriptors, dynamic K, RANSAC gates | Cache is local; no in-flight provider calls | Medium-high | MVE blocks in `02_fact_cards.md`; Sources #6-#9 | Selected with runtime gate | | SuperPoint + LightGlue | SuperPoint, LightGlue | Same local matching with SuperPoint features | Strong technical baseline | SuperPoint license is restrictive | Legal review | Local only | Medium | Source #6 | Needs user decision | | Classical SIFT/ORB-only | OpenCV | Handcrafted features and homography | Simple fallback, low compute | Poor cross-domain robustness | Feature-rich scenes | Local only | Low | Source #5 | Fallback / regression baseline | **Exact-fit evidence**: - Project constraints checked: offline cache, top-K dynamic retrieval, cross-domain local match, <400 ms hot-path constraint. - Runtime gate: heavy VPR/re-ranking is trigger-based, not per-frame. ### Component: Satellite Cache And Tile Write-Back | Solution | Tools | Pinned Mode/Config | Advantages | Limitations | Requirements | Security | Cost | API Capability Evidence | Fit | |----------|-------|--------------------|------------|-------------|--------------|----------|------|-------------------------|-----| | COG + PostgreSQL/PostGIS manifest + descriptor sidecars | GDAL COG, PostgreSQL/PostGIS manifest, FAISS sidecars | Service tiles and generated candidate tiles stored as tiled compressed GeoTIFFs with CRS/date/source/meter-per-pixel metadata | Geospatial standard, supports write-new-tile workflow, descriptor accounting | Needs careful 10 GB budget | STAC-like manifest, freshness gates, descriptor pruning | Local signed manifests recommended | Medium | Source #18 | Selected | | PMTiles archive | PMTiles | Single-file read archive | Efficient map reads | Read-only; cannot update in place | Archive rebuild for updates | Local file integrity | Low | Source #17 | Rejected for live mutable cache | **Exact-fit evidence**: - Project constraints checked: offline-only, no raw photo storage, mid-flight generated tiles, Satellite Service ingest metadata. - External dependency: Satellite Service owns the promotion/voting layer for trusted basemap updates. ### Component: MAVLink Integration And Telemetry | Solution | Tools | Pinned Mode/Config | Advantages | Limitations | Requirements | Security | Cost | API Capability Evidence | Fit | |----------|-------|--------------------|------------|-------------|--------------|----------|------|-------------------------|-----| | MAVSDK telemetry + pymavlink output | MAVSDK, pymavlink | MAVSDK subscribes to telemetry; pymavlink emits `GPS_INPUT` to ArduPilot with `GPS1_TYPE=14` | Exact `GPS_INPUT` field control while keeping high-level telemetry APIs | Plane-specific failsafe/spoof triggers need SITL proof | ArduPilot Plane params, QGC status, FDR tlog | Validate MAVLink source and message rate | Medium | Sources #10-#12 | Selected | **Exact-fit evidence**: - Project constraints checked: ArduPilot only, v1 `GPS_INPUT` only, WGS84 output, covariance to `horiz_accuracy`. - Validation gate: Plane SITL with production parameters. ### Component: Flight Data Recorder | Solution | Tools | Pinned Mode/Config | Advantages | Limitations | Requirements | Security | Cost | API Capability Evidence | Fit | |----------|-------|--------------------|------------|-------------|--------------|----------|------|-------------------------|-----| | Segmented FDR | PostgreSQL event index + binary/CBOR payloads with Parquet export post-flight | Fixed-size segment files for per-frame estimates, IMU, MAVLink, health, emitted GPS_INPUT, generated-tile metadata | Replayable, bounded, no raw frame retention | Exact format selected during implementation | Rollover policy, monotonic timestamps | Integrity hash per segment recommended | Medium | AC-NEW-3 | Selected pattern | ## Runtime Modes | Mode | Trigger | Behavior | Output Label | |------|---------|----------|--------------| | Satellite anchored | VPR + local match passes freshness, RANSAC, covariance, and Mahalanobis gates | ESKF absolute update, low covariance, tile generation eligible if sigma gate passes | `satellite_anchored` | | VO extrapolated | Last anchor fresh enough, VO healthy, normal overlap | VO/IMU propagation, covariance grows with anchor age | `vo_extrapolated` | | Dead reckoned | Visual blackout, VO failure without anchor, spoofing while no visual signal | IMU-only propagation, monotonic covariance growth, degraded fix type thresholds | `dead_reckoned` | | Failsafe / no fix | Blackout >30 s or covariance >500 m | `GPS_INPUT.fix_type=0`, `horiz_accuracy=999.0`, QGC status | `dead_reckoned` with failsafe status | ## Testing Strategy ### Integration / Functional Tests - Replay normal overlapping frames and assert AC-2.1a VO registration rate and AC-2.2 VO MRE. - Replay satellite-anchor cases and assert AC-1.1/1.2, AC-2.2 cross-domain MRE, freshness gates, and source labels. - Inject stale tiles and assert no `satellite_anchored` output. - Inject sharp turns and disconnected segments and assert VPR relocalization. - Run ArduPilot Plane SITL with `GPS1_TYPE=14` and assert valid `GPS_INPUT` fields, fix type degradation, and QGC statuses. - Inject visual blackout + spoofed GPS and assert spoofed GPS is ignored, covariance grows, and thresholds match AC-NEW-8. - Request AI-camera object coordinates and assert level-flight projection plus maneuver error bound. ### Non-Functional Tests - Jetson Orin Nano Super profiling: <400 ms p95, <8 GB shared memory, 25 W no-throttle hot-soak. - Cache build test for 400 km²: imagery + manifests + descriptors fit within budget or fail with explicit budget report. - 8-hour FDR load test: <=64 GB, rollover logged, no silent data loss. - Monte Carlo false-anchor and over-confidence tests for AC-NEW-4 and AC-NEW-7. - Cold boot 50x: first valid `GPS_INPUT` <30 s p95. ## References Detailed source registry: `_docs/00_research/01_source_registry.md`. Key sources: - Fixed-wing satellite-aided VO: https://www.mdpi.com/2076-3417/14/16/7420 - Aerial VPR survey: https://arxiv.org/abs/2406.00885 - OpenVINS docs: https://docs.openvins.com/ - ORB-SLAM3 README: https://raw.githubusercontent.com/UZ-SLAMLab/ORB_SLAM3/master/README.md - LightGlue README: https://raw.githubusercontent.com/cvg/LightGlue/main/README.md - FAISS docs: https://faiss.ai/index.html - ArduPilot GPSInput: https://ardupilot.org/mavproxy/docs/modules/GPSInput.html - MAVLink GPS_INPUT: https://mavlink.io/en/messages/common.html#GPS_INPUT - Jetson Orin Nano Super: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/nano-super-developer-kit/ - PMTiles: https://docs.protomaps.com/pmtiles/ - GDAL COG: https://gdal.org/en/stable/drivers/raster/cog.html ## Related Artifacts - AC assessment: `_docs/00_research/00_ac_assessment.md` - Question decomposition: `_docs/00_research/00_question_decomposition.md` - Source registry: `_docs/00_research/01_source_registry.md` - Fact cards: `_docs/00_research/02_fact_cards.md` - Comparison framework: `_docs/00_research/03_comparison_framework.md` - Reasoning chain: `_docs/00_research/04_reasoning_chain.md` - Validation log: `_docs/00_research/05_validation_log.md` - Component fit matrix: `_docs/00_research/06_component_fit_matrix.md`