Android加速度计检测设备静止不动

时间:2015-06-10 16:29:51

标签: android accelerometer

我正在为Android开发一个应用程序,用于检查设备是否处于静止状态。当我将设备放在平坦的表面上时,这必须起作用。 当设备静止在设备的任何一侧时,这也必须工作。当我手持设备时,检查应该失败。因为手/手臂的小动作应该足以检测到运动。

我一遍又一遍地试过这个但是我似乎仍然没有这样做。通常情况下,我从SensorEventListener收到的数据总是波动很大。下面的数据表示我仍然躺在平坦的表面上时从设备返回的数据。

0.07366191
0.056904275
0.034122672
0.047471035
0.080519415
0.07816742
1.2434766
0.34602648
0.25965866
0.52344894
0.14806636

我尝试过以下方法:

  • 10秒校准,同时平放在桌子上,存储校准值并将其用作阈值。
  • 根据Math.sqrt(ax * ax + ay * ay + az * az)结果修复了阈值处理。
  • 使用TYPE_LINEAR_ACCELERATION或普通类型。
  • 使用重力(9.8)作为阈值。

此时我不知道该怎么做了。我真的希望有人可以帮助我。提前谢谢。

2 个答案:

答案 0 :(得分:0)

我不确定Android加速度计输出的是什么样的值,但如果它与我使用过的其他加速度计一样,它会定期给出设备感受到的Gs或毫克数量的样本。 x,y和z方向(x轴,y轴和z轴相对于设备固定 - 通常你可以找到加速度计的指南,告诉你哪个方向是哪个)。

例如,平躺的加速度计正在经历一个G向上。如果输出以毫秒为单位,则将连续输出(0,0,1000)。如果翻转它,它将输出(0,0,-1000)。

会有一点噪音,所以您会看到(-2,5,998),(1,0,1001)等值,而不是(0,0,1000)。滤除噪声的一种方法是记住最后几个样本并对其进行平均,然后使用平均值而不是原始数据来做出决策。

对于该决定,您可以尝试检查G读数的z分量是否在距离1000或-1000 20个单位之内。

答案 1 :(得分:0)

如果您只使用三个组件的平方根,则无法看到旋转运动。 你可以做的是建立一个循环缓冲区(推出旧值的新值),一定数量介于10到100个acc值之间,不仅可以保存引力平方根,还可以保存三个组件。使用每个新值,您可以计算x,y,z分量的最大值和最小值。因此,您可以计算x,y,z的最大增量。然后测试一些振动,如在桌子上走路或敲击,并确定你说的最大三角形可以说它“静止”。非常基本的,当然如果设备仍然躺在一个表面上(比如起始火车上的一张桌子),这将无法工作。