搜索了一段时间后,我没有找到任何方法将平移加速度方向与旋转隔离。
我正在寻找一种方法来获得与手机旋转方式无关的加速度方向(当然也与手机的旋转方式无关)。
基本上,这将使我能够在加速、减速和方向改变之间做出区分。
我试图用从中获得的角度来补偿加速度传感器角度,getOrientation
但我试验getOrientation
了当设备具有平移运动(加速度)时角度(方位角、俯仰和滚动)是不一样的。
我需要两者之一:无论设备如何旋转,加速度方向或方向值,无论设备如何加速。
这甚至可能吗?
搜索了一段时间后,我没有找到任何方法将平移加速度方向与旋转隔离。
我正在寻找一种方法来获得与手机旋转方式无关的加速度方向(当然也与手机的旋转方式无关)。
基本上,这将使我能够在加速、减速和方向改变之间做出区分。
我试图用从中获得的角度来补偿加速度传感器角度,getOrientation
但我试验getOrientation
了当设备具有平移运动(加速度)时角度(方位角、俯仰和滚动)是不一样的。
我需要两者之一:无论设备如何旋转,加速度方向或方向值,无论设备如何加速。
这甚至可能吗?
终于我们找到了!
通过Android文档我们可以得到旋转矩阵(getRotationMatrix)来改变手机的坐标系:旋转矩阵R将一个向量从设备坐标系转换到世界坐标系。
但是在参数文档中说(这里是测验):
重力 - 是一个包含 3 个浮点数的数组,其中包含以设备坐标表示的重力矢量。您可以简单地使用 TYPE_ACCELEROMETER 类型的 Sensor 的 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);
在哪里
然后在 trueAcceleration 向量中,无论移动设备如何移动其方向,我们都会在移动平移中获得加速度。