Android加速方向

时间:2013-03-01 13:20:10

标签: android android-sensors device-orientation acceleration

在搜索了一段时间后,我没有找到任何方法将旋转加速度方向与旋转隔离开来。

我正在寻找一种方法来获得加速方向,与手机的旋转方式无关(当然也与旋转方式无关)。

基本上这可以让我在加速度,减速度和方向变化方面做出改变。

我尝试使用从getOrientation获得的角度补偿加速度传感器角度,但我尝试了当设备具有平移运动(加速度)时,getOrientation角度(Azimut,pitch和roll)不同。

我需要两种方法之一:加速方向,无论设备如何旋转或方向值,无论设备如何加速。

这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

最后我们找到了它!

Android documentation之后我们可以得到旋转矩阵(getRotationMatrix)来改变移动坐标系:旋转矩阵R将一个矢量从设备坐标系转换到世界坐标系。

但是在参数文档中说(这里是测验):

  

gravity - 是一个包含重力向量的3个浮点数组   以设备的坐标表示。您可以简单地使用这些值   由TYPE_ACCELEROMETER类型的传感器的SensorEvent返回。

那么如果您使用文档说加速度计值作为旋转矩阵上的参数,当然加速将受到影响,而移动翻译和矩阵将是无用的。

您必须使用重力传感器值(TYPE_GRAVITY类型的传感器

,而不是使用加速计传感器值

由于此传感器不会受到移动翻译的影响,因此在翻译移动设备时可以使用旋转矩阵。

最后,适合我们的代码是:

float[] trueacceleration = new float[4];
float[] R = new float[16];
float[] RINV = new float[16];    

SensorManager.getRotationMatrix(R, I, GRAVITY, geomagnetic);
Matrix.invertM(RINV, 0, R, 0);          
Matrix.multiplyMV(trueAcceleration, 0, RINV, 0, linearAcceleration, 0);

哪里

  • GRAVITY是带有TYPE_GRAVITY传感器值的矢量,
  • geomangetic是一个矢量,其值来自TYPE_MAGNETIC_FIELD传感器,
  • linearAcceleration是一个值为的向量 TYPE_LINEAR_ACCELERATION传感器

然后在trueAcceleration向量中,我们在移动翻译中加速,无论移动方向如何移动。