Ми вирішуємо проблему точного трекінгу транспорту в реальному часі
Наші інженери стикалися з ситуацією, коли GPS-трекер на автобусі показував маршрут, що стрибає по паралельних вулицях, а диспетчер не міг зрозуміти, де машина насправді. Водій уже проїхав зупинку, а на карті — тільки під'їжджає. Це не проблема заліза, а помилка фільтрації та map matching. Ми розробляємо системи трекінгу, які використовують дані апаратних трекерів (Teltonika, Queclink, Galileosky) або GTFS Realtime, і накладають їх на карту з урахуванням швидкості, маршруту та рельєфу. Досвід роботи з парками від 50 до 1000 машин дозволяє нам гарантувати точність позиціонування з похибкою не більше 5 метрів.
Які джерела даних ми використовуємо?
Для логістичних компаній та управління парком транспортний засіб — це апаратний GPS-трекер (Teltonika FMB920, Queclink GV350, Galileosky), а не телефон водія. Трекер надсилає пакети по MQTT або HTTP-протоколу на сервер. Додаток виступає тільки як візуалізатор даних, а не як джерело.
Якщо завдання — показувати громадський транспорт за даними GTFS Realtime (стандарт Google), то джерело — відкриті API міських транспортних операторів. Формат — Protocol Buffers (transit_realtime.FeedMessage), парсинг через бібліотеку gtfs-realtime-bindings.
Для додатків з телефоном водія (таксі, корпоративний транспорт) — той самий стек, що у кур'єрського трекінгу, але з поправками на швидкість руху.
Таблиця порівняння типів трекерів
| Тип | Приклади пристроїв | Протокол | Частота оновлення | Вартість (установка на 1 машину) |
|---|---|---|---|---|
| Апаратний | Teltonika FMB920, Queclink GV350 | MQTT, Wialon | 10-60 секунд | $50-$150 |
| Зі смартфона | Будь-який Android/iOS | REST, WebSocket | 5-30 секунд | $0 (тільки софт) |
| GTFS Realtime | - | HTTP, Protocol Buffers | 1-60 секунд | $0 (відкриті дані) |
GPS-фільтрація на високих швидкостях: як прибрати дрейф?
На швидкості 80-120 км/год горизонтальний GPS-дрейф менший, ніж у місті з багатоповерхівками, але інша проблема: при різких поворотах маркер може «обганяти» реальне положення машини через затримку оновлення. Калман-фільтр згладжує цю затримку.
Проста реалізація фільтра Калмана для координат на Kotlin:
class KalmanFilter(private var accuracy: Float = 1f) { private var lat = 0.0 private var lon = 0.0 private var variance = -1f fun process(lat: Double, lon: Double, accuracy: Float, timestamp: Long): LatLng { if (variance < 0) { this.lat = lat; this.lon = lon; variance = accuracy * accuracy } else { val dt = (timestamp - lastTimestamp) / 1000f variance += dt * 3f * 3f // швидкість зміни 3 m/s val k = variance / (variance + accuracy * accuracy) this.lat += k * (lat - this.lat) this.lon += k * (lon - this.lon) variance *= (1 - k) } lastTimestamp = timestamp return LatLng(this.lat, this.lon) } private var lastTimestamp = 0L } На iOS аналогічна реалізація в Swift або використання CLLocationManager з CLActivityType.automotiveNavigation — Apple застосовує власний фільтр.
Map Matching: який сервіс обрати?
Рейсовий автобус їде по фіксованому маршруту — GPS-точки між зупинками повинні лежати строго на цьому маршруті, а не стрибати на паралельну вулицю. Map matching: беремо послідовність GPS-точок і «притискаємо» їх до найближчої ділянки дорожнього графа.
OSRM self-hosted: GET /match/v1/driving/{coordinates}?radiuses={radiuses}&geometries=geojson. Повертає matched-трек з waypoints. Згідно з документацією OSRM, latency при self-hosting становить < 20 мс, що прийнятно для реального часу.
Google Roads API snapToRoads — простіше в інтеграції, але платно (5$ за 1000 викликів) і обмежено 100 точками за запит.
Порівняння OSRM vs Google Roads API
| Параметр | OSRM self-hosted | Google Roads API |
|---|---|---|
| Вартість | Безкоштовно (сервер) | $5 за 1000 викликів |
| Latency | < 20 мс | ~100 мс |
| Обмеження | Немає | 100 точок/запит |
| Контроль | Повний | Зовнішній |
Висновок: для частого використання (1000+ машин) OSRM self-hosted у 250 разів дешевший і в 5 разів швидший.
Як забезпечити плавну анімацію руху?
Маркер автобуса/вантажівки — кастомний PNG або SVG з поворотом за напрямком руху. Напрямок у градусах: atan2(dLon, dLat) * 180 / PI. На Android — BitmapDescriptorFactory.fromBitmap(rotatedBitmap) з поворотом через Matrix.postRotate(). На iOS — GMSMarker з iconView, поворот через CGAffineTransform(rotationAngle:).
Маршрут — полілінія. Google Directions API для розрахунку або заздалегідь збережений GTFS shapes.txt. На карті — GMSPolyline / Polyline з кастомним кольором та товщиною. Пройдена ділянка — інший колір (наприклад, сірий замість синього).
Анімація руху — інтерполяція між точками. Інтервал оновлення GPS-трекера зазвичай 30-60 секунд, а не 5. Це означає, що маркер повинен плавно рухатися 30 секунд від однієї точки до іншої, а не стрибати. ValueAnimator на Android з LinearInterpolator, CADisplayLink на iOS.
Серверна частина: як забезпечити масштабування?
Для парку з 50-200 машин — Socket.IO або WebSocket на Node.js. Сервер зберігає актуальні позиції в Redis з TTL. Клієнт підписується на канал fleet/updates і отримує оновлення всіх машин пачкою кожні 10-15 секунд замість індивідуальних подій — економить трафік на 80%.
Для великих парків (1000+ машин) — MQTT broker з топіками vehicle/{id}/gps. Клієнт підписується тільки на цікаві машини.
Історичне зберігання маршрутів: PostgreSQL + PostGIS для геопросторових запитів («покажи всі машини, що проїхали через зону X вчора»), TimescaleDB для time-series метрик (швидкість, паливо).
Що входить в роботу?
- Аудит джерела даних: трекер/телефон/GTFS — визначаємо тип і протокол.
- Проектування серверної шини та вибір стеку (MQTT/WebSocket/Redis).
- Реалізація мобільного клієнта: маркери, маршрути, анімація, стани.
- Інтеграція map matching (OSRM self-hosted або Google Roads).
- Навантажувальне тестування з емуляцією трафіку до 1000 машин.
- Документація з API та налаштування.
- Навчання диспетчерів (1 година).
- Підтримка 2 тижні після запуску.
Термін розробки — від 2 до 6 тижнів залежно від джерела даних, кількості платформ та масштабу парку. Сертифіковані інженери з досвідом 5+ років гарантують стабільну роботу. Середня вартість впровадження для парку з 20 машин — від 500 000 рублів. Оцінимо ваш проект безкоштовно — напишіть нам! Замовте розробку трекінгу — зв'яжіться з нами для консультації.







