Logo FORBOT.pl - darmowe kursy elektroniki, Arduino, Raspberry Pi
Moduły GRINN w ofercie TME

Filtr Alfa – Beta od teorii do praktyki – #1

Filtr Alfa – Beta od teorii do praktyki – #1

Zadaniem czujników jest dostarczanie informacji o położeniu robota oraz innych obiektów.

Dane te są przekazywane do algorytmów sterowania. Sygnały z czujników obarczone są błędem. Aby uzyskać dokładniejsze informacje na temat stanu obiektu należy dokonać jego estymacji na podstawie danych pomiarowych.

Następny artykuł z serii »

Wstęp

Popularną metodą radzenia sobie z tym problemem jest filtracja Kalmana. Jest to statystycznie optymalna metoda estymacji stanu. Oznacza to, że dla zadanych parametrów pracy nie istnieje lepsze oszacowanie stanu obiektu. Jego implementacja wymaga jednak znajomości modelu stanowego obiektu oraz macierzy kowariancji błędów pomiarowych i procesowych, a także wykonania obliczeń na macierzach. Dlatego chciał bym zaproponować uproszczoną metodę mogącą jednak dawać bardzo dobre wyniki w praktyce.

O filtrze Alfa - Beta

Filtr Alfa - Beta opiera się na założeniu, że ruch obiektu można wyrazić za pomocą dwóch składowych stanu, gdzie jedna składowa jest pochodną drugiej. Wektor stanu składający się z wartości położenia oraz prędkości spełnia te założenia. Równania filtru mają postać:

wzory

Gdzie \widehat{y} to oszacowanie położenia, \widehat{v} to oszacowanie prędkości, y to zmierzone położenie, a \Delta Tto krok czasowy pomiędzy kolejnymi pomiarami.

Wyrażenie (t|t) oznacza wartość w aktualnej chwili czasu w oparciu o pomiar do aktualnej chwili czasu, (t+1|t) oznacza wartość w kolejnej chwili czasu w oparciu o pomiary do aktualnej chwili czasu, a (t|t-1) oznacza wartość w aktualnej chwili czasu w oparciu o pomiary do poprzedniej chwili czasu.

Algorytm dzieli się na fazę predykcji kolejnego stanu (dwa pierwsze równania) oraz korektę przewidywanej wartości w oparciu o pomiar (kolejne dwa równania). Parametry alfa i beta służą do strojenia filtru. Ich wartości należy zmieniać w zakresie od 0 do 1.

Implementacja

Aby zaprezentować działanie algorytmu w praktyce, napisałem prosty skrypt w Matlabie:

Sygnał mierzony, to sygnał losowy o wartości oczekiwanej 0 i wariancji 10. Po 5 sekundach następuje skok wartości oczekiwanej do 100.

Wyniki symulacji

Symulacja dla alfa = 0.1 i beta = 0.05 dała następujący rezultat:

a=0.1, b=0.05

a=0.1, b=0.05

Widzimy, że w początkowej fazie filtr wskazuje wartości zbliżone do zera, więc odporność na zakłócenia jest dobra. Problem zaczyna się po skoku wartości oczekiwanej. Możemy wtedy zaobserwować duże opóźnienie i przeregulowanie.

Strojenie

Kolejną symulację wykonałem dla wartości alfa = 0.1 i beta = 0.2:

a=0.1 b=0.2

a=0.1 b=0.2

W tym przypadku przeregulowanie jest zdecydowanie większe niż poprzednio. Dodatkowo widzimy, że odporność na duże skokowe zakłócenia w pierwszej fazie jest dużo gorsza niż poprzednio.

W następnej symulacji ustawiłem alfa = 0.7, beta = 0.05:

a=0.7 b=0.05

a=0.7 b=0.05

Widzimy, że wartości po odfiltrowaniu niewiele odbiegają od wartości mierzonych. Filtr ma przez to niewielką odporność na zakłócenia, ale za to szybko reaguje na skokowe zmiany sygnału.

W ostatniej symulacji ustawiłem alfa = 0.35, beta = 0.05:

a=0.35 b=0.05

a=0.35 b=0.05

Tym razem mamy gorszą reakcję na skokową zmianę sygnału niż poprzednio, jednak odporność na zakłócenia jest zdecydowanie lepsza.

Podsumowanie

Jak widać po przeprowadzonych symulacjach, małe wartości parametru alfa zapewniają dużą odporność na zakłócenia czujników kosztem zwolnionej reakcji na skokowe zmiany sygnału. Zwiększanie wartości alfa powoduje poprawienie czasu reakcji i pogorszenie odporności na zakłócenia. Parametrowi beta najlepiej przypisywać małe wartości. Jego zwiększanie powoduje obniżenie stabilności filtru.

W kolejnej części zajmiemy się praktyczną implementacją filtru alpha - beta na układzie z żyroskopem oraz mikrokontrolerem STM32.

Następny artykuł z serii »

alpha-beta, filtr, kalman, regulator

Komentarze

11:06, 21.08.2014 #1

Wkradł się drobny błąd - TeX nie przeparsował "widehaty" i "widehatv".

Co do strojenia to można by pewnie zastosować algorytm zmieniający α i β i badający średnią różnicę między wartościami oryginalnymi a przefiltrowanymi. Kod powinien zwrócić najlepsze parametry dla danego sygnału.

Administrator
12:52, 21.08.2014 #2

Parsowanie poprawione ;)

19:52, 21.08.2014 #3

A w czym to jest lepsze od prostych filtrów LP czy medianowych?

Jeśli jest znaczna różnica to czy mógłbyś porównać alfa-beta z czym innym?

22:15, 21.08.2014 #4

filtr LP czy medianowy wprowadza opóźnienie. wynik równań tych filtrów bazuje na próbkach z przeszłości i im większe tłumienie tym więcej tych próbek musi być, tym większe opóźnienie.

Ten filtr jest filtrem predykcyjnym, jak widać nawet we wzorze wylicza wartość dla czasu przyszłego bazując na wykrytych zmianach sygnału i parametrach alfa i beta.

23:40, 21.08.2014 #5

Marooned, sposób strojenia o którym mówisz to szukanie parametrów minimalizujących błąd średniokwadratowy na podstawie danych pomiarowych. Do problemu można też podejść bardziej teoretycznie i wyznaczyć optymalne parametry na podstawie wariancji: http://en.wikipedia.org/wiki/Alpha_beta_filter#Choice_of_Parameters

18:41, 12.09.2014 #6

W ostatniej linii wzoru akapitu: O filtrze Alfa – Beta wkradł się błąd zamiast y powinno być v.

20:31, 29.01.2015 #7

Testowałem w Simulinku filtr Alfa Beta na przykładzie przebiegów nieokresowych (chaotycznych).

Wartości Alfa / Beta dobierałem doświadczalnie.

Tłumienie oscylacji było widoczne przy małych wartościach Beta. Były to rzędy mikro w stosunku do Alfy jak przykładowo:

Alfa=7*10^(-3); Beta=3*10^(-6);

Jak można rozwiązać problem strojenia filtra np. z użyciem wariancji aby kontrolować Alfę w zależności od Bety ?

Zobacz powyższe komentarze na forum

Dodaj komentarz