从电话轴到世界坐标轴的转换

时间:2014-07-09 07:51:34

标签: android math geometry

我正在开展一个项目,我希望将我的Android手机轴转换为世界坐标轴。我沿着手机3轴(x,y,z)加速,三个角度是方位角,俯仰和滚动。我怎样才能将我的手机轴虚拟转换为世界坐标轴(truenorth,trueeast)。 我所做的就是给我错误的结果。 这是我的方法。

让我们说 -0.030029837 -0.008528218 -0.199289320是沿着手机的X,Y,Z轴和 0.01618620 0.48581530 0.19617330是方位角,俯仰和滚动的三个角度(以弧度表示)。

沿着" truenorth"加速。我只是沿着Y轴采取加速度并将其与所有三个角度的cos相乘,即。 -0.008528218 * COS(0.19617330)* COS(0.48581530)* COS(0.01618620)= - 0.00739584

沿着" trueeast"加速。我只是沿X轴采取加速度并将其与所有三个角度的cos相乘,即。 -0.030029837 * COS(0.19617330)* COS(0.48581530)* COS(0.01618620)= - 0.026042471

沿着"垂直向上加速"我只是沿Z轴采取加速度并将其乘以2个角度的cos即。 -0.199289320 * COS(0.19617330)* COS(0.48581530)= - 0.172850298

现在检查我是否正确或错误。我做了一致性测试。 沿着手机的X,Y,Z轴的加速度的大小应该等于沿着真正的东部,truenorth和垂直向上的加速度的大小。 但这是不平等的。

0.20不等于0.17

我哪里错了?如果那里的人可以帮助我,那将是一个很大的帮助。

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

我假设您的方位角,俯仰角和滚动角表示电话轴相对于世界轴的偏移角度。如果我的假设是正确的,那么以下代码行将满足您的需求。

    float yaw = (float) Math.toDegrees(0.01618620);
    float pitch = (float) Math.toDegrees(0.48581530);
    float roll = (float) Math.toDegrees(0.19617330);
    float acc[] = { -0.030029837f, -0.008528218f, -0.199289320f, 1 };

    float[] matrix = new float[16];
    Matrix.setIdentityM(matrix, 0);
    Matrix.rotateM(matrix, 0, yaw, 0, 0, 1);
    Matrix.rotateM(matrix, 0, pitch, 0, 1, 0);
    Matrix.rotateM(matrix, 0, roll, 1, 0, 0);

    float accT[] = new float[4];
    Matrix.multiplyMV(accT, 0, matrix, 0, acc, 0);

    float rawMagnitude = Matrix.length(acc[0], acc[1], acc[2]);
    System.out.println(rawMagnitude);
    float transformedMagnitude = Matrix.length(accT[0], accT[1], accT[2]);
    System.out.println(transformedMagnitude);

控制台打印量级是

    0.2017195
    0.20171948

我使用了android.opengl.Matrix。这里使用的静态方法是自解释的,有关详细信息,请参阅API文档。

如果我的假设正好相反,也就是说,如果你的方位角,俯仰角和滚动角表示世界轴相对于电话轴偏离的角度,那么只需使你的方位角,俯仰角和滚动角成为负值。