# Локальний план виконання (gps-denied-onboard) **Призначення:** поетапна реалізація сервісу геолокалізації знімків БПЛА за спеками у цьому репозиторії. **Режим роботи:** ведеться розробка у гілці `stage1` з пушами в репозиторій. **Опорні документи:** `docs/00_problem/`, `docs/01_solution/`, `docs/02_components/`, `docs/03_tests/`. --- ## 1. Цілі та критерії успіху - Відтворити архітектуру ASTRAL-Next / гібрид VO + кросс-вью + фактор-граф згідно з `decomposition_plan.md`. - Досягти приймальних критеріїв з `acceptance_criteria.md` (точність, стійкість до виїздів/виражів, <5 с на кадр на цільовій GPU, REST + SSE). - Покрити інтеграційні та приймальні сценарії з `docs/03_tests/` по мірі готовності компонентів. --- ## 2. Затверджені архітектурні рішення (LOCAL DECISIONS) Замість відкритих питань ми зафіксували наступний стек для локального прототипу: 1. **Джерело супутникових карт:** `Google Maps API` (з імплементацією патерну Strategy для легкої заміни в майбутньому). 2. **Математичний оптимізатор (Factor Graph):** `GTSAM (Python Bindings)` для уникнення C++ збірки на етапі MVP та збереження єдиного Python-процесу. 3. **БД та Черги:** `SQLite` (ресурсна економія, жодних фонових контейнерів) та `asyncio.Queue` для In-Memory SSE стрімінгу замість Redis. 4. **Формат ground-truth / Ваги:** Вимагає ручного завантаження тестових наборів та вагів моделей до локальних папок (Етап 0.5). --- ## 3. Необхідні ресурси ### 3.1. Апаратне - ПК або ноутбук з **NVIDIA GPU** (мінімум RTX 2060, бажано 8+ ГБ VRAM). - **RAM:** 32 ГБ бажано. - **Диск:** десятки ГБ під кеш тайлів та ваги моделей. ### 3.2. Програмне - **OS:** Linux з драйверами NVIDIA + CUDA. - **Python 3.11+**, віртуальне середовище (venv/uv). - **Git** — робота в гілці `stage1`. --- ## 4. Рекомендований стек | Шар | Технологія | |-----|------------| | API | FastAPI, Pydantic v2 | | Стрим | SSE (наприклад, sse-starlette) | | CV/DL | PyTorch | | Граф поз | GTSAM (Python) | | БД | SQLite + SQLAlchemy 2 + Alembic | | Контейнери | (опційно для SQLite) | --- ## 5. Поетапний план виконання (детально) ### Етап 0 — Ініціалізація репозиторію коду (локально) ✅ - Створено структуру пакета `src/gps_denied/`, `pyproject.toml`, залежності. - Налаштовано `.gitignore`: `.env`, `data/`, `weights/`, `__pycache__`, `*.db`. - **Результат:** сервіс запускається, health endpoint працює, тест пройдено. ### Етап 0.5 — Підготовка даних та моделей (Data Provisioning) - **Токени:** Зафіксувати Google Maps API key у `.env`. - **Дані:** Завантажити тестові зображення у папку `data/test_flights`. - **Ваги:** Завантажити ваги SuperPoint, LightGlue, LiteSAM локально в `weights/`. ### Етап 1 — Конфігурація та доменні моделі ✅ - Реалізовано завантаження конфігів з `.env` через `pydantic-settings` (`config.py`). - Pydantic-схеми: GPSPoint, CameraParameters, Flight*, Waypoint, Batch*, SSE events. ### Етап 2 — База даних полёту ✅ - SQLite БД: 8 таблиць (flights, waypoints, geofences, flight_state, frame_results, heading_history, images, chunks). - Async FlightRepository з повним CRUD, каскадним видаленням. 9 тестів БД. ### Етап 3 — REST API + завантаження батчів ✅ - Endpoints: створення полёту, завантаження батчу зображень (мультипарт). - Фейковий `FlightProcessor` для замикання логіки під час тестування REST. ### Етап 4 — SSE та менеджер результатів ✅ - Підписка на події по `flight_id` через `asyncio.Queue` (віддача проміжних та уточнених поз). - Збереження в таблицю `frame_results` (за допомогою FlightRepository). ### Етап 5 — Супутникові тайли та координати (Google Maps) ✅ - Клієнт Google Maps тайлів, локальний кеш. - Функції піксель <-> GPS (проекції, ENU координати). ### Етап 6 — Черга зображень і ротації ✅ - FIFO батчів (ImageInputPipeline), менеджер ротацій (ImageRotationManager). - Асинхронне збереження в кеш `image_storage`. ### Етап 7 — Model manager та послідовний VO ✅ - Завантаження локальних вагів (SuperPoint+LightGlue - Mock), побудова ланцюжка відносних оцінок (`SequentialVisualOdometry`). ### Етап 8 — Глобальне місце та метричне уточнення ✅ - Кросс-вью вирівнювання до тайла Google Maps (F09 LiteSAM Mock). - Отримання абсолютної GPS координати через Global Place Recognition (F08 AnyLoc/Faiss Mock). ### Етап 9 — Фактор-граф і чанки (GTSAM) ✅ - Побудова чинників (відносні VO + абсолютні якорі). Оптимізація траєкторії через GTSAM (F10). - Координатор відновлення в разі втрати трекінгу (F11) та управління чанками маршруту (F12). ### Етап 10 — Повний цикл обробки ✅ - Оркестрація: `process_frame` зі State Machine (NORMAL→LOST→RECOVERY→NORMAL), асинхронне доуточнення через SSE після зміни графа. ### Етап 11 — Приймальні тести та продуктивність ✅ - 6 AC-тестів: нормальний політ (20 кадрів), tracking loss/recovery, perf <5с/кадр, user anchor, sustained throughput (50 кадрів), graph convergence. - Усього 80 тестів проходять. ### Етап 12 — Локальна експлуатація ✅ - Деталізований README: архітектура, структура, endpoints, тести, компоненти, `.env`, розгортання. --- ## 6. Залежності між етапами ``` 0 → 0.5 → 1 → 2 → 3 → 4 ↘ 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 ``` --- ## 7. Резюме | Що | Зміст | |----|--------| | **Рішення** | Google Maps (Карти), GTSAM Python (Граф), SQLite (БД). | | **Етапи** | 0–12: Від ініціалізації до готових AC-метрик (з урахуванням підготовки даних в 0.5). | | **Гілка** | `stage1` з повноцінною роботою та комітами. |