Граубергер Александр Сергеевич
Идея проекта
StrideTrack — это приложение которое превращает смартфон в полноценный GPS-трекер и навигатор для бегунов и велосипедистов. Сервис сочетает в себе актуальные карты Yandex, интеллектуальную фильтрацию GPS-шумов и guided-навигацию, позволяя пользователям не только записывать тренировки, но и двигаться по заранее заданным маршрутам с обратной связью в реальном времени.
Краткое описание
StrideTrack — это картографический модуль мобильного приложения на Flutter, интегрированный с Yandex MapKit. Сервис предоставляет пользователям полный цикл работы с геоданными: от планирования маршрута до сохранения GPX-трека.
Ключевой функционал:
-
Интерактивная карта с поддержкой жестов, маркером текущей позиции и ориентацией по компасу.
-
Построение маршрутов (пешеходных и транспортных) через Yandex MapKit с поиском адресов и подсказками.
-
Запись GPS-треков в реальном времени с отрисовкой полилинии и расчётом метрик: дистанция, время, скорость, темп, калории, шаги, набор высоты.
-
Guided-навигация — ведение пользователя по заранее загруженному маршруту с индикатором прогресса, контролем отклонения и автозавершением.
-
Работа с GPX — импорт, отображение и экспорт маршрутов в формате GPX 1.1 с сохранением расширенных метаданных (sidecar JSON).
-
Автопауза — автоматическая приостановка записи при остановке движения.
-
Энергосбережение — приостановка GPS при сворачивании приложения или переключении вкладок.
Архитектура: сервис построен по принципам MVVM с элементами Clean Architecture, что изолирует бизнес-логику (фильтрация GPS, навигация) от картографического SDK и аппаратных сенсоров. Это делает код тестируемым и готовым к масштабированию.
Технологический стек: Flutter/Dart, Yandex MapKit, Geolocator, Flutter Compass, GPX, фильтр Калмана для подавления шумов GPS.
Целевая аудитория: спортсмены-любители (бегуны, велосипедисты), которые хотят отслеживать свои тренировки, планировать маршруты и получать навигационную поддержку в реальном времени.
| 1 | Отображение карты и геолокация | Frontend |
| 2 | Построение маршрутов (Yandex MapKit) | Frontend |
| 3 | Поиск адресов с подсказками | Frontend |
| 4 | Запись GPS-трека с фильтрацией | Frontend |
| 5 | Расчёт спортивных метрик | Frontend |
| 6 | Guided-навигация | Frontend |
| 7 | Работа с GPX (импорт/экспорт) | Frontend |
| 8 | Ручная и автоматическая пауза | Frontend |
| 9 | Запланированные тренировки | Frontend |
| 10 | Энергосбережение и жизненный цикл | Frontend |
| 11 | Аутентификация и авторизация | Бэкенд |
| 12 | Синхронизация тренировок с облаком | Бэкенд |
| 13 | Хранение истории тренировок (БД) | Бэкенд |
| 14 | Социальные функции (лента, лайки, подписки) | Бэкенд |
| 15 | Аналитика и агрегация статистики | Бэкенд |
| 16 | Рейтинги и доски лидеров | Бэкенд |
| 17 | Рекомендательная система маршрутов | Бэкенд |
| 18 | Кеширование (Redis) | Бэкенд |
| 19 | Административный API | Бэкенд |
| 20 | Экспорт данных (GDPR) | Бэкенд |
| 21 | Пуш-уведомления | Бэкенд |
| 22 | Мониторинг и логирование | DevOps |
| 23 | Масштабирование и балансировка | DevOps |
| 24 | CI/CD и контейнеризация | DevOps |
1. Платформы и целевые устройства
| Платформа / Устройство | Назначение |
|---|---|
| Android 12+ | Основная целевая платформа мобильного приложения |
| iOS 14+ | Вторичная целевая платформа (кросс-платформенность Flutter) |
| Сервер Linux (Ubuntu 22.04 LTS) | Развёртывание бэкенд-сервисов, базы данных и кеша |
| VDSina | Хостинг бэкенда, объектное хранилище для GPX-файлов |
| Docker / Kubernetes | Контейнеризация и оркестрация микросервисов |
2. Средства разработки (IDE и инструменты)
| Инструмент | Назначение |
|---|---|
| Android Studio (Koala / Ladybug) | Основная IDE для разработки Flutter-приложения (эмулятор Android, отладка, профилирование) |
| Visual Studio Code | Альтернативная IDE (с плагинами Flutter, Python, Docker) |
| Xcode (macOS) | Сборка и подпись iOS-версии приложения |
| PyCharm Professional | IDE для разработки бэкенда на Python |
| DBeaver / pgAdmin 4 | Визуальный клиент для управления PostgreSQL |
| Postman / Insomnia | Тестирование REST API и WebSocket-соединений |
| Git | Система контроля версий |
| GitHub / GitLab | Хостинг репозиториев, CI/CD и управление проектом |
| Docker Desktop | Локальный запуск контейнеризованных сервисов |
| Kubernetes (minikube / kind) | Локальная оркестрация контейнеров для тестирования |
| Prometheus + Grafana | Мониторинг и визуализация метрик бэкенда |
| ELK Stack (Elasticsearch, Logstash, Kibana) | Централизованное логирование |
3. Мобильный клиент (Frontend) — Flutter
Фреймворк и язык
| Технология | Версия | Назначение |
|---|---|---|
| Flutter | 3.22+ | Кроссплатформенный фреймворк для iOS/Android |
| Dart | 3.4+ | Язык программирования для Flutter |
Основные пакеты и библиотеки
| Пакет / Библиотека | Версия | Назначение |
|---|---|---|
| yandex_maps_mapkit | 4.x | Интеграция с Yandex MapKit (карты, маршрутизация, геокодирование) |
| geolocator | 13.x | Доступ к GPS-приёмнику, определение координат и разрешений |
| flutter_compass | 1.x | Получение азимута (компас) для ориентации маркера |
| permission_handler | 12.x | Запрос и проверка системных разрешений |
| path_provider | 2.x | Получение путей к локальным каталогам (для сохранения GPX) |
| xml | 6.x | Парсинг и генерация GPX-файлов |
| dio | 5.x | HTTP-клиент для отправки треков на бэкенд |
| retrofit | 4.x | Генерация типизированных API-клиентов (поверх Dio) |
| riverpod / flutter_bloc | 2.x / 8.x | Управление состоянием приложения (на выбор) |
| go_router | 14.x | Маршрутизация и навигация |
| shared_preferences | 2.x | Хранение локальных настроек (токен, настройки) |
| flutter_secure_storage | 9.x | Безопасное хранение JWT-токенов |
| connectivity_plus | 6.x | Мониторинг состояния сети (офлайн/онлайн) |
| device_info_plus | 10.x | Сбор информации об устройстве (для аналитики) |
4. Бэкенд — Python
Язык и веб-фреймворк
| Технология | Версия | Назначение |
|---|---|---|
| Python | 3.12+ | Основной язык программирования бэкенда |
| FastAPI | 0.115+ | Веб-фреймворк для создания REST API (высокая производительность, асинхронность, автогенерация OpenAPI) |
| Uvicorn | 0.34+ | ASGI-сервер для запуска FastAPI в продакшене |
| Gunicorn | 23.x | WSGI-сервер (опционально, для совместимости с некоторыми библиотеками) |
Работа с базой данных (PostgreSQL + SQLAlchemy)
| Технология | Версия | Назначение |
|---|---|---|
| PostgreSQL | 16.x | Основная реляционная база данных |
| SQLAlchemy | 2.0+ | ORM (Object-Relational Mapping) для работы с БД |
| Alembic | 1.13+ | Инструмент для управления миграциями схемы БД |
| asyncpg | 0.30+ |
Асинхронный драйвер PostgreSQL для SQLAlchemy (поддержка async/await)
|
| psycopg2-binary | 2.9+ | Синхронный драйвер PostgreSQL (для задач миграций) |
2. Отсутствие аналогов с полностью бесплатным пользовательским режимо
Достижение поставленных целей
| № | Задача (из Введения) | Результат | Статус |
|---|---|---|---|
| 1 | Провести анализ картографического функционала существующих спортивных приложений и определить требования к модулю | Проведён сравнительный анализ Strava, Nike Run Club, Komoot, Яндекс Карт. Сформулированы функциональные и нефункциональные требования | Выполнено |
| 2 | Обосновать выбор технологического стека | Обоснован выбор Flutter, Yandex MapKit, Geolocator, GPX, фильтра Калмана. Проведено сравнение SDK | Выполнено |
| 3 | Спроектировать архитектуру сервиса и модель его состояний | Разработана четырёхуровневая архитектура (MVVM + Clean Architecture) и конечный автомат состояний | Выполнено |
| 4 | Реализовать интеграцию с Yandex MapKit и построение маршрутов | Реализована инициализация SDK, коллекции объектов, маршрутизация (пеший/транспортный режимы), управление камерой | Выполнено |
| 5 | Разработать алгоритмы записи, фильтрации GPS-треков и guided-навигации | Реализован GpsTrackProcessor с фильтром Калмана (таблица 2.3) и RouteProgressTracker с проекцией на маршрут | Выполнено |
| 6 | Обеспечить локальное сохранение тренировок в формате GPX | Реализованы GeometryProvider (GPX 1.1) и WorkoutMetadata (sidecar JSON) | Выполнено |
| 7 | Провести тестирование сервиса и оценить соответствие требованиям | Проведено функциональное тестирование 15 сценариев на реальном устройстве Оценены нефункциональные показатели | Выполнено |
Ключевой фактор актуальности — в 2022–2024 годах ведущие мировые спортивные приложения прекратили официальную поддержку в России:
-
Strava и Nike Run Club удалены из российских сегментов App Store и Google Play .
-
Adidas Running прекратил работу в феврале 2024 года .
-
Российские пользователи потеряли доступ к накопленной многолетней статистике тренировок, любимым маршрутам и платным функциям .
«Пользователи хранили там ценную для себя информацию. Просто бах — и всё закрывается! К тому же многие сервисы имеют платные функции, и даже если пользоваться ими через VPN, нужно ещё решить проблему с оплатой» — Виктор Осокин, основатель российской платформы Simpla .
Эта ситуация создала острый рыночный спрос на отечественные аналоги спортивных трекеров, что подтверждается появлением российских проектов: «Бег. Начни бегать», Simpla, «На спорте», «Бег» от VK
1. Масштабируемость (Scalability)
1.1. Текущая клиентская часть (Flutter)
| Аспект | Реализация | Оценка масштабируемости |
|---|---|---|
| Архитектура | MVVM + Clean Architecture с разделением на Presentation, Domain, Data, MapKit Layer | Высокая - замена SDK или источника GPS не требует переписывания бизнес-логики |
| Управление состоянием | Централизованное состояние в MapScreenState | Средняя - при росте числа экранов может потребоваться переход на Riverpod/Bloc для лучшей масштабируемости |
| Коллекции MapKit | Три изолированные коллекции объектов (_userLocationCollection, _placemarksCollection, _routesCollection) | Высокая - обновление одного слоя не перерисовывает всю карту |
| Обработка GPS | Throttling UI (500 мс), фильтр Калмана, инкрементальное обновление полилинии | Высокая - треки до 10 000+ точек обрабатываются без падения FPS |
| Кодовая база | Модульная структура (features/map/, data/, core/map/) | Высокая - легко добавлять новые режимы маршрутизации или типы активности |
| Пакетная изоляция | Виджет карты вынесен в общий пакет common | Высокая - переиспользование в других частях приложения |
Обоснование:
-
Yandex MapKit обеспечивает наилучшую детализацию карт на территории РФ
Поддерживает пешеходную и транспортную маршрутизацию через официальный пакет.
-
Соответствует российскому законодательству о геоданных (приоритет для коммерциализации в РФ).
-
Предоставляет Suggest API для поиска адресов с подсказками.
Отличия от основных аналогов
| Критерий | StrideTrack | Komoot | Яндекс Карты (трекинг) | Strava |
|---|---|---|---|---|
| Карты РФ | Высокое качество (Yandex) | Среднее (OSM) | Высокое качество | Низкое (OSM) |
| Guided-навигация | Полноценная (прогресс, off-route) | Полноценная | Отсутствует | Отсутствует |
| Фильтрация GPS | Многоступенчатая (Kalman) | Базовая | Базовая | Базовая |
| Спортивные метрики на карте | Крупный шрифт для бега | Ориентирован на туризм | Минимальные | Развитые, но карты OSM |
| GPX импорт/экспорт | Полный цикл | Полный цикл | Нет | Нет |
| Офлайн-карты | Не реализовано | Есть | Есть | Нет |
| Социальные функции | Есть | Есть | Нет | Есть (ключевая фича) |