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.
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ć:
Gdzie y^ to oszacowanie położenia, v to oszacowanie prędkości, y to zmierzone położenie, a ΔT to 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:
MATLAB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
% Parametry symulacji
dt=0.1;
t_end=10;
t=0:dt:t_end;
% Parametry filtru
alfa=0.1;
beta=0.05;
Y=zeros(1,size(t,2));
Yf=Y;
ypri=0;
ypost=0;
vpri=0;
vpost=0;
fori=1:size(t,2)
ifi<50
Y(i)=10*randn(1);
else
Y(i)=10*randn(1)+100;
end
ypri=ypost+dt*vpost;
vpri=vpost;
ypost=ypri+alfa*(Y(i)-ypri);
vpost=vpri+beta*(Y(i)-ypri)/dt;
Yf(i)=ypost;
end
plot(t,Y,'b',t,Yf,'r','LineWidth',1.5)
title('Filtr alfa-beta')
xlabel('Czas')
ylabel('Sygnal mierzony')
legend('Wartosc mierzona','Wartosc estymowana')
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:
MATLAB
1
2
3
4
ypri=ypost+dt*vpost;
vpri=vpost;
ypost=ypri+alfa*(Y(i)-ypri);
vpost=vpri+beta*(Y(i)-ypri)/dt;
Wyniki symulacji
Symulacja dla alfa = 0.1 i beta = 0.05 dała następujący rezultat:
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
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
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
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.
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...