1

ユーザーの足音をカウントするこのコードを見つけましたが、正しく機能していません。正確な結果を示しているわけではありません。

- (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;
}

不正なステップも検出しています。フィルターを適用して誤ったステップを削除するにはどうすればよいですか?

数日間情報を探していて、ここでいくつか見つけました: http://www.analog.com/library/analogDialogue/archives/41-03/pedometer.htmlですが、適用に問題があります。

4

1 に答える 1

0

x、y、または z をテストする代わりに、加速度ベクトルの大きさを取得すると役立つ場合があります。データをプロットして、どこが間違っているかを確認してみませんか? たとえば、加速度ベクトルの大きさの配列を保持し、それらがステップをトリガーする場所をマークします。このようなもの:

typedef struct accelData {
    float mag;
    BOOL causedStep;
} accelData;
accelData gAcceleration[kMaxDataPoints];
int i = 0;
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    const float violence = 1.2;
    float magnitudeOfAcceleration = sqrt (acceleration.x*acceleration.x + acceleration.y * acceleration.y + acceleration.z * acceleration.z);
    BOOL shake = magnitudeOfAcceleration > violence;
    gAcceleration[i].mag = magnitudeOfAcceleration;
    if (shake)
    {
        steps++;
        gAcceleration[i].causedStep = YES;
    }
    else
    {
        gAcceleration[i].causedStep = NO;
    }
}

このデータを取得したら、それを分析して、ステップの誤った記録の原因を特定できる場合があります。ノイズなどを減らすために、データをローパス フィルター処理する必要があるかもしれません。

于 2012-10-28T00:15:11.013 に答える