Я использую данные датчика типа 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);