如何从 Android 3 轴加速度计中的加速度计读数中删除重力因子
Posted
技术标签:
【中文标题】如何从 Android 3 轴加速度计中的加速度计读数中删除重力因子【英文标题】:How to remove Gravity factor from Accelerometer readings in Android 3-axis accelerometer 【发布时间】:2011-03-23 13:56:17 【问题描述】:谁能帮忙去除加速度计读数中的 g 因子?
我正在使用 SensorEventListener 和 onSensorChanged()
方法来获取 Sensor.TYPE_ACCELEROMETER 数据。我只需要各个方向的纯加速度值。所以在任何状态下,如果设备是稳定的(或恒速),它应该大致给出(0.0,0.0,0.0)。
目前,根据它的俯仰和滚动,它会根据作用在每个轴上的 g 力为我提供可变输出。
我希望有一些公式可以删除它,因为我还从 Sensor.TYPE_ORIENTATION 侦听器获取方向值(俯仰和滚动)。我用过一些,但没有用。
【问题讨论】:
【参考方案1】:关于时间的微分可以让你摆脱常数。
因此,通过获取加速度计信号的导数,您将获得“Jerk”,然后您可以对其重新积分以获得您正在寻找的加速度的非恒定部分。
用 Layman 的话来说,每 1 秒从加速度计中取一个样本,然后从前一个样本中减去它。如果答案是(非常接近)零,那么你就没有相对于地球加速。如果结果不为零,则将其积分(在这种情况下,乘以一秒),您就有了加速度。
不过有两件事: - 注意信号中的噪声,四舍五入您的输入。 - 不要指望片上加速度计提供超精确的结果。您可以使用它们来检测晃动、方向变化,但不能真正了解您在汽车急转弯时遇到了多少 G。
【讨论】:
【参考方案2】:一种方法(仅适用于具有加速度计的设备)是通过减去相同方向的静态情况下的值来从加速度计数据中移除重力矢量。但是由于方向是通过加速度读数而不是独立计算的,所以它不是很准确。
陀螺仪在这种情况下可能会有所帮助。但是很少有机器人仍然拥有真正的陀螺仪。而且使用它的原始读数并不是那么简单。
【讨论】:
【参考方案3】:看看下面的链接。
http://developer.android.com/reference/android/hardware/SensorEvent.html
【讨论】:
实际上,Android 文档中的计算是不正确的,因为它们假设设备的方向没有改变。当然,这在实践中极为罕见。【参考方案4】:您可以使用低通滤波器。
对每个传感器值执行此操作:
g = 0.9 * g + 0.1 * v
其中v
是您当前的传感器值,g
是初始设置为零的全局变量。请注意,您需要与轴一样多的 g 变量。
使用v = v - g
,您可以从传感器值中消除重力因素。
【讨论】:
请注意,这可以重写为g = (1-a)*g + a*v
,其中a
是一个介于0和1之间的变量,用于控制过滤器的截止。
我不明白这个。添加低通滤波器如何移除恒定偏差?你不想要一个高通吗?
这个计算不起作用,因为它假定设备的方向不会随着时间而改变,这是极其罕见的。
它作为电容器(它是无线电电子学中 RC 滤波器的一部分)工作 - 主要部分(0.9g)缓慢变化(电容器的电荷),但振荡部分(0.1)的影响只有在相同符号且多次不为零
请注意,过滤器的响应速度取决于您的采样率(即 SENSOR_DELAY_XXX 设置)【参考方案5】:
只需减去 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]).
【讨论】:
这是正确的,但是计算旋转矩阵对于新手来说有点困难。如果您想了解更多详细信息,请搜索方向余弦矩阵。 你只从 Z 中减去它吗? X 和 Y 呢? @rclai 只要它始终面向 Z 方向向下,只需从 Z 中减去它就足够了。一旦设备倾斜,数据就会关闭,正弦重力不会只为 Z 拉动。【参考方案6】:使用 Sensor.TYPE_LINEAR_ACCELERATION 代替 Sensor.TYPE_ACCELEROMETER
【讨论】:
注意,并非所有设备都有 Sensor.TYPE_LINEAR_ACCELERATION 智能手表一般没有TYPE_LINEAR_ACCELERATION【参考方案7】:您需要假设两个坐标系: 1-固定的全球系统。 2-移动坐标系,其中原点像传感器一样移动和旋转。 在全局系统中,g 始终平行于 z 轴,但在移动系统中则不然。 所以你所要做的就是从方向角计算 3*3 旋转矩阵或 偏航,俯仰和滚动。 (你可以在任何地方找到公式)。 然后将此旋转矩阵乘以传感器测量的 3*1 加速度矢量。 这将转换坐标并在固定的全局系统中声明值。 之后唯一要做的就是简单地从 z 值中减去 g。
【讨论】:
以上是关于如何从 Android 3 轴加速度计中的加速度计读数中删除重力因子的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Android 中的加速度计测量手机在 XY 平面上的倾斜度
如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转