我设计的应用程序需要检查设备的方向(方位角,俯仰和滚动).我使用以下代码实现此目的:
@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
}
}
现在,我可以从“方向” float []中获得方位角,俯仰和横滚值.方位角和侧倾值一切都很好(它返回正确的角度),但是当我打印音高值(orientation [1])时,我总是获取PI / 2和-PI / 2之间的角度.我不明白为什么?我无法获取大于PI / 2或小于-PI / 2的角度.一旦我的角度为-PI / 2,并且继续旋转设备(三星Galaxy S2),该角度在达到PI / 2值后突然减小.
谁能解释为什么俯仰角如此罕见?
提前致谢!
解决方法:
螺距的计算公式为:pitch =(float)Math.asin(-RMatrix [7]); arcsin函数的范围是[-PI / 2,PI / 2],因此asin只能取-PI / 2和PI / 2之间的值.