Реалізація AR-навігації в мобільному додатку
AR-навігація — це коли стрілка направлення намальована поверх реального світу через камеру. Звучить просто, але в реалізації є три принципово різні сценарії з різною технічною складністю: навігація на відкритому повітрі (outdoor), всередину будівлі (indoor) та навігація по етажу в торговому центрі або аеропорту. Кожен розв'язується окремим стеком.
Outdoor AR-навігація: GPS + компас + ARKit/ARCore
Базовий підхід — привязка AR-об'єктів до GPS-координат. Використовується CLLocationManager + CLHeading для компаса, ARKit/ARCore для стабілізації орієнтації. Точність GPS в місті — 3-8 метрів, чого достатньо для стрілки «ідіть прямо 200 метрів», але недостатньо для «сверніте тут» з точністю до тротуара.
ARKit Geo Tracking (iPhone XS+, iOS 14+, підтримувані міста) — інший рівень. ARGeoTrackingConfiguration використовує GPS, компас та street-level imagery від Apple Maps для локалізації з точністю 1-3 метра. ARGeoAnchor привязується до координат WGS84, та ARKit сам підтримує якорь в мировом просторі при русі користувача.
let anchor = ARGeoAnchor(
coordinate: CLLocationCoordinate2D(latitude: 53.9045, longitude: 27.5615),
altitude: nil
)
arView.session.add(anchor: anchor)
ARGeoTrackingStatus.stateReason покаже, чому geo tracking не працює (.notYetInitialized, .geoDataNotLoaded, .visualLocalizationFailed). Останнє трапляється при поганому освітленні або на малоизвестных вулицях — потрібен fallback на GPS+компас.
Indoor-навігація: все складніше
GPS всередину будівель не працює. Опції:
Beacon/BLE (iBeacon, Eddystone). Трилатерація по RSSI. Точність — 2-5 метрів в хороших умовах, 5-10 в реальних (металеві стелажі, Wi-Fi перешкоди). CLLocationManager.startRangingBeacons(satisfying:) на iOS, BluetoothLeScanner на Android.
ARKit/ARCore + карта етажу. Користувач сканує QR-код при вході → отримує стартову позицію → ARKit ведє relative tracking від цієї точки. Похибка накопичується — кожні 50 метрів помилка позиції зростає на 0.5-2%. Потрібні контрольні точки (QR-коди у поворотах) для рекалібровки.
Visual Positioning System (VPS). Google Visual Positioning Service (ARCore 1.24+) працює в підтримуваних локаціях (Mall of America, партнерські аеропорти). StreetscapeGeometryMode + спеціальний endpoint для indoor maps. Для Росії/СНГ покриття мінімальне — потрібно будувати власну VPS з Immersal SDK або Sturfee.
Immersal SDK — найпрактичніший варіант для custom indoor VPS. Хмарна локалізація: фотографуєте помещение в Immersal Mapper, SDK локалізує користувача по visual match з точністю до 10-30 см. Працює на iOS (ARKit) та Android (ARCore). Ліцензія від $199/мес.
Отрисовка маршруту в AR
Шлях в AR — це ланцюжок 3D-точок, сполучених стрілками або «крошками» на рівні підлоги. Для плавного слідування по маршруту потрібна параметрична крива (Catmull-Rom spline) через waypoints — іначе стрілки будуть занадто кутастими на поворотах.
Стрілку направлення рисуємо як ModelEntity з USDZ-моделлю (GLB для ARCore), billboard-поворотом до камери по Y-осі. На поворотах — анімація пульсації через FromToByAnimation в RealityKit.
Важливо: стрілки повинні «прилипати» до виявленої площини підлоги, а не висіти в повітрі. Для цього — raycast вниз з кожного waypoint на виявлені площини.
Типова біль в production
Компас на Android — SensorManager.SENSOR_DELAY_GAME з фільтрацією через low-pass filter. Без фільтрації компас дергається та стрілка «прибивает» на 15-20° в секунду. Погано откалібрований магнетометр (поблизу з металевими конструкціями) дає відхилення до 30°. Додайте UI-запит на калібровку компаса при SensorAccuracy.LOW.
Терміни
Outdoor AR-навігація на GPS+компас — 2-3 тижні. З ARKit Geo Tracking — плюс 1 тиждень. Indoor-рішення на Immersal VPS — від 4 тижнів (включаючи зйомку та картування). Вартість розраховується індивідуально.







