在我的应用程序中,我想计算应用程序开始与当前测量角度之间的角度差。因此我使用Sensor.TYPE_ACCELEROMETER
andSensor.TYPE_MAGNETIC_FIELD
来获取当前方向。这工作得很好。这是我的代码:
@Override
public void onSensorChanged(SensorEvent event) {
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
return;
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
valuesAccelerometer = lowPass(event.values.clone(),
valuesAccelerometer);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
valuesMagneticField = lowPass(event.values.clone(),
valuesMagneticField);
}
boolean success = SensorManager.getRotationMatrix(matrixR, matrixI,
valuesAccelerometer, valuesMagneticField);
if (success) {
SensorManager.getOrientation(matrixR, matrixValues);
azimuth = (float) Math.toDegrees(matrixValues[0]);
if (azimuth < 0.0f) {
azimuth += 360.0f;
}
if (!initAz) {
startAzimuth = azimuth;
initAz = true;
} else {
float difAz = startAzimuth-azimuth;
Log.i("Test", "" +"Dif: "+ difAz + "Act_Value " + azimuth + " Start_Value " + startAzimuth);
}
}
}
为了描述我的问题,这里有一个 Logcat 的例子:
Dif: -220.63545 Act_Value 358.24 Start_Value 137.61
Dif: -220.7943 Act_Value 358.40 Start_Value 137.61
Dif: -221.49236 Act_Value 359.10 Start_Value 137.61
Dif: 137.07309 Act_Value 0.53 Start_Value 137.61
Dif: 135.63617 Act_Value 1.97 Start_Value 137.61
Dif: 135.16443 Act_Value 2.44 Start_Value 137.61
Dif: 136.15468 Act_Value 1.457 Start_Value 137.61
Dif: 136.72552 Act_Value 0.88 Start_Value 137.61
如果我当前的测量值从 360° 变为 0°,我的差异角度就会出错。我怎么能处理得这么干净,所以它适用于左右旋转。