9

この歩数計アプリと同じ機能を開発する必要があります

私はこの歩数計アプリを非常に詳細に観察しました。

完璧な歩数計アプリではありません。たとえば、ある場所にとどまって手を振ると、歩数と距離も検出されます。

この理想的な重力の振る舞いは無視してください。このアプリの説明では、iPhoneを縛るか、ポケットに入れて歩数を数える必要があるとすでに述べています。このように、私はこのアプリが非常にうまく機能していることを発見しました、それはほとんどすべてのステップを検出します。

私の問題は次のとおりです。上記のロジックに従って1つのサンプルを開発しましたが、そのレベルまでは機能していません。たとえば、2〜3ステップを同時に検出する場合があります。そして時々それはうまくいく。

私のコード:

viewDidLoadの場合:

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.2] 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    const float violence = 1.2;
    static BOOL beenhere;
    BOOL shake = FALSE;
    if (beenhere) return;
    beenhere = TRUE;
    if (acceleration.x > violence || acceleration.x < (-1* violence))
       shake = TRUE;
    if (acceleration.y > violence || acceleration.y < (-1* violence))
       shake = TRUE;
    if (acceleration.z > violence || acceleration.z < (-1* violence))
       shake = TRUE;
    if (shake) {
       steps=steps+1;
     }
  beenhere = false;
}

私は何が間違っているのですか?しきい値を特定できません。高くすると、小さなステップは検出されません。小さくすると、3〜4ステップ同時に登録されます。

これを行うために必要な他の実装、またはこのコードの微調整はありますか?

私は他のすべての同様のスタックオーバーフローリンクを見てきました。私が見つけたものは、このレベルまでは機能しません。

助けてください。

4

2 に答える 2

20

ステップではなく、いびきを数えていますが、同じ問題がいくつかあります。実際の答えはありませんが、いくつかの提案があります。

  1. ステップ間に時間間隔が必要です。はい、誰かがゆっくり歩いたりジョギングしたりすることができますが、最速でもステップ間におそらく1/5秒の時間間隔があります。「影響」がそれよりも急速に現れる場合は、リバウンド/ガタガタ音が原因である可能性があります。
  2. 固定しきい値()ではなく、前のイベントの移動平均violenceに基づいて可変しきい値を使用します。
  3. 電話機が短期間で向きを変更しないという仮定に基づいて、x、y、およびzのしきい値を個別に維持することを検討してください。
  4. 特定のレベルよりも強いイベントを単に無視するのではなく、2つのしきい値(おそらく一方は他方の一部)で指定された制限を使用して、範囲外のイベントを無視することを検討してください。
  5. 歩くときに何が起こるかを考えてみてください。足が地面にぶつかるときの「ショック」とともに、非常にリズミカルな体の前後の加速があります。ショック(かなり短期間の信号)を無視して、代わりにリズミカルな前後の動きを探すのが最善かもしれません。

別の提案

この獣を「生きた」状態でテストすることは不可能です。(ラップトップを目の前に持ってジョギングし、デバッガーコンソールに焦点を合わせようとしていると想像できます。)まず、アプリをリグして、生のデータを含むいくつかの記録(つまり、ファイルの書き込み)を作成します。測定値を確認してから、アプリを再リグして(ここでは#ifdefsが便利です)、これらの測定値を「再生」できるようにします。これにより、デバッガーを使用してアプリをステップ実行し、その動作を観察できます。

于 2011-11-29T12:59:32.660 に答える
0
        var motionManager = CMMotionManager()
        motionManager.deviceMotionUpdateInterval = 0.1
        motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
            deviceManager, error in

            var accelerationThreshold:Double = 1;
            var userAcceleration:CMAcceleration = deviceManager.userAcceleration;
            if(fabs(userAcceleration.x) > accelerationThreshold) || (fabs(userAcceleration.y) > accelerationThreshold) || (fabs(userAcceleration.z) > accelerationThreshold)
            {
                println("LowPassFilterSignal")
            }
        })
于 2016-04-05T09:13:57.767 に答える