1

毎秒 50Hz / 50 回のデータを求めています。ディスプレイが上を向いたテーブルの上でデバイスが平らなときに、デバイスを突然 x 軸で 90 度ひっくり返すと、値はその位置の「ターゲット」値にかなりゆっくりと移動します。

ここで奇妙なことに、測定レートを上げると、デバイスを突然 90 度ひっくり返すと、値が新しい値に速く移動します。しかし、1 秒に 1 回だけ新しい値を要求すると、値がターゲットに到達するまでに非常に長い時間がかかります。この理由は何ですか?

私はいかなる種類のデータ集計も行いませんし、何も蓄積しません。単純なフィルタリングを行って、ノイズを取り除きます。私の方法は次のようになります。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
    // accelerationX is an instance variable
    accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);

    // round
    int i = accelerationX * 100;
    float clippedAccelerationValue = i;
    clippedAccelerationValue /= 100;

    [self moveViews:clippedAccelerationValue];
}

後で、私の -moveViews: メソッドで、私はこれを行います:

-(IBAction)moveSceneForPseudo3D:(float)accelerationValue {
    if(fabs(lastAccelerationValue - accelerationValue) > 0.02) { // some little treshold to prevent flickering when it lays on a table
        float viewAccelerationOffset = accelerationValue * 19 * -1;

        newXPos = initialViewOrigin + viewAccelerationOffset;
        myView.frame = CGRectMake(newXPos, myView.frame.origin.y, myView.frame.size.width, myView.frame.size.height);

        lastAccelerationValue = accelerationValue;
    }
}

その結果、デバイスが x 軸上で 90 度、つまり 180 度回転すると、ビューはターゲット位置にかなりゆっくりと移動します。それが加速度計の物理学によるものなのか、フィルタリング コードのバグによるものなのかはわかりません。加速度計がステアリングに使用されるペースの速いゲームがあることしか知らないので、それがハードウェアの問題であるとはほとんど想像できません.

4

1 に答える 1