Android 安卓三轴加速度计中如何从加速度计读数中去除重力因子

Android 安卓三轴加速度计中如何从加速度计读数中去除重力因子,android,accelerometer,Android,Accelerometer,有人能帮忙从加速度计读数中去除g系数吗 我正在使用SensorEventListener和onSensorChanged()方法获取Sensor.TYPE\u加速计数据。我只需要所有方向上的纯加速度值。因此,在任何状态下,如果设备是稳定的(或在恒定速度下),它应该大致给出(0.0,0.0,0.0) 目前,根据它的俯仰和滚动,它根据作用在每个轴上的g力提供可变输出 我希望有一些公式可以消除这一点,因为我还可以从Sensor.TYPE_orientation listener获得方向值(俯仰和滚动)

有人能帮忙从加速度计读数中去除g系数吗

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

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


我希望有一些公式可以消除这一点,因为我还可以从Sensor.TYPE_orientation listener获得方向值(俯仰和滚动)。我用过一些,但不起作用。

区分时间的函数会使你忘记常数

所以,通过对加速度计信号的导数,你会得到“Jerk”,然后你可以对它重新积分,从而得到你想要的加速度的非恒定部分

用外行的话说,每1秒从加速计上取一个样本,然后从上一个样本中减去它。如果答案是(非常接近)零,那么相对于地球,你没有加速。如果结果不是零,积分它(在这种情况下,乘以1秒),你就有了加速度

但有两件事: -注意信号中的噪声,将输入四舍五入。 -不要期望芯片加速计的结果超精确。你可以用它们来检测震动和方向的变化,但不能真正知道你在汽车急转弯时经历了多少重力。

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


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

看看下面的链接


您可以使用低通滤波器

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

g = 0.9 * g + 0.1 * v
其中,
v
是您当前的传感器值,
g
是一个全局变量,最初设置为零。请注意,您将需要尽可能多的g变量,因为您有轴

使用
v=v-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]).

使用Sensor.TYPE_线性加速度而不是Sensor.TYPE_加速计

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

注意,这可以重写为
g=(1-a)*g+a*v
,其中
a
是一个介于0和1之间的变量,用于控制过滤器的截止。我不理解这一点。添加低通滤波器如何消除恒定偏差?你不想要高通吗?这个计算不起作用,因为它假设设备的方向不会随时间而改变,这是极为罕见的。它作为电容器工作(这是无线电电子学中RC滤波器的一部分)-主要部分(0.9g)会发生变化(电容器的电荷),但振荡部分的影响(0.1)只有在同一符号且多次不为零时,才是相当可观的。请注意,过滤器将根据您的采样率(即传感器延迟设置)快速或缓慢响应。实际上,Android文档中的计算是不正确的,因为它们假设设备的方向不会改变。当然,这在实践中是非常罕见的。这是正确的,但是对于新手来说,计算旋转矩阵有点困难。如果你想要更多的细节,可以搜索方向余弦矩阵。你只从Z减去它吗?那么X和Y呢?@rclai只要它一直朝着Z方向向下,从Z中减去它就足够了。一旦设备倾斜,数据将关闭,sinec gravity不会仅拉动Z。请注意,并非所有设备都有传感器。线性加速度通常情况下,智能手表没有线性加速度