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

Pri*_*tam 15 android accelerometer

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

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

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

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

Mat*_*aun 10

您可以使用低通滤波器.

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

g = 0.9 * g + 0.1 * v
Run Code Online (Sandbox Code Playgroud)

v您当前的传感器值在哪里,并且g是最初设置为零的全局变量.请注意,您需要与轴数一样多的g变量.

随着v = v - g您可以消除您的传感器值的重力因素.

  • 我不明白这一点.如何添加低通滤波器*去除*恒定偏差?你不想要高通吗? (7认同)
  • 此计算不起作用,因为它假定设备的方向不随时间变化,这是非常罕见的. (3认同)
  • 请注意,这可以重写为 `g = (1-a)*g + a*v`,其中 `a` 是一个介于 0 和 1 之间的变量,用于控制滤波器的截止。 (2认同)

Rat*_*ore 9

使用Sensor.TYPE_LINEAR_ACCELERATION而不是Sensor.TYPE_ACCELEROMETER

  • 请注意,并非所有设备都具有Sensor.TYPE_LINEAR_ACCELERATION (5认同)

The*_*erg 6

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

a = your accelerometer reading,
R = your rotation matrix (as a 9-long vector).
Run Code Online (Sandbox Code Playgroud)

那么你想要的是

(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]).
Run Code Online (Sandbox Code Playgroud)

  • @rclai只要它始终面向Z方向向下,只需从Z中减去它就足够了。一旦设备倾斜,数据就会关闭,正弦重力不仅仅作用于 Z 轴。 (3认同)

小智 4

对时间函数进行微分可以消除常数。

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

通俗地说,就是每 1 秒从加速度计中采样一次,并从之前的采样中减去它。如果答案是(非常接近)零,那么你相对于地球的加速度就没有。如果结果非零,对其进行积分(在本例中,乘以一秒),就得到了加速度。

但有两件事: - 留意信号中的噪声,四舍五入您的输入。- 不要指望片上加速计会产生超准确的结果。您可以使用它们来检测晃动、方向变化,但不能真正了解您在汽车急转弯时经历了多少 G。