gpt4 book ai didi

android - 需要根据 Sensor.TYPE_ORIENTATION 数据计算旋转矢量

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:49 34 4
gpt4 key购买 nike

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

传感器数据定义如下:

  • 必须重新计算值才能成为正确的 3d 位置:值 [0]:方位角,磁北方向与 Y 轴之间的角度,围绕 Z 轴(0 到 359)。 0=北,90=东,180=南,270=西
  • 1 :俯仰,绕X轴旋转(-180到180),当z轴向y轴移动时为正值。
  • values[2]:Roll,绕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 矩阵计算角度,但我认为必须有更简单的解决方案 (?)

最佳答案

这应该有效(使用 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);
}

将此条件放入您的 onSensorChanged 中。在 actual_orientation 中,您将获得相对于您的实际位置指向北方的矢量。

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

float[] outR = new float[16];
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, actual_vals);

关于android - 需要根据 Sensor.TYPE_ORIENTATION 数据计算旋转矢量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2858255/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com