1

Я разрабатываю приложение, которое должно проверять ориентацию устройства (азимут, шаг и ролл). Я использую следующий код для достижения этой цели: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.

Может ли кто-нибудь объяснить мне, почему угол наклона ведет себя так необычно?

Заранее благодарен!

ответ

5

Шаг рассчитывается как pitch = (float) Math.asin(-RMatrix[7]); Диапазон функции arcsin является [-PI/2, PI/2], поэтому asin может принимать только значение между -PI/2 и PI/2.

+0

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

+0

Я нашел решение! На самом деле это очень просто: 'if (gravityMatrix [2] <0) \t \t \t \t Ориентация [1] = (поплавок) (Math.PI - ориентация [1]); Это работает, потому что сила тяжести на оси z изменяется от положительной к отрицательной, когда устройство продолжает вращаться по оси X. Таким образом, это возвращает правильный шаг (значения между 0 и PI, 0 и -PI) Спасибо за ваше объяснение! – user1176420

+0

на моем Sony Xperia Z5P, для поля, я видел диапазон значений от -0 (плоский на столе) до -90 (стоя) и обратно до -0 (лицом вниз по столу), поэтому у меня не было никакого способа зная, что было вверх и вниз! С этим исправлением я наконец смогу принять решение о том, смотрит ли пользователь вверх или вниз. Надеюсь, это не аппаратно! –

Смежные вопросы