cab*_*ret 8 iphone accelerometer uiaccelerometer ios4 ios
还在BigNerdRanch iOS开发书上.
在Accelerometer章节中,他们首先实现加速度计跟踪,但它相当跳跃.然后,他们建议通过更改原始代码对其应用低通滤波器:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
HypnosisView *hv = (HypnosisView *)[self view];
[hv setXShift:10.0 * [acceleration x]];
[hv setYShift:10.0 * [acceleration y]];
[hv setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)
对此:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
HypnosisView *hv = (HypnosisView *)[self view];
float xShift = [hv xShift] * 0.8 + [accel x] * 2.0;
float yShift = [hv yShift] * 0.8 + [accel y] * 2.0;
[hv setXShift:xShift];
[hv setYShift:yShift];
[hv setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)
相当简单的问题:他们从哪里获得这些价值?我一直在查看文档,我发现了一些关于低通滤波器的东西,它建议使用以下代码:
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
// Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
// Use the acceleration data.
}
Run Code Online (Sandbox Code Playgroud)
但是,我首先尝试使用该代码,我得到一个错误(通过分析我的应用程序)说'''的左值是一个垃圾值'.我的加速度计跟踪也不起作用.
我对这些数值意味着什么感到困惑.例如,在代码的第一部分中,为什么它们将加速度值乘以10?要获得"更大"的运动?我可以从中得到一些意义,但是使用低通滤波器的第二个代码对我来说完全没有意义.
Mik*_*han 14
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
Run Code Online (Sandbox Code Playgroud)
在此代码中发生的事情是,您将此时的加速度乘以过滤因子0.1,然后将其添加到上次更新被0.9调用时的过滤加速度.
这几乎是获得新值并将其添加为总accelX的10%,其他90%由前一个值组成,前一个值取决于之前的值,这取决于之前的值,依此类推.这会削减高频值,因为只允许10%的任何更改进入新的accelX值.
KFilteringFactor为0.1使得该滤波器可以切断所有高频.您肯定希望通过更改此值来尝试以适合您的特定应用程序.
| 归档时间: |
|
| 查看次数: |
11731 次 |
| 最近记录: |