Android getOrientation Azimute fica poluído quando o telefone é inclinado

Eu estou tendo um problema muito chato com uma visão AR agindo como uma bússola. Então, quando eu mantenho o telefone no retrato (de modo que a tela está apontando para o meu rosto), então eu chamo oremapCoordinateSystem que o tom é 0 quando segurando o retrato. Então o azimute (funcionalidade da bússola) é perfeito, mas assim que eu inclino o telefone o azimute fica arruinado, se eu me inclino para frente o azimute aumenta e se eu me inclino para trás ele diminui.

Eu uso 2 sensores para obter as leiturasSensor.TYPE_MAGNETIC_FIELD eSensor.TYPE_GRAVITY.

Eu uso um lowpassfilter que é bem básico, é implementado com umalfa constante e é usado diretamente nos valores de leitura dos sensores.

Aqui está o meu 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 você vê, não há mágica aqui. Eu chamo este pedaço de código quando os valores gravitymeterValues ​​e magnetometerValues ​​estão prontos para serem usados.

Minha pergunta é: como faço para impedir que o azimute enlouqueça quando eu inclino o telefone?

Eu verifiquei um aplicativo gratuito na Google Play Store,Bússola e não resolveu este problema, mas espero que exista uma solução.

Eu tenho 2 soluções em mente:

Faça com que a visão AR funcione somente em ângulos de inclinação muito restritos, agora eu tenho algo comopitch >= -5 && pitch <= 30. Se isso não for realizado, o usuário verá uma tela que pede a ele para girar o telefone para retrato.

De alguma forma, usar o tom para suprimir o azimute, isso parece ser uma solução bastante específica do dispositivo, mas é claro que estou aberto a sugestões.

Eu também posso adicionar que eu tenho procurado por um par de horas para uma solução decente e eu não encontrei nenhum que me deu soluções melhores do que 2) aqui.

Desde já, obrigado!

questionAnswers(1)

yourAnswerToTheQuestion