Реалізація Visual Positioning System (VPS) в мобільному AR-додатку
GPS дає 3–5 метрів точності. Для AR-досвіду в міському середовищі це катастрофічно мало: накладати навігаційні стрілки поверх конкретного входу в будівлю або показувати AR-анотацію над правильною скульптурою в музейному дворику при 5-метровій похибці неможливо. VPS вирішує це: користувач наводить камеру на навколишній простір, алгоритм матчить кадр проти предзаписаної візуальної карти та повертає позицію з точністю до 10–30 сантиметрів.
Як працює VPS
Два етапи: mapping (offline) та localization (online, у реальному часі).
Mapping. Простір або зовнішня зона сканується: оператор з телефоном або спеціалізованим rig ходить по всій площі, записуючи відео. З відео вилучаються ключові кадри, запускається алгоритм Structure from Motion (SfM) — будується sparse point cloud та набір 6DOF поз камери. Дескриптори feature points (ORB, SuperPoint + SuperGlue для кращої точності) індексуються в базі даних для швидкого пошуку.
Localization. Телефон записує кадр, відправляє на сервер (або обробляє локально на потужних пристроях). Алгоритм image retrieval знаходить найближчі ключові кадри з бази → PnP (Perspective-n-Point) обчислює позу камери → повертає 6DOF transform. Все за 200–500 мс при серверній обробці.
Провайдери та SDK
| Провайдер | Покриття | Offline | Точність |
|---|---|---|---|
| Google ARCore Geospatial API | Міста зі Street View | Ні | ~10–30 см |
| Immersal SDK | Кастомні карти | Так (device) | ~2–5 см |
| Niantic Lightship VPS | Lightship wayspots | Ні | ~10–20 см |
| Apple ARKit + GPS | Outdoor, iOS тільки | Частково | ~1–3 м |
| Microsoft Azure Spatial Anchors | Кастомні | Ні | ~1–5 см |
Для кастомних закритих просторів (музей, офіс, склад) — Immersal. Для міських AR-досвідів на iOS — ARCore Geospatial API або Niantic VPS. Azure Spatial Anchors добре при інтеграції з Azure-інфраструктурою заказчика.
Інтеграція Immersal у нативний додаток
Immersal надає REST API для cloud localization та Unity SDK — останнього не потребно, працюємо нативно.
iOS: HTTP запит до https://api.immersal.com/localize з JPEG кадром та camera intrinsics → JSON-відповідь з позою в системі координат карти → конвертуємо в ARKit world space через матричне перетворення.
struct LocalizeRequest: Encodable {
let token: String
let fx, fy, ox, oy: Double // camera intrinsics з ARCamera.intrinsics
let image: String // base64 JPEG
}
// Отримуємо mapToWorld matrix, застосовуємо до ARSession.currentFrame
Android: аналогічно через retrofit2 + moshi, camera intrinsics з CameraCharacteristics.
Локалізацію запускаємо не на кожному кадрі (це 200 мс latency) — триггер при зміні позиції на 1+ метр або при втраті ARCore tracking.
Побудова візуальної карти
Сканування для Immersal: спеціальне iOS-додаток Immersal Mapper, або кастомний скрипт через REST API. Вимоги до зйомки: перекриття кадрів 60%+, рівномірне освітлення, повне покриття маршрутів користувачів. Для великого простору (торговельний центр 3 поверхи) — кілька годин роботи оператора.
Після завантаження відео на сервер Immersal: SfM обробка 30–120 хвилин, отримуємо mapId. При оновленні інтер'єру — пересканюємо змінені зони та мерджимо з існуючою картою через Immersal Console.
Терміни
Інтеграція ARCore Geospatial для міського AR-досвіду: 2–4 тижні. Кастомна VPS з Immersal для закритого приміщення включаючи сканування: 4–8 тижнів. Власний VPS-сервер на базі HLoc (hloc + SuperPoint + SuperGlue + Colmap) без зовнішніх залежностей: 3–5 місяців. Вартість розраховується індивідуально.







