我想在Android上使用加速度计,并将它们放在地球坐标系上,就像这个主题Acceleration from device's coordinate system into absolute coordinate system或Transforming accelerometer's data from device's coordinates to real world coordinates一样,但这些解决方案并不适用于我。我正在处理Processing。该项目只是为了追踪太空中的手机加速度,无论它是怎样的(站立,侧面......)。我也是Android的新手。 我很感激你的帮助! 谢谢。
编辑:我不需要手机的确切位置,只需加速。
答案 0 :(得分:4)
我终于解决了!我结合了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)乘以单位矢量的手机加速度,将手机坐标转换为地球坐标。 谢谢大家的帮助!
答案 1 :(得分:0)
根据设备坐标系给出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