2010-07-31 325 views
14

任何人都可以帮助从加速度计读数中去除g因子。我正在使用SensorEventListener和onSensorChanged()方法获取Sensor.TYPE_ACCELEROMETER数据。我只需要所有方向上的纯加速度值。因此,在任何状态下,如果设备稳定(或以恒定速度),它应该粗略地给出(0.0,0.0,0.0)。 目前,取决于它的俯仰和横滚,它根据作用在每个轴上的g力给予我可变的输出。如何从Android 3轴加速度计的加速度计读数中去除重力因子

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

请帮忙吗?

回答

4

区分时间的函数可以去除常量。

因此,通过加速度计信号的导数,您将得到“Jerk”,然后您可以重新整合,以便获得所需加速度的非恒定部分。

按照莱曼的术语,每1秒从加速度计中取样,并从前一个样本中减去它。如果答案(非常接近)为零,那么相对于地球而言,你并没有加速。如果结果不是零,则将其整合(在这种情况下,乘以一秒),就得到了加速度。

两件事,但: 了解信号中的噪音,四舍五入你的输入。 - 不要期望片上加速度计的超精确结果。您可以使用它们来检测晃动,方向变化,但不是真的知道您在汽车急转弯时遇到了多少个G。

3

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

陀螺仪可能有助于这种情况。但是很少有机器人仍然拥有真正的陀螺仪。而使用它的原始数据并不那么简单。

9

可以使用低通滤波器。

这样做对每个传感器值:

g = 0.9 * g + 0.1 * v 

哪里v是您当前的传感器值和g是一个全局变量初始设置为零。请注意,您需要尽可能多的g变量。

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

+0

请注意,这可以重写为g =(1-a)* g + a * v',其中'a'是一个介于0和1之间的变量,用于控制滤波器的截止频率。 – 2014-06-17 20:56:08

+3

我不明白这一点。如何添加低通滤波器*去除*恒定偏差?你不想要高通吗? – matth 2015-08-11 04:28:50

+1

此计算不起作用,因为它假定设备的方向不会随时间而改变,这是非常罕见的。 – fishinear 2016-01-30 13:36:07

3

只需将g(〜9.8m/s^2)乘以旋转矩阵的z方向即可。 或者更明确的了解它,让

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

这是正确的,但计算旋转矩阵对新手来说有点难。搜索方向余弦矩阵,如果你想了解更多的细节。 – xryl669 2016-05-25 12:38:43

+1

你只从Z中减去它吗? X和Y怎么样? – rclai 2016-08-26 13:36:12

+1

@rclai只要它一直面向Z方向,只需从Z中减去它就足够了。一旦设备发生倾斜,数据将会关闭,只有Z才会引起sinec重力。 – 2016-11-23 12:42:40

7

使用Sensor.TYPE_LINEAR_ACCELERATION而不是Sensor.TYPE_ACCELEROMETER

+1

唯一正确的答案,而最简单的,以及... – fishinear 2016-01-30 13:38:21

+3

注意,并不是所有设备都能Sensor.TYPE_LINEAR_ACCELERATION – Lytic 2016-07-18 23:43:10

+1

智能手表没有TYPE_LINEAR_ACCELERATION一般 – 2017-08-08 21:28:27