Интеграция 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 месяца в зависимости от масштаба объекта. Стоимость рассчитывается после оценки инфраструктуры и целевых сценариев.







