我要求他们以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度时,视图移动得非常缓慢到达目标位置。我不知道这是因为加速度计的物理特性,还是我的过滤代码中的错误。我只知道有快节奏的游戏,加速度计用于转向,所以我几乎无法想象这是一个硬件问题。
答案 0 :(得分:8)
这一行:
accelerationX = acceleration.x * 0.05 + accelerationX * (1.0 - 0.05);
是一个低通滤波器,它通过计算x加速度的移动平均值来工作。换句话说,每次调用回调时,您只需将accelerationX
向新的加速度计值移动5%。这就是为什么在accelerationX
反映新方向之前需要多次迭代的原因。
您应该做的是增加0.05
值,说0.2
。我会创建一个全局#define
并使用不同的值以及不同的刷新率。