Розробка мобільного додатку для велосипедистів
Велосипедні додатки — конкурентний ринок зі Strava, Komoot, Wahoo. Виживають або нішеві продукти (треккінг для конкретного регіону, клубні функції, інтеграція з конкретним залізом), або додатки з унікальною моделлю даних. Розробка починається з розуміння, чому користувачу ще один додаток та що конкретно він робить краще.
GPS-трекінг: якість даних важливіше частоти
CLLocationManager на iOS з desiredAccuracy = kCLLocationAccuracyBestForNavigation та distanceFilter = 5 (оновлення кожні 5 метрів) — стандартна конфігурація для трекінгу активності. На Android — Fused Location Provider з PRIORITY_HIGH_ACCURACY та інтервалом 1-2 секунди.
Проблема GPS на велосипеді — не точність в чистому полі, а тоннелі, путепроводи, плотна міська забудова. Точки «стрибають» на 50-100 метрів. Сирий трек без фільтрування — це дергана лінія на карті та завищений пробіг.
Фільтрування Калмана — стандартний підхід. Простий алгоритм згладжування для GPS:
class GPSKalmanFilter {
private var latitude: Double = 0
private var longitude: Double = 0
private var variance: Double = -1
private let minAccuracy: Double = 1.0
mutating func process(lat: Double, lon: Double, accuracy: Double, timestamp: TimeInterval) -> CLLocationCoordinate2D {
let accuracy = max(accuracy, minAccuracy)
if variance < 0 {
latitude = lat; longitude = lon
variance = accuracy * accuracy
} else {
let timeStep = timestamp - lastTimestamp
if timeStep > 0 {
variance += timeStep * 3.0 // Q: process noise
}
let K = variance / (variance + accuracy * accuracy)
latitude += K * (lat - latitude)
longitude += K * (lon - longitude)
variance = (1 - K) * variance
}
lastTimestamp = timestamp
return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
}
Додатково: точки з horizontalAccuracy > 50 метрів відбрасуємо повністю. Стрибок більш 10 м/с (36 км/ч) при очікуваній 25 км/ч — теж виброс.
Bluetooth-датчики по протоколу ANT+/BLE
Велосипедисти використовують зовнішні датчики: датчик каденса (обороти педалей), датчик потужності (ватметр), пульсометр, датчик швидкості. Протоколи — Bluetooth LE з профілями з GATT Cycling Profile (CP, CSC, HR) та проприетарний ANT+.
ANT+ на iOS недоступен з App Store (тільки через MFi-аксесуари). На Android — бібліотека ant-android-sdk-stub через Ant+ Plugin Service. Реалістична альтернатива — BLE-датчики з подвійною трансляцією ANT+/BLE (Garmin, Wahoo, більшість сучасних датчиків).
// Android: підписка на Cycling Speed and Cadence (CSC) GATT
val CSC_SERVICE = UUID.fromString("00001816-0000-1000-8000-00805f9b34fb")
val CSC_MEASUREMENT = UUID.fromString("00002a5b-0000-1000-8000-00805f9b34fb")
fun parseCscMeasurement(value: ByteArray): CscData {
val flags = value[0].toInt()
var offset = 1
var wheelRevolutions = 0L
var wheelEventTime = 0
if (flags and 0x01 != 0) { // Wheel Revolution Data present
wheelRevolutions = value.getLong32(offset)
wheelEventTime = value.getUInt16(offset + 4)
offset += 6
}
var crankRevolutions = 0
var crankEventTime = 0
if (flags and 0x02 != 0) { // Crank Revolution Data present
crankRevolutions = value.getUInt16(offset)
crankEventTime = value.getUInt16(offset + 2)
}
return CscData(wheelRevolutions, wheelEventTime, crankRevolutions, crankEventTime)
}
Швидкість з CSC розраховується по дельті обертів колеса та дельті часу события. Довжина окружності колеса — налаштування користувача або автовичислення по розміру шини.
Навігація по маршруту
Побудова маршруту по велодорожках — OpenStreetMap через OSRM або GraphHopper з велосипедним профілем. Відображення — MapLibre GL (відкритий) або Mapbox SDK. Пошагова навігація голосом: AVSpeechSynthesizer на iOS, TextToSpeech на Android — триґер за 150-200 метрів до повороту.
Офлайн-карти критичні для велотуризму в горах. Mbtiles або PMTiles формат, загрузка регіону заздалегідь. MapLibre підтримує офлайн з коробки.
Статистика та інтеграція
Після поїздки: пробіг, час, набір висоти (з CLLocationManager.altitude з барометричною коррекцією на iOS, аналогічно через SensorManager на Android), середня/максимальна швидкість, потужність, каденс. Експорт в .fit (формат Garmin/Strava) або GPX.
Інтеграція зі Strava через OAuth2 + Strava API v3: завантаження активності через POST /uploads з файлом .fit або .gpx. Кінцева точка підтримує multipart/form-data з полями data_type, name, activity_type.
Розробка велосипедного додатку з GPS-трекингом, BLE-датчиками, картою та Strava-експортом: 8-12 тижнів на одну платформу. Вартість розраховується індивідуально.







