2011-12-14 101 views
2

我正在为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; 
    } 
} 
+0

如何使用Core Location Framework? http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html – 2011-12-14 16:36:17

+0

我不确定这是否适合我的需求。例如,如果有人坐在电话旁边并且电话稍微移动,则警报需要关闭。 – ThisDarkTao 2011-12-14 16:39:13

回答

3

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

要检测运动,只需计算'Activate'上设置的原始矢量与当前矢量之间的角度。谷歌搜索angles between 3d vectors将帮助你与这背后的数学。

理论上有人可以选择电话并保持确切的方向,但这是不可能的。

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