이호준 멘토님의 우당탕탕 멘토링 -3.2 각종센서-

지난번 포스트 에서는 모듈화를 통해 하나의 뷰 컨트롤러 안에 여러 가지 뷰 컨트롤러를 담는 방법에 대해 알아보았다.

이번 시간에는 iOS device가 가지고 있는 여러 가지 센서 정보 및 iOS device 자체 정보에 대해 알아보려 한다.

종류가 다양하기 때문에 일단 몇 가지로 분류해서 진행하겠다.

공부하면서 다이어그램을 그려봤는데, 궁금하신 분들은 아래 링크를 클릭해 다이어그램을 확인하자.

google에서 제공하는 draw.io를 이용하였다.

https://drive.google.com/file/d/1hgR-M-RWKNSLOwtX27G7KwyPkl7bGbqd/view?usp=sharing


가속도 센서와 자이로스코프 센서

os를 가리지 않고 대부분의 스마트폰과 태블릿 pc에는 가속도 센서와 자이로스코프 센서를 가지고 있다.

iOS에서는 이들 정보를 CoreMotion이라는 클래스 안에 정보를 담아서 보내준다.

그중에서도 CMMotionManager는 가속도 센서 및 자이로스코프, 그리고 나침반(방위) 센서까지 정보를 받아오는 역할을 한다.

공부를 하다가 글로만 이해하기엔 한계가 있는 것 같아서 diagram을 그려가며 공부했다.

아래 이미지는 CoreMotion 밑의 CMMotionManager에 대한 다이어그램이다.

하나씩 파헤쳐보자.


diagram

세 개의 축

가속도 센서와 자이로스코프 센서를 이해하기 전에 알아야 할 것이 있다.

iOS 디바이스에 있는 센서들은 주로 x, y, z의 축을 토대로 움직임을 감지하는 경우가 많은데,

이 때 x, y, z 축은 디바이스를 기준으로 어떻게 형성되어 있는지 아는 것이 중요하다.


이에 대한 정확한 설명은 여기 페이지에 나와있다.

그리고 거기서 가장 핵심이 되는 이미지는 바로 아래 이미지이다.



기기를 좌우로 흔들면 x축 가속도 값이 크게 변동되고,

아래 위로 움직이면 y축 가속도 값이 변동된다.

z축은 기기를 내쪽으로 당겼다가 멀리 밀어내는 행위를 빨리 했을 때 가속도 값에 변동이 있다.

그림을 보면서 상상하면 쉽게 감을 잡을 수 있을 것이다.


가속도 데이터 가져오기

그러면 그런 가속도 변동값을 어떻게 가져올까?

swift에서는 CMMotionManager 타입의 변수가 startAccelerometerUpdates() 메서드를 통해 가속도 센서로부터 값을 가져온다. 측정이 시작되면 AccelerationData 밑의 CMAcceleration 을 통해 그 값을 가져올 수 있다.

정확한 코드가 필요하다면 글의 맨 아래에 전체 코드를 남겨둘테니 그것을 참고하시라.


가속도 측정센서를 이용해 가속도를 실제로 측정했다.

아래위로 마구 흔들었더니 acc_y, 그러니까 y축 가속도가 2를 넘어섰고,

그에 따라 오른쪽 레이블에 "y축 가속도 측정됨"이라는 문구가 떴다.


asd


양 옆으로 흔들 때는 x축 가속도가, 당기고 밀 때는 z축 가속도가 내 의도대로 잘 측정됐다.

측정값은 음수와 양수값 모두 가지므로 측정값의 절대값을 기준으로 가속이 있었는지를 판단했다.


자이로스코프 데이터 가져오기

gyro데이터 역시 마찬가지로 CMMotionManager의 메서드를 통해 측정할 수 있다.

startGyroUpdates()를 통해 측정을 시작하며, 측정이 시작되면 CMGyroData 안에 있는 CMRotationRate형 변수를 통해 값을 측정한다.

rotation 또한 x, y, z 세 축을 중심으로 값을 가지며, 어떤 축을 기준으로 얼마나 회전했는지에 따라 그 값이 달라진다.


이것 또한 한번 테스트해보자.

세로로 뻗친 x축을 기준으로 회전을 시켰더니 내 의도대로 x축 회전이 측정되었다는 문구가 나왔다.


Apr-07-2021 19-23-42

gif에서는 글자가 잘 안보이기 때문에 아래에 사진을 하나 더 첨부한다.


rotation test

이것 역시 코드가 필요하신 분들은 맨 아래 전체 코드를 참고하시길 바란다.


pitch, roll, yaw

자이로스코프는 정적인 상태에 따라 데이터를 보내주기도 한다.

현재 디바이스의 화면이 사용자를 향해있는지, 등지고 있는지, 엎어져 있는지, 누워 있는지, 왼쪽으로 돌아가 있는지 오른쪽으로 돌아가있는지에 따라 Pitch, Roll, Yaw라는 값이 그것을 반영하여 전달된다.

이것 또한 gyroScope 센서를 이용한 것이라고 추측된다.


기타 가속도 센서 및 자이로스코프 센서를 이용한 것들

그 외에도 가속도 센서 및 자이로스코프 센서를 이용한 서비스가 몇 개 더 있다.

gravity라고 해서 중력가속도가 더해진 가속도를 제공하기도 하고,

CMCalibratedMagneticField라는 데이터 타입으로 자기장 정보를 전달해주기도 한다.

이것을 잘 이용하면 나침반 앱을 간단히 만들어볼 수도 있을 것이다.


CMMotionActivty && CMMotionActivityManager

CoreMotion에서 제공하는 디바이스의 센서 정보를 이용해 현재 사용자의 상태를 얻어올 수도 있다.

정확히는 CMMotionActivty && CMMotionActivityManager를 이용하며,

이 때 상태라고 하는 것에는 크게 다섯 가지가 있다.

바로 걷기, 달리기, 자전거, 움직이는 자동차, 정차한 자동차 상태이다.


이들 센서가 전해주는 값이나 그것을 받아오는 법에 대해서는 아래 블로그가 잘 설명하고 있어 링크를 달아두겠다.

https://nshipster.co.kr/cmmotionactivity/


애플워치관련 센서

값비싼 애플워치 안에도 무수히 많은 센서들이 들어가 있다. (비싼 이유는 각종 고급 센서 때문인 것 같다.)

애플워치가 측정하는 센서는 되게 특이한데,

CMFallDetection이라고 해서 넘어지는 것을 측정하거나,

CMMovementDisorderManager라고 해서 파킨슨 병과 관련된 증상을 측정하기도 한다.

또한 CMTremorResult를 가지고 손 떨림을 측정하기도 하며,

CMDyskineticSymptomResult라고 해서 지연성 운동장애라는 것을 감지하기도 한다.


대부분 의학 용도로 많이 사용될 것 같기도 하고 애플워치를 보유하고 있지도 않아서 따로 테스트를 하지는 않았다.

다만 애플워치에 들어가는 이러한 선구자적인 기능들이 애플을 좀더 값어치 있는 기업으로 만들어주지 않을까 하는 생각이 들었다.


그 외 CoreMotion 자체가 제공하는 기능들

CoreMotion은 더 다양한 정보를 전달한다.

대표적으로 CMPedoMeter는 걸음 수를 측정하여 그 정보를 전달해준다.

CMAltimeter는 고도 정보를 계산하여 전달해주기도 한다.

CMHeadphoneMotionManager는 기기에 유선 이어폰이 꽂혔을 때나 무선 블루투스 이어폰이 페어링되었을 때를 감지한다고 하는데, 이에 관련된 정보를 찾아보니 그렇게 완벽한 서비스 단계는 아닌 듯했다.


Device의 정보를 얻어오자.

디바이스의 정보도 한번 받아와보자.

UIDevice라는 클래스는 디바이스의 버젼, 모델 정보, 배터리 정보, 기기가 바라보는 방위 정보를 얻어오고, 근접 센서 접근을 가능하게 한다.


스크린샷 2021-04-08 오후 2 57 07

디바이스 정보

디바이스 정보는 UIDevice.current에 내장된 device.name, device.model, device.userInterface 등의 정보를 받아옴으로써 확인할 수 있다.

1:1 대응로 대응을 시키자면 이렇다.


스크린샷 2021-04-08 오후 2 59 46

또한 device.SystemVersion를 통해 현재 iOS 버전 정보를 얻어낼 수 있다.

그런데 이 정보는 다시 Major, Minor public, Minor non-public로 나뉜다.

예를 들어 내 iOS 버젼 정보가 11.4.2라면, 11이 Major가 되고, 4가 Minor public, 2가 Minor non-public이 된다.


디바이스의 현재 상태 및 근접 센서 정보

UIDevice는 현재 디바이스가 누워있는지, 엎어져있는지, 가로로 눞혀져 있는지 등을 감지하는 device.orientation 정보를 제공하기도 한다.

또한 UIDeviceProximty 를 가지고 근접센서에 접근하여 사용자의 신체가 근접센서에 가까이 있는지 판단할 수 있게 만든다.

이 때 근접센서는 true/false 정보만을 전달하기 때문에 얼마나 떨어져있는지에 대한 정보를 알 수는 없다.


[다음편]에서 계속...


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom