我正在尝试创建一个简单的指南针应用程序(用于学习目的),我正在使用磁传感器和加速度计的旋转矩阵。这是我的代码:
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
geomagnetic[0] = event.values[0];
geomagnetic[1] = event.values[1];
geomagnetic[2] = event.values[2];
havemag = true;
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
gravity[0] = event.values[0];
gravity[1] = event.values[1];
gravity[2] = event.values[2];
haveacc = true;
}
if (haveacc && havemag) {
if (SensorManager.getRotationMatrix(Rm, I, gravity, geomagnetic)) {
float[] result = new float[3];
SensorManager.getOrientation(Rm, result);
azimuth = result[0];
pitch = result[1];
roll = result[2];
}
}
}
当我在移动手机时查看这些值(使用Log.d
输出)时,我得到的值不正确。我使用这段代码来制作学位:
int deg = (int)(azimuth * (float)57.295);
但是这个值永远不会达到零(这应该是在180 / -180的正好相反的一侧)。相反,与180 / -180相反,我得到-85(约)。
答案 0 :(得分:3)
您应该使用正确的JavaMath函数将弧度转换为度。此外,将角度(度数)转换为[0-360]度间隔非常有用。
// angle in degree [-180 - 0 - 180] degree
azimuth = Math.toDegrees( result[0] )
// angle in degree [0 - 360] degree
azimuth = ( Math.toDegrees( result[0] ) + 360 ) % 360;