2011-12-14 12 views
2

iPhone用の動き検出アラームを作成しています。このアラームは、「アクティブ化」ボタンを押すことによって設定され、小さなカウントダウンの後に、それが動いているかどうかを読み取る。私は動きを検出するために加速度計を使用しようとしましたが、閾値が低すぎると、デバイスが動いているかどうかにかかわらず、常に動いています。スレッショルドを高く設定すると、動きが検出されず、動きの特定の速度のみが検出されます。デバイスが移動したことを検出する

力量によってではなく、電話機が実際に移動したかどうかは、どのようにこれを正しく行うかに関する解決策がありますか?

私はそれを実装する方法のオンラインの例を見つけようとしましたが、拡張現実感とOpenGLなどのソリューションが出てきました。動きの単純な検出だけが必要です。

は、任意の助けをありがとう!

EDIT:

私はそれがアップルのドキュメントからいくつかのサンプルを使用して作業を得ることができました。

私は、この加速度計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 –

+0

私のニーズに適しているかどうかは分かりません。たとえば、誰かが電話の横に座って電話がわずかに動いた場合など、アラームをオフにする必要があります。 – ThisDarkTao

答えて

3

一つの方法を。電話が動いていない場合、ベクトルはかなり一定のままです。電話機がピックアップされると、電話機の向きが変化する可能性があるため、重力ベクトルも変化する(加速度計の向きに関連して)。

動きを検出するには、「アクティブ化」で設定した元のベクトルと現在のベクトルの間の角度を計算するだけです。グーグルangles between 3d vectorsは、この背後にある数学を手伝ってくれます。

誰かが電話を拾って正確な向きを維持することができますが、これは非常に困難です。

これが役立ち、幸運を祈っています。

+0

コンパスと組み合わせることができます(存在する場合)。 –

関連する問題