【问题标题】:Android get accelerometers on earth coordinate systemAndroid在地球坐标系上获取加速度计
【发布时间】:2014-05-16 17:45:08
【问题描述】:

我想在 Android 上获得加速度计并将它们放在地球坐标系上,就像在这个主题 Acceleration from device's coordinate system into absolute coordinate system 或这里 Transforming accelerometer's data from device's coordinates to real world coordinates 上一样,但这些解决方案对我不起作用。我正在处理。该项目只是为了跟踪手机在太空中的加速度,无论它是如何(站立,侧面......)。我也是安卓新手。 感谢您的帮助! 谢谢你。

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

【问题讨论】:

  • “这些解决方案对我不起作用。” 请解释:为什么?你会得到错误的结果吗? “该项目只是跟踪手机在太空中的位置” 这已经出现了无数次。你不能通过双重积分加速度来做到这一点。您需要外部参考源(例如 GPS)或某些特定领域的假设(例如脚在地面上时不会移动)。
  • 嗨,它根本不起作用(结果可能是完全随机的),cmets 说同样的话:“我已经测试了你的 sn-p,我得到的只是一个相当嘈杂的随机信号作为回报。”该项目并不是真正能够跟踪空间中的位置,而是至少获得地球参考中的加速度值。我很清楚我无法通过双重积分值来获得位置。无论手机的位置如何,我都想获得加速度值。
  • 恐怕我不跟。我没有发布任何 sn-p,也没有任何评论说“我已经测试了你的 sn-p,我得到的只是一个相当嘈杂的随机信号作为回报。”根据我的回答。 Sensor.TYPE_LINEAR_ACCELERATION 有什么问题?据我了解,您的问题正是您正在寻找的。​​span>
  • @Ali Sensor.TYPE_LINEAR_ACCELERATION 给了我没有重力的加速度,但仍然在手机坐标中。我需要在地球坐标中有加速度值。 link 这些图完美地解释了这一点:如果手机站立并向北移动,它的值与它在侧面时的值不同,仍然向北移动。
  • 好的,我明白了。 Acceleration from device's coordinate system into absolute coordinate system 接受的答案有什么问题?请不要说“它不起作用”,而是解释您尝试过的(用代码)以及结果是什么。

标签: android matrix coordinates processing accelerometer


【解决方案1】:

我终于解决了!我结合了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) 将手机加速度乘以单位向量,将手机坐标转换为地球坐标。 谢谢大家的帮助!

【讨论】:

    【解决方案2】:

    accelerometers 是根据设备坐标系给出的。要用地球坐标系表示accelerometers,您需要找到基矩阵从设备坐标系到地球坐标系的变化。这就是 rotation matrixgetRotationMatrix 方法中的内容。
    因此,您必须注册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 中返回的加速度计

    【讨论】:

    • 首先,感谢您的帮助。我不知道如何将这些矩阵相乘,因为我只能将 4*4 矩阵与multiplyMM 相乘(我试图为加速度计值制作一个 3*3 矩阵)所以我有:android.opengl.Matrix.multiplyMM(earthAcc, 0, accMatrix, 0, Rotate, 0); 我也试过multiplyMV(earthAcc, 0, Rotate, 0, acc_values, 0);我得到FATAL EXCEPTION: Animation Thread java.lang.IllegalArgumentException: length - offset < n。矩阵都是 3*3(accMatrix 就是 x, 0, 0, 0, y, 0, 0, 0, z.
    • 旋转矩阵被定义为一个数组,所以你只需要使用正则乘法。
    • 如果我写earthAcc = acc_values*Rotate;,我会得到operator * cannot be applied to float[],float[]
    • 好吧,我仍然得到相当随机的值。这是我写的内容:monSensorManager.getRotationMatrix(Rotate, I, gravity_values, mag_values); earthAcc[0] = Rotate[0] * acc_values[0] + Rotate[1] * acc_values[1] + Rotate[2] * acc_values[2]; earthAcc[1] = Rotate[3] * acc_values[0] + Rotate[4] * acc_values[1] + Rotate[5] * acc_values[2]; earthAcc[2] = Rotate[6] * acc_values[0] + Rotate[7] * acc_values[1] + Rotate[8] * acc_values[2]; 我试过每次都不更新getRotationMatrix,仍然很随机。谢谢你的帮助,我真的需要它!
    • 加速度计会波动,不知道你说的随机是什么意思。每次调用 onSensorChanged 时,您都必须计算旋转矩阵。即使您将设备仍然放在桌子上,您仍然会看到波动,但除非您有强烈的磁场干扰,否则值不应有太大差异。
    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 2012-01-30
    • 2014-03-25
    • 2012-07-19
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多