私は現在、レーザースキャナーを備えたポイントロボットに拡張カルマンフィルターを実装する必要がある学校のプロジェクトに取り組んでいます。ロボットは、回転半径0度で回転し、前進することができます。すべての動作は区分的に線形です(駆動、回転、駆動)。
私たちが使用しているシミュレーターは、加速をサポートしていません。すべての動きは瞬時です。
また、ローカライズする必要のある既知のマップ(PNG画像)もあります。レーザースキャンをシミュレートするために、画像のレイトレースを行うことができます。
私のパートナーと私は、使用する必要があるモーションモデルとセンサーモデルについて少し混乱しています。
これまでのところ、状態をベクトルとしてモデル化しています。
次のように更新式を使用しています
void kalman::predict(const nav_msgs::Odometry msg){
this->X[0] += linear * dt * cos( X[2] ); //x
this->X[1] += linear * dt * sin( X[2] ); //y
this->X[2] += angular * dt; //theta
this->F(0,2) = -linear * dt * sin( X[2] ); //t+1 ?
this->F(1,2) = linear * dt * cos( X[2] ); //t+1 ?
P = F * P * F.t() + Q;
this->linear = msg.twist.twist.linear.x;
this->angular = msg.twist.twist.angular.z;
return;
}
初期化を忘れてP
ゼロになり、修正が行われなかったことに気づくまでは、すべてが機能していると考えていました。まだシステムにノイズを導入していないため、伝搬は非常に正確でした。
モーションモデルでは、Fに次の行列を使用しています。
その更新式のヤコビアンとして。これは正しいです?
Pを初期化する方法があるもう1つの問題。1、10、100を試したところ、マップが50x50だけの場合、ロボットはすべて(-90、-70)の位置にロボットを配置しません。
私たちのプロジェクトのコードはここにあります:https : //github.com/en4bz/kalman/blob/master/src/kalman.cpp
アドバイスは大歓迎です。
編集:
この時点で、基本的な動きのノイズでフィルターを安定させることができましたが、実際の動きはありません。ロボットが動き始めるとすぐに、フィルターは非常に速く発散し、マップを終了します。