Jakiś czas temu, szukając informacji o filtrach, znalazłem film Chrisa Rosera mówiący w drugiej części o znajdowaniu rezonansów ramy wirnikowca przy pomocy analizy FFT danych, zarejestrowanych w czasie pracy silników pochodzących z akcelerometrów i żyroskopów. Bardzo mi się to spodobało i zapragnąłem mieć taką funkcjonalność w swoim autopilocie. Od kilku lat mam własną wersję szybkiej transformaty Fouriera, opracowaną podczas rozwoju niepublikowanego testera modelarskiego. Tak więc najważniejsze elementy składowe są gotowe i można złożyć je w całość. W swojej pierwszej wersji FFT pracowało na rdzeniu Cortex 3, a wykres drgań z wybranej osi akcelerometru wyświetlany był na wyświetlaczu 320×240 pikseli. Szerokość wyświetlacza, rozmiar dostępnej pamięci i wydajność kontrolera powodowały, że rozsądną szerokością FFT było 512 punktów, umożliwiającą na wizualizację uzyskanych 256 wyników na wyświetlaczu. Wtedy rozszerzyłem możliwość konfiguracji do 1024 punktów, co wymagało uśredniania danych, gdyż na jednym pikselu ekranu musiało się zmieścić 1,6 punktów wykresu. Teraz mam troszkę większy wyświetlacz 480×320, ale to wciąż mało. Mimo to zrobiłem wykres z FFT, na tym, co jest dostępne. Dane szersze niż szerokość wyświetlacza są uśredniane a węższe rozciągane, tak aby wypełnić całą roboczą część ekranu, gdyż część ekranu zajmuje skala.
Nowością, jaką podpatrzyłem u Chrisa, jest użycie wodospadu do prezentacji danych historycznych. Wstępnie zrobiłem wodospad przechowujący 100 pomiarów, bo tyle zmieściło mi się na ekranie. Ponieważ w APL3 mam dużo dostępnej pamięci i szybki kontroler, od razu liczę 6 FFT ze wszystkich osi akcelerometru i żyroskopu. Na wyświetlaczu, aby to było w miarę czytelne, jestem w stanie narysować maksymalnie 3 wykresy. Trochę gorzej jest z wodospadem, ale rozwiązałem to w ten sposób, że każda składowa RGB odpowiada jednej osi czujnika. Intensywność świecenia każdej składowej jest proporcjonalna do wyniku transformaty, więc jeżeli szum wszystkich osi jest zbliżony do siebie, to wodospad jest w odcieniach szarości, a gdy jedna z osi zaczyna dominować nad pozostałymi, pojawia się kolorowa poświata sygnalizująca dominację drgań w danej osi. Na fotografii ekranu powyżej jest to praktycznie niewidoczne ze względu na słabe odwzorowanie kolorów.
Mimo wszystko obserwacja wyniku jest dosyć trudna ze względu na niewielki rozmiar wyświetlacza i dosyć prosty sposób obrazowania, dlatego aż prosi się o przeniesienie danych do aplikacji na PC, wyświetlenie ich na dużym ekranie oraz użycie szerszej niż 8-bitowa skali koloru. Pierwsze podejście do problemu, będące poleceniem pobrania zebranych wcześniej danych, dało całkiem przyzwoity wynik, jednak takie narzędzie było trudne w obsłudze, gdyż zrobienie setki transformat zajmuje sporo czasu, a przesłanie ich portem szeregowym niewiele mniej. W tym czasie nic się nie dzieje, a nie każdy lubi długo czekać bez żadnego efektu. Finalnie zdefiniowałem nowy typ telemetrii, który ma za zadanie na bieżąco przenosić wyniki transformat do komputera naziemnego. Ta telemetria jest automatycznie uruchamiana razem ze startem FFT i kończy się po przesłaniu wszystkich danych. Kosztowało do dużo pracy, ale już jest gotowe. Zaletą tego podejścia jest brak konieczności obsługi, ale przede wszystkim to, że wyniki pojawiają się od razu i wszystkie wodospady budowane są na bieżąco. Na komputerze nie ma potrzeby umieszczać wszystkiego na jednym ekranie, więc każdy pomiar ma swój własny wykres.
Pierwotnie używana skala 8-bitowa słabo oddaje subtelności, więc obecnie używam przejścia między dwoma kolorami. Wśród kolorów podstawowych najlepiej wygląda przejście z niebieskiego do czerwonego. Po prostu oko jest bardziej czułe na zmianę koloru niż jego intensywność. Dodatkowo skojarzenie kolorów ciepłe-zimne ułatwia interpretację wyników. W programie pokazywanym na filmie jest możliwość przesuwania skali koloru. Tego jeszcze nie mam u siebie, ale jest to problem programistyczny. Po prostu nie potrafię utworzyć kontrolki z suwakiem w klasie widoku. Może kiedyś się nauczę.
Dlaczego to tak długo trwa?
Transformata Fouriera zamienia amplitudę sygnału w funkcji czasu na amplitudę w funkcji częstotliwości. Wynik transformaty jest o połowę mniejszy od ilości danych, z jakich jest ona liczona. Przykładowo, chcąc uzyskać wykres o szerokości 1024 punktów, trzeba poddać obróbce 2048 pomiarów. Maksymalna częstotliwość, jaką można przedstawić na wykresie FFT, to również połowa maksymalnej częstotliwości, z jaką rejestrowane są dane. Obecnie pętla główna autopilota pracuje z częstotliwością około 270 Hz. Na potrzeby FFT dołożyłem drugi pomiar czujników w pętli, więc generuję około 540 kompletów pomiarów na sekundę. Tak więc mogę zobrazować pełną częstotliwość pętli. To wciąż dosyć mało, ale według tego, co jest prezentowane na filmie, większość diagnozowanych problemów mieści się w tym zakresie. Autopiloty oparte na kontrolerach STM32H7 mają pętlę akwizycji czujników "fast loop" pracującą z częstotliwością 2 kHz, więc transformując tamte wyniki, można wyświetlić wykres częstotliwości do 1 kHz. Być może trzeba będzie pójść w tę stronę, ale nie chcę bezmyślnie kopiować rozwiązania. Chcę do tego dojść samodzielnie, skalując konkretne potrzeby i weryfikując, czy to ma sens.
Wracając do pomiaru: aby uzyskać wykres 1024 punktów, trzeba rejestrować dane przez 7,58 sekundy. Chcąc uzyskać wodospad ze 100 pomiarów, robi się z tego 758 sekund, czyli 12,6 minuty. Obliczenia też trochę trwają, ale robione są w tle, więc nie zajmują dodatkowego czasu. W tym czasie robione jest 100 pomiarów dla 6 czujników, każdy ma 1024 wyniki typu float. Daje to 2,4 MB danych, które trzeba przesłać do komputera. Przesłanie wyników z prędkością 115,2 kbps zajmie 3,5 minuty. Teraz łatwiej można zrozumieć, dlaczego zależało mi na zrównolegleniu procesu generowania i przesyłania danych.
Poszukiwanie rezonansu
Nieruchomy BSL ma swoje szumy, na transformacie których można zaobserwować częstotliwości o większym natężeniu zmian. Jeszcze do końca nie wiem, z czego to wynika. Jest to ciekawy materiał do przemyśleń. Jednak na transformacie zaczyna się dziać, gdy zostaną włączone silniki, gdyż to napęd produkuje większość drgań. Aby móc przejść przez cały zakres pracy silników, zrobiłem okno dialogowe konfiguracji procesu, w którym kolejne obliczenia FFT będą robione dla coraz to większych prędkości obrotowych silników. W oknie definiuję zakres wysterowania, gdyż podejrzewam, że może być potrzeba zrobienia pomiaru z normalnie założonymi śmigłami. Zbyt mocno wysterowany napęd będzie próbował odlecieć, a mocowanie go nie ma sensu, gdyż będzie tłumiło drgania. Z tego, co się zorientowałem, pomiary robi się ze śmigłami zamontowanymi w przeciwną stronę. Mają wtedy dużo mniejszą sprawność i dociskają BSP do ziemi. Jednak przewiduję, że nawet wtedy może zaistnieć potrzeba ograniczenia maksymalnego wysterowania. Drugim konfigurowalnym parametrem jest możliwość włączenia tylko wybranych silników. W ogólności rozbicie dużego zagadnienia na mniejsze części może ułatwić diagnostykę.
Uruchomienie takiego testu powoduje, że z każdym nowym FFT silniki zaczynają się kręcić trochę szybciej, począwszy od wysterowania minimalnego, aż do maksymalnego pomniejszonego o procentową wartość podaną jako zakres wysterowania silników. Akurat na biurku mam dosyć nietypową ramę, kupioną wiele lat temu jako ciekawostka. Nazywam ją „Drewnokopterem”, bo jest w całości wykonana ze sklejki o grubości 2 mm. Jest trochę zbyt delikatna do latania, ale ze względu na niewielkie rozmiary dobrze nadaje się jako biurkowy obiekt testowy.

Rama wyposażona jest w 4 silniki o wysokim KV, co nie jest korzystne dla FFT o niewielkim zakresie częstotliwości, ale na razie mam uruchomione tylko to. Niedługo powinien zostać uruchomiony Pentakopter, a tam powinno już być ciekawie :-).
Po wykonaniu testu bez śmigieł, skonfigurowanego jak pokazano na obrazku okna konfiguracyjnego, czyli FFT o szerokości 2048 punktów i narastaniu wysterowania dwóch przeciwległych silników do 80%, uzyskałem taki wynik, jak na obrazku niżej. Jeszcze nie mam automatycznej skali ani opisu osi, ale na osi X jest częstotliwość od zera do połowy częstotliwości próbkowania, czyli około 270 Hz. Oś Y to wyniki kolejnych FFT rosnące od góry do dołu. Im niżej, tym większe wysterowanie silników. Pierwsze 3 wykresy to osie X, Y i Z akcelerometru, kolejne 3 osie to żyroskop. Akcelerometr rejestruje, czy zamontowany na ramie autopilot, drgając, przemieszcza się liniowo wzdłuż osi, żyroskop rejestruje, czy drgając, obraca się wokół osi.

Widać, że rama zdecydowanie bardziej drży liniowo, niż się skręca, gdyż wykresy z akcelerometru są znacznie bardziej czerwone. Zielonymi ramkami zaznaczyłem występowanie trzech rezonansów. Najniższy jest widoczny tylko na żyroskopach. Kolejny, największy, jest widoczny na wszystkich czujnikach. Ostatni wyraźny jest widoczny głównie na akcelerometrach przy wyższym wysterowaniu, zwłaszcza na osi Y jest widoczny dopiero po osiągnięciu 2/3 wysokości wykresu. Jest ledwie dostrzegalny na żyroskopach. Ciekawa jest też obserwacja, że natężenie drgań nie zwiększa się wyraźnie wraz ze wzrostem prędkości. Natomiast jest zakres ok. 10–15% wysterowania, gdzie drgania są zdecydowanie najmniejsze. Na wszystkich sześciu czujnikach widać niebieski pasek niskich drgań. Już nie mogę się doczekać, kiedy będę mógł wstawić APL3 na jakąś inną ramę i porównać wyniki.
Na wodospadach Chrisa wyraźnie było widać grubą chmurę zwiększonej amplitudy drgań rosnącą wraz z prędkością obrotową. Tutaj obserwuję cienkie i wyraźne linie. Być może to nie jest częstotliwość główna silnika, tylko jej harmoniczne? Być może jest tak z powodu braku śmigieł, bo to jednak one swoimi niedoskonałościami wyważenia i nierównego ciągu generują większość drgań. Zupełną zagadką jest to, że te linie mają swój lustrzany odpowiednik. Gdy jedna linia opada od lewej do prawej, co wydaje się normalne, to druga. symetryczna do niej, narasta. Na wodospadzie o szerokości 1024 punktów (ten na zdjęciu wyświetlacza na samej górze) są dwie pary linii tworzące X na środku wodospadu. Na wykresie o szerokości 2048 punktów są dwa niezależne X. Pierwszy w okolicy 40% szerokości obrazu, drugi mniejszy w okolicach 70%. Są widoczne głównie na akcelerometrach, ale można je też dostrzec na żyroskopach. Być może to są jakieś artefakty wynikające z obliczeń lub niewłaściwej konfiguracji?
Nie ukrywam, że zrobiłem narzędzie, którego jeszcze nie bardzo rozumiem i dopiero uczę się, jak można go używać. Jeżeli ktoś ma doświadczenie w zakresie badania drgań i mógłby podpowiedzieć jakąś literaturę czy coś zasugerować, to byłbym bardzo wdzięczny.