1

次のスムージング機能を使用して、GPSからの速度の読み取りをスムージングしています。

void smoothing_init()
{
    k = 0;
    kalman_init(0.0625, 32, 1.3833094, 0);
}

void kalman_init(double _q, double _r, double _p, double intial_value)
{
    q = _q;
    r = _r;
    p = _p;
    x = intial_value;
}


double smoothing_add_sample(double measurement)
{
    p = p + q;
    k = p / (p + r);
    x = x + k * (measurement - x);
    p = (1 - k) * p;
    return x;
}

ただし、これにより、平滑化値700(通常の範囲は0〜150)が得られ、その後下がることがあります。ルーチンを0で初期化したが、すぐに0を超える読み取り値(たとえば、40、50)を受け取ったときに発生すると思います。

これらの関数を微調整して、このようなスパイクを自然に防止しながら、データをスムーズにできるようにするにはどうすればよいですか。

4

1 に答える 1

2

カルマンフィルターは推定器であり、線形システムのpシステム状態()の分散(コード内)を最小化します。x分散pは、の値に対する信頼度の尺度として解釈できますx

各タイムステップに対してk、フィルターは2つのステップを実行します。

  1. 予測ステップは、推定を1タイムステップ先に伝播します(あなたの場合、分散のあるゼロ平均ガウスノイズはx[k+1] = x[k] + w[k]どこにあるかによる)。ここでは、状態分散が。だけ増加することを意味します。w[k]qq
  2. フィルタリングステップには、測定情報が組み込まれます(分散のあるゼロ平均ガウスノイズはmeasurement[k] = x[k] + v[k]どこにあるかによる)。v[k]r

従来の推定の場合、問題pは非常に大きな値で初期化されます(初期値の信頼性はほとんどありませんx)。時間の経過pとともに、約の値に減少しますqpはに依存しないため、とmeasurementにのみ依存することに注意してください。q,rp[0]

微調整のために:

  • 大きいp、すなわちp/r>>0;で初期化します。の初期化値は実際には重要でxはありません。
  • r/qは、スムージングの強さを調整します(スムージングはr/q=0​​まったくありません)。
  • の大きさを選択するにはr,q、ガウスノイズを想定できます。その場合、95%の確率で、真の値はの信頼区間にあり[x-2*sqrt(p), x+2*sqrt(p)]ます。
于 2012-12-12T18:03:50.753 に答える