我正在设计一个应用程序,需要检查设备的方向(方位角、俯仰和滚转)。我使用以下代码来实现这一点:
@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,并且我继续旋转我的设备(三星Galaxy S2),角度在达到PI/2值后突然减小。
有人能解释一下为什么俯仰角表现得如此罕见吗?
提前感谢!
Pitch计算为pitch = (float) Math.asin(-RMatrix[7]);
。arcsin
函数的范围为[-PI/2, PI/2]
,因此asin
只能取介于-PI/2
和PI/2
之间的值。