среда, 19 октября 2011 г.

Правильная ориентация.

При работе с датчиком ориентации в Андроиде, внезапно выяснилось, что данные возвращаются в  градусах типа int, то есть округленно до 1 градуса. Для повышения точности Гугл посоветовал сделать так:


@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGrav = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mMag = event.values;
if (mGrav != null && mMag != null) {
matrixR = new float[9];
matrixI = new float[9];
boolean success = SensorManager.getRotationMatrix(matrixR, matrixI, mGrav, mMag);
if (success) {
mOrient = new float[3];
SensorManager.getOrientation(matrixR, mOrient);
}
                  }
}

В итоге массив mOrient получает значения по координатам X, Y и Z в радианах. И как можно заметить, типа float. При переводе их в градусы получаем точные значения. Но тут возникает другая проблема - шум датчиков. Значения скачут. Наткнулся в тырнете на интересный кусочек кода:

avX = rad2deg * mOrient[0] * kF + avX * (1.0f - kF);

Если припомнить математику, можно догадаться - это своего рода фильтр. Значение коэффициента kF подбираем опытным путем, в пределах где-то 0,01 - 0,5. Чем меньше - тем плавнее меняются показания датчика.

2 комментария:

  1. Здравствуйте. Полезная статья , такой вопрос вы не сталкивались с проблемой , когда пытаешься использовать датчик повернув устройство , сделав правильный ремап , датчик показует чтото не то?

    ОтветитьУдалить
  2. Также значение изменяется в зависимости от наклонов телефона по оси ОZ и ОY.

    ОтветитьУдалить