Swifter {Swift Developer}

메뉴

 

watchOS 3에서 모션인식하는 방법

CMDeviceMotion에서 자이로센서 값과 그것을 이용한 자세(모션) 상태정보를 체크가능해졌다.

예를 들어,

테니스채를 들고 스윙을 할 때 이 동작을 감지하여 포핸드 또는 백핸드를 식별하는 알고리즘을 이해하고 모션 감지에 필요한 지식을 정리해보자.

teniss1

이 내용은 Apple Watch뿐만 아니라, 아이폰, 안드로이드, 밴드형 웨어러블 기기등 가속도센서와 자이로센서의 값을 사용하는 기기에 대한 공통적인 내용이다.

  • 테니스 스윙 체크 알고리즘
  1. 각속도와 중력가속도 벡터의 내적을 계산함
  2. 1번째 이동 편균과 최대값을 구함
  3. 2번째에서 구한 값을 임계값을 처리함
  4. 2번째에서 나온 값의 부호와 손목방향에서 포핸드 및 백핸드를 판정함

1. 각속도와 중력 가속도 벡터의 내적을 계산함

ten1

필요한 정보: 중력방향의 축에 대한 각속도

CMDeviceMotion

  • watchOS 3부터 관련 정보를 얻을 수 있음
  • 기기의 동작에 대한 여러가지 정보가 포함되어 있음

rotationRate: 각속도

각 축별 단위는 라디안/초

gravity: 중력가속도

필요한 정보: 중력방향의 축에 대한 각속도

vector-watchOS3

필요한 정보: 중력방향의 축에 대한 각속도 (Apple Watch의 각속도 벡터와 중력벡터의 내적으로 얻기)

내적 계산방법

math-watchos3

구현

2. 1번째에서 이동거리 평균과 최대값을 구하기

50샘플(1초) 분을 저장

50샘플 중에서의 평균 계산

50샘플 중에서 절대값이 가장 큰 값을 얻기

accumulatedYawRot 변수명

accumulated: 축적

Rot: rotation방향

오일러 각

  • 3차원 공간에서는 놓인 방향을 나타내는 각도
  • 회전방향 Pitch 3회전 각도로 표시됨

ten2

지금까지 각속도와 중력 가속도 벡터의 내적을 계산하고 이동 평균과 최대값을 구하는 것으로 구한 이동 편균이 accumulatedYawRot 피크값이 peakRate가 된다.

3. 2번째에서 구한 값을 임계값 처리함

평균값과 피크값에 대해 임계값 처리를 하는 이유는 피크값은 순간 빨리 움직이면서 반응하기 때문이고 평균값은 그 동안 일정 이상의 속도로 움직이기 때문이다.

4. 2번째의 값의 부호 및 손목 방향에서 포핸드 및 백핸드를 판정함

Apple Watch를 손목에 착용하고 있는가?

  • watchOS 3에 신규 추가된 API
  • 자동감지가 아닌 사용자가 직접 설정한 값

 

 

 

Facebook Comments

카테고리:   watchOS

댓글

죄송하지만 댓글은 닫혀 있습니다.