Gooday Note Scrap Source Android login
 
작성일 : 12-11-09 11:10
자이로스코프와 관련한 나침반 앱
 글쓴이 : 기리
조회 : 18,188   추천 : 0   비추천 : 0  
   http://blog.daum.net/aero2k/64 [3508]

https://market.android.com/details?id=com.myastro.compass




1. 자이로 컴파스란?


자이로 컴파스는 다음과 같이 정의할 수 있다.


1. 사전적 의미  

   가. 나침반(羅針盤) : 자침(磁針)이 남북을 가리키는 특성을 이용하여 방향을 알 수 있도록 만든 기구.

   나. compass  : 나침반, 나침의.

   다. Magnetic compass : 자기(磁氣) 컴퍼스[나침의].

   라. gyro : gyrocompass. 바퀴, 회전의 뜻의 결합사.

   마. gyrocompass : 나침의의 한 가지. 자이로컴퍼스. 회전 나침반.

    고속으로 회전하는 팽이를 주체로 하며, 지구 자기와는 관계가 없음.


일반적으로 자이로 스코프를 검색하면 다음과 같은 회전의 결과값이 나온다.


    


물론 안드로이드 폰이나 아이폰에 담겨있는 자이로 센서 칩은 아래와 같은 칩으로 구성 되어 있다.

아이폰4, Galaxy Tab, Galaxy S2에 탑재되어 있는 자이로 센서 MEMS 칩은 STMicroelectronics의 L3G4200D 모델이다.


단말에는 다음과 같은 각도로 장착되어 있다.

 


이미지 파일은 아이폰4를 기준으로한 모습이다.

위의 그림에서 X축 방향은 Pitch 각속도를 Y축 방향은 Yaw 각속도를 Z축 방향은 Roll 각속도를 나타낸다.


안드로이드 단말중 갤럭시 탭의 경우, 아이폰 4와 동일한 축으로 각속도 값이 나오지만,

갤럭시 S2의 경우에는 X축 Pitch 각속도와 Y축 Yaw 각속도가 서로 바뀌었다.

즉, X축은 Yaw 각속도를 나타내며, Y축은 Pitch각속도를 나타낸다.


갤럭시 S2는 Portrait(세로 모드) 보다 Lanscape(가로 모드) 상태에서 Yaw 각도를 더 세밀하게 표현하기 위해서,

Gyroscope MEMES 칩의 위치를 변경한 것으로 보인다.

(예를 들어 차량용 Navigation app의 경우, 세로 모드 보다 가로 모드를 더 많이 사용한다.)


어쨓든 구글에서는 아이폰과 같은 장착을 Recommendation 했지만, 제조사(삼성)에서 변경하는 사항에 대한 강제성이 없음으로,

앱 개발자는 센서의 장착 축에 대해서 고려해야 한다. ㅠ ㅠ


단말 상태가 Portrait mode인지 Landscape mode인지에 대해서 체크하는 방법은

Android 의 Display api를 이용하는 방법(구글은 이 방법을 추천 함)과 Accelerometer 가속도 센서로 부터 얻는 방법이 있다.

이에 대해서는 다음에 정리해 보도록 하겠다.



2. 안드로이드 Gyroscope Api


Gyroscope api는 이전에 한번 다뤘었다.

 

Gravity Sensor(Accelerometer, Magnetic, Gyroscope)


기본 Api 들은 기존 SensorManager를 통해서 Magnetic, Accelerometer Sensor 정보를 얻어오는 방법과 동일하다.

Gingerbread에서는 이 기반에서 Rotation Vector와 Linear Acceleration 기술이 추가 되었다.

 


이 기술은 2010년 하반기에 InvenSense에서 발표한 Rotation Vector, Linear Acceleration 에서 차용해 온듯 하다.

Sensor Fusion on Android Devices: A Revolution in Motion Processing


이 PT를 보면 안드로이드에서도 애플 iOS만큼의 Gyroscope과련 기술 발전이 있을 것 처럼 보여 지지만,

실망스럽게도 Gingerbread에 Rotation Vector와 Linear Acceleration 기술을 붙이기만 했지, 실제 공개된 소스를 보면,

전혀 자이로 스코프와 연계된 소스는 없고 Magnetic sensor와 Accelerometer sensor를 Euler Angle 계산법에 의해서

회전 방향(Heading)을 계산하고만 있다.

(이에 대해서 2011년 초에 다른 개발자들이 구글 측에 문의한 답변은 "아직은 지자기와 가속도 센서를 이용하고 있으며, 차후에 자이로 데이타를 사용할 것이다. 기다려 달라~" 였던듯 하다.)


결국 구글은 애플이 iOS4에 자이로 스코프를 탑재하니깐, 부랴부랴 Froyo에 자이로스코프 관련 api를 탑재하고,

Gingerbread에는 api를 보강한다고 했지만, 결국 변한것은 하나도 없었다.

(프로요 기반으로 자이로스코프가 탑재된 단말은 갤럭시 탭이 유일했던것으로 기억 됨.)


Gingerbread 에서 iOS4를 쫓아서 자이로 스코프를 적용한다면, Rotation Vector를 통해서 Quaternion 사원수 형태로 

자이로 센서 정보를 얻어오고, 이를 토대로 Rotation Matrix를 구하려는 시도를 했어야 한다.

결국 api interface는 만들었지만, 안에 채워 놓지는 못했다.

Quaternion의 경우 가끔 NaN(Not a Number) error로 발생 시킨다.

아마도 acos(w) 처리를 하면서 입력값이 range가 -1.0 ~ +1.0 이어야 하는데 이 range를 벗어나는 값이 발생해서 나타는것이 아닌가 쉽다.


결국 구글은 방법은 WWDC 2010년에 iOS4 발표시에 Gyroscope Api인 CoreMotion 를 따라 할려고 하다가 실패한 것으로 보인다.

문제는 WWDC 2011년에 발표한 iOS5에서는 CoreMotion 기능이 더 보강 되어서, 임의의 축을 기준으로 Motion Sensing함으로서

현재의 Attitude(자세)를 측정하는 기술이 더욱 향상 되었다.


아마도 구글은 전반적인 자이로 스코프 관련 api를 수정할 필요를 그다지 느끼지 않는것 같다.

실제 자이로 스코프를 응용한 앱이 안드로이드 마켓에는 거의 없다.


현재는 iOS를 쫓아서 UX 개선 및 태블릿 PC OS인 honeycomb 이나 ice cream sandwich 만드는데 역량을 집중하고 있어서

자원이 부족한 것으로 보인다.

이번 Google IO 2011을 보면 android 3.0과 4.0에서는 구글의 자체 2D 엔진인 Skia lib가 iOS의 2D를 쫓아가지 못해서,

2D Accelerator를 opengles 2.0의 shader를 이용하겠다고 발표했다.

iOS의 경우 그 전부터 Core UI 나 Core Animation 에서 iOS에 커스터마이징된 bitblt 2D 가속칩을 사용 하고 있다.


안드로이드에서 Gyroscope api는 현재 아주 많이 부실하다.

하지만, Raw data인 Yaw, Pitch, Roll data만을 이용해서도 기울기 자세를 90도 또는 0도에 가깝게 기울인 상태에서 측정할 경우,

정확하게 회전 방향을 측정할 수 있다.


하지만, 자세의 기울기를 30도 이상 기울여서 단말을 회전 시킬경우, 방향 각이 부 정확하게 나온다.


즉, 정확한 방향 각(선수 방향, heading)을 측정하기 위해서는 X, Y, Z축에 대해서 개발자가 자체적으로 Sensor Fusion을 해야 한다.


 

 

이렇게 구한 선수 방향 각 heading 상대 각도임으로, 임의의 기준 각도에 더해서 나침반으로 사용한다.


임의의 기준 각도는 다음과 같이 2가지 방법을 통해서 구할 수 있다.


1. 임의의 기준 각도는 Android Orientation Sensor(가속도 + 지자기)로 부터 얻은 자북 방향 각도의 결과에서 편각을 보정 해줌으로서, 진북(True north, 정북) 방향 각도를 이용한다.


2. 임의의 기준 각도는 GPS Course로 부터 얻은 진북(True north)를 구한 각도를 이용한다.



 


3. My App - Gyro Compass 3D


현재 안드로이드 마켓에 올라와 있는 Gyroscope 관련 app의 경우, 애플의 App Store 마켓에 올라와 있는 그것 보다 많이 부실하다.

 

(그렇다고 제 앱이 좋다는 이야기는 아님 ^^;)


 

Gyro Compass 3D앱은 Android Orientation Sensor(가속도+지자기)로 부터 얻은 각도(현재는 자북 -ㅁ-)에 Sensor Fusion해서 얻은 heading 각도를 더한 나침반 애플리케이션을 만들었다.

(Gyroscope + Accelerometer + Magnetic Sensor)

 

안드로이드 OS API에서 Gyroscope 관련 사항이 지원을 부실하기 때문에,

개발자가 직접 Quaternion 계산 수식을 만들고, 가속도 센서와 지자기 센서를 이용한 Fusion하