Я разрабатываю приложение, которое должно проверять ориентацию устройства (азимут, шаг и ролл). Я использую следующий код для достижения этой цели:Android SensorManager.getOrientation() возвращает шаг между -PI/2 и PI/2
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
gravityMatrix = event.values.clone();// Fill gravityMatrix with accelerometer values
else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
geomagneticMatrix = event.values.clone();// Fill geomagneticMatrix with magnetic-field sensor values
if(gravityMatrix != null && geomagneticMatrix != null){
RMatrix = new float[16];
IMatrix = new float[16];
SensorManager.getRotationMatrix(RMatrix, IMatrix, gravityMatrix, geomagneticMatrix);// Retrieve RMatrix, necessary for the getOrientation method
SensorManager.getOrientation(RMatrix, orientation);// Get the current orientation of the device
}
}
Теперь я могу получить азимут, высоту и значение крена от «ориентации» поплавка []. Все отлично подходит для значений азимута и рулона (он возвращает правильный угол), однако, когда я печатаю значение основного тона (ориентация [1]), я всегда получаю угол между PI/2 и -PI/2. Я не понимаю, почему? Я не могу получить угол больше PI/2 или меньше -PI/2. Как только у меня есть угол + - PI/2, и я продолжаю вращать свое устройство (Samsung Galaxy S2), угол внезапно уменьшается после достижения значения PI/2.
Может ли кто-нибудь объяснить мне, почему угол наклона ведет себя так необычно?
Заранее благодарен!
Oke, большое спасибо. Это действительно имеет смысл, я этого не знал. Однако я должен знать разницу между этими двумя ориентациями, которые имеют один и тот же шаг, поэтому я думаю, что я собираюсь использовать азимутальное значение. Он изменяется с отрицательного на положительный, когда устройство продолжает вращаться по оси X. Я дам вам знать, если это сработает. – user1176420
Я нашел решение! На самом деле это очень просто: 'if (gravityMatrix [2] <0) \t \t \t \t Ориентация [1] = (поплавок) (Math.PI - ориентация [1]); Это работает, потому что сила тяжести на оси z изменяется от положительной к отрицательной, когда устройство продолжает вращаться по оси X. Таким образом, это возвращает правильный шаг (значения между 0 и PI, 0 и -PI) Спасибо за ваше объяснение! – user1176420
на моем Sony Xperia Z5P, для поля, я видел диапазон значений от -0 (плоский на столе) до -90 (стоя) и обратно до -0 (лицом вниз по столу), поэтому у меня не было никакого способа зная, что было вверх и вниз! С этим исправлением я наконец смогу принять решение о том, смотрит ли пользователь вверх или вниз. Надеюсь, это не аппаратно! –