私は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度の場合、ビューはちょうどそれを目標位置にかなりゆっくりと移動します。私はそれが加速度計の物理学のためであるかどうか、またはそれが私のフィルタリングコードのバグであるかどうかはわかりません。私は加速度計がステアリングに使用されるペースの速いゲームがあることを知っているだけなので、ハードウェアの問題であるとはほとんど想像できません。
ありがとうございます!それはまさに問題の解決策でした。 – Thanks
(このコードが実装する)RC LowPassフィルタによって生成された位相シフトが重要であることを追加する必要があります。ローパスフィルタ(FFTを使用して実装されたものなど)の他の実装は、少し良くなり、その点で重要です。彼らは実装するのがはるかに難しいです。 –