mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-04-22 21:56:38 +00:00
2dd60a0e37
7 structured documents covering stack, integrations, architecture, structure, conventions, testing, and concerns. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
120 lines
5.3 KiB
Markdown
120 lines
5.3 KiB
Markdown
# Technology Stack
|
|
|
|
**Analysis Date:** 2026-04-01
|
|
|
|
## Languages
|
|
|
|
**Primary:**
|
|
- Python 3.11+ — entire application (enforced in `pyproject.toml` via `requires-python = ">=3.11"`)
|
|
|
|
## Runtime
|
|
|
|
**Environment:**
|
|
- Target hardware: NVIDIA Jetson Orin Nano Super 8GB (ARM64/aarch64)
|
|
- Target OS: JetPack 6.2.2 (L4T / Ubuntu 22.04)
|
|
- CUDA 12.6.10, TensorRT 10.3.0, cuDNN 9.3 (all JetPack-bundled, not in pyproject.toml)
|
|
- Development/CI: x86_64 Linux with Docker+CUDA (cuVSLAM and TensorRT mocked)
|
|
|
|
**Package Manager:**
|
|
- pip / setuptools >=75
|
|
- Lockfile: not present (no `requirements.txt`, no lock file)
|
|
|
|
## Frameworks
|
|
|
|
**Core:**
|
|
- FastAPI (unpinned, >=0.115 per docs) — REST API framework with auto-generated OpenAPI docs
|
|
- Uvicorn (`uvicorn[standard]`, unpinned) — ASGI server
|
|
- sse-starlette >=2.0 — Server-Sent Events streaming (`EventSourceResponse` actively used in `src/gps_denied/api/routers/flights.py`)
|
|
|
|
**Data Validation / Settings:**
|
|
- Pydantic >=2 — schema definitions across all `src/gps_denied/schemas/*.py`
|
|
- pydantic-settings >=2 — env/YAML configuration in `src/gps_denied/config.py`
|
|
|
|
**Database:**
|
|
- SQLAlchemy >=2 (async) — ORM and query layer (`src/gps_denied/db/engine.py`, `src/gps_denied/db/models.py`)
|
|
- Alembic >=1.14 — database migrations
|
|
- aiosqlite >=0.20 — async SQLite driver (default DB URL: `sqlite+aiosqlite:///./flight_data.db`)
|
|
|
|
**Testing:**
|
|
- pytest >=8.0 — test runner (config in `pyproject.toml`, `testpaths = ["tests"]`)
|
|
- pytest-asyncio >=0.24 — async test support (`asyncio_mode = "auto"`)
|
|
- httpx >=0.28 (dev) — HTTP client for integration tests
|
|
|
|
**Linting / Formatting:**
|
|
- ruff >=0.9 — linting and formatting (`target-version = "py311"`, `line-length = 100`)
|
|
|
|
## Key Dependencies
|
|
|
|
**HTTP Client:**
|
|
- httpx >=0.27 — async HTTP client used in `src/gps_denied/core/satellite.py` for tile fetching
|
|
|
|
**Computer Vision:**
|
|
- opencv-python-headless >=4.9 — image decode/encode, feature detection/matching, resize
|
|
- Actively imported in `src/gps_denied/core/satellite.py` and `src/gps_denied/core/vo.py`
|
|
- Note: docs specify a CUDA-enabled build must be compiled from source (`CUDA_ARCH_BIN=8.7`) on Jetson; pyproject.toml installs the headless CPU build as default
|
|
- numpy >=1.26 — array operations, ESKF math, image buffer handling (used throughout core modules)
|
|
|
|
**Tile Caching:**
|
|
- diskcache >=5.6 — disk-based tile cache with size limit in `src/gps_denied/core/satellite.py`
|
|
|
|
**Factor Graph Optimization:**
|
|
- gtsam >=4.3a0 — factor graph optimizer (`src/gps_denied/core/graph.py`)
|
|
- Import is wrapped in a try/except (`HAS_GTSAM` flag); the module degrades gracefully if not installed
|
|
|
|
**Multipart Upload:**
|
|
- python-multipart >=0.0.9 — required for FastAPI `UploadFile` in flight frame ingestion
|
|
|
|
## Dependencies Planned-but-Not-in-pyproject.toml
|
|
|
|
These appear in `_docs/01_solution/tech_stack.md` but are NOT listed in `pyproject.toml` or `requires.txt`:
|
|
|
|
| Package | Planned Purpose | Status |
|
|
|---------|----------------|--------|
|
|
| PyCuVSLAM v15.0.0 (aarch64 wheel) | Primary visual odometry engine | Planned — local wheel install from `bin/aarch64/` |
|
|
| scipy | Rotation matrices, ESKF spatial transforms | Planned — not yet in deps |
|
|
| torch (JetPack-compatible aarch64) | LiteSAM / XFeat model loading | Conditional — depends on day-1 benchmark |
|
|
| tensorrt 10.3.0 | TensorRT FP16 inference engine | JetPack-bundled, not pip-installed |
|
|
| pycuda | CUDA stream management | Planned, not yet added |
|
|
| geojson | GeoJSON output formatting | Planned, not yet added |
|
|
| pygeohash | GeoHash tile indexing | Planned, not yet added |
|
|
| filterpy v1.4.5 | ESKF reference/fallback | Planned, not yet added |
|
|
|
|
The VO interface in `src/gps_denied/core/vo.py` is written against an abstract `ISequentialVisualOdometry` — PyCuVSLAM implementation is a planned concrete subclass. Current `ModelManager` in `src/gps_denied/core/models.py` uses `MockInferenceEngine` stubs (SuperPoint/LightGlue mock returning random keypoints).
|
|
|
|
## ML Models (Planned)
|
|
|
|
| Model | Format | Purpose |
|
|
|-------|--------|---------|
|
|
| SuperPoint | TensorRT FP16 / ONNX | Frame keypoint extraction (VO) |
|
|
| LightGlue | TensorRT FP16 / ONNX | Keypoint matching (VO) |
|
|
| LiteSAM (opt) OR XFeat semi-dense | TensorRT FP16 | Satellite image matching — selection via day-1 benchmark at 480px |
|
|
|
|
Weights expected at paths configured in `ModelPaths` settings (`src/gps_denied/config.py`): `weights/superpoint.pt`, `weights/lightglue.pt`, `weights/litesam.pt`.
|
|
|
|
## Configuration
|
|
|
|
**Environment:**
|
|
- Loaded from `.env` file (root) via pydantic-settings `AppSettings` in `src/gps_denied/config.py`
|
|
- Nested delimiter: `__` (e.g., `DB__URL=...`)
|
|
- Key env prefix groups: `DB_`, `API_`, `TILES_`, `MODEL_`, `AREA_`, `RECOVERY_`, `ROTATION_`
|
|
|
|
**Build:**
|
|
- `pyproject.toml` — project metadata, dependencies, ruff and pytest config
|
|
- No Dockerfile present in scanned directories
|
|
|
|
## Platform Requirements
|
|
|
|
**Development:**
|
|
- Python 3.11+, pip
|
|
- x86_64 Linux with GPU (Docker+CUDA) for model export and unit tests
|
|
- cuVSLAM and TensorRT mocked in unit tests (per documented strategy)
|
|
|
|
**Production:**
|
|
- NVIDIA Jetson Orin Nano Super 8GB, JetPack 6.2.2
|
|
- No internet connectivity during flight (all tiles pre-fetched)
|
|
- OpenCV must be compiled from source with `CUDA_ARCH_BIN=8.7` for GPU preprocessing
|
|
|
|
---
|
|
|
|
*Stack analysis: 2026-04-01*
|