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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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