W poprzednim artykule przedstawiłem teorię dotyczącą filtrów alfa-beta. Wykonałem również symulacje w Matlabie demonstrujące wpływ nastaw na zachowanie filtru. Teraz przyszła pora na implementację filtru na mikrokontrolerze.
W projekcie wykorzystałem płytkę STM32F4 Discovery i moduł MiniIMU v2 od Pololu.
Zaimplementowana aplikacja wypisuje przez interfejs USART aktualne odczyty z żyroskopu we wszystkich trzech osiach oraz oszacowania prędkości kątowej wykonane za pomocą filtru alfa-beta. Aplikacja wykorzystuje system FreeRTOS na którym działają cztery wątki:
wątek odczytu danych z czujnika po I2C
wątek obliczający aktualne oszacowania filtru
wątek wypisujący dane przez interfejs USART
wątek diagnostyczny odpowiadający za inicjalizację pozostałych wątków i migający diodą w celu sprawdzenia czy aplikacja działa poprawnie.
Pomiary z czujnika wykonywane są co 100 ms. Do tej częstotliwości zostały dopasowane częstotliwości działania filtru i loggera wypisującego dane na USART.
Implementacja
Implementacja filtru alfa-beta jest bardzo prosta i składa się z 4 linijek kodu na każdą oś:
Dane z powyższej aplikacji zebrałem za pomocą programu RS Data Logger, a następnie przekonwertowałem na dane czytelne dla Matlaba. Wykorzystałem do tego prosty program napisanym w C (main.c w załączniku). W kolejnym kroku wygenerowałem wykresy wartości mierzonej i estymowanej dla wszystkich trzech osi:
Oś X
Oś y
Oś z
Analiza sygnałów
Sygnał z żyroskopu charakteryzuje się niewielkim zaszumieniem, a zmiany sygnału są dosyć gwałtowne. W takim wypadku dobrze zastosować dużą wartość parametru alfa, co oznacza upodobnienie sygnału odfiltrowanego do oryginalnego. Filtracja jest bardziej przydatna dla sygnałów o większym zaszumieniu.
Zobaczmy więc, jak filtr działa dla akcelerometru. Poniżej pomiary dla trzech osi dla parametru alfa=0.2 i beta=0.05:
Oś x
Oś y
Oś z
Podsumowanie
Tym razem widzimy pewne przeregulowania przy gwałtownych zmianach wartości, za to filtr dobrze radzi sobie z szumem.
Jak mieliśmy okazję się przekonać, filtr alfa-beta jest prostszą alternatywą dla filtru Kalmana.
Jego implementacja nie jest skomplikowana i zajmuje 4 linijki kodu. Strojenia dokonujemy za pomocą dwóch parametrów, gdzie najważniejszy jest parametr alfa.
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...