Значения датчика TYPE_ROTATION_VECTOR не совпадают для разных устройств.

Я использую данные датчика типа ROTATION_VECTOR в своем приложении.

Используя свой Nexus 5, я могу получить азимут по ориентациям [0] и получить направление телефонов в диапазоне, показанном на рисунке ниже (это очень точно).

Поскольку я пробовал свое приложение на разных устройствах, я обнаружил, что значения датчика отличаются от моего тестового устройства Nexus 5. На моем Samsung Galaxy Nexus и на Samsung Galaxy S3 Mini азимут зависит от наклона устройств, как показано на рисунке.

«Только

TYPE_ROTATION_VECTOR использует слияние датчиков, поэтому я проверил значения отдельных датчиков на разных устройствах с помощью приложений для тестирования датчиков. На Nexus 5 значения ориентации для оси z остаются примерно одинаковыми при наклоне устройства, на Samsung Galaxy Nexus значение z менялось при наклоне (примерно 90° из вертикального положения в лежачее). Я боюсь, что слияние датчиков использует эти значения, и поэтому мой азимут отличается на разных устройствах.

Есть ли у кого-нибудь подобный сценарий и, что еще более важно: есть ли у кого-нибудь обходной путь или другой способ получения азимута?

Просто чтобы убедиться, я ищу направление, в котором направлена ​​задняя камера...

Вот мой код:

final float[] mRotationMatrix = new float[9];
final float[] mRotationMatrixFromVector = new float[9];
final float[] orientation = new float[3];

...

SensorManager.getRotationMatrixFromVector(mRotationMatrixFromVector,
                event.values);

// enables usable range like in picture
SensorManager.remapCoordinateSystem(mRotationMatrixFromVector,
                        SensorManager.AXIS_X, SensorManager.AXIS_Z,
                        mRotationMatrix);

SensorManager.getOrientation(mRotationMatrix, orientation);

person RuNaWaY87    schedule 29.10.2015    source источник
comment
Я рекомендую вам включить датчик гироскопа в ваши расчеты.   -  person Metehan Toksoy    schedule 15.10.2018


Ответы (1)


Обычно у вас есть три угла, определяющих ориентацию, и чтобы использовать их для проекции на некоторое расстояние наружу, вы должны использовать их все в правильном порядке, так как вы будете вращать свою систему координат. Я ответил на аналогичный вопрос здесь который может вам помочь - там есть некоторый код javascript, который я оставил неоптимизированным, чтобы показать шаги, используемые для решения этой проблемы.

Обычно азимут находится в системе отсчета земли, и вы можете просто использовать его сам по себе. Но так может быть не во всех случаях. Если вы подозреваете, что на ваш азимут влияет высота, вполне вероятно (при условии, что они не просто неправильно пометили цифры!), что углы, которые они вам предоставляют, предназначены для использования в другом порядке, и вы Придется выяснить, в каком порядке они применяются. Как только у вас будет правильный порядок, примените три угла в этом порядке (см. Мой другой ответ), тогда проекция повернутой оси X на плоскость XY является фактическим азимутом.

person wordragon    schedule 17.10.2018