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] 값으로 하였습니다.