まず、カルマンフィルターを作成するのはこれが初めてです。
私は以前、次の質問を投稿しました。この投稿の背景を説明しているStackOverflowで、ノイズと速度値からの変動を除外します。これは私がフィルタリングしようとしている値の典型的なサンプルです。ここでは、必ずしも減少する必要はありません。しかし、変化率は通常、このようなものです
X ------- Y
16 --- 233.75
24 --- 234.01
26 --- 234.33
32 --- 234.12
36 --- 233.85
39 --- 233.42
47 --- 233.69
52 --- 233.68
55 --- 233.76
60 --- 232.97
66 --- 233.31
72 --- 233.99
このチュートリアルに従って、カルマンフィルターを実装しました:カルマンフィルター(ダミー用)。
私の実装は次のようになります(疑似コード)。
//Standard deviation is 0.05. Used in calculation of Kalman gain
void updateAngle(double lastAngle){
if(firsTimeRunning==true)
priorEstimate = 0; //estimate is the old one here
priorErrorVariance = 1.2; //errorCovariance is the old one
else
priorEstimate = estimate; //estimate is the old one here
priorErrorVariance = errorCovariance; //errorCovariance is the old one
rawValue = lastAngle; //lastAngle is the newest Y-value recieved
kalmanGain = priorErrorVariance / (priorErrVariance + 0.05);
estimate = priorEstimate + (kalmanGain * (rawValue - priorEstimate));
errorCovariance = (1 - kalmanGain) * priorErrVariance;
angle = estimate; //angle is the variable I want to update
} //which will be lastAngle next time
私は事前の推定値0から始めます。これは問題なく動作するようです。しかし、私が気づくのは、この更新が実行されるたびにkalmanGainが減少することです。つまり、フィルターを実行している時間が長くなるほど(?)、新しい値が信頼できるようになります。それは欲しくない。
私は移動平均(単純で指数加重)を使用するだけからこれを使用するようになりました。現在、私はそれほど良い結果を得ることができません。
私の質問は、これが適切な実装であり、以前のエラー分散と標準偏差が、投稿したサンプル値に従って適切に見えるかどうかです。私のパラメーターは、実際にランダムに選択されて、良い結果が得られるかどうかを確認しています。いくつかの異なる範囲を試しましたが、結果は良くありません。私ができる変更について何か提案があれば、本当にありがたいです。明らかな欠落があるとすいません。初めての投稿もこちら。