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

时间:2013-01-21 19:36:35

标签: ios accelerometer physics

所以我正在编写一段代码,我必须在上面的iOS 4.3中使用Accelerometer和陀螺仪检测不同的移动手势。

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

如果不是

Q2:目前我想检测iPhone是否被丢弃。

到目前为止我取得的成就: CoreMotion API提供 userAcceleration ,其中(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

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

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

1 个答案:

答案 0 :(得分:21)

Q2

检查较大的负值并不能告诉您手机是否被丢弃。

  • 首先,用户可以通过快速手势移动手机,这也会导致较大(可能是负值)的值。
  • 其次,手机可能会落在另一个方向上,而不是你想象的那样,因此,虽然手机正朝着地面移动,但加速度可能是正的。

您可以计算总加速度(a = sqrt(ax^2 + ay^2 + az^2))并检查此总加速度是否大致对应于地球加速度(9.81)。如果加速度对应地球加速度一段时间,手机就会掉落。

然而,你需要测试自己,在你的情况下,“总加速度对应大约对地球加速度”和“一段时间”是什么意思。


背后的物理学:

我们假设您放弃了手机,手机的y轴向上显示。然后x和z加速度将为0,y加速度将如下:

Acceleration in y axis

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

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

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

Total acceleration

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

编辑内容:
 1.为什么要将加速度值四舍五入到小数点后3位?如果您对0.9 < x < 1.1进行测试,x0.914698还是0.915并不重要。
 2.如果有人放下手机然后再次抓住手机怎么办,那么总加速度不一定要再次下降。此外,手机击中地板时应该有一个很大的加速度值(突然减速)。也许在你的价值观中没有看到这个的原因是它太短了,它落在两次连续测量之间。然而,这可以测量,所以不要认为在自由落体后立即加速应该再次降低。