3

尝试不同的方法来计算手机的方位角已经有 2 周了,但我基本上发现了两个问题:

我的问题

  1. 360º 转弯并不总是 360º。如果我快速转弯,我会在转弯结束前完成我的 360 度,如果我走得很慢,我会在转弯结束后完成我的 360 度。
  2. 当我把它放在桌子上时,方位角会随机移动。或者甚至保持在相同的位置,对于任何滴答声,我都会得到 +- 3 度,所以如果我保持在 200º 并等待,我可能是 197º。然后如果我继续等待,它可能会达到 194º,但我会留下来。

我在找什么?

对于问题1.-,我正在寻找 X 轴(方位角)上的精确运动。在HelloPanoramaGL 项目示例中可以找到一个很好的示例。它移动平稳,您可以获得移动真实全景的感觉。

对于问题2.-这个基于 iOS 全景图的项目同时执行 1.- 和 2.-。当你转弯时,它会得到相同的位置。

我试过的

好吧,两周后我敢说我已经完成了我在互联网上找到的所有内容,例如:

  • 试图设置Sensor.TYPE_ORIENTATION不推荐使用的,但它是为我提供最佳结果的那个。
  • 尝试Sensor.TYPE_ACCELEROMETER和的组合Sensor.TYPE_MAGNETIC_FIELD。还将低通滤波器添加到传感器
  • 使用其余的传感器就像Sensor.TYPE_ROTATION_VECTOR等待任何让它工作的希望。

但是我的问题没有解决。

这是我现在的代码:

声明所有传感器:

    private SensorManager sensorManager;
    private Sensor magnetic_field;
    private Sensor accelerometer;
    private Sensor orientation;

初始化 onCreate():

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    orientation = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    magnetic_field = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

注册监听器 onResume():

    sensorManager.registerListener(this, magnetic_field, SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this, orientation, SensorManager.SENSOR_DELAY_FASTEST);
    // tried with SENSOR_DELAY_FASTEST, SENSOR_DELAY_UI and SENSOR_DELAY_GAME

并得到结果:

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
        float azimuth1 = event.values[0];
        return;
    }

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        mGravity = event.values;
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        mGeomagnetic = event.values;
    if (mGravity != null && mGeomagnetic != null) {
        float R_[] = new float[9];
        float I_[] = new float[9];
        boolean success = SensorManager.getRotationMatrix(R_, I_, mGravity, mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];
            SensorManager.getOrientation(R_, orientation);
            azimut = orientation[0]; // orientation contains: azimut, pitch and roll
        }
    }
}

如果你能帮助我,那就太好了。

非常感谢。

问候。

拉斐尔。

4

0 回答 0