Android在地球坐标系上获得加速度计

时间:2014-05-16 17:45:09

标签: android matrix coordinates processing accelerometer

我想在Android上使用加速度计,并将它们放在地球坐标系上,就像这个主题Acceleration from device's coordinate system into absolute coordinate systemTransforming accelerometer's data from device's coordinates to real world coordinates一样,但这些解决方案并不适用于我。我正在处理Processing。该项目只是为了追踪太空中的手机加速度,无论它是怎样的(站立,侧面......)。我也是Android的新手。 我很感激你的帮助! 谢谢。

编辑:我不需要手机的确切位置,只需加速。

2 个答案:

答案 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_DonSensorChanged

中返回的加速度计