mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-21 11:21:12 +00:00
update GPS-denied onboard research docs
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
# Tech Stack Evaluation
|
||||
|
||||
## Requirements Analysis
|
||||
|
||||
| Requirement | Implication |
|
||||
|-------------|-------------|
|
||||
| Jetson Orin Nano Super, 8 GB, 25 W | Prefer Python orchestration with C++/TensorRT hot paths; benchmark memory early. |
|
||||
| Fixed nadir monocular nav camera | Avoid stereo-only VO dependencies; use custom planar VO/IMU. |
|
||||
| ArduPilot v1 GPS substitute | Use `pymavlink` `GPS_INPUT`; defer `ODOMETRY`. |
|
||||
| Offline satellite cache | Use local SQLite/MBTiles-like packages with explicit manifests and precomputed descriptors. |
|
||||
| OpenAPI docs | Use FastAPI for local control/health/object API. |
|
||||
| No raw frame persistence | FDR stores metadata, estimates, MAVLink, IMU, health, generated tiles, and failure thumbnails only. |
|
||||
|
||||
## Technology Evaluation
|
||||
|
||||
### Language and Runtime
|
||||
|
||||
| Option | Fitness | Maturity | Security | Team/Cost | Scalability | Score | Decision |
|
||||
|--------|---------|----------|----------|-----------|-------------|-------|----------|
|
||||
| Python 3.11+ orchestration | High | High | Medium | High | Medium | 4/5 | Selected |
|
||||
| C++ hot-path modules | High | High | Medium | Medium | High | 4/5 | Selected for VO/matching kernels as needed |
|
||||
| .NET backend | Low | High | High | Medium | High | 2/5 | Rejected for onboard CV hot path |
|
||||
| Rust hot-path modules | Medium | Medium | High | Medium | High | 3/5 | Deferred unless memory safety becomes critical |
|
||||
|
||||
### Vision and Inference
|
||||
|
||||
| Option | Fitness | Maturity | Security | Team/Cost | Scalability | Score | Decision |
|
||||
|--------|---------|----------|----------|-----------|-------------|-------|----------|
|
||||
| OpenCV | High | High | Medium | High | Medium | 5/5 | Selected |
|
||||
| TensorRT | High | High | Medium | Medium | High | 5/5 | Selected for deployed models |
|
||||
| PyTorch runtime | Medium | High | Medium | High | Medium | 3/5 | Dev/training only, not hot v1 runtime |
|
||||
| cuVSLAM | Low for v1 | High | Medium | Medium | High | 2/5 | Rejected for v1 sensor mismatch |
|
||||
| ORB-SLAM3 / VINS-Fusion | Medium | Medium | Low licensing fit | Medium | Medium | 2/5 | Experimental only |
|
||||
|
||||
### Matching and VPR
|
||||
|
||||
| Option | Fitness | Maturity | Security | Team/Cost | Scalability | Score | Decision |
|
||||
|--------|---------|----------|----------|-----------|-------------|-------|----------|
|
||||
| AnyLoc/DINOv2-VLAD style descriptors | High | Medium | Medium | Medium | High | 4/5 | Selected with benchmark |
|
||||
| FAISS CPU/HNSW-flat | High | High | Medium | High | Medium | 4/5 | Selected v1 baseline |
|
||||
| FAISS GPU/cuVS | Medium | Medium | Medium | Low on Jetson | High | 3/5 | Optimization only |
|
||||
| ALIKED + LightGlue | High | Medium | Medium | Medium | High | 4/5 | Selected learned-feature candidate |
|
||||
| OpenCV SIFT/AKAZE | Medium | High | High | High | Medium | 3/5 | Selected legal baseline |
|
||||
| DeDoDe | Medium | Medium | Medium | Medium | Medium | 3/5 | Experimental fallback |
|
||||
| Official Magic Leap SuperPoint weights | High | Medium | Low for product | Medium | High | 1/5 | Rejected unless commercial license is obtained |
|
||||
|
||||
### State, API, and Storage
|
||||
|
||||
| Option | Fitness | Maturity | Security | Team/Cost | Scalability | Score | Decision |
|
||||
|--------|---------|----------|----------|-----------|-------------|-------|----------|
|
||||
| ESKF with NumPy/SciPy prototype, C++ Eigen if needed | High | High | Medium | Medium | High | 5/5 | Selected |
|
||||
| FastAPI + Pydantic | High | High | Medium | High | Medium | 5/5 | Selected |
|
||||
| SQLite / MBTiles-like local cache | High | High | Medium | High | Medium | 4/5 | Selected |
|
||||
| COG/GeoTIFF + GDAL/Rasterio exchange | High | High | Medium | Medium | High | 4/5 | Selected |
|
||||
| PostgreSQL/PostGIS onboard | Low | High | Medium | Low | High | 2/5 | Rejected for embedded v1; too heavy |
|
||||
| Parquet/JSONL FDR segments | High | High | Medium | High | Medium | 4/5 | Selected |
|
||||
|
||||
### MAVLink and Ground Station
|
||||
|
||||
| Option | Fitness | Maturity | Security | Team/Cost | Scalability | Score | Decision |
|
||||
|--------|---------|----------|----------|-----------|-------------|-------|----------|
|
||||
| pymavlink `GPS_INPUT` | High | High | Medium | High | Medium | 5/5 | Selected |
|
||||
| MAVSDK telemetry plumbing | Medium | High | Medium | High | Medium | 4/5 | Selected for non-GPS telemetry where useful |
|
||||
| Mission Planner support | Low | High | Medium | Medium | Medium | 2/5 | Out of scope |
|
||||
| QGroundControl | High | High | Medium | High | Medium | 5/5 | Selected |
|
||||
|
||||
## Tech Stack Summary
|
||||
|
||||
- **Primary language**: Python 3.11+ for orchestration, API, data pipelines, tests, and integration.
|
||||
- **Hot path**: C++/CUDA/TensorRT modules only where profiling proves Python/OpenCV is insufficient.
|
||||
- **Computer vision**: OpenCV, TensorRT, DINOv2/AnyLoc-style descriptors, ALIKED + LightGlue candidate, SIFT/AKAZE legal baseline, DeDoDe experimental fallback.
|
||||
- **State estimation**: ESKF in local NED/ENU, prototyped in Python and migrated to C++ Eigen only if latency requires.
|
||||
- **Autopilot**: pymavlink `GPS_INPUT` v1; MAVSDK only for general telemetry if it does not interfere with GPS emission.
|
||||
- **API**: FastAPI with generated OpenAPI at `/openapi.json`, local-first deployment.
|
||||
- **Storage**: SQLite/MBTiles-like onboard cache, manifest sidecars, GDAL/Rasterio for COG/GeoTIFF exchange, segmented FDR logs.
|
||||
- **Testing**: pytest, SITL ArduPilot, replay harness, Jetson benchmark harness, thermal/memory profiling.
|
||||
|
||||
## Risk Assessment
|
||||
|
||||
| Risk | Impact | Mitigation |
|
||||
|------|--------|------------|
|
||||
| Noncommercial SuperPoint weights enter product build | High | Reject official Magic Leap weights by default; CI/license scan model artifacts; use ALIKED + LightGlue or SIFT/AKAZE unless a commercial grant exists. |
|
||||
| VPR model too slow or memory-heavy | High | Conditional VPR only; benchmark DINOv2-S/tiny variants; CPU FAISS baseline; precompute gallery descriptors. |
|
||||
| Cross-view false positives in sparse fields | High | Top-K retrieval, local geometry, freshness gates, ESKF innovation gating, covariance calibration. |
|
||||
| ArduPilot EKF source behavior changes by version | High | Pin ArduPilot version and SITL tests; v1 GPS_INPUT only. |
|
||||
| Cache format exceeds 10 GB | Medium | Validate provider compression and descriptor index size before implementation freeze. |
|
||||
| Python hot path misses 400 ms p95 | High | Profile first; move only measured bottlenecks to C++/TensorRT. |
|
||||
|
||||
## Learning / Validation Requirements
|
||||
|
||||
| Area | Required Proof |
|
||||
|------|----------------|
|
||||
| Jetson runtime | Benchmark VO, VPR trigger, local matching, ESKF, API, and FDR together under sustained load. |
|
||||
| Scheduler latency | Prove bounded latest-frame queue, frame-drop accounting, and timestamp-correct GPS_INPUT under heavy VPR/local-matcher load. |
|
||||
| ArduPilot integration | SITL proves `GPS_INPUT` acceptance, failsafe behavior, and no ODOMETRY emission in v1. |
|
||||
| Dataset realism | Add real FC IMU logs or approved SITL IMU generated from the trajectory. |
|
||||
| Cache ingestion | Validate COG/GeoTIFF import, local package generation, manifests, and stale-tile rejection. |
|
||||
| Safety | Monte Carlo validates false-position and cache-poisoning budgets before production release. |
|
||||
Reference in New Issue
Block a user