来源:古月居 深度学习初学者
本文约1500字,建议阅读5分钟本文介绍了卡尔曼滤波的基本原理。
原理
カルマン フィルターは、基本的な予測測位アルゴリズムです。原理は非常にシンプルで理解しやすいです。中心となるプロセスは図で説明できます。
本質的には、これら 2 つの状態プロセスを繰り返すことで、徐々に正確に位置を特定します。
予測:現在の状態環境下で、次の期間 t の位置について計算される推定値。
更新:より多くのセンサーがより正確な位置情報を取得し、現在の予測位置を更新します。つまり、予測誤差を修正します。
なぜセンサーデータを更新する必要があるのかと疑問に思われるかもしれません。現実世界ではセンサーに多くのノイズ干渉があるため、センサー データを完全に信頼することはできません。カルマン アルゴリズムは線形計算とガウス分布に依存していますが、一次元位置決めを使用したアルゴリズムの実装を紹介します。
次に更新しますが、予測後にセンサーデータを取得すると、現在のセンサーは車の位置が26の位置にあるはずであることを示しています。前回の予想よりも良かったです。さあ、そのとおりです。
したがって、分散は当然比較的小さくなりますが、最終的には、車の実際の位置がセンサー データに近くなり、分散が小さくなり、よく考えてみると非常に明確になると考えられます。比較的信頼性の高いデータにより、車の位置に対する私の自信は確実に高まります。
この期間 t 後の自動車の位置の最終更新は、以下の図の赤いガウス ダイアグラムです。
このように移動して更新し続けると、最終的には車の位置がどんどん正確になっていきます。
一次元モデルでのカルマン公式:
予測する
更新する
参照コード:
#include <iostream>
#include <math.h>
#include <tuple>
using namespace std;
double new_mean, new_var;
tuple<double, double> measurement_update(double mean1, double var1, double mean2, double var2)
{
new_mean = (var2 * mean1 + var1 * mean2) / (var1 + var2);
new_var = 1 / (1 / var1 + 1 / var2);
return make_tuple(new_mean, new_var);
}
tuple<double, double> state_prediction(double mean1, double var1, double mean2, double var2)
{
new_mean = mean1 + mean2;
new_var = var1 + var2;
return make_tuple(new_mean, new_var);
}
int main()
{
//Measurements and measurement variance
double measurements[5] = { 5, 6, 7, 9, 10 };
double measurement_sig = 4;
//Motions and motion variance
double motion[5] = { 1, 1, 2, 1, 1 };
double motion_sig = 2;
//Initial state
double mu = 0;
double sig = 1000;
for (int i = 0; i < sizeof(measurements) / sizeof(measurements[0]); i++) {
tie(mu, sig) = measurement_update(mu, sig, measurements[i], measurement_sig);
printf("update: [%f, %f]\n", mu, sig);
tie(mu, sig) = state_prediction(mu, sig, motion[i], motion_sig);
printf("predict: [%f, %f]\n", mu, sig);
}
return 0;
}
編集者: 王晶