Клієнт хоче виміряти довжину дивана по одній фотографії — без рулетки, без спеціального обладнання. Ми реалізували цю функцію в мобільних додатках з точністю до 2% за правильних умов. Наш досвід — 5+ років у розробці iOS/Android, 30+ проєктів з AR та computer vision. Пропонуємо рішення під ключ: від вибору методу (LiDAR, SLAM або monocular depth) до інтеграції з вашим бекендом. Отримайте консультацію — оцінимо ваш проєкт за один день.
Який метод вимірювання обрати: LiDAR, SLAM чи monocular depth?
ARKit/ARCore (LiDAR або SLAM) — точний, але вимагає підтримки пристрою. iPhone 12 Pro і новіший з LiDAR дають точність 1–3 см на відстані до 5 метрів. ARCore на Android без LiDAR — гірший, похибка 3–8 см.
Monocular depth estimation — працює на будь-якому пристрої без LiDAR, використовує CNN для оцінки глибини по одному кадру. MiDaS, DPT, Depth Anything V2 — актуальні моделі. Точність помітно нижча за LiDAR-підхід, але для багатьох задач достатня.
| Метод | Точність | Вимоги до пристрою | Складність реалізації |
|---|---|---|---|
| LiDAR (ARKit/ARCore) | 1–3 см | iPhone 12 Pro+, iPad Pro | Середня |
| SLAM (ARKit/ARCore) | 3–8 см | Пристрої з підтримкою ARKit/ARCore | Середня |
| Monocular depth | 5–15% | Будь-який пристрій | Висока (нейромережа) |
// iOS: вибір методу залежно від можливостей пристрою func selectMeasurementMethod() -> MeasurementMethod { if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) { return .lidarARKit // iPhone 12 Pro+, iPad Pro } else if ARWorldTrackingConfiguration.isSupported { return .slamARKit // ARKit без LiDAR } else { return .monocularDepth // фолбек на CoreML-модель } } Що впливає на точність вимірювання?
Точність вимірювання безпосередньо залежить від умов зйомки: освітлення, текстура поверхні, відстань до об'єкта та кут нахилу камери. Білі стіни без текстур погіршують SLAM-трекінг, а високе освітлення може викликати пересвіти. Для стабільного результату необхідно:
- Текстуровані поверхні (чорні, глянцеві об'єкти гірше детектуються)
- Відстань до об'єкта не більше 5 м при LiDAR, 3 м при SLAM
- Мінімізація динамічних об'єктів у кадрі
- Правильне фокусування камери
Як ми реалізуємо вимірювання через ARKit
// Вимірювання відстані між двома точками в AR class ARMeasurementSession: NSObject, ARSessionDelegate { var arView: ARSCNView! private var startAnchor: ARAnchor? private var endAnchor: ARAnchor? func placePoint(at screenPoint: CGPoint) -> MeasurementPoint? { // Raycast від екрану в 3D світовий простір guard let query = arView.raycastQuery( from: screenPoint, allowing: .estimatedPlane, alignment: .any ) else { return nil } guard let result = arView.session.raycast(query).first else { return nil } let worldPosition = result.worldTransform.columns.3 // позиція в метрах return MeasurementPoint( position: SIMD3(worldPosition.x, worldPosition.y, worldPosition.z), confidence: result.targetAlignment == .horizontal ? .high : .medium ) } func calculateDistance(from start: MeasurementPoint, to end: MeasurementPoint) -> Measurement<UnitLength> { let diff = end.position - start.position let distanceMeters = Double(simd_length(diff)) return Measurement(value: distanceMeters, unit: .meters) } } Одна з поширених помилок — не враховувати, що raycast працює краще на добре текстурованих поверхнях. Біла стіна дає поганий результат SLAM tracking, AR-мітки починають «пливти».
Відображення вимірювання в AR
func addMeasurementLine(from start: SIMD3<Float>, to end: SIMD3<Float>, distance: String) { let midpoint = (start + end) / 2 // Лінія між точками let lineNode = SCNNode(geometry: createCylinder(from: start, to: end)) // Мітка з відстанню посередині let labelNode = SCNNode(geometry: SCNText(string: distance, extrusionDepth: 0.001)) labelNode.position = SCNVector3(midpoint.x, midpoint.y + 0.02, midpoint.z) labelNode.scale = SCNVector3(0.005, 0.005, 0.005) labelNode.constraints = [SCNBillboardConstraint()] // завжди обличчям до камери sceneRoot.addChildNode(lineNode) sceneRoot.addChildNode(labelNode) } Reference object підхід для вимірювання по фото
Без AR — потрібен об'єкт відомого розміру в кадрі. Банківська картка (85.6 × 53.98 мм) — зручний reference:
// Android: вимірювання через reference object class ReferenceObjectMeasurer { fun measureWithCard(bitmap: Bitmap, cardBoundingBox: RectF, objectBoundingBox: RectF): MeasurementResult { // Реальні розміри картки val cardRealWidth = 85.6f // мм val cardRealHeight = 53.98f // Пікселі → мм val pixelsPerMmHorizontal = cardBoundingBox.width() / cardRealWidth val pixelsPerMmVertical = cardBoundingBox.height() / cardRealHeight // Корекція на перспективне спотворення (спрощено) val correctionFactor = estimatePerspectiveCorrection( cardBoundingBox, imageDimensions = bitmap.width to bitmap.height ) return MeasurementResult( widthMm = (objectBoundingBox.width() / pixelsPerMmHorizontal) * correctionFactor, heightMm = (objectBoundingBox.height() / pixelsPerMmVertical) * correctionFactor, accuracy = MeasurementAccuracy.MODERATE // ±5-10% без калібрування ) } } Детекція картки в кадрі — через ML Kit Object Detection або YOLOv8-кастомний (нескладно навчити на 500 знімках карток в різних умовах).
Процес роботи: від ідеї до релізу
- Аналітика — вивчення бізнес-вимог, пристроїв аудиторії, необхідної точності.
- Проектування — вибір архітектури: нативний ARKit/ARCore або кроссплатформа, визначення методу вимірювання (LiDAR/SLAM/monocular depth).
- Реалізація — розробка MVP з базовим UI (дві точки, лінія), інтеграція з CoreML/ML Kit, налаштування калібрування.
- Тестування — перевірка точності на 10+ пристроях, в різних умовах зйомки, A/B тести.
- Деплой — підготовка до публікації в App Store та Google Play, оформлення документів, TestFlight/Firebase Distribution.
| Етап | Тривалість |
|---|---|
| Аналітика | 1–2 дні |
| Проектування | 1–2 дні |
| Реалізація MVP | 3–5 днів (одна платформа) |
| Повноцінне рішення (iOS+Android) | 1–2 тижні |
| Тестування та деплой | 3–5 днів |
Що входить в роботу
- Архітектурна документація та опис API
- Інтеграція з вашою CRM / бекендом через REST або GraphQL
- Навчання вашої команди роботі з функцією
- Технічна підтримка 3 місяці
- Доступ до вихідного коду (з правом модифікації)
- Сертифікати від Apple та Google (якщо потрібно)
Ми — сертифіковані розробники Apple та Google. Гарантуємо точність вимірювань відповідно до вимог App Store Review Guidelines (Section 4.2/5.1). За 5 років реалізували 30+ проєктів в e-commerce, будівництві та медицині.
Типові помилки при реалізації
- Ігнорування підтримки пристроїв без LiDAR — користувачі отримують нульову точність.
- Відсутність калібрування перспективних спотворень при reference object.
- Використання стандартних моделей глибини без донавчання на предметній області.
- Неврахування рекомендацій Apple для in-app purchase (якщо функція платна) — StoreKit 2.
Оцініть ваш проєкт — напишіть нам. Отримайте консультацію щодо вибору методу та термінів реалізації.
У статті використані матеріали monocular depth estimation та документації Apple ARKit.







