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ć P
i ż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.
źródło
Przede wszystkim nie wspomniałeś o tym, jakiego rodzaju lokalizacji używasz. Czy to ze znanymi lub nieznanymi korespondencjami?
Teraz, aby zdobyć Jakobian w Matlabie, możesz wykonać następujące czynności
Wynik
Rozszerzony filtr Kalmana wymaga, aby system był liniowy, a szum - Gaussa. System oznacza tutaj, że modele ruchu i obserwacji muszą być liniowe. Czujniki laserowe podają zasięg i kąt w kierunku punktu orientacyjnego z ramy robota, więc model pomiarowy nie jest liniowy. O
P
, jeśli założymy, że jest duży, to estymator EKF będzie początkowo słaby i opiera się na pomiarach, ponieważ poprzedni wektor stanu nie jest dostępny. Jednak gdy robot zacznie się poruszać i wykrywać, EKF będzie coraz lepszy, ponieważ wykorzystuje modele ruchu i pomiarów do oszacowania pozycji robota. Jeśli twój robot nie wykrywa żadnych punktów orientacyjnych, niepewność rośnie drastycznie. Musisz także uważać na kąt. W C ++cos and sin
, kąt powinien być w radianach. W kodzie nic nie ma na ten temat. Jeśli zakładasz szum kąta w stopniach podczas obliczania w radianach, możesz uzyskać dziwne wyniki, ponieważ jeden stopień jako hałas, podczas gdy obliczenia w radianach są uważane za ogromne.źródło