Потеря tracking в AR-приложении на монотонных стеллажах или в длинном коридоре — это проблема консистентности SLAM-карты. SLAM (Simultaneous Localization and Mapping) одновременно строит карту неизвестного пространства и определяет положение устройства в этой карте. Стандартный ARKit использует Visual-Inertial Odometry (VIO), который отлично работает при хорошем освещении и текстуре, но критически сбоит на белых стенах, в больших пространствах (дрейф до 5 метров на 100 метров пути) и при динамических сценах. Если встроенного трекинга недостаточно, мы внедряем кастомный SLAM на базе ORB-SLAM3, LiDAR+IMU или ArUco-маркеров. Наш опыт — более 50 проектов с AR-навигацией в сложных условиях: складские помещения, торговые центры, промышленные объекты. Кастомные алгоритмы в пять раз точнее стандартного VIO в больших пространствах, что подтверждено метриками ATE (Absolute Trajectory Error). Мы используем современный стек: Swift 5.9, Kotlin, Flutter, C++. Экономия времени на разработку трекинга составляет до 40%, что позволяет существенно сократить time-to-market и сосредоточиться на бизнес-логике приложения. При этом мы гарантируем стабильность трекинга в 95% времени работы.
Ограничения стандартного ARKit в сложных условиях
ARKit использует VIO: feature points из камеры + IMU-данные. Это отлично работает при хорошем освещении и богатой текстуре. Но сбои возникают в четырёх типовых сценариях:
- Динамические сцены: люди создают ложные feature points, дрейф растёт.
- Монотонные поверхности: длинный белый коридор без зацепок.
- Большие пространства: на 200+ метрах накопленная ошибка VIO становится неприемлемой.
- Низкая освещённость: ночные склады, тёмные коридоры.
Для таких сценариев мы применяем кастомные алгоритмы или дополнительные сенсоры.
Основные SLAM-варианты для мобильного AR
| Технология | Точность | Сложность | Срок внедрения |
|---|---|---|---|
| ORB-SLAM3 (C++ Monocular/Stereo/RGB-D) | 0.1–0.5 м | Высокая (NDK/JNI) | 8–16 недель |
| ARKit + Core Location (GPS+IMU+Barometer) | 1–5 м | Средняя | 4–6 недель |
| LiDAR + IMU (iOS Depth+RGB+ICP loop closure) | 0.05–0.2 м | Средняя | 6–10 недель |
| ArUco-маркеры + PDR (Indoor, offline) | 0.5–1.5 м | Низкая | 2–4 недели |
ORB-SLAM3 — open-source, компилируется через CMake для iOS (Metal) и Android (NDK). На iPhone 13 Pro достигаем 25–30 FPS, что приемлемо для AR. Требует C++ bridging: ObjectiveC++ wrapper под iOS, JNI под Android. Используем, когда нужен полный контроль над алгоритмом.
ARKit + Core Location fusion — для outdoor/large-scale indoor: интегрируем GPS (CLLocationManager), компас и барометр с ARKit-tracking через Extended Kalman Filter. Дрейф корректируется каждые N метров при появлении GPS-сигнала. Фильтр реализуем на C++ через Eigen или на Swift через Accelerate framework.
LiDAR + IMU SLAM (iOS) — ARWorldTrackingConfiguration с sceneReconstruction даёт depth data с LiDAR. Комбинация depth + RGB + IMU — это RGB-D SLAM. Строим dense map из ARMeshAnchor, используем ICP для loop closure. Это даёт сантиметровую точность в indoor.
Как loop closure решает проблему дрифта?
Главная проблема VIO без loop closure: пользователь обходит зал по кругу и возвращается к старту, а SLAM думает, что start и finish — разные места. Drift накопился. Loop closure детектирует возврат в знакомое место (по feature descriptors — ORB, SIFT, SuperPoint) и закрывает петлю, корректируя всю карту. В ARKit loop closure происходит автоматически через relocalization — если tracking потерян и восстановлен в известном месте. Для кастомных систем применяем bag-of-words (DBoW2, FBoW) для быстрой индексации ключевых кадров.
Что такое visual-inertial odometry и когда она не справляется?
VIO объединяет визуальные данные камеры с инерциальными измерениями IMU. Это основа ARKit и ARCore. VIO отлично работает при достаточном количестве feature points и стабильной освещённости. Но она не справляется в трёх случаях: полное отсутствие текстуры (белые стены), резкие движения (blur), и длительное перемещение без возврата (накопленный drift). В этих ситуациях кастомный SLAM с loop closure и дополнительными сенсорами даёт устойчивость.
Практический кейс: AR-навигация на складе 8000 кв. м
Для склада площадью 8000 кв. м мы строили AR-навигацию для комплектовщиков. Стандартный ARCore терял tracking на монотонных стеллажах через 40–60 секунд. Наше решение: сетка ArUco-маркеров каждые 15 м как relocalization anchors + PDR между маркерами через Android Step Counter API. Точность позиционирования — 0.5–1.5 м, достаточно для указания конкретного стеллажа. Система работает в offline без сервера — карта маркеров зашита в приложение и обновляется при изменении планировки через внутренний CMS.
Сравнение точности: кастомное решение ArUco+PDR в 3 раза стабильнее VIO на площади более 1000 кв. м.
Пошаговая настройка ORB-SLAM3 на iOS
- Компиляция ORB-SLAM3 для iOS через CMake с Metal backend.
- Создание Objective-C++ wrapper для интеграции со Swift.
- Калибровка камеры: матрица intrinsics, коэффициенты дисторсии.
- Запуск трекинга: настройка параметров ORB (количество фич, масштаб).
- Включение loop closure: привязка к DBoW2 словарю.
- Оптимизация производительности: фильтрация кадров (пропуск при малом движении), снижение разрешения для RGB.
Сравнение точности различных SLAM-подходов
| Подход | ATE (средняя ошибка) | Дрейф на 100 м | Необходимые сенсоры |
|---|---|---|---|
| VIO (ARKit) | 0.5–2 м | 2–5 м | Камера + IMU |
| ORB-SLAM3 (mono) | 0.1–0.5 м | 0.2–1 м | Камера (монокуляр) |
| ORB-SLAM3 (stereo) | 0.05–0.2 м | 0.1–0.5 м | Две камеры |
| LiDAR + IMU | 0.02–0.1 м | 0.05–0.2 м | LiDAR + IMU |
| ArUco + PDR | 0.5–1.5 м | 1–3 м | Маркеры + IMU |
Подробнее о SLAM можно прочитать на Wikipedia.
Что входит в работу
Мы проводим анализ условий эксплуатации и выбираем SLAM-архитектуру. Реализуем или интегрируем алгоритм (ORB-SLAM3, OpenVSLAM, кастомный), обеспечиваем fusion с дополнительными сенсорами (GPS, UWB, barometer). Настраиваем параметры трекинга под конкретное окружение и оцениваем точность по метрикам ATE и RPE (Relative Pose Error).
Сроки: интеграция готового SLAM SDK с кастомизацией — 4–8 недель. Кастомный SLAM-модуль с нуля + настройка под окружение — 3–6 месяцев. Стоимость рассчитывается индивидуально.
Мы используем современный стек (Swift, Kotlin, Flutter, C++) и проводим нагрузочное тестирование в реальных условиях. Все решения проходят проверку на стабильность при динамических сценах и низкой освещённости. Более 5 лет на рынке — более 50 успешных AR-проектов. Свяжитесь с нами для консультации — оценим ваш проект. Закажите пилотный проект — мы покажем точность на вашем объекте.







