如何从Android 3轴加速度计中的加速度计读数中删除重力因子

时间:2010-07-31 07:47:37

标签: android accelerometer

任何人都可以帮助从加速度计读数中删除g因子吗?

我正在使用带有onSensorChanged()方法的SensorEventListener来获取Sensor.TYPE_ACCELEROMETER数据。我只需要在所有方向上的纯加速度值。因此,在任何状态下,如果设备稳定(或以恒定速度),它应该大致给出(0.0,0.0,0.0)。

目前,根据其俯仰和滚动,它会根据作用在每个轴上的g力给出可变输出。

我希望有一些公式可以删除它,因为我还从Sensor.TYPE_ORIENTATION侦听器获取方向值(俯仰和滚动)。我已经使用了一些,但它没有用。

7 个答案:

答案 0 :(得分:10)

您可以使用低通滤波器。

对每个传感器值执行此操作:

g = 0.9 * g + 0.1 * v

其中v是您当前的传感器值,g是一个最初设置为零的全局变量。请注意,您需要与轴数一样多的g变量。

使用v = v - g,您可以从传感器值中消除重力因子。

答案 1 :(得分:9)

答案 2 :(得分:9)

使用Sensor.TYPE_LINEAR_ACCELERATION代替Sensor.TYPE_ACCELEROMETER

答案 3 :(得分:4)

在时间上区分时间函数会使你失去常数。

因此,通过获取加速度计信号的导数,您将得到“Jerk”,然后您可以重新积分,以获得您正在寻找的加速度的非恒定部分。

在Layman的术语中,每1秒从加速度计中取样,然后从前一个样本中减去它。如果答案是(非常接近)零,那么你就不会相对于地球加速。如果结果为非零,则对其进行积分(在这种情况下,乘以一秒),就可以得到加速度。

但有两件事: - 查看信号中的噪音,完善您的输入。 - 不要指望片上加速度计的超精确结果。您可以使用它们来检测摇晃,方向的变化,但不是真的知道您在车内急转弯时遇到的G数。

答案 4 :(得分:4)

只需减去旋转矩阵z方向的g(~9.8m / s ^ 2)倍。 或者更明确一点,让

a = your accelerometer reading,
R = your rotation matrix (as a 9-long vector).

然后你想要的是

(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]).

答案 5 :(得分:3)

一种方法(仅适用于带有加速度计的设备)是通过减去相同方向的静态情况下的值来从加速度计数据中移除重力矢量。但是,由于取向再次通过加速度读数计算而不是独立计算,因此不太准确。

在这种情况下,陀螺仪可能会有所帮助。但很少有机器人仍然拥有真正的陀螺仪。使用原始读数并不是那么简单。

答案 6 :(得分:1)

你需要假设两个坐标系: 1-固定全球系统。 2-原点移动的移动坐标系&像传感器一样旋转。 在全局系统中,g始终与z轴平行,但在移动系统中则不是。 所以你要做的就是从方向角度计算3 * 3旋转矩阵 偏航,俯仰和放大滚。 (你可以在任何地方找到公式)。 然后将此旋转矩阵乘以传感器测量的3 * 1加速度矢量。 这将转换坐标并声明固定全局系统中的值。 之后唯一的事就是简单地从z值中减去g。