毎秒 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 度回転すると、ビューはターゲット位置にかなりゆっくりと移動します。それが加速度計の物理学によるものなのか、フィルタリング コードのバグによるものなのかはわかりません。加速度計がステアリングに使用されるペースの速いゲームがあることしか知らないので、それがハードウェアの問題であるとはほとんど想像できません.