检测设备是否移动

时间:2011-12-14 16:34:11

标签: iphone ios

我正在为iPhone创建动作检测警报。此警报将通过按下“激活”来设置。按钮,在小倒计时之后,将读取是否正在移动的读数。我已经尝试使用加速度计来检测运动,但是如果阈值变得太低,它会持续激活,无论设备是否在移动。如果我将阈值设置得更高,则不会检测到移动,并且只会检测特定的运动速度。

有没有人有任何关于如何正确执行此操作的解决方案,而不是通过一定的力量,但手机是否实际移动了。

我试图找到如何实现它的在线示例,但只提出了增强现实和OpenGL等解决方案。我只需要一个简单的动作检测。

感谢您的帮助!

编辑:

我设法使用Apple文档中的一些示例来使用它。

我已经成功实现了我想要的加速度计didAccelerate方法:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Use a basic low-pass filter to keep only the gravity component of each axis.
    accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
    accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
    accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));

    float accelerationThreshold = 1.01; // or whatever is appropriate - play around with different values

    if (fabs(accelX) > accelerationThreshold || fabs(accelY) > accelerationThreshold || fabs(accelZ) > accelerationThreshold) {
        [self.soundPlayer play];
        accelX = accelY = accelZ = 0;
        accelerometerActive = NO;
        accelerometer.delegate = nil;
        accelerometer = nil;
    }
}

1 个答案:

答案 0 :(得分:3)

这样做的一种方法是计算重力矢量。如果手机没有移动,那么矢量将保持相当稳定。如果手机被拿起,手机的方向可能会发生变化,因此重力矢量也会发生变化(相对于加速度计的方向)。

要检测移动,只需计算“激活”上设置的原始矢量与当前矢量之间的角度。谷歌搜索angles between 3d vectors将帮助您解决背后的数学问题。

理论上有人可以拿起电话并保持准确的方向,但这种情况极不可能。

希望这会有所帮助,祝你好运。