使用CoreMotion/加速度计编程检测iPhone是否掉落

5
我正在编写一段代码,需要使用iOS 4.3以上版本中的加速度计和陀螺仪检测不同的运动手势。
Q1:是否有任何现有的开源代码已经实现了任何运动/手势检测?
如果没有,
Q2:目前我想要检测iPhone是否掉落。
到目前为止,我已经实现了什么:
CoreMotion API提供了用户加速度,它(afaik)是用户给设备的加速度或设备在某个方向上的加速度(x、y或z)而不考虑重力。所以我可以做的是:存储先前5-6个加速度参数的值,并检查其中是否有任何一个命中大的负值,这基本上代表了突然减速。
但是这种解决方案并不是非常优化,我认为我需要先以某种方式检测设备的自由落体/向下运动。有什么方法来解决这个问题吗?
更新: 感谢Misch分享你的方法。我根本没有考虑过总加速度。我正是按照你说的做的:
“然而,您必须自己测试,在您的情况下,“总加速度大约相当于地球加速度”和“一段时间内”的意思是什么。”
加速度值实际上是以G为单位的,所以我在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
我认为,我仍然需要不断测试和调整值。如果您有任何优化,请分享,我知道为了帮助您,您需要看到许多自由落体加速度值的样本。目前我正在考虑:
将加速度值四舍五入到小数点后3位,并玩弄我使用的加速度范围。 也许检查自由落体条件满足后,总加速度值是否突然下降。 你认为我引用的加速度值有点嘈杂吗?

11
如果([UIScreen mainScreen] isGlassBroken]){ /掉落/ } - user529758
2
"现在我想检测iPhone是否被摔落。" 我想知道您如何测试该功能。 - iDev
没什么大不了的,我的iPod在地毯上掉了几次:P 我不能透露,但这将以非常安全的方式使用。 :) - Asymptote
1个回答

22

关于 Q2

仅检查大的负值并不能确定手机是否正在掉落。

  • 首先,用户可能只是快速移动手机,这也会导致一个大的(也许是负的)数值。
  • 其次,手机可能掉落在你想象之外的方向,因此加速度可能是正的,尽管手机向地面移动。

你可以计算总加速度 (a = sqrt(ax^2 + ay^2 + az^2)) 并检查是否该总加速度大概等于地球加速度 (9.81)。如果加速度连续一段时间等于地球加速度,则说明手机正在掉落。

然而,在你的情况下,你必须测试自己定义的 "总加速度大概等于地球加速度" 和 "连续一段时间" 的含义。


背后的物理原理:

假设您以一种方式将手机掉落,使得手机的 y 轴朝上。那么 x 和 z 加速度将为 0,y 加速度将如下所示:

Acceleration in y axis

一开始加速度为 0,然后在您松开手机的那一刻达到 -9.81。然后它会撞击地面,这是你看到小的加速度峰值,然后加速度再次变成 0。

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

因此,你必须观察手机的总加速度:

Total acceleration

在这里,您不再看到负加速度了。但是,在自由落体中,无论手机朝向哪个方向,都将具有加速度 9.81。

关于您的修改:
1. 为什么要将加速度值四舍五入到小数点后3位?如果测试代码0.9<x<1.1,那么x0.914698还是0.915并不重要。

2. 如果有人把手机掉了但又接住了,总加速度并不一定会再次下降。此外,在手机撞击地面的瞬间应该会有一个很大的加速度值(急剧减速)。也许你在测试结果中没有看到这个值,是因为它很短,恰好落在两个连续测量值之间。然而,这个值是可以测量的,所以不要假设自由落体后立即就会出现加速度下降。

感谢Misch指出总加速度,非常感谢您的努力。我已经更新了我的问题,如果您能添加一些内容,请务必这样做。我接受你的答案!:)谢谢 - Asymptote
这也适用于车祸吗?如果你以40公里/小时的速度行驶并发生碰撞,是否会有突然的运动变化(减速),等于地球加速度还是显著更高? - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接