0

我一直在尝试使用 getOrientation() 方法获取航向值。

boolean success = SensorManager.getRotationMatrix(rot, incl, accel, magnet);
if (success) {
    // Compute orientation
    float orientation[] = new float[3];
    SensorManager.getOrientation(rot, orientation);

}

即使我保持手机稳定并以稳定的位置行走,这些值也会有很大差异。

然后我尝试将加速度值的参考从手机更改为世界轴:

        // Compute world acceleration
        float wAccel[] = new float[4];
        float newAccel[] = new float[]{accel[0],accel[1],accel[2], 0};
        android.opengl.Matrix.multiplyMV(wAccel, 0, rot, 0, newAccel, 0);
        magnetLine += "W" + LOGSEPARATOR +
                tsString + LOGSEPARATOR +
                wAccel[0] + LOGSEPARATOR +
                wAccel[1] + LOGSEPARATOR +
                wAccel[2] + "\n";
    }

然后,我使用 atan2 函数上 X 和 Y 轴的值来确定向量的角度。即使以不同的方式变化,这些值仍然显示出奇怪的行为(有时该值是恒定的,有时它会显示周期性的行为,就像跟随脚步一样)。

我见过一些人在与此类似的情况下调用 remapCoordinate 系统。这是我想念的吗?

4

1 回答 1

1

以下是您可以做的几件事:

  1. 首先,除非您使用的是旧版本的 Android API,否则请Sensor.TYPE_GRAVITY使用Sensor.TYPE_ACCELEROMETER. Sensor.TYPE_GRAVITY旨在尝试过滤掉运动,只留下重力矢量。
  2. onAccuracyChanged(Sensor sensor, int accuracy)使用接口的方法监控传感器的准确性SensorEventListener。我遇到了同样的问题,就我而言,它发生Sensor.TYPE_MAGNETIC_FIELDSensorManager.SENSOR_STATUS_UNRELIABLE.
remapCoordinateSystem()与在您的坐标系中进行 90 度旋转有关,例如将 x 与 z 轴交换等。如果您正在制作一个显示真北方向的指南针,那么您需要考虑您的设备是处于纵向还是横向模式等。但是,传感器的测量值不依赖于纵向/横向,因此如果它们变化很大,那么您的问题就出在其他地方。

另请注意, android compass 似乎不可靠,有些人发现 Android 设备中的 compass 不是很好。但是,那篇文章大约是 2 年前发布的,所以希望现在情况会好转 :-)。

于 2013-04-18T18:42:50.950 回答