【问题标题】:Need to calculate rotation-vector from Sensor.TYPE_ORIENTATION data需要根据 Sensor.TYPE_ORIENTATION 数据计算旋转矢量
【发布时间】:2010-05-18 14:39:47
【问题描述】:

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

传感器数据定义如下:

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

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

(编辑:要了解工作代码背后的想法,请查看DroidAR framework 的 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 矩阵计算角度,但我认为必须有一个更简单的解决方案(?)

【问题讨论】:

    标签: android opengl-es vector matrix sensors


    【解决方案1】:

    这应该可以工作(使用 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); 
    

    【讨论】:

    • 好的,非常感谢您提供的代码,正如您在我的帖子中看到的那样,它几乎与我所做的相同。从 getOrientation 返回的 actual_orientation 值有一些奇怪的值范围,它们不是度数或从 -1 到 +1 或类似的东西。而且我认为当您旋转设备时(在地平线上的某个地方)仍然存在价值翻转。在这段代码 sn-ps 之后,你对 actual_vals 做了什么吗?
    • yes..getOrientation 以弧度返回值。如果你想要学位的价值,你必须隐藏实际_vals ..你欢迎
    【解决方案2】:

    好的,现在我有一个解决方案,您必须按以下顺序进行 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 数据执行此操作,请告诉我。

    【讨论】:

    • 我想知道如何使用 Sensor.TYPE_ORIENTATION 数据执行此操作。谢谢。
    猜你喜欢
    • 2019-11-25
    • 2021-11-15
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多