我正在开展一个项目,我希望将我的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
我哪里错了?如果那里的人可以帮助我,那将是一个很大的帮助。
提前多多感谢。
答案 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文档。
如果我的假设正好相反,也就是说,如果你的方位角,俯仰角和滚动角表示世界轴相对于电话轴偏离的角度,那么只需使你的方位角,俯仰角和滚动角成为负值。