개발하는 동글 :]

CoreMotion 알아보기, 응용하기 본문

카테고리 없음

CoreMotion 알아보기, 응용하기

동글하다 2024. 5. 2. 17:39

CoreMotion?

  • 가속도계, 자이로스코프 등 하드웨어에서 동작 관련 이벤트를 처리하는 프래임워크이다.
  • iOS 4.0 부터 사용이 가능하다.

CMMotionManager?

  • 모션 서비스를 시작하고 관리하기 위한 객체
  • 장치의 온보드 센서에 의해 감지된 움직임을 보고하는 서비스를 제공
  • 이 객체를 사용하여 네 가지 유형의 모션 데이터를 수신한다.
    • 유형
    • Accelerometer data: 3차원 공간에서 장치의 순간 가속도를 나타내는 가속도계 데이터
    • Gyroscope data: 자이로스코프 데이터 - 기기의 기본 축 3개를 중심으로 한 순간 회전을 나타냅니다.
    • Magnetometer data: 지구 자기장을 기준으로 기기의 방향을 나타내는 자력계 데이터
    • Device-motion data:기기의 사용자 시작 가속도, 자세, 회전 속도, 보정된 자기장을 기준으로 한 방향, 중력을 기준으로 한 방향 등 주요 동작 관련 속성을 나타내는 기기 동작 데이터 입니다.
  • 처리된 장치 동작 데이터는 장치의 자세, 회전 속도, 보정된 자기장, 중력 방향 및 사용자가 장치에 기여하는 가속도의 양을 제공합니다.
  • 앱에 대해 하나의 개체만 만들어야 한다.이 클래스의 여러 인스턴스는 시스템이 가속도계 및 자이로스코프에서 데이터를 수신하는 속도에 영향을 줄 수 있다.

사용하기

그럼 이 CoreMotion의 CMMotionManager를 어떻게 사용할 수 있을까?

CMMotionManager를 이용하여 가속도계 값을 받아오는 방법을 예시로 들어보자

 

1. CMMotionManager를 사용하기 위해 CoreMotion을 임포트

2. startAccelerometerUpdates 메서드를 통해 어떤 OperationQueue에서 작업을 진행할 건지를 설정 후 후행 클로저를 이용하여 data를 처리

  • accelerometerUpdateInterval 속성을 통해 가속도계의 업데이트 주기를 1 / 60으로 60Hz로 설정한다. (선택)

이렇게 작성만 해주어도 값을 불러오는 작업은 쉽게 사용할 수 있다.!

응용하기

CMMotionManager는 4가지의 유형의 데이터를 처리하는 각 유형을 모듈화 하여 일정 수치 이상의 이벤트가 있을 때를 감지하는 기능을 만들어 보자.!

1. 유형별 Enum 만들기

  • 각 기능을 사용하기 쉽게 Enum으로 유형 정리

2. 각 모듈을 설정할 Model 만들기

  • 각 모듈이 동작할 때 필요한 Interval, queue, 특정 수치를 포함한 설정값이 들어있는 Model을 만든다
  • 이벤트를 감지하는 특정 수치는 Enum을 활용해 예민하게 반응할지, 평범하게 반응하지, 둔하게 반응할지로 만들었다.

3. 각 모듈별 데이터 Model 만들기

  • 모든 모듈의 data형태가 x, y, z값이 나오는 것을 확인하였다 그래서 공통된 클래스를 상속받는 형태로 구현하였다.
  • 만들고 난 후 아쉽다고 느낀 점은 상속이 아니라 프로토콜로 만들어서 구조체로 만드는 게 좀 더 효율적이지 않을까 생각한다.

 

4. 모듈의 Protocol 만들기

  • 모듈을 사용할 때 필요한 CMMotionManager와 감시할 값과 모듈의 세팅값 그리고 모듈의 실행과 종료의 기능이 포함된 프로콜을 만들었다.

5. 프로토콜을 채택하여 각 유형별 모듈을 만들기

 

6. 각 모듈을 사용하는 클래스 만들기

  • 모든 모듈이 포함된 클래스를 만들었고 이 클래스는 통해 특정 모듈을 실행 및 종료가 가능하며 각 모듈의 값이 특정 수치를 넘어설 때를 구독할 수 있는 기능을 포함하고 있다.
  • 그리고 앞서 CMMotionManager는 하나의 객체만 사용해야 한다고 했으니 단 하나의 인스턴스만을 만들어 주입하는 형태로 만들었다. 하지만 싱글톤 패턴을 이용해서 관리했다면 조금 더 편하지 않을까 생각한다.!

 

7. 사용하기

  • DefaultCoreMotionCentralHub를 생성 후 알림이 있을 때를 구독하여 Swing이라는 문자열을 출력해 보았다.

1. 기본 설정

  • 기본값으로 설정 후 휴대폰을 흔들어 보았을 때
  • 기기를 적당한 속도로 움직일 때 반응하며 120Hz보다 더 적게 출력됨

2. 민감하게, 120Hz 설정

  • 기기를 손에 들기만 해도 반응하며 120Hz에 맞게 더 많이 반응함

  • 두 설정의 차이로 Swing이 출력되는 정도가 다른 것을 확인할 수 있다.! 이로써 CoreMotion을 활용하여 특정 수치에 반응하는 기능을 구현해 보았다.

GitHub Link

https://github.com/4Humankind/HA/commit/df0c2e8c8fb3dab1c61eee9d523273d767284aef