Core Motion: 본질, 모션 센서 및 데이터 처리

저자: IT Sectr 게시일: 2026-03-25 읽는 시간: 8 분

Core Motion 프레임워크는 Apple 기기에서 가속도계, 자이로스코프, 자기계 및 만보계 데이터에 대한 액세스를 제공하는 iOS의 시스템 구성 요소입니다. Apple Developer Documentation, 2025에 따르면, 프레임워크는 센서의 원시 데이터를 처리하여 이해하기 쉬운 메트릭(가속도, 각속도, 방향, 걸음 수)으로 변환합니다. 모든 모션 센서를 위한 단일 API를 통해 개발자는 만보계, 피트니스 앱 및 기기 기울기 제어 게임을 만들 수 있습니다.

핵심 포인트

  • Core Motion — iPhone 및 iPad의 모션 센서 데이터를 처리하는 Apple 프레임워크.
  • CMMotionManager — 가속도계, 자이로스코프 및 자기계에 액세스하는 중앙 클래스.
  • CMAltimeter — 상대 고도 및 기압 변화 데이터를 얻기 위한 클래스.
  • CMPedometer — 걸음 수, 이동 거리 및 이동 속도를 계산하는 클래스.
  • CMDeviceMotion — 중력 필터링이 적용된 결합 데이터(userAcceleration).

Core Motion이란?

Core Motion은 기기의 모션 센서를 다루기 위해 iOS 4에서 도입된 Apple의 시스템 프레임워크입니다. 가속도계, 자이로스코프, 자기계 및 만보계에 액세스하기 위한 통합 인터페이스를 제공하여 개발자가 낮은 수준에서 하드웨어 드라이버를 다룰 필요가 없습니다.

Core Motion의 주요 장점은 데이터의 하드웨어 필터링입니다. 프레임워크는 자동으로 가속도계와 자이로스코프의 판독값을 결합하여 중력 성분이 없는 순수한 userAcceleration을 계산하고, 쿼터니언 및 오일러 각 형태로 공간에서 기기의 방향도 제공합니다.

Apple WWDC 2023에 따르면, Core Motion은 App Store에서 80% 이상의 피트니스 앱에서 사용됩니다. 프레임워크는 전력 소비에 최적화되어 있어 구독자가 없으면 센서 폴링 빈도가 자동으로 낮아져 기기의 배터리 수명이 연장됩니다.

중요한 아키텍처 기능은 M 시리즈 코프로세서(Motion coprocessor)의 사용으로, 주 A 시리즈 프로세서와 독립적으로 모션 센서 데이터를 처리합니다. M7 칩(iPhone 5S)부터 코프로세서는 지속적으로 가속도계와 자이로스코프 데이터를 수집하여 CMPedometer와 CMAltimeter가 1mW 미만 소비로 잠금 화면 상태에서 백그라운드로 작동할 수 있게 합니다. 이는 하드웨어 격리 덕분에 가능해졌습니다. 코프로세서는 자체 비휘발성 메모리와 메인 시스템과 독립적인 데이터 버스를 가지고 있습니다.

Core Motion 아키텍처

Core Motion 아키텍처는 CMMotionManager를 통한 싱글톤 모델을 기반으로 합니다. 애플리케이션은 관리자의 단일 인스턴스를 얻고 이를 통해 업데이트 빈도를 구성하고 각 센서 유형에 대한 데이터 수집을 시작하거나 중지합니다. 데이터는 지정된 간격으로 클로저 블록을 통해 도착합니다.

프레임워크는 데이터 획득에 두 가지 모드를 사용합니다: 풀(startAccelerometerUpdates를 통한 능동적 폴링)과 푸시(startAccelerometerUpdatesToQueue를 통한 수동적 수신). 푸시 모드는 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 Hz

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)의 하드웨어 처리와 함께 가속도계 데이터를 사용합니다. 이를 통해 최소 전력 소비로 백그라운드 작동이 가능하며, 연속 8시간 트래킹에 약 1%의 배터리를 소비합니다.

CMAltimeter — iPhone 6 이상에 내장된 기압계를 기반으로 상대 고도를 측정하는 클래스입니다. 약 1미터의 정확도로 시작점 대비 고도 변화를 표시합니다. 피트니스 앱의 층수 계산 및 내비게이션 앱의 고도 변화 판단에 사용됩니다.

CMPedometer 데이터는 현재 판독값에 대해 5초 이내의 지연으로 사용할 수 있습니다. 과거 데이터의 경우 queryPedometerData를 통해 최대 7일간 데이터를 조회할 수 있습니다. 만보계는 자동으로 걷기, 달리기, 사이클링을 인식하며, 이러한 활동 유형은 queryPedometerData에서 유형별 필터링과 함께 사용할 수 있습니다.

정확도 및 제한 사항

CMPedometer의 정확도는 일반 보행 시 약 95%이며 달리기 시 90%로 감소합니다. 정확도는 주머니나 가방 내 전화기 위치, 신발 유형, 표면의 영향을 받습니다. Apple은 실외 거리 측정에 Core Location과 CMPedometer를 함께 사용할 것을 권장합니다. 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 인스턴스를 생성하기만 하면 됩니다. 단, iOS 11부터 CMPedometer의 경우 CMStepCounter를 통한 승인 또는 시스템 권한 대화 상자와 함께 CMPedometer를 사용해야 합니다.

통합 프로세스에는 다음이 포함됩니다: CMMotionManager 생성, isAccelerometerAvailable/isGyroAvailable/isDeviceMotionAvailable을 통한 센서 가용성 확인, 업데이트 간격 설정 및 데이터 수집 시작. 데이터가 더 이상 필요하지 않을 때 stopAccelerometerUpdates를 통해 업데이트를 중지하는 것이 중요합니다. 이는 전력 소비에 매우 중요합니다.

백그라운드 작동의 경우 CMPedometer와 CMAltimeter는 추가 구성이 필요하지 않습니다. 이들은 모션 코프로세서를 사용합니다. CMMotionManager의 경우 백그라운드 작동이 불가능하며, 앱이 활성화되어 포그라운드에 있을 때만 데이터가 수집됩니다. CMPedometer의 유일한 조건은 iOS의 백그라운드 업데이트 구독을 초기화하기 위해 설치 후 사용자가 앱을 최소 한 번 이상 실행해야 한다는 것입니다.

전력 소비 최적화

Core Motion은 적응형 폴링 빈도를 지원합니다. 앱이 실시간 데이터를 필요로 하지 않는 경우 100Hz 대신 1~5Hz 간격으로 설정하는 것으로 충분합니다. 피트니스 앱의 경우 CMMotionManager는 10Hz, CMPedometer는 1Hz가 최적의 빈도입니다. Apple은 올바른 작동에 필요한 최소 빈도로 낮출 것을 권장합니다.

기울기 제어 게임의 경우 원활한 반응을 보장하기 위해 60~100Hz의 빈도가 필요합니다. 이 경우 별도의 큐와 함께 startDeviceMotionUpdates를 사용하고 데이터를 가능한 한 빨리 처리하는 것이 중요합니다. Apple에 따르면 60Hz는 30Hz보다 약 2배 더 많은 전력을 소비합니다.

Core Motion 작업 시 기기 호환성을 고려하는 것이 중요합니다. 자이로스코프는 iPhone 3GS 및 1세대 iPad에 없으며, 자기계는 셀룰러 모듈이 없는 모든 iPad에 없습니다. 센서 가용성 확인을 위해 CMMotionManager 클래스의 정적 메서드 isAccelerometerAvailable, isGyroAvailable, isDeviceMotionAvailable을 사용합니다. 시뮬레이터에서 Core Motion은 테스트 데이터를 반환하며, 실제 센서에서 디버깅하려면 실제 Apple 기기가 항상 필요합니다.

swift
// 피트니스 앱을 위한 최적 설정
motionManager.deviceMotionUpdateInterval = 0.1 // 10 Hz

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이 배터리 수명에 어떤 영향을 미치나요?

배터리에 미치는 영향은 폴링 빈도에 따라 다릅니다. 100Hz에서 Core Motion은 시간당 약 5~7%의 배터리를 소비합니다. 10Hz에서는 시간당 약 1~2%입니다. 모션 코프로세서의 CMPedometer는 8시간 작동 시 1% 미만을 소비합니다. Apple은 데이터가 필요하지 않을 때는 항상 업데이트를 중지할 것을 권장합니다.

Core Motion을 사용하여 만보계를 만들 수 있나요?

네, CMPedometer는 가속도계 원시 데이터를 처리할 필요 없이 만보계를 위한 즉시 사용 가능한 솔루션을 제공합니다. 이 클래스는 보행 시 약 95%, 달리기 시 90%의 정확도로 자동으로 걸음을 인식합니다. 사용자 정의 걸음 감지기의 경우 자체 알고리즘과 함께 CMMotionManager를 사용할 수 있습니다.

Core Motion은 Android의 모션 프레임워크와 어떻게 다른가요?

Core Motion은 시스템 수준에서 iOS에 통합되어 있으며 저전력 처리를 위해 M 시리즈 코프로세서를 사용합니다. Android는 하드웨어 드라이버에 직접 액세스하는 SensorManager를 사용하지만 전용 코프로세서가 없어 백그라운드 트래킹 시 전력 소비가 증가합니다.

CMPedometer에 특별한 권한이 필요한가요?

iOS 11 이상에서 CMPedometer의 경우 사용자 권한이 필요합니다. 요청은 CMPedometer 생성 시 자동으로 이루어지며 시스템 대화상자가 표시됩니다. Info.plist에 앱이 모션 데이터에 액세스해야 하는 이유를 설명하는 NSMotionUsageDescription 키를 추가해야 합니다.

요약

  • Core Motion은 가속도계, 자이로스코프 및 자기계를 다루기 위한 iOS 시스템 프레임워크입니다.
  • CMMotionManager는 모든 기기 모션 센서에 대한 액세스를 제공하는 중앙 클래스입니다.
  • CMDeviceMotion은 필터링된 데이터(userAcceleration, attitude, rotationRate)를 제공합니다.
  • CMPedometer는 최소 전력 소비로 걸음 수 계산을 위해 M 시리즈 코프로세서를 사용합니다.
  • CMAltimeter는 기압계를 사용하여 최대 1미터 정확도로 고도 변화를 측정합니다.
  • 통합에 entitlement가 필요하지 않지만 CMPedometer에는 NSMotionUsageDescription이 필요합니다.
  • M7~M11 코프로세서는 1mW 미만의 전력 소비로 백그라운드 데이터 수집을 가능하게 합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기