2011-12-14 127 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將幫助你與這背後的數學。

理論上有人可以選擇電話並保持確切的方向,但這是不可能的。

希望這會有所幫助,祝你好運。