W zeszłym tygodniu cały świat mówił o Elonie Musku i o SpaceX, a wszystko za sprawą startu rakiety Falcon Heavy, który odbył się 6 lutego 2018. Największe wrażenie na wszystkich wywarło synchroniczne lądowanie dwóch bocznych rakiet. Przy okazji – wiecie, że SpaceX wcale nie wykonało takiego lądowania jako pierwsze? New Shepard firmy Blue Origin należącej do Jeffa Bezosa było wcześniej, tylko widocznie mają gorszy marketing. Dzięki studiowaniu automatyki mogłem od razu docenić kunszt inżynierów projektujących system sterowania. Postaram się wytłumaczyć z jakimi problemami musieli się zmierzyć. To tylko króciutkie wprowadzenie do ogromnego tematu jakim jest teoria sterowania, więc będę stosował pewne uproszczenia. Ale na początek polecam obejrzeć jeszcze raz nagranie z lądowania.
https://www.youtube.com/watch?v=u0-pfzKbh2k
Odwrócone wahadło
Okazuje się, że zadanie stabilizacji wychylenia rakiety to bardziej rozbudowana wersja popularnego problemu akademickiego – odwróconego wahadła. Na czym on polega? Mamy wózek poruszający się po linii prostej, do którego przymocowany jest pręt, który może się swobodnie obracać. Chodzi o to, aby tak sterować położeniem wózka, żeby pręt ustawiony pionowo do góry nie spadł.
Zamiast sterowania automatycznego możemy sami pobawić się w regulator odwróconego wahadła i utrzymywać np. kij od szczotki na ręce:
Aby rozwiązać to zadanie najpierw należy wyprowadzić model matematyczny obiektu korzystając z równań sił i momentów na niego działających. Następnie dla wyznaczonego modelu należy zaprojektować regulator sterujący siłą przyłożoną do wózka tak, aby utrzymywać zadany kąt. Musimy tutaj zmierzyć się z kilkoma problemami.
Po pierwsze układ jest nieliniowy – pojawiają się funkcje trygonometryczne związane z kątem wychylenia. Sterowanie nieliniowym obiektem jest bardzo skomplikowane, ponieważ nie możemy wtedy stosować metod analitycznych i jedyne na czym polegamy to optymalizacja numeryczna. Co więcej ciężko sprawdzić jakość takiego sterowania – po raz kolejny nie można używać wzorów, trzeba bazować tylko na danych pomiarowych. Aby oszczędzić sobie tych problemów, układ się linearyzuje, aby był adekwatny dla małych kątów wychylenia od pionu.
Po drugie układ jest niestabilny. Jeżeli zostawimy go samemu sobie, wahadło zawsze opadnie. Przez to sterowanie jest trudniejsze i możemy dojść do sytuacji, gdzie wahadło jest w takim położeniu, z którego nie jesteśmy w stanie uratować go przed upadkiem. Wózek posiada jakąś maksymalną prędkość, która może nie być wystarczająca aby przywrócić wahadło w stan równowagi. Zainteresowanym sterowaniem układów niestabilnych polecam świetny artykuł Guntera Steina, gdzie tłumaczy zagadnienie na przykładzie analizy katastrofy w Czarnobylu i sterowania myśliwcami ponaddźwiękowymi.
Dokładne omówienie problemu odwróconego wahadła można znaleźć tutaj, albo w instrukcjach laboratoryjnych na każdej polskiej politechnice. Już tak postawione zadanie jest dosyć trudne i wielu studentów na nim poległo. Dobrzy inżynierowie potrafią sobie jednak z nim poradzić i osiągają fajne efekty:
Jednak problem stabilizacji rakiety jest o wiele trudniejszy. Do naszego modelu matematycznego dochodzą jeszcze takie efekty jak wiatr, siła Coriolisa, opór aerodynamiczny, czy zmiana masy na skutek wypalania paliwa. Poza tym podczas stabilizacji rakieta spada w dół z bardzo dużą prędkością. Same równania ruchu rakiety uwzględniające te wszystkie czynniki są na tyle skomplikowane, że ich wyprowadzenie w tym dokumencie zajmuje kilkadziesiąt stron.
Wyznaczanie trajektorii
Stabilizacja wychylenia rakiety to jedno, ale ostatecznym celem jest jednak zatrzymanie jej pionowo w dokładnie wyznaczonym miejscu. Rakieta nie tylko musi do niego dotrzeć, ale również w odpowiednim momencie wytracić całą prędkość. Jest to zadanie wyznaczania trajektorii dla zadanych warunków początkowych i końcowych. Realizuje się je za pomocą metod sterowania optymalnego.
Zasada działania jest następująca – algorytm korzystając z modelu matematycznego i aktualnego stanu obiektu (pozycji, przyspieszenia, wychylenia kątowego itp.) dla każdej chwili czasu od teraz do zadanego momentu w przyszłości (nazywanego horyzontem predykcji) wylicza wartości sterowania (czyli w tym wypadku ciągu silników odrzutowych) od teraz do końca horyzontu stosując optymalizację numeryczną. Do procedury optymalizacji wprowadzamy ograniczenia takie jak maksymalny ciąg, maksymalna zmiana ciągu pomiędzy iteracjami (zmiana od 0 do maksa trwa więcej niż jedną iterację), maksymalne dozwolone wychylenie rakiety itp. Do sterowania bierzemy wyliczoną wartość dla aktualnej chwili czasu. Pozostałe sterowania są odrzucane i w kolejnej iteracji znowu wykonujemy optymalizację. Dzięki temu możemy lepiej reagować na zmianę warunków, czy niedokładności modelu i urządzeń wykonawczych. Zasadę działania regulatora obrazuje schemat.
Taki algorytm jest bardzo kosztowny obliczeniowo – w każdej iteracji wykonujemy optymalizację. Ważne jest więc, aby czas wykonania jednej pętli był krótszy niż okres próbkowania układu. Okres próbkowania z kolei musi być wystarczająco krótki, aby system mógł szybko podjąć wymagane działania. Jeśli na przykład wyłączymy silniki po 10 sekundach to z rakiety może już nie być co zbierać.
Algorytmy zastosowane przez SpaceX
Udało mi się dotrzeć do kilku artykułów, gdzie pracownicy SpaceX i NASA opisują swoje postępy dotyczące algorytmów lądowania w zadanym miejscu. Poza lądowaniem na Ziemi takie algorytmy są też potrzebne na przykład do lądowania na Marsie w pobliżu obiektów, z których łazik miałby pobrać próbki dodatkową trudnością jest wtedy brak dokładnej nawigacji, jaką zapewnia na Ziemi GPS. Najlepszym źródłem wiedzy była strona domowa Larsa Blackmore, szefa zespołu SpaceX odpowiedzialnego za algorytmy GNC (Guidance Navigation and Control).
W artykule Autonomous Precision Landing of Space Rockets (strona 15) możemy przeczytać ogólnie o wyzwaniach i osiągnięciach w dziedzinie lądowania rakiet. Możemy na przykład dowiedzieć się, jak zmieniają się niepewności pozycji rakiety Falcon w poszczególnych fazach lotu.
Po starcie niepewność się zwiększa głównie na skutek działania wiatru i po wyjściu z atmosfery się stabilizuje. Podczas zawracania rakiety na Ziemię jest możliwość zmniejszenia niepewności, która następnie ponownie rośnie podczas wchodzenia w atmosferę ziemską. W ostatniej fazie lotu uruchamiane są silniki, aby ostatecznie skierować rakietę w wyznaczone miejsce.
Algorytm wykorzystywany w ostatniej fazie nazywa się G-FOLD i można o nim przeczytać tutaj. Artykuł jest bardzo ogólnikowy i nie dowiemy się z niego żadnych szczegółów technicznych. Więcej informacji znajdziemy za to w kolejnym artykule, wypełnionym w całości wzorami i symulacjami. Algorytm minimalizuje odległość od celu, a następnie znajduje trajektorię minimalizującą zużycie paliwa. W obliczeniach pomaga generator kodu w C dla problemów optymalizacji funkcji wypukłych dostępny tutaj. Znalazłem również na GitHubie przykładową implementację. A na youtube można zobaczyć testy polowe algorytmu wykonane przez NASA.
Dlaczego nie machine learning?
Dla osób nie znających teorii sterowania problem lądowania rakiety może wydawać się idealny do zastosowania sztucznej inteligencji. Stosując deep learning możemy przecież poradzić sobie bez dokładnego matematycznego modelu, poza tym sieć nauczy się reagować również na nieprzewidziane sytuacje. Dodatkowo jest to w ostatnim czasie gorący temat.
Z punktu widzenia teorii sterowania uczenie maszynowe to tak naprawdę połączenie metod identyfikacji i sterowania optymalnego. Podobnie jak w przypadku metod identyfikacji sieć jest uczona za pomocą danych testowych dzięki czemu tworzy swój własny model procesu. Poza tym w procesie uczenia minimalizowana jest jakaś funkcja kosztów, więc sieć wykonuje pewien rodzaj optymalizacji.
Problem polega na tym, że ten wyuczony model oraz strategia optymalizacji nie są do końca znane i nie mogą być kontrolowane przez człowieka. Ciężko więc stwierdzić, że wystąpił błąd i należy interweniować. Co więcej takie sterowanie nie może być sprawdzone za pomocą analitycznych miar jakości.
Kolejna kwestia to samo uczenie sieci. Oczywiste względy finansowe uniemożliwiają uczenie na rzeczywistym obiekcie, dlatego musi ono zachodzić w środowisku symulacyjnym. A żeby zasymulować warunki, w jakich działa rakieta musimy dysponować modelem matematycznym dobrze odzwierciedlającym rzeczywistość. Jakość sterowania sieci będzie ściśle zależeć od jakości modelu użytego w symulacjach. Czyli cały zysk związany z brakiem potrzeby modelowania zostaje utracony. Co więcej, jeżeli w sterowaniu optymalnym otrzymujemy optymalne sterowanie dla zadanych parametrów, to mamy matematyczny dowód, że w tych warunkach nie da się rozwiązać tego problemu lepiej.
Znalazłem jednak również publikację dotyczącą zastosowania reinforcement learningu do rozwiązania tego problemu.
Podsumowanie
Problem lądowania rakiety jest bardzo skomplikowany, ale i niezwykle ciekawy. Jego złożoność sprawia, że jest doskonałym sposobem zaprezentowania różnych zagadnień teorii sterowania. Po odpowiednim uproszczeniu i rozbiciu na mniejsze części mógłby być świetnym materiałem dydaktycznym dla studentów automatyki. Ja sam będąc na studiach, szczególnie na początku, miałem problem ze znalezieniem motywacji do nauki, bo przykłady na zajęciach wydawały mi się nieprzydatne w praktyce. Powiązanie trudnych zagadnień z ciekawym, wziętym z życia, problemem na pewno by pomogło.
26 lutego 2018 at 18:19
Czytałem z ogromnym zaciekawieniem
26 lutego 2018 at 18:43
Fajna publikacja. Pozdrawiam.
26 lutego 2018 at 19:55
A co ze sterowaniem rozmytym? W przypadku użycia tego rozwiązania nie trzeba mieć modelu obiektu. Są jakieś konkretne powody, dla których nie stosuje się tego typu sterowania w takich skomplikowanych układach?
27 lutego 2018 at 16:24
Sterownik rozmyty tutaj się nie nadaje, ponieważ potrzebne jest określenie przyszłej trajektorii do osiągnięcia punktu docelowego. Sterowniki rozmyte są dużo prostsze i nie mają takich możliwości. Nadają się raczej do zastępowania układów sterowania ręcznego, gdzie operatorzy posiadali pewną empiryczną wiedzę o układzie trudną do wyrażenia wzorami.
27 lutego 2018 at 22:31
Dzięki!
28 lutego 2018 at 20:45
Bardzo ciekawie napisany post.
18 marca 2022 at 08:22
Fajny artykuł i napisany w ciekawy sposób.