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

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

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

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

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

您可以使用低通滤波器。

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

 g = 0.9 * g + 0.1 * v 

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

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

使用Sensor.TYPE_LINEAR_ACCELERATION而不是Sensor.TYPE_ACCELEROMETER

区分时间函数可以解释常数。

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

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

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

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

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

只需减去旋转矩阵的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]). 

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