Core Motion: суть, датчики руху та обробка даних

Автор: IT Sectr Опубліковано: 2026-03-25 Час читання: 8 хв

Фреймворк Core Motion — системний компонент iOS, що надає доступ до даних акселерометра, гіроскопа, магнітометра та крокоміра на пристроях Apple. За даними Apple Developer Documentation, 2025, фреймворк обробляє сирі дані датчиків і перетворює їх на зрозумілі метрики — прискорення, кутову швидкість, орієнтацію та кількість кроків. Єдиний API для всіх датчиків руху дозволяє розробникам створювати крокоміри, фітнес-програми та ігри з керуванням нахилом пристрою.

Головне

  • Core Motion — фреймворк Apple для обробки даних з датчиків руху iPhone та iPad.
  • CMMotionManager — центральний клас для доступу до акселерометра, гіроскопа та магнітометра.
  • CMAltimeter — клас для отримання даних про відносну висоту та зміну тиску.
  • CMPedometer — клас для підрахунку кроків, пройденої відстані та швидкості руху.
  • CMDeviceMotion — об'єднані дані з фільтрацією від гравітації (userAcceleration).

Що таке Core Motion?

Core Motion — системний фреймворк Apple, представлений в iOS 4 для роботи з датчиками руху пристрою. Він надає єдиний інтерфейс для доступу до акселерометра, гіроскопа, магнітометра та крокоміра, звільняючи розробника від необхідності працювати з апаратними драйверами на низькому рівні.

Ключова перевага Core Motion — апаратна фільтрація даних. Фреймворк автоматично об'єднує показники акселерометра та гіроскопа для обчислення чистої userAcceleration без гравітаційної складової, а також видає орієнтацію пристрою в просторі у вигляді кватерніонів і кутів Ейлера.

За даними Apple WWDC 2023, Core Motion використовується більш ніж у 80% фітнес-програм з App Store. Фреймворк оптимізований для енергоспоживання — частота опитування датчиків автоматично знижується за відсутності підписників, подовжуючи час роботи пристрою від батареї.

Важлива архітектурна особливість — використання співпроцесора M-серії (Motion coprocessor), який обробляє дані датчиків руху незалежно від основного процесора A-серії. Починаючи з чипа M7 (iPhone 5S), співпроцесор постійно збирає дані акселерометра та гіроскопа, дозволяючи CMPedometer і CMAltimeter працювати у фоновому режимі при заблокованому екрані зі споживанням менше 1 мВт. Це стало можливим завдяки апаратній ізоляції: співпроцесор має власну енергонезалежну пам'ять та шину даних, незалежну від основної системи.

Архітектура Core Motion

Архітектура Core Motion побудована за синглтон-моделлю через CMMotionManager. Додаток отримує єдиний екземпляр менеджера та через нього налаштовує частоту оновлення, запускає або зупиняє збір даних з кожного типу датчиків. Дані надходять через блоки-завершення із зазначеним інтервалом.

Фреймворк використовує два режими отримання даних: pull (активне опитування через startAccelerometerUpdates) та push (пасивне отримання через startAccelerometerUpdatesToQueue). Push-режим кращий для UI-додатків, оскільки дані доставляються у вказану чергу без блокування основного потоку.

swift
import CoreMotion

let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 0.1

guard motionManager
    .isAccelerometerAvailable else { return }

motionManager.startAccelerometerUpdates(
    to: OperationQueue.current()!
) { data, _ in
    guard let accel = data?.acceleration else { return }
    print("X: \(accel.x), Y: \(accel.y), Z: \(accel.z)")
}

Датчики Core Motion

Core Motion надає доступ до чотирьох категорій датчиків: акселерометр вимірює лінійне прискорення по трьох осях, гіроскоп — кутову швидкість обертання, магнітометр — напруженість магнітного поля для компаса. Четверта категорія — об'єднані дані CMDeviceMotion, які включають відфільтровані показники всіх датчиків.

CMDeviceMotion — найцінніший клас для розробки. Він надає userAcceleration (прискорення без гравітації), rotationRate (швидкість обертання), magneticField (вектор магнітного поля) та attitude (орієнтація пристрою у вигляді кватерніона або кутів Ейлера). Для розрахунку attitude Core Motion використовує злиття даних гіроскопа та акселерометра за алгоритмом, аналогічним комплементарному фільтру.

Магнітометр використовується для корекції дрейфу гіроскопа. Чистий гіроскоп з часом накопичує похибку через температурний дрейф та шум — магнітометр і акселерометр корегують цю похибку, забезпечуючи точність орієнтації до 1–2 градусів у статичному положенні.

swift
guard motionManager
    .isDeviceMotionAvailable else { return }

motionManager.deviceMotionUpdateInterval = 1.0 // 1 Гц

motionManager.startDeviceMotionUpdates(
    using: .xArbitraryZVertical,
    to: OperationQueue.current()!
) { motion, _ in
    guard let attitude = motion?.attitude else { return }
    print("Roll: \(attitude.roll)")
    print("Pitch: \(attitude.pitch)")
    print("Yaw: \(attitude.yaw)")
}

Крокомір і висотомір

CMPedometer — клас для підрахунку кроків, пройденої відстані та темпу руху. Він використовує дані акселерометра з апаратною обробкою на співпроцесорі руху M-серії (M7/M8/M9/M10/M11). Це дозволяє працювати у фоновому режимі з мінімальним енергоспоживанням — близько 1% заряду за 8 годин безперервного відстеження.

CMAltimeter — клас для визначення відносної висоти на основі барометра, встановленого в iPhone 6 і новіших. Він показує зміну висоти відносно початкової точки з точністю близько 1 метра. Використовується у фітнес-програмах для підрахунку поверхів та в навігаційних програмах для визначення перепадів висот.

Дані CMPedometer доступні із затримкою не більше 5 секунд для поточних показників. Для історичних даних доступна вибірка за останні 7 днів через queryPedometerData. Крокомір автоматично розпізнає ходьбу, біг та їзду — ці типи активності доступні через queryPedometerData з фільтром за типом.

Точність та обмеження

Точність CMPedometer становить близько 95% при звичайній ходьбі та знижується до 90% при бігу. На точність впливають: розташування телефону в кишені або рюкзаку, тип взуття та поверхня. Apple рекомендує використовувати CMPedometer у поєднанні з Core Location для визначення відстані на відкритому повітрі — GPS забезпечує точнішу відстань, а Core Motion — підрахунок кроків.

swift
let pedometer = CMPedometer()

guard CMPedometer
    .isStepCountingAvailable() else { return }

pedometer.startUpdates(from: Date()) { data, _ in
    guard let pedData = pedometerData else { return }
    print("Кроки: \(pedData.numberOfSteps)")
    print("Відстань: \(pedData.distance)")
}

// Доступ до висотоміра
let altimeter = CMAltimeter()
altimeter.startRelativeAltitudeUpdates(
    to: OperationQueue.current()!
) { data, _ in
    print("Висота: \(data?.relativeAltitude)")
}

Інтеграція Core Motion у додаток

Інтеграція Core Motion не вимагає спеціальних дозволів чи entitlement — достатньо додати імпорт фреймворку та створити екземпляр CMMotionManager. Однак для CMPedometer починаючи з iOS 11 потрібен запит авторизації через CMStepCounter або використання CMPedometer із системним діалогом дозволу.

Процес інтеграції включає: створення CMMotionManager, перевірку доступності датчика через isAccelerometerAvailable / isGyroAvailable / isDeviceMotionAvailable, налаштування інтервалу оновлення та запуск отримання даних. Важливо зупиняти оновлення через stopAccelerometerUpdates, коли дані не потрібні — це критично важливо для енергоспоживання.

Для фонової роботи крокоміра CMPedometer та висотоміра CMAltimeter не потрібні додаткові налаштування — вони використовують співпроцесор руху. Для CMMotionManager фонова робота недоступна — дані збираються лише тоді, коли додаток активний і знаходиться на передньому плані. Єдина умова для CMPedometer — додаток має бути хоча б один раз запущений користувачем після встановлення для ініціалізації підписки на фонові оновлення від iOS.

Оптимізація енергоспоживання

Core Motion підтримує адаптивну частоту опитування: якщо додатку не потрібні дані в реальному часі, достатньо встановити інтервал 1–5 Гц замість 100 Гц. Для фітнес-програм оптимальна частота — 10 Гц для CMMotionManager та 1 Гц для CMPedometer. Apple рекомендує знижувати частоту до мінімально необхідної для коректної роботи.

Для ігор з керуванням нахилом необхідна частота 60–100 Гц, щоб забезпечити плавність реакції. У цьому випадку важливо використовувати startDeviceMotionUpdates з окремою чергою та обробляти дані максимально швидко. За даними Apple, частота 60 Гц споживає приблизно в 2 рази більше енергії, ніж 30 Гц.

При роботі з Core Motion важливо враховувати сумісність пристроїв: гіроскоп відсутній на iPhone 3GS та iPad 1-го покоління, магнітометр — на всіх iPad без стільникового модуля. Для перевірки доступності датчиків використовуються статичні методи isAccelerometerAvailable, isGyroAvailable та isDeviceMotionAvailable класу CMMotionManager. На симуляторі Core Motion повертає тестові дані — для налагодження на реальному датчику завжди необхідний фізичний пристрій Apple.

swift
// Оптимальне налаштування для фітнес-додатку
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Гц

motionManager.startDeviceMotionUpdates(
    to: .main
) { [weak self] motion, error in
    guard let self = self,
          let motion = motion else { return }

    if motion.userAcceleration.magnitude() > 2.0 {
        self.detectedSignificantMovement()
    }
}

Часті запитання

Чи працює Core Motion на iPad та iPod touch?

Так, Core Motion працює на всіх пристроях Apple з необхідними датчиками. Акселерометр є на всіх iPhone, iPad та iPod touch. Гіроскоп — на всіх iPhone 4 і новіших, iPad 2 і новіших. Магнітометр — лише на iPhone, на iPad відсутній. Барометр — на iPhone 6 і новіших.

Як Core Motion впливає на заряд батареї?

Вплив на батарею залежить від частоти опитування. На 100 Гц Core Motion споживає близько 5–7% заряду на годину. На 10 Гц — близько 1–2% на годину. CMPedometer на співпроцесорі руху споживає менше 1% за 8 годин роботи. Apple рекомендує завжди зупиняти оновлення, коли дані не потрібні.

Чи можна використовувати Core Motion для створення крокоміра?

Так, CMPedometer надає готове рішення для крокоміра без необхідності обробляти сирі дані акселерометра. Клас автоматично розпізнає кроки з точністю близько 95% при ходьбі та 90% при бігу. Для кастомного детектора кроків можна використовувати CMMotionManager з власним алгоритмом.

Чим Core Motion відрізняється від фреймворку рухів на Android?

Core Motion інтегрований в iOS на рівні системи та використовує співпроцесор M-серії для низькоенергетичної обробки. Android використовує SensorManager з прямим доступом до апаратних драйверів, але не має спеціалізованого співпроцесора, що збільшує енергоспоживання при фоновому відстеженні.

Чи потрібен спеціальний дозвіл для CMPedometer?

Для CMPedometer на iOS 11 і новіших потрібен дозвіл користувача. Запит виконується автоматично при створенні CMPedometer та викликає системний діалог. У Info.plist необхідно додати ключ NSMotionUsageDescription з описом, навіщо додатку потрібен доступ до даних руху.

Підсумки

  • Core Motion — системний фреймворк iOS для роботи з акселерометром, гіроскопом та магнітометром.
  • CMMotionManager — центральний клас, що надає доступ до всіх датчиків руху пристрою.
  • CMDeviceMotion надає відфільтровані дані — userAcceleration, attitude та rotationRate.
  • CMPedometer використовує співпроцесор M-серії для підрахунку кроків з мінімальним енергоспоживанням.
  • CMAltimeter вимірює зміну висоти з точністю до 1 метра за допомогою барометра.
  • Інтеграція не вимагає entitlement, але для CMPedometer потрібен NSMotionUsageDescription.
  • Співпроцесор M7–M11 забезпечує фоновий збір даних з енергоспоживанням менше 1 мВт.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також