Android在地球坐标系上获得加速度计
我想在Android上获取加速度计并将它们放在地球坐标系上,就像这个话题一样,从设备坐标系加速到绝对坐标系或在这里将加速度计的数据从设备坐标转换为实际坐标,但这些解决方案不能为我工作。 我正在处理Processing。 该项目只是为了跟踪手机在太空中的加速度,无论它如何(站在旁边......)。 我也是Android的新手。 我会感谢您的帮助! 谢谢。
编辑:我不需要手机的确切位置,只有加速度。
我终于搞定了! 我结合了2个以前的答案,这里是代码:
monSensorManager.getRotationMatrix(Rotate, I, gravity_values, mag_values);
float[] relativacc = new float[4];
float[] inv = new float[16];
relativacc[0]=lin_values[0];
relativacc[1]=lin_values[1];
relativacc[2]=lin_values[2];
relativacc[3]=0;
android.opengl.Matrix.invertM(inv, 0, Rotate, 0);
android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, relativacc, 0);
1)获取地球坐标中的手机单位矢量2)翻转矩阵得到手机坐标中的地球单位矢量3)将单位矢量乘以手机加速度,将手机坐标转换为地球坐标。 感谢大家的帮助!
accelerometers
是根据设备坐标系给出的。 要根据地球坐标系表达accelerometers
,您需要找到从设备坐标系到地球坐标系的基础矩阵的变化。 这是rotation matrix
在getRotationMatrix
方法中的内容。
因此,您必须注册TYPE_MAGNETIC_FIELD
并过滤TYPE_ACCELEROMETER
值或使用TYPE_GRAVITY
来获得rotation matrix
。 一旦获得rotation matrix M
,将设备坐标系中的accelerometer vector
转换为地球坐标系是很简单的。
A_E = M * A_D
那是
A_E[0] = M[0] * A_D[0] + M[1] * A_D[1] + M[2] * A_D[2];
A_E[1] = M[3] * A_D[0] + M[4] * A_D[1] + M[5] * A_D[2];
A_E[0] = M[6] * A_D[0] + M[7] * A_D[1] + M[8] * A_D[2];
A_D
是在onSensorChanged
返回的加速度计