Şu anda lazer tarayıcılı bir nokta robotu için genişletilmiş bir Kalman Filtresi uygulamam gereken okul projesi üzerinde çalışıyorum. Robot 0 derece dönüş yarıçapı ile dönebilir ve ileri doğru sürülebilir. Tüm hareketler parçalı doğrusaldır (sürücü, döndürme, sürücü).
Kullandığımız simülatör hızlanmayı desteklemiyor, tüm hareketler anlık.
Ayrıca, yerelleştirmemiz gereken bilinen bir haritaya (png resmi) sahibiz. Lazer taramalarını simüle etmek için görüntüde iz bırakabiliriz.
Ortağım ve ben, kullanmamız gereken hareket ve sensör modelleri konusunda biraz kafamız karıştı.
Şimdiye kadar devleti bir vektör olarak modelliyoruz .
Güncelleme denklemlerini aşağıdaki gibi kullanıyoruz
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;
}
Başlatmayı unuttuğumuzu P
ve sıfır olduğunu fark edene kadar her şeyin çalıştığını düşündük , yani hiçbir düzeltme olmadı. Görünüşe göre yayılımımız çok hassastı çünkü henüz sisteme gürültü getirmedik.
Hareket modeli için F için aşağıdaki matrisi kullanıyoruz:
Bizim güncelleme formülleri Jacobian olarak. Bu doğru mu?
Sensör modeli için, robotların sonlu farklarını alarak Jacobian'a (H) yaklaşıyoruz , ve haritadaki konumlar ve ışın izleme. Bunun işe yarayacağını söyleyen TA ile konuştuk, ancak yine de olacağından emin değilim. Profesörümüz uzakta, maalesef ona soramayız. Düzeltme adımı başına 3 lazer ölçümü kullanıyoruz, böylece H 3x3'tür.
P'nin nasıl başlatılacağına dair diğer bir sorun 1,10,100'ü denedik ve hepsi sadece harita 50x50 olduğunda robotu haritanın dışına (-90, -70) yerleştirdiler.
Projemizin kodu şu adreste bulunabilir: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Herhangi bir tavsiye büyük beğeni topluyor.
DÜZENLE:
Bu noktada filtreyi temel hareket gürültüsü ile stabilize olacak şekilde aldım, ancak gerçek hareket yok. Robot hareket etmeye başlar başlamaz filtre oldukça hızlı bir şekilde ayrılır ve haritadan çıkar.