8

まだ BigNerdRanch iOS Development book にあります。

加速度計の章では、最初に加速度計の追跡を実装しますが、かなり不安定です。次に、元のコードを変更してローパス フィルターを適用することを提案します。

- (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];
}

これに:

- (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];
}

かなり単純な質問: これらの値はどこから取得するのでしょうか? ドキュメントを調べたところ、次のコードを示唆するローパス フィルターに関する情報が見つかりました。

   #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.
}

ただし、最初にそのコードを試してみたところ、(アプリを分析して)「「*」の左の値はガベージ値です」というエラーが発生しました。加速度計の追跡も機能しませんでした。

これらの値が何を意味するのか、私はかなり混乱しています。たとえば、コードの最初の部分で、なぜ加速値を 10 倍するのでしょうか? 「より大きな」動きを得るには?私はそれをある程度理解することができましたが、ローパス フィルターを使用した 2 番目のコードはまったく意味がありません。

4

2 に答える 2

15
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));

このコードで起こっていることは、現時点での加速度にフィルタリング係数 0.1 を掛けてから、最後に更新が呼び出されたときのフィルタリングされた加速度に 0.9 を加えていることです。

これはほとんど新しい値を取得し、合計 accelX の 10% として追加します。残りの 90% は、その前の値に依存する以前の値で構成され、それはその前の値に依存します。これにより、変更の 10% のみが新しい accelX 値に適用されるため、高周波値がカットされます。

KFilteringFactor が 0.1 の場合、このフィルターはすべての高周波をカットします。特定のアプリケーションに合わせてこの値を変更して、実験することをお勧めします。

于 2012-02-10T18:55:39.960 に答える
2

あなたは Big Nerd Ranch Book に取り組んでいるので、Book のディスカッション フォーラムに進むことをお勧めします。

詳細については、ウィキペディアのローパス フィルターに関する記事を参照してください。

フィルタリングの別の例については、Apple のAccelerometerGraphの例をご覧ください。

また、kFilteringFactor を 0.2 にすると、現在の値の乗数が 0.8 (1 - 0.2) になり、0.2 x 10 であるため、新しい値の乗数は 2.0 になると考えてください。

妥当な値を与えるための倍率は 10 だと思います。

于 2011-08-04T13:54:10.257 に答える