5

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

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. 你认为我引用的加速度值有点吵吗?
4

1 回答 1

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 位?如果您测试,则is或0.9 < x < 1.1无关紧要。 2. 如果有人把手机掉了然后又接住了怎么办,所以总加速度不一定要再次下降。此外,手机落地的那一刻应该有很大的加速度值(突然减速)。也许人们在您的值中没有看到这一点的原因是它太短了,以至于它介于两次连续测量之间。然而,这是可以测量的,所以不要假设在自由落体之后,加速度应该再次减小。x0.9146980.915

于 2013-01-21T19:46:07.110 回答