Android getOrientation Азимут загрязняется при наклоне телефона
У меня действительно раздражающая проблема с представлением AR, действующим как компас. Поэтому, когда я держу телефон в портретном режиме (чтобы экран был направлен на мое лицо), тогда я вызываюremapCoordinateSystem
что высота тона равна 0, когда он держит портрет Тогда азимут (функция компаса) идеален, но как только я наклоняю телефон, азимут разрушается, если я наклоняюсь вперед, азимут увеличивается, а если я наклоняюсь назад, он уменьшается.
Я использую 2 датчика, чтобы получить показания,Sensor.TYPE_MAGNETIC_FIELD
а такжеSensor.TYPE_GRAVITY
.
Я использую lowpassfilter, который довольно простой, он реализован сальфа постоянный и используется непосредственно на считанные значения с датчиков.
Вот мой код:
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 <= 30
, Если это не заполнено, пользователю показывается экран, который просит его повернуть телефон в портретное положение.
Каким-то образом используйте высоту тона для подавления азимута, хотя это кажется довольно специфичным для устройства решением, но, конечно, я открыт для предложений.
Я также могу добавить, что я искал подходящее решение в течение нескольких часов, и я не нашел ни одного, который дал бы мне лучшие решения, чем 2) здесь.
Заранее спасибо!