Files
gps-denied-onboard/README.md
T

8.7 KiB

GPS-Denied Onboard

Сервіс геолокалізації знімків БПЛА в умовах відсутності GPS-сигналу.

Система використовує візуальну одометрію (VO), співставлення з супутниковими картами (cross-view matching) та оптимізацію траєкторії через фактор-графи для визначення координат дрона в реальному часі.


Архітектура

UAV Frames ──▷ ImageInputPipeline (F05) ──▷ ImageRotationManager (F06)
                                                    │
                              ┌─────────────────────┼─────────────────────┐
                              ▼                     ▼                     ▼
                 SequentialVO (F07)    GlobalPlaceRecog (F08)   SatelliteData (F04)
                       │                     │                        │
                       ▼                     ▼                        ▼
              FactorGraphOptim (F10) ◂── MetricRefinement (F09) ◂── CoordTransform (F13)
                       │
             ┌─────────┴─────────┐
             ▼                   ▼
   RouteChunkManager (F12)   FailureRecovery (F11)
             │
             ▼
    SSE Event Streamer ──▷ Ground Station

State Machine (process_frame):

NORMAL ──(VO fail)──▷ LOST ──▷ RECOVERY ──(GPR+Metric ok)──▷ NORMAL

Стек

Підсистема Технологія
API FastAPI + Pydantic v2, SSE (sse-starlette)
БД SQLite + SQLAlchemy 2 (asyncio)
CV OpenCV (Essential Matrix, RANSAC, recoverPose)
Оптимізація GTSAM 4.3 (iSAM2, Huber kernel)
Моделі Mock engines: SuperPoint, LightGlue, DINOv2, LiteSAM
Кеш diskcache (супутникові тайли)
HTTP httpx (Google Maps Static Tiles)
Тести pytest + pytest-asyncio (80 тестів)

Швидкий старт

Вимоги

  • Python ≥ 3.11
  • pip / venv
  • ~500 MB дискового простору (GTSAM wheel)

Встановлення

git clone https://github.com/azaion/gps-denied-onboard.git
cd gps-denied-onboard
git checkout stage1

python3 -m venv .venv
source .venv/bin/activate

pip install -e ".[dev]"

Конфігурація .env

# Опціонально — для реальних супутникових тайлів
GOOGLE_MAPS_API_KEY=<your_key>
GOOGLE_MAPS_SESSION_TOKEN=<your_token>

# Налаштування серверу (за замовчуванням)
GPS_DENIED_HOST=127.0.0.1
GPS_DENIED_PORT=8000
GPS_DENIED_DB_URL=sqlite+aiosqlite:///./gps_denied.db

Запуск серверу

python -m gps_denied

Сервер стартує на http://127.0.0.1:8000.

Endpoint Метод Опис
/health GET Health check
/flights POST Створити новий політ
/flights/{id} GET Деталі польоту
/flights/{id} DELETE Видалити політ
/flights/{id}/images/batch POST Завантажити батч зображень
/flights/{id}/fix POST Надати GPS-якір (user fix)
/flights/{id}/status GET Статус обробки
/flights/{id}/events GET SSE стрім подій
/flights/{id}/object-gps POST Pixel → GPS координата

Тести

# Усі тести (80 шт, ~23с)
python -m pytest tests/ -v

# Тільки acceptance
python -m pytest tests/test_acceptance.py -v

# Тільки конкретний модуль
python -m pytest tests/test_graph.py -v

Покриття тестами

Файл тесту Компонент Кількість
test_schemas.py Pydantic моделі 12
test_database.py SQLAlchemy CRUD 9
test_api_flights.py REST endpoints 5
test_health.py Health check 1
test_satellite.py Тайли + Mercator 5
test_coordinates.py ENU / GPS конвертері 4
test_pipeline.py Image queue 3
test_rotation.py 360° ротації 4
test_models.py Mock engines 3
test_vo.py Visual Odometry 5
test_gpr.py Place Recognition 3
test_metric.py Metric Refinement 3
test_graph.py Factor Graph 4
test_chunk_manager.py Chunk lifecycle 3
test_recovery.py Recovery coordinator 2
test_processor_full.py State Machine 4
test_acceptance.py AC сценарії + perf 6
Всього 80

Структура проєкту

gps-denied-onboard/
├── src/gps_denied/
│   ├── __init__.py
│   ├── __main__.py            # Entry point (uvicorn)
│   ├── app.py                 # FastAPI application
│   ├── config.py              # Pydantic Settings (.env)
│   ├── api/
│   │   └── flights.py         # REST endpoints
│   ├── core/
│   │   ├── processor.py       # FlightProcessor + process_frame (State Machine)
│   │   ├── vo.py              # Sequential Visual Odometry (F07)
│   │   ├── gpr.py             # Global Place Recognition (F08)
│   │   ├── metric.py          # Metric Refinement (F09)
│   │   ├── graph.py           # Factor Graph Optimizer (F10, GTSAM)
│   │   ├── recovery.py        # Failure Recovery Coordinator (F11)
│   │   ├── chunk_manager.py   # Route Chunk Manager (F12)
│   │   ├── coordinates.py     # Coordinate Transformer (F13)
│   │   ├── models.py          # Model Manager (F16)
│   │   ├── satellite.py       # Satellite Data Manager (F04)
│   │   ├── pipeline.py        # Image Input Pipeline (F05)
│   │   ├── rotation.py        # Image Rotation Manager (F06)
│   │   ├── sse.py             # SSE Event Streamer
│   │   └── results.py         # Result Manager
│   ├── db/
│   │   ├── database.py        # Async engine + session
│   │   ├── models.py          # SQLAlchemy ORM models
│   │   └── repository.py      # FlightRepository (CRUD)
│   ├── schemas/
│   │   ├── __init__.py        # Re-exports
│   │   ├── flight.py          # Flight, Waypoint, GPS, Camera schemas
│   │   ├── events.py          # SSE event models
│   │   ├── image.py           # ImageBatch, ProcessingStatus
│   │   ├── rotation.py        # RotationResult, HeadingHistory
│   │   ├── model.py           # InferenceEngine, ModelConfig
│   │   ├── vo.py              # Features, Matches, RelativePose
│   │   ├── gpr.py             # TileCandidate, DatabaseMatch
│   │   ├── metric.py          # AlignmentResult, Sim3Transform
│   │   ├── graph.py           # Pose, OptimizationResult
│   │   ├── chunk.py           # ChunkHandle, ChunkStatus
│   │   └── satellite.py       # TileCoords, TileBounds
│   └── utils/
│       └── mercator.py        # Web Mercator utilities
├── tests/                     # 17 test modules (80 tests)
├── docs/                      # Архітектурні специфікації
├── docs-Lokal/                # Локальний план та рішення
├── pyproject.toml             # Залежності та конфігурація
└── .gitignore

Компоненти (F-індексація)

ID Назва Файл Статус
F04 Satellite Data Manager core/satellite.py Mock
F05 Image Input Pipeline core/pipeline.py
F06 Image Rotation Manager core/rotation.py
F07 Sequential Visual Odometry core/vo.py Mock engines
F08 Global Place Recognition core/gpr.py Mock Faiss
F09 Metric Refinement core/metric.py Mock LiteSAM
F10 Factor Graph Optimizer core/graph.py GTSAM wrapper
F11 Failure Recovery Coordinator core/recovery.py
F12 Route Chunk Manager core/chunk_manager.py
F13 Coordinate Transformer core/coordinates.py
F16 Model Manager core/models.py Mock/Fallback

Ліцензія

Приватний репозиторій. Усі права захищено.