본문 바로가기
Android/이것저것

자이로스코프 센서 사용하기

by 일상 속 둔치 2018. 9. 9.

안드로이드에는 많은 센서들이 내장되어있다. 가속, 중력, 조도, 근접, 온도, 방향 등의 센서들이 있다.


그 중 이번 포스트에서는 자이로스코프 센서를 사용해볼 것이다.


자이로스코프(Gyroscop)

자이로스코프 센서는 3차원 회전 정보를 감지하는 센서다.


[그림1] 자이로스코프 센서의 각 축의 회전각


X축의 회전을 Roll, Y축의 회전을 Pitch, Z축의 회전을 Yaw라고 부른다.


자이로스코프의 센서에서 각 X,Y,Z축에 대한 값을 측정해주는 데 그 값은 각속도이다.


따라서 회전각을 얻고 싶다면 측정한 각속도로 계산을 해주어야한다.


거리 = 속력 * 시간이다. 따라서 회전각 = 각속도 * 시간으로 구해주면 된다.


따라서 단위 시간(dt)동안 측정되는 각속도를 이용하여 회전한 각도에 더해주면 회전한 각도를 구할 수 있다.


현재까지 회전각 = 이전 회전각 + 측정한 각속도 * dt (적분)


*이때 적분을 하는 과정에서 적분 상수 때문에 오차가 생긴다. 오차가 누적(드리프트)이되서 추후에 정확한 측정이 어려워진다.


센서를 이용하는 방법은 다음과 같다.


1. SenseorManger 생성

2. Sensor 객체 생성

3. SensorListener 생성


코드

1. activity_main.xml

 실시간으로 센서의 변화값을 볼 수 있게 x,y,z축 각각 textview를 선언해주었다.


2. MainActivity.class

 변수 목록이다. 위에서부터 센서를 관리하기 위한 센서 매니저, 리스너, 센서 객체를 생성하였다. x,y,z축 회전각을 받기위한 변수와 각 계산에 필요한 변수들을 선언하였다. 이때 rad_to_dgr는 radian을 degree로 변환하기 위한 변수이며 NS2S는 나노 세컨드를 세컨트로 단위 변환해주는 상수이다.


 센서 객체에 Sensor.TYPE_GYROSCOPE를 매개변수로 넣어주어 자이로스코프 센서를 등록해준다. 만약 자이로스코프가 아닌 다른 센서를 사용하기 원한다면 해당 센서를 값으로 넘겨주면 된다! (ex.TYPE_ORIENTATION 등)


 센서 이벤트 리스너는 onSensorChanged와 onAccuracyChanged를 오버라이딩 해준다.

- onSensorChanged : 센서의 값이 변하는 이벤트를 감지

- onAccuracyChanged : 센서의 정확도가 변하는 이벤트 감지


 sensorEvent 변수로 측정한 값이 넘어오는 데 values[index]로 접근이 가능하다. 센서마다 index에 따른 정보가 다르므로 다른 자료를 참고하자! 자이로센서는 0,1,2 순서대로 x,y,z축 각속도이다.


 센서 이벤트의 timestamp에서 현재 timestamp를 빼주고 단위를 second로 변환해준다. 이는 단위시간(dt)이며 위에서 구한 수식에 따라 '현재 회전각 = 누적된 회전각 + 각속도*단위시간'을 적용시켜주고 setText로 값을 확인해보자


*onAccuracyChanged는 지금 정확도를 필요로 하지 않는 간단한 실습이기 때문에 구현하지 않았다.


onResume에서 센서 매니저로 센서 리스너에 센서를 등록한다. 3번째 매개변수에 SensorManger.SENSOR_DELAY_UI는 리스너의 반응 속도인데 FASTEST, GAME, UI, NORMAL 순으로 빠르다.


 onPause에서 센서 매니저로 리스너를 해제한다. 센서는 기기에 큰 부담을 줄 수 있으므로 우리 스마트폰을 위해 리스너를 해제해주자.




사진 출처


· [그림1]

https://www.researchgate.net/figure/Average-roll-pitch-and-yaw-angles_fig2_262055313

'Android > 이것저것' 카테고리의 다른 글

SimpleDateFormat  (0) 2020.05.06
안드로이드 툴바 없애기 (Action Bar)  (0) 2018.11.04
Image Asset Studio  (0) 2018.09.15
안드로이드 입문  (0) 2018.09.10
랜더링 오류 해결 (sdk ver.28)  (0) 2018.09.09

댓글