基本的なカルマン フィルター

b0638c8e5d39a8010a53479afaa08ba8.png

来源:古月居 深度学习初学者
本文约1500字,建议阅读5分钟本文介绍了卡尔曼滤波的基本原理。

原理

カルマン フィルターは、基本的な予測測位アルゴリズムです。原理は非常にシンプルで理解しやすいです。中心となるプロセスは図で説明できます。

bbacae1b84e0fdd64f83a8f5e34cdda5.jpeg

本質的には、これら 2 つの状態プロセスを繰り返すことで、徐々に正確に位置を特定します。

予測:現在の状態環境下で、次の期間 t の位置について計算される推定値。

更新:より多くのセンサーがより正確な位置情報を取得し、現在の予測位置を更新します。つまり、予測誤差を修正します。

なぜセンサーデータを更新する必要があるのか​​と疑問に思われるかもしれません。現実世界ではセンサーに多くのノイズ干渉があるため、センサー データを完全に信頼することはできません。カルマン アルゴリズムは線形計算とガウス分布に依存していますが、一次元位置決めを使用したアルゴリズムの実装を紹介します。

35403e8faabf575666fd2b02c60626f8.jpeg

b7a9c52ccd0bdf860a7f57a7bd044b2d.png

次に更新しますが、予測後にセンサーデータを取得すると、現在のセンサーは車の位置が26の位置にあるはずであることを示しています。前回の予想よりも良かったです。さあ、そのとおりです。

したがって、分散は当然比較的小さくなりますが、最終的には、車の実際の位置がセンサー データに近くなり、分散が小さくなり、よく考えてみると非常に明確になると考えられます。比較的信頼性の高いデータにより、車の位置に対する私の自信は確実に高まります。

この期間 t 後の自動車の位置の最終更新は、以下の図の赤いガウス ダイアグラムです。

5bb07ed5c63aee16a5bcd175998b667e.jpeg

このように移動して更新し続けると、最終的には車の位置がどんどん正確になっていきます。

一次元モデルでのカルマン公式:

予測する

66d515dd7ad6a30ecf9b92cd12a21630.jpeg

更新する

ad5c5dd7a5e03dfbdcde7b9fe3c6a923.jpeg

38f3a4ac52122998e1a1e742fecd4ea0.jpeg

参照コード:

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

編集者: 王晶

d71d6a627246054b52469f47b5a0faca.png

おすすめ

転載: blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/131566215