У меня очень неприятная проблема с видом AR, действующим как компас. Поэтому, когда я держу телефон в портрете (так, чтобы экран указывал на мое лицо), я вызываю remapCoordinateSystem
, что высота тона равна 0 при удержании этого портрета. Тогда азимут (функциональность компаса) совершенен, но как только я наклоняю телефон, азимут разрушается, если я наклоняюсь вперед, азимут увеличивается, и если я наклоняюсь назад, он уменьшается.Android getOrientation Azimuth загрязняется, когда телефон наклонен
Я использую 2 датчика для получения показаний, Sensor.TYPE_MAGNETIC_FIELD
и Sensor.TYPE_GRAVITY
.
Я использую lowpassfilter, который довольно простой, он реализован с константой alpha и используется непосредственно для считывания значений с датчиков.
Вот мой код:
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);
Как вы видите, нет никакой магии здесь. Я называю этот фрагмент кода, когда гравитационные параметры и свойства magnetometerValues готовы к использованию.
Мой вопрос в том, как остановить азимут от спячки, когда я наклоняю телефон?
Я проверил бесплатное приложение в Google Play Store, Compass, и он не решил эту проблему, но я надеюсь, что есть решение.
У меня есть 2 решения в виде:
сделать вид AR работать только в очень связях углы наклона, прямо сейчас у меня есть что-то вроде
pitch >= -5 && pitch <= 30
. Если это не заполнено, пользователю будет показан экран, который попросит его/ее повернуть телефон на портрет.Как-то использовать подачу для подавления азимута, это похоже на довольно специфичное для устройства решение, но, конечно, я открыт для предложений.
Я также могу добавить, что я искал пару часов для достойного решения, и я не нашел ни одного, который дал мне все лучшие решения, чем 2) здесь.
Заранее благодарен!
Что делать вам фильтр низких частот? Вам не нужно фильтровать при использовании TYPE_GRAVITY. –
@HoanNguyen Нужно ли мне пропускать 'Sensor.TYPE_MAGNETIC_FIELD'? Теперь я пропускаю как 'Sensor.TYPE_MAGNETIC_FIELD', так и' Sensor.TYPE_GRAVITY'. –
Нет, использование фильтра нижних частот заключается в удалении ускорения в направлении x y. Матрица getRotationMatrix потребовала, чтобы третий параметр был приблизительно равен ускорению только в направлении z.Если вы используете TYPE_GRAVItY, нет необходимости использовать фильтр нижних частот, но у многих устройств нет TYPE_GRAVITY, поэтому вам необходимо использовать TYPE_ACCELEROMETER и фильтр нижних частот для устройств, у которых нет TYPE_GRAVITY. –