假设一个人使用这个指南针,从90度开始,他们可以顺时针或逆时针旋转。如何最好地计算他们完成了多少个完整的360度旋转?假设他们从头到尾只会顺时针或逆时针旋转。
我想出的解决方案是,如果起始角度为90度,则当传感器数据发生变化时,持续检查下一个角度,如果一直往一个方向移动,就知道他们正在旋转。如果他们一直朝着同一个方向旋转,并回到了90度,那就算作完成了一次旋转。我的方法看起来非常复杂和低效,我很难想出更好的方法。
在这种情况下,我期望有多次完整的旋转。
我将会感激任何帮助。谢谢!
我找到了相关答案这里,并试图为此编写代码示例。如果有人已经做出类似的事情,请发布!
我想出的解决方案是,如果起始角度为90度,则当传感器数据发生变化时,持续检查下一个角度,如果一直往一个方向移动,就知道他们正在旋转。如果他们一直朝着同一个方向旋转,并回到了90度,那就算作完成了一次旋转。我的方法看起来非常复杂和低效,我很难想出更好的方法。
在这种情况下,我期望有多次完整的旋转。
我将会感激任何帮助。谢谢!
我找到了相关答案这里,并试图为此编写代码示例。如果有人已经做出类似的事情,请发布!
@Override
public void onSensorChanged(SensorEvent event)
{
switch(event.sensor.getType())
{
case Sensor.TYPE_GRAVITY:
{
mValuesAccelerometer = lowPass(event.values.clone(), mValuesAccelerometer);
break;
}
case Sensor.TYPE_MAGNETIC_FIELD:
{
mValuesMagneticField = lowPass(event.values.clone(), mValuesMagneticField);
break;
}
}
boolean success = SensorManager.getRotationMatrix(
mMatrixR,
mMatrixI,
mValuesAccelerometer,
mValuesMagneticField);
if (success)
{
SensorManager.getOrientation(mMatrixR, mMatrixValues);
float azimuth = toDegrees(mMatrixValues[0]);
float pitch = toDegrees(mMatrixValues[1]);
float roll = toDegrees(mMatrixValues[2]);
if (azimuth < 0.0d)
{
//The bearing in degrees
azimuth += 360.0d;
}
}
}