Інтеграція UWB (Ultra-Wideband) для точного позиціонування у мобільному додатку
GPS у приміщенні не працює — це відомо. Bluetooth Low Energy дає точність 1-3 метра в найкращому випадку. Wi-Fi RSSI triangulation — 2-5 метрів з високою нестабільністю. UWB (Ultra-Wideband) — технологія з точністю 10-30 сантиметрів, заснована на вимірюванні часу проходження радіосигналу (Time of Flight / Two-Way Ranging). Саме її Apple вбудував у iPhone 11+ через чип U1, і саме вона дає AirTag точність «ось ваша сумка, поверніть вправо».
Як працює UWB та що це означає для розробника
UWB використовує імпульси шириною ~500 МГц у діапазоні 6-8.5 ГГц. Час проходження сигналу між двома пристроями вимірюється з точністю до наносекунд (TWR — Two-Way Ranging, або TDoA — Time Difference of Arrival). З часу обчислюється відстань: 1 нс = ~30 см.
Для сценарію indoor positioning потрібні якорі (anchors) — UWB маяки з відомими координатами — та мобільний пристрій (tag). За виміряними відстанями до мінімум 3 якорів обчислюється позиція методом трилатерації.
Підтримувані пристрої
iOS. Apple NearbyInteraction framework. Пристрої з чипом U1/U2: iPhone 11–15, iPhone SE 3rd gen, AirTag, HomePod mini 2, Apple Watch Ultra. NISession — основний клас. Одна сесія = одна пара пристроїв. Для позиціонування відносно кількох якорів — кілька паралельних NISession.
Android. UwbManager з Jetpack Core UWB (androidx.core:core-uwb). Підтримувані пристрої: Samsung Galaxy (S21 Ultra+, S22+, S23, S24, Z Fold3+), Pixel 6 Pro+, деякі Xiaomi. Перевірка підтримки: UwbManager.isAvailable().
UWB-якоря (hardware). Для інфраструктурного позиціонування потрібні сторонні якоря: Qorvo DWM3000EVB, Decawave DWM1001, Sewio RTLS, Pozyx. Вони спілкуються по IEEE 802.15.4z і мають SDK для конфігурації.
Обмеження платформи
Apple Nearby Interaction — тільки peer-to-peer між двома Apple-пристроями або MFi-сертифікованими аксесуарами. Для інфраструктурного indoor positioning (якоря → телефон) напрямки через NISession працює тільки з Qorvo-сумісними якорями через спеціальний NIConfiguration.
NISession вимагає обміну NIDiscoveryToken між пристроями заздалегідь — зазвичай через Multipeer Connectivity, Bluetooth або сервер. Після обміну токенами NISession.run(configuration:) починає вимірювання.
Практичний кейс: навігація в торговому центрі
Сценарій: покупець шукає конкретний магазин. GPS недоступний. BLE-навігація недостатньо точна для коридорів шириною 3 метри. UWB-якоря встановлені на стелі кожні 10-15 метрів.
Якоря Pozyx Creator (UWB, PoE, самостійна локалізація) → центральний сервер Pozyx збирає дані позиціонування → REST API отдає координати tag-пристрою в системі координат будівлі.
Мобільний додаток: при вході в будівлю пристрій «підключається» до системи (через BLE handshake для ідентифікації), далі кожні 100-200 мс отримує оновлення координат через WebSocket (x, y, floor).
Координати накладаються на план будівлі (SVG-схема поверхів). Плавне рух маркера: Kalman Filter для згладжування шумних UWB-вимірювань. Без фільтра маркер «стрибає». Kalman-фільтр на мобілі — 20-30 рядків кода, але помітно покращує UX.
Навігація до точки: A* pathfinding по графу проходів (граф будується з SVG-схеми, заборонені зони — стіни та вітрини). При відхиленні від маршруту на > 1м — пересчет.
Інтеграція з Apple NearbyInteraction
Для пристрій-до-пристрою сценаріїв (курʻєр → клієнт, складів → конкретна палета):
import NearbyInteraction
class UWBSession: NSObject, NISessionDelegate {
let session = NISession()
func startSession(with peerToken: NIDiscoveryToken) {
session.delegate = self
let config = NINearbyPeerConfiguration(peerToken: peerToken)
config.isCameraAssistanceEnabled = true // iOS 16+: AR overlay
session.run(config)
}
func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
guard let peer = nearbyObjects.first else { return }
if let distance = peer.distance {
print("Distance: \(distance) m")
}
if let direction = peer.direction {
// SIMD3<Float> - направлення у 3D
print("Direction: \(direction)")
}
}
}
isCameraAssistanceEnabled включає Precision Finding — AR-стрілка поверх камери показує направлення до об'єкту (як в AirTag Precision Finding). Вимагає ARKit та NSCameraUsageDescription.
Обмін токенами
NIDiscoveryToken неможливо створити програмно — тільки отримати з session.discoveryToken. Щоб почати UWB-сесію, обидва пристрої повинні обміняти токенами заздалегідь. Типова схема: обидва пристрої публікують токен через Bluetooth Peripheral → сканують один одного → отримують токени → стартують NISession.
CloudKit або сервер — для сценаріїв де пристрої не рядом фізично при ініціалізації.
Типові проблеми інтеграції
Multipath interference. UWB-сигнал відбивається від металевих поверхонь (стелажі, обладнання) — хибні вимірювання відстані. Рішення: NLOS (Non-Line-of-Sight) detection через аналіз First Path Power vs Total Received Power. Pozyx та Decawave повертають ці метрики в сирому пакеті.
NISession suspended. iOS приостановлює UWB-сесію при уходе додатку в фон. sessionWasSuspended(_ session:) — зберігаємо останнє положення, при sessionSuspensionEnded — рестартуємо. У фоні UWB не працює — обмеження платформи.
Калібровка якорів. Координати якорів у просторі потрібно виміряти точно — помилка в 5 см змішує всі розрахунки. Self-localization якорів (Pozyx, Sewio) автоматично визначають свої координати при першому запуску через UWB TWR між собою.
Точність в динаміці. При швидкому русі (> 2 м/с) TDoA-системи дають більше помилок ніж TWR. Для пішоходів TWR з оновленням 10 Гц достатній.
Процес проекту
Аудит сценарію використання та обладнання → вибір UWB-платформи (Apple NI / Qorvo / Pozyx) → пілот на тестовій зоні з вимірюванням точності → інтеграція з мобільним додатком → Kalman-фільтрація та навігаційний граф → нагрузковое тестування (100+ одночасних пристроїв) → розгортання якорів.
Тривалість проекту
Пілот з Apple NearbyInteraction на двох пристроях — 1-2 тижні. Повноцінна indoor-навігація з інфраструктурними якорями, Kalman-фільтром та картою будівлі — 2-4 місяці залежно від масштабу об'єкту. Вартість розраховується після оцінки інфраструктури та цільових сценаріїв.







