Android Orientación El azimut se contamina cuando el teléfono está inclinado

Tengo un problema realmente molesto con una vista AR que actúa como una brújula. Entonces, cuando sostengo el teléfono en vertical (para que la pantalla apunte a mi cara), llamo alremapCoordinateSystem que el tono es 0 cuando se mantiene retrato. Entonces, el azimut (funcionalidad de la brújula) es perfecto, pero tan pronto como inclino el teléfono, el azimut se arruina, si me inclino hacia adelante, el azimut aumenta y si me inclino hacia atrás, disminuye.

Yo uso 2 sensores para obtener las lecturas,Sensor.TYPE_MAGNETIC_FIELD ySensor.TYPE_GRAVITY.

Yo uso un filtro de paso bajo que es bastante básico, se implementa con unalfa constante y se utiliza directamente en los valores de lectura de los sensores.

Aquí está mi código:

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);

Como ves no hay magia aquí. Llamo a este código cuando los valores del medidor de gravedad y los valores del magnetómetro están listos para ser utilizados.

Mi pregunta es ¿cómo puedo evitar que el azimut se vuelva loco cuando inclino el teléfono?

Revisé una aplicación gratuita en Google Play Store,Brújula y no ha resuelto este problema, pero espero que haya una solución.

Tengo 2 soluciones en mente:

Hacer que la vista AR solo funcione en ángulos de tono muy constreñidos, ahora mismo tengo algo comopitch >= -5 && pitch <= 30. Si esto no está completo, al usuario se le muestra una pantalla que le pide que gire el teléfono a modo vertical.

De alguna manera, use el tono para suprimir el azimut, aunque parece una solución bastante específica para el dispositivo, pero por supuesto estoy abierto a sugerencias.

También puedo agregar que he estado buscando durante un par de horas una solución decente y no he encontrado ninguna que me haya brindado mejores soluciones que 2) aquí.

¡Gracias por adelantado!

Respuestas a la pregunta(1)

Su respuesta a la pregunta