Реализация Hand Tracking в AR-приложении
Hand tracking — отслеживание кистей рук и пальцев без маркеров, через камеру. Самостоятельное управление AR-интерфейсом, виртуальные музыкальные инструменты, обучающие приложения по хирургии или механике — везде, где руки становятся контроллером, требуется точное распознавание 21 сустава на каждую руку. Технически задача сложна: быстрые движения, перекрытие пальцев, потеря трекинга при плохом освещении. Наш опыт позволяет решать эти проблемы с помощью нативных и кроссплатформенных решений, сокращая затраты на разработку до 40% за счёт использования готовых библиотек.
Почему hand tracking — сложная техническая задача?
Каждая рука имеет 21 joint (в MediaPipe) или 26 (в ARKit), которые нужно отслеживать в реальном времени с низкой задержкой. Проблемы: самоперекрытие пальцев (щипок, когда большой палец перекрывает указательный), потеря трекинга при слабом освещении (<200 лк) и высокая вычислительная нагрузка на GPU. Современные решения комбинируют машинное обучение и геометрические алгоритмы для стабильного захвата.
Платформенная ситуация
iOS: Начиная с последних версий iOS и ARKit Hand Tracking предоставляет публичный API с 26 joints. До этого использовались сторонние ML-решения. Android: ARCore не имеет hand tracking, поэтому стандартом стал MediaPipe Hands с 21 joint, который работает и на iOS для кроссплатформенности.
Как ARKit и MediaPipe решают проблему перекрытия пальцев?
Оба фреймворка используют 2.5D-подход: сначала определяют bounding box кисти, затем уточняют joints внутри. При перекрытии уверенность падает, но ARKit лучше справляется благодаря глубине от LiDAR (на iPad Pro/iPhone Pro). MediaPipe использует только RGB и даёт более плавный трекинг, но с большей задержкой на слабых устройствах.
Реализация hand tracking на iOS (Swift)
// Последние версии iOS, RealityKit
let session = ARKitSession()
let handTrackingProvider = HandTrackingProvider()
Task {
try await session.run([handTrackingProvider])
for await update in handTrackingProvider.anchorUpdates {
let handAnchor = update.anchor
guard handAnchor.isTracked else { continue }
// Позиция кончика указательного пальца
if let indexTip = handAnchor.skeleton.joint(named: .indexFingerTip) {
let worldTransform = handAnchor.originFromAnchorTransform * indexTip.anchorFromJointTransform
// Привязать объект к кончику пальца
}
}
}
Когда hand tracking с MediaPipe оправдан?
MediaPipe Hands бесплатен, кроссплатформенен и подходит, если требуется поддержка старых устройств или единая кодовая база. Пример на Kotlin:
// Android
val handLandmarker = HandLandmarker.createFromOptions(context,
HandLandmarkerOptions.builder()
.setBaseOptions(BaseOptions.builder().setModelAssetPath("hand_landmarker.task").build())
.setNumHands(2)
.setMinHandDetectionConfidence(0.5f)
.setMinTrackingConfidence(0.5f)
.build()
)
val result = handLandmarker.detect(mpImage)
// result.landmarks() — List<List<NormalizedLandmark>>
// 21 точка на каждую руку в нормализованных координатах [0..1]
21 joint в MediaPipe: WRIST, THUMB_CMC .. THUMB_TIP, INDEX_FINGER_MCP .. INDEX_FINGER_TIP, аналогично для остальных пальцев. Для AR-привязки в 3D: нормализованные 2D-координаты → unproject через camera intrinsics + depth (LiDAR или monocular depth estimation).
Сравнение ARKit и MediaPipe
| Критерий | ARKit Hand Tracking | MediaPipe Hands |
|---|---|---|
| Платформы | iOS, visionOS | iOS, Android |
| Количество joints | 26 | 21 |
| Задержка (iPhone 15) | 15-20 мс | 20-30 мс (iOS) |
| Задержка (Android средний) | — | 35-45 мс |
| Бесплатность | Да (в составе платформы) | Да |
| Точность при перекрытии | Выше | Ниже |
ARKit быстрее MediaPipe в 2-3 раза на современных устройствах, но MediaPipe обеспечивает кроссплатформенность.
Распознавание жестов
Базовые жесты без ML — через геометрию joints:
- Pinch (щипок): расстояние между THUMB_TIP и INDEX_FINGER_TIP < порог (2-3 см).
- Открытая ладонь: все TIP joints выше соответствующих MCP joints по Y-оси.
- Кулак: все TIP joints ниже MCP по Y-оси.
- Victory (V): index и middle TIP выше MCP, остальные — ниже.
Сложные жесты (ASL алфавит, кастомные комбинации) — CreateML GestureClassifier или TensorFlow Lite custom model. Обучение на 500-1000 образцах каждого жеста.
Пример: обучение кастомного жеста
Используйте CreateML с датасетом из 1000 кадров для каждого жеста. Тренируйте классификатор на основе геометрических признаков (углы между суставами) — точность достигает 95%.Как hand tracking взаимодействует с AR-объектами
Picking объектов: ray из ладони/пальца → intersection с AR-объектами. PinchGesture = «схватить», разжать = «отпустить». Две руки одновременно → масштабирование (расстояние между ладонями), вращение (ориентация вектора между ладонями). Хирургическая симуляция: кончик пальца взаимодействует с виртуальными органами через collision detection.
Ограничения в реальных условиях
Перекрытие пальцев остаётся проблемой. MediaPipe и ARKit используют 2.5D — самоперекрытие не решено полностью. Контрастность руки на тёмном фоне снижает confidence. Минимальное освещение для стабильного трекинга — 200 лк. Latency: MediaPipe на среднем Android — 35-45 мс, ARKit на iPhone — 15-20 мс. Для музыкальных инструментов разница ощутима.
Пошаговый план реализации hand tracking
- Анализ требований и выбор платформы (ARKit / MediaPipe / гибрид).
- Интеграция библиотеки и настройка конфигурации (пороги уверенности, количество рук).
- Разработка логики жестов (геометрическая или ML-классификация).
- Реализация взаимодействия с AR-объектами (raycast, collision).
- Тестирование на реальных устройствах в разных условиях освещения.
- Оптимизация производительности (снижение нагрузки на GPU, асинхронная обработка).
Что входит в работу
- Архитектурное описание и техническая документация.
- Исходный код с комментариями и интеграцией в существующий проект.
- Тестовый билд для iOS и/или Android.
- Консультация по доработкам и поддержка на этапе внедрения.
- Гарантия качества и соблюдение сроков.
Получите консультацию по вашему проекту — мы оценим сроки и реализуем hand tracking под ключ. Закажите разработку hand tracking и ускорьте вывод вашего AR-продукта на рынок.
Сроки
Базовый hand tracking с распознаванием pinch/open жестов на iOS — от 1 до 2 недель. Кроссплатформенное решение на MediaPipe — от 2 до 3 недель. Кастомный классификатор жестов с обучением — плюс 2-3 недели. Интерактивное взаимодействие рук с AR-объектами — плюс 2-4 недели. Стоимость рассчитывается индивидуально после анализа требований.







