8

我需要根据从 Sensor.TYPE_ORIENTATION 获得的数据计算旋转矢量。

传感器数据定义如下:

  • 必须重新计算这些值才能成为正确的 3d 位置: 值 [0]:方位角,磁北方向和 Y 轴之间的角度,围绕 Z 轴(0 到 359)。0=北,90=东,180=南,270=西
  • 1:俯仰,绕 X 轴旋转(-180 到 180),当 z 轴向 y 轴移动时为正值。
  • values[2]:滚动,绕 Y 轴旋转(-90 到 90),当 x 轴远离 z 轴时为正值

我需要所有三个值,例如 Z 轴值(从 0 到 360 度)。我尝试了很多,但无法弄清楚如何做到这一点:/

(编辑:要了解工作代码背后的想法,请查看DroidAR 框架的 ActionWithSensorProcessing 类,您可以看到如何处理不同的事件类型。)

我还尝试使用 Sensor.TYPE_ACCELEROMETER 和 Sensor.TYPE_MAGNETIC_FIELD 自己计算这个 3d 矢量。这是代码:

final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)

但这不起作用,我认为这很复杂。所以我打赌有一个简单的解决方案如何重新计算 ensor.TYPE_ORIENTATION 的值以使它们成为 3d 旋转矢量,但我只是不知道该怎么做。如果你知道答案,请告诉我。

编辑:我应该补充一点,我想将值传递给 OpenGL 以将其与轴对齐,如下所示:

gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);

但由于奇怪的值范围,我显然不能这样做。SensorManager.getOrientation 中的值也存在同样的问题,因为当您通过地平线时它们也会翻转。

另一种解决方案是使用 inR 矩阵计算角度,但我认为必须有一个更简单的解决方案(?)

4

2 回答 2

12

这应该可以工作(使用 Sensor.TYPE_MAGNETIC_FIELD 和 Sensor.TYPE_ACCELEROMETER 输入)

switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
        magnitude_values = event.values.clone();
        sensorReady = true;
        break;
    case Sensor.TYPE_ACCELEROMETER:
        accelerometer_values = event.values.clone();
    }   

    if (magnitude_values != null && accelerometer_values != null && sensorReady) {
        sensorReady = false;

        float[] R = new float[16];
        float[] I = new float[16];

        SensorManager.getRotationMatrix(R, I, this.accelerometer_values, this.magnitude_values);

        float[] actual_orientation = new float[3];
        SensorManager.getOrientation(R, actual_orientation);
 }

把这个 conde 放在你的 onSensorChanged 中。在 actual_orientation 中,您将拥有相对于您的实际位置指向北的向量。

如果您想从相机的角度检测北方,您必须像这样更改最后一行代码

float[] outR = new float[16];
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, actual_vals); 
于 2010-05-18T14:45:48.657 回答
4

好的,现在我有一个解决方案,您必须按以下顺序进行 openGl 旋转:

gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[0], 0, 0, 1);

将此与 SensorManager.getOrientation 结合使用,它将起作用。如果有人知道如何使用 Sensor.TYPE_ORIENTATION 数据执行此操作,请告诉我。

于 2010-05-23T12:29:41.207 回答