2009-05-11 6 views
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 achsisに90度回転します、または180度の場合、ビューはちょうどそれを目標位置にかなりゆっくりと移動します。私はそれが加速度計の物理学のためであるかどうか、またはそれが私のフィルタリングコードのバグであるかどうかはわかりません。私は加速度計がステアリングに使用されるペースの速いゲームがあることを知っているだけなので、ハードウェアの問題であるとはほとんど想像できません。

答えて

8

この行:

accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05); 

は、x加速度の移動平均を計算することによって動作する低域通過フィルタです。つまり、コールバックが呼び出されるたびに、accelerationXを新しい加速度計の値に向かって5%だけ移動させます。そのため、accelerationXに新しい方向が反映されるまでには、多くの繰り返しが必要です。

0.05の値を増やすことは、0.2となります。私はグローバル#defineを作り、異なったリフレッシュレートと共に異なった値で遊びます。

+0

ありがとうございます!それはまさに問題の解決策でした。 – Thanks

+0

(このコードが実装する)RC LowPassフィルタによって生成された位相シフトが重要であることを追加する必要があります。ローパスフィルタ(FFTを使用して実装されたものなど)の他の実装は、少し良くなり、その点で重要です。彼らは実装するのがはるかに難しいです。 –

関連する問題