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

2016-09-01
15 Views

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

You may be interested

모바일 앱 아키텍처
Swift
shares13 views
Swift
shares13 views

모바일 앱 아키텍처

MJ Kim - 4월 22, 2017

이 내용은 나름대로 개발해본 내용을 토대로 정리해본 모바일 앱 아키텍처에 대한 내용이다. 이를 정리한 이유는 오래된 아키텍처부터 최근 아키텍처까지 정리해보고…

시간차를 얻는 Date Extension
Swift 3.0
shares6 views
Swift 3.0
shares6 views

시간차를 얻는 Date Extension

MJ Kim - 4월 12, 2017

사용자가 남길 내용에 대한 시간표시를 할 때 일정한 시간차를 표현해주는 경우가 있어 이에 대한 Date Extention을 정리해 보았다. [crayon-58fc9029e5f7a013044368/]  

Swift 3.1에서 없어진 문법 정리
Swift 3.0
shares34 views
Swift 3.0
shares34 views

Swift 3.1에서 없어진 문법 정리

MJ Kim - 3월 31, 2017

Swift언어는 무엇인가 나올때마다 없어지는 것들이 있어, Swift 3.1에서 컴파일할 수 없게 된 문법내용을 정리했다. switch문을 사용하여 enum에서 protocol을 여러가지 패턴으로…