1

我以每秒 50Hz / 50 次的频率向他们询问数据。当我突然将设备在 x 轴上翻转 90 度,而设备平放在桌子上,显示器朝上时,这些值非常缓慢地移动到该位置的“目标”值。

现在奇怪的是:如果我增加测量速率,在突然将设备翻转 90 度时,值会更快地移动到新值。但是,如果我每秒只询问一次新值,则该值达到目标需要很长时间。这可能是什么原因?

我不做任何类型的数据聚合,也不积累任何东西。我只是做了一些简单的过滤来消除噪音。我的方法如下所示:

- (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 度时,视图只是非常缓慢地移动到它的目标位置。我不知道这是因为加速度计的物理特性,还是我的过滤代码中的错误。我只知道有些快节奏的游戏会使用加速度计进行转向,所以我几乎无法想象这是硬件问题。

4

1 回答 1

8

这一行:

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

是一个低通滤波器,它通过计算 x 加速度的移动平均值来工作。换句话说,每次调用回调时,您只会将accelerationX5% 的值移向新的加速度计值。这就是为什么它需要多次迭代才能accelerationX反映新的方向。

你应该做的是增加0.05价值,也就是说0.2。我会制作一个全局#define变量,并使用不同的值以及不同的刷新率。

于 2009-05-11T19:03:19.313 回答