Android getOrientation Азимут загрязняется при наклоне телефона

У меня действительно раздражающая проблема с представлением AR, действующим как компас. Поэтому, когда я держу телефон в портретном режиме (чтобы экран был направлен на мое лицо), тогда я вызываюremapCoordinateSystem что высота тона равна 0, когда он находится в портретном положении. Тогда азимут (функция компаса) идеален, но как только я наклоняю телефон, азимут разрушается, если я наклоняюсь вперед, азимут увеличивается, а если я наклоняюсь назад, он уменьшается.

Я использую 2 датчика, чтобы получить показания,Sensor.TYPE_MAGNETIC_FIELD а также .Sensor.TYPE_GRAVITY

Я использую фильтр нижних частот, который довольно простой, этореализовано сальфа постоянный и используется непосредственно на считанные значения с датчиков.

Вот мой код:

float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, gravitymeterValues,
    magnetometerValues);

float[] remappedRotationMatrix = new float[9];

SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X,
    SensorManager.AXIS_Z, remappedRotationMatrix);

float results[] = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, results);

float azimuth = (float) (results[0] * 180 / Math.PI);
if (azimuth < 0) {
    azimuth += 360;
}

float pitch = (float) (results[1] * 180 / Math.PI);
float roll = (float) (results[2] * 180 / Math.PI);

Как видите, здесь нет магии. Я называю этот кусок кода, когда параметры gravitymeterValues и magnetometerValues готовы к использованию.

У меня вопрос: как я могу остановить сумасшедший азимут, когда я наклоняю телефон?

Я проверил бесплатное приложение в магазине Google Play,Компас и это неЯ решил эту проблему, но я надеюсь, что есть решение.

Я имею в виду 2 решения:

Заставьте AR работать только в очень ограниченных углах наклона, сейчас у меня есть что-то вродеpitch >= -5 && pitch

Ответы на вопрос(1)

Ваш ответ на вопрос