Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

Filtr Alfa – Beta od teorii do praktyki – #1

Programowanie Teoria 21.08.2014 GandalF

abZadaniem 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.

Nawigacja serii artykułów:
następna część »

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.

Filtr alfa – beta zawarty jest w czterech linijkach kodu:

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.

Jest to wpływ zwiększenia parametru beta.

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ępna część »

Powiadomienia o nowych, darmowych artykułach!

Komentarze

Marooned

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.

Treker
Administrator

12:52, 21.08.2014

#2

Parsowanie poprawione ;)

sjacek

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?

Hudyvolt

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.

GAndaLF

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

michalw57

18:41, 12.09.2014

#6

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

admunt1

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

FORBOT Damian Szymański © 2006 - 2017 Zakaz kopiowania treści oraz grafik bez zgody autora. vPRsLH.