마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 센서를 이용한 방위각 검출중 문제

0 추천

ACCELEROMETER 센서와 MAGNETIC_FIELD 센서를 이용해 방위각을 구하고 있습니다.

참고한 사이트는 http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=1036 입니다.

 

값을 뽑아보니 0도 ~ 360도의 값이 나오기는 합니다.

 

그런데 문제는 단말기의 움직임에 따른 각도가 재대로 안나옵니다.

 

예를들어 단말기를 오른쪽으로 90도를 돌렸을 때, 값이 90이 증가해야하는데 그렇지가 않습니다.

 

구간을 나눠서 봤을 때 10도정도의 오차가 발생하는 부분도 있고, 많게는 20도가량 오차가 발생하는 부분도 있습니다.

 

이동방향을 측정하기 위해 정확한 각도의 값이 필요한데(오차범위 5도 이내) 10도~20도나 틀어져버리면

 

데이터를 사용할 수가 없습니다.

 

어떻게 각도를 구해야하는지 도움 부탁드리며, 아래에는 소스코드 첨부하겠습니다.

 

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
m_acc_data = event.values.clone();
 
float alpha = 0.8f;
gravity_data[0] = alpha * gravity_data[0] + (1 - alpha) * event.values[0];
gravity_data[1] = alpha * gravity_data[1] + (1 - alpha) * event.values[1];
gravity_data[2] = alpha * gravity_data[2] + (1 - alpha) * event.values[2];
accel_data[0] = event.values[0] - gravity_data[0];
accel_data[1] = event.values[1] - gravity_data[1];
accel_data[2] = event.values[2] - gravity_data[2];
 
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mag_data = event.values.clone();
 
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mag_data = event.values.clone();
 
        if(accel_data != null && mag_data != null) {
            SensorManager.getRotationMatrix(rotation, null, m_acc_data, mag_data);
            SensorManager.getOrientation(rotation, result_data);
            
            result_data[0] = (float)Math.toDegrees(result_data[0]);
 
 
 
각도체크는 result_data[0] 값으로 하였습니다.

 

음무 (17,820 포인트) 님이 2013년 12월 2일 질문

1개의 답변

0 추천
먼저 안드로이드에서 방위각을 구하는건 내부적으로 센서값을 변환하여 얻는 것으로 알고있습니다.

근데, 여기서 자기장 센서가 좀...아니 너무 불안정합니다. 주변에 전자기기가 있어도 그렇고...

심지어는 전류가 흐르는 코드 주위에서도 틀어집니다. 전류가 흐르면 자기장이 발생하니 당연할까요;

아무튼 자기장의 영향이 거의 없는 밖에서 실험을 한번 해보시길 바랍니다....

그래도 만족할만한 값이 안 나올경우 얻어진 방위각을 후처리 해줘야 될 것으로 생각됩니다..
인연 (31,880 포인트) 님이 2013년 12월 3일 답변
...