Obecnie pracuję nad projektem dla szkoły, w którym muszę wdrożyć rozszerzony filtr Kalmana dla robota punktowego ze skanerem laserowym. Robot może się obracać z promieniem obrotu 0 stopni i jechać do przodu. Wszystkie ruchy są częściowo liniowe (napęd, obrót, napęd).
Symulator, którego używamy, nie obsługuje przyspieszenia, cały ruch jest natychmiastowy.
Mamy również znaną mapę (obraz PNG), w której musimy się zlokalizować. Możemy naświetlić ślad na obrazie w celu symulacji skanów laserowych.
Mój partner i ja jesteśmy trochę zdezorientowani co do modeli ruchu i czujników, których będziemy musieli użyć.
Do tej pory modelujemy stan jako wektor .
Używamy równań aktualizacji w następujący sposób
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;
}
Myśleliśmy, że wszystko działa, dopóki nie zauważyliśmy, że zapomnieliśmy zainicjować Pi że było zero, co oznacza, że nie nastąpiła korekta. Najwyraźniej nasza propagacja była bardzo dokładna, ponieważ nie wprowadziliśmy jeszcze hałasu do systemu.
Dla modelu ruchu używamy następującej macierzy dla F:
Jak to jest jakobian z naszych formuł aktualizacji. Czy to jest poprawne?
W przypadku modelu czujnika przybliżamy jakobian (H), biorąc skończone różnice w robotach , i pozycje i ray tracing na mapie. Rozmawialiśmy z TA, który powiedział, że to zadziała, ale nadal nie jestem pewien. Nasz prof jest nieobecny, więc nie możemy go niestety zapytać. Używamy 3 pomiarów laserowych na krok korekty, więc H to 3x3.
Innym problemem jest to, jak zainicjować P. Wypróbowaliśmy 1,10 100 i wszyscy umieszczają robota poza mapą w (-90, -70), gdy mapa ma tylko 50 x 50.
Kod naszego projektu można znaleźć tutaj: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Wszelkie porady są mile widziane.
EDYTOWAĆ:
W tym momencie filtr ustabilizował się przy podstawowym hałasie ruchu, ale bez rzeczywistego ruchu. Gdy tylko robot zacznie się poruszać, filtr rozbiega się dość szybko i wychodzi z mapy.