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!