如果使用CoreMotion / Accelerometer删除iPhone,则以编程方式进行检测

所以我写了一段代码,在上面的iOS 4.3中,我必须使用加速度计和陀螺仪来检测不同的移动手势。

Q1:是否有任何已经实现了移动/手势检测的开源代码?

如果不

Q2:现在我想检测iPhone是否掉线。

到目前为止,我所取得的成就是: CoreMotion API提供了userAcceleration ,其中(afaik)是用户给设备的加速度,或者是在某个方向(x,y或z)加速的设备,可以做的是:存储,比如前面的5-6个加速度参数值,可以检查其中的任何一个碰到大的负值,这基本上代表了突然减速。

但是这个解决scheme并不是非常优化,我想我需要先检测设备的自由下落运动。 任何想法如何解决这个问题?

更新:感谢Misch分享你的方法。 我完全没有想到总加速度。 我的确如你所说:

“然而,你将不得不testing自己,什么意思是”总的加速度大致对应于地球的加速度“和”在一段时间内“你的情况。

加速度值实际上是在G中,所以我testing了“总加速度”值在0.9-1.1的范围内。 我检查了一段时间,最初我检查了updateInterval设置为1 / 20.0时连续四个值。 现在我已经放松了一点连续性的条件。

这是一个示例输出:

加速度= 0.090868
加速度= 0.074473
加速度= 0.159797
加速= 1.157513
加速= 1.224588
加速= 1.036272
加速度= 0.914698
加速= 0.904093
加速= 0.941516
加速度= 0.046362
加速度= 0.045109
加速度= 0.060045

我想,我还是要继续testing和调整价值。 如果你有任何优化,请分享,我知道为了帮助你需要看到自由落体加速度值的许多样本。 现在我想:

  1. 将加速度的值四舍五入到小数点后三位,并使用我正在使用的加速度范围。
  2. 可能是检查自由落体情况后,总加速度值是否突然下降。
  3. 你认为我引用的加速度值有点吵?

Q2

检查较大的负值不会告诉您电话是否被丢弃。

  • 首先,用户可以用快速的手势移动电话,这也会导致很大的(也许是负的)值。
  • 其次,手机可能会跌倒在你想象的另一个方向,因此,虽然手机正朝着地面移动,但加速度可能是正面的。

您可以计算总加速度( a = sqrt(ax^2 + ay^2 + az^2) )并检查这个总加速度是否近似对应于地球加速度( 9.81 )。 如果加速度与地球加速度相对应一段时间,手机就会下降。

然而,你将不得不testing自己,什么意思是“总的加速度大致对应于地球的加速度”和“ 一段时间 ”你的情况。


这背后的物理学:

假设您以某种方式放下手机,手机的y轴向上显示。 那么x和z加速度将是0,y加速度将是这样的:

y轴加速度

开始时加速度为0,此时会达到-9.81,您释放手机。 然后它会撞到地面,在小的加速度峰值中看到,然后加速度再次为零。

但是,您不能仅使用y方向的加速度,因为您的手机可能会以不同的angular度落下。

所以你必须看你的手机的总加速度:

总加速度

在这里你看不到负面的加速度了。 不过,在这个方向上,手机面向哪个方向并不重要,因为自由落体总是以9.81的加速度为特征。

对您的编辑:
1.为什么要将加速度的值舍入到小数点后三位? 如果你testing0.9 < x < 1.1 ,那么x0.914698还是0.915并不重要。
2.如果有人把手机掉下来,但又抓住了手机,那么总的加速度不一定要下降。 另外,手机碰到地板的时候应该有一个很大的加速度值(突然减速)。 也许在你的价值观中没有看到这一点的原因是,它是如此之短,它落在两次连续的测量之间。 然而,这可以测量,所以不要以为自由落体后,加速度应该再次下降。