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

Asy*_*ote 4 physics accelerometer ios

所以我正在编写一段代码,我必须在上面的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. 你认为我引用的加速度值有点吵?

Mis*_*sch 22

Q2:

检查较大的负值不会告诉您手机是否被丢弃.

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

您可以计算总加速度(a = sqrt(ax^2 + ay^2 + az^2))并检查该总加速度是否大致对应于地球加速度(9.81).如果加速度对应于地球加速度一段时间,则手机正在下降.

然而,你必须测试自己,在你的情况下,"总加速度大致对应于地球加速度"和" 一段时间 "是什么意思.


这背后的物理:

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

y轴加速度

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

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

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

总加速度

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

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