Poprzednio przybliżyłem teorię związaną z filtrem Kalmana oraz na przykładzie pokazałem reakcję filtru na zmiany poszczególnych parametrów.
Teraz zajmę się czymś bardziej praktycznym. Na podstawie danych pomiarowych z akcelerometru i żyroskopu postaram się zaprojektować filtr Kalmana dla układu śledzącego orientację robota w przestrzeni.
Wartością, którą będę śledził jest orientacja robota wyrażona jako kąt na płaszczyźnie xy w trójwymiarowym, kartezjańskim układzie współrzędnych. Do dyspozycji mam żyroskop mierzący prędkość kątową wokół trzech osi x, y i z, a także akcelerometr mierzący przyspieszenie liniowe również w trzech osiach x, y i z.
Żaden z tych czujników nie mierzy bezpośrednio położenia kątowego. Dlatego będę musiał posłużyć się przekształceniami matematycznymi. Pomiar kąta położenia wyciągnę z pomiarów akcelerometru. Dane z żyroskopu posłużą natomiast do korekcji.
Zakładam, że jedyną siłą działającą na akcelerometr jest grawitacja. Wektor siły grawitacji rozkłada się na trzy składowe odpowiadające poszczególnym osiom układu współrzędnych. Można go również przedstawić za pomocą współrzędnych sferycznych r, ϕ, θ (patrz rysunek). Kąt ϕ można obliczyć z wzoru:
Wektor w układzie współrzędnych przedstawiony za pomocą współrzędnych prostokątnych i sferycznych.
Cechą charakterystyczną żyroskopów jest tak zwany dryft. Jest to rodzaj błędu pomiarowego kumulującego się z czasem. Jeżeli zostawimy czujnik nieruchomo, mierzona wartość będzie stopniowo oddalać się od zera. Pomiar z żyroskopu ωg można więc zapisać jako suma rzeczywistej prędkości kątowej ω i aktualnej wartości dryftu g:
Wyprowadzenie modelu stanowego
W modelu stanowym obiektu zastosujemy pewien trik.
Dryft żyroskopu potraktujemy jako jedną ze zmiennych stanu, którą będziemy estymować. Tak więc nasz model będzie składać się z dwóch zmiennych stanu - położenia kątowego robota i dryftu żyroskopu. Położenie kątowe w danej chwili czasu składa się z położenia w poprzedniej chwili czasu i wpływu prędkości kątowej w bieżącym cyklu próbkowania. Można to zapisać jako:
Z tych równań otrzymujemy następujący model stanowy:
Przekształcenia danych pomiarowych
Plik data2.txt zawiera dane pomiarowe z żyroskopu i akcelerometru. Zostały one zebrane przez mikrokontroler STM32 przy pomocy programu opublikowanego w drugiej części artykułu o filtrach alfa-beta. Wartości są przedstawione w słowach bitowych.
% Pierwszy pomiar sluzy nam jako wartosc poczatkowa dla filtru
xpost=[acc_angle;0];
else
% aktualizacja czasu
xpri=A*xpost+B*u;
Ppri=A*Ppost*A' + V;
% aktualizacja pomiarow
eps = Y(i) - C*xpri;
S = C*Ppri*C'+W;
K=Ppri*C'*S^(-1);
xpost = xpri + K*eps;
Ppost = Ppri - K*S*K';
end
%Zapis estymaty do wektora wynikow
Yf(i)=xpost(1);
end
plot(t,Y,'b',t,Yf,'r','LineWidth',1.5)
title('Filtr Kalmana')
xlabel('Czas')
ylabel('Sygnal mierzony')
legend('Wartosc mierzona','Wartosc estymowana')
Wynik symulacji został przedstawiony na wykresie. Poszczególne wariancje dobierałem metodą prób i błędów. Jak widać, filtr reaguje na skokowe zmiany z niewielkim opóźnieniem i ignoruje szpilki. Inne właściwości filtru można uzyskać zmieniając macierz kowariancji V.
Wyniki symulacji.
Podsumowanie
W tej części cyklu przedstawiłem sposób projektowania filtru Kalmana dla rzeczywistego układu. Najpierw przeanalizowałem dane odczytywane z czujników i dokonałem przekształceń. Następnie wyprowadziłem model stanowy badanego obiektu. Ostatnią fazą była implementacja filtru.
Jak widać w kodzie, implementacja filtru zajmuje 7 linijek i składa się z działań na macierzach.
W kolejnej części zajmiemy się implementacją filtru na STM32.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...