mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-21 14:51:14 +00:00
150 lines
12 KiB
Markdown
150 lines
12 KiB
Markdown
# 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`
|