|
Zachodniopomorski Uniwersytet Technologiczny |
||||
Inteligentne Układy Sterowania |
|||||
Temat: Synteza neuronowego regulatora obiektu dynamicznego. (wahadło odwrócone) |
|||||
Emil Łobocki Michał Mania
|
Prowadzący: Dr Janusz Papliński |
Data oddania:
|
Ocena: |
Podpis: |
Witam panie doktorze, na wstępie chciałem bardzo przeprosić za tak późny termin, zarazem proszę o wyrozumiałość, ze względu na moją niedyspozycyjność (mieszkam za granicą).
Pierwsze sprawozdanie oddał mój kolega z grupy (widoczny u góry w tabelce), teraz robię to drugie osobiście zgodnie z umową, odnośnie części drugiej zadania, mieliśmy jej nie poruszać, gdyż nie przerabialiśmy jej na laboratorium i wykładach, lecz postaram się w miarę sił coś uwzględnić...
Model wahadła odwróconego, który powstał w simulinku:
Dane są bezpośrednio imporotwane do workspace w ustawieniach, z pominięciem pliku pmodel, co pozwala na szybkie ustawienie rządanych wartości.
Identyfikacja plików skryptowych appcs1 i appcs2.
Na początku appcs1 (jest to nielinowa identyfikacja obiektu i reguacji) i konfiguracja appcs1b, zmieniłem w dwóch plikach czas trwania z 4sekund na 6 aby zobaczyć dokładniejszą stabilizację i późniejsze ewntualne „piki”. Wartości początkowe zmieniamy w pliku appcs1b.
Poniżej standardowe ustawienia czyi 5 stopni wychylenia, krzywa radialna bez zmian czyli 0 (liniowa od samego początku), oraz siła również zerowa.
Wygląda to tak...
angle = 5 * deg2rad;
vel = 0*deg2rad;
force = 0;
Testujemy model dla sieci o 10 neuronach i maxymalnej liczbie literacji 300, lecz po 69 następuje adaptacja...
Otrzymujemy dla odpowiedzi wahadła:
Nie będe wklejał wykresów z otwartej pętli, orazu umieszczę różnicę odpowiedzi wahadła w stosunku do odpowiedzi pętli sterowania, która jest znakowana krzyżkami na wykresie:
Następnie dla tych samych warunków, lecz dla zamkniętej pętli sterowania:
Wniosek: Wyniki nie różnia się od poprzednio(może nie zauważalnie) ze względu na „dość” dobry dobór nastaw, oraz przyuczenia sieci...
Oczywiście wszystkie wyniki, oraz wykresy odnoszą się do stworzenia obiektu, testowania i przyuczenia go, nie do samego regulatora, gdyż to właśnie obiektem i jego wartościami wpływamy na regulator.
Teraz spróbujemy, dla większego kątu początkowego oraz zmienimy liczbę neuronów na trochę wiekszą, powiedzmy z 10 na 20....
Poniżej przedstawię tylko „czystą” odpowiedź wahadła, oraz porównanie odpowiedzi wahadła względem zamkniętej pętli sterowania, gdyż te wyniki najbardziej nas interesują.
Przedstawiam:
Kąt 45 stopni
angle = 45 * deg2rad;
vel = 0*deg2rad;
force = 0;
Oraz liczbę neuronów na 20
mnet.trainParam.show = 20; % Frequency of progress displays (in epochs).
mnet.trainParam.epochs = 300; % Maximum number of epochs to train.
mnet.trainParam.goal = (0.0037^2); % Mean-squared error goal.
Otrzymujemy:
Jak poprzednio zakończone po 69 lieteracjach.
Odpowiedź wahadła, widać zmieniony kąt początkowy, krzywej radialnej (obortowej) nie zmieniałem, gdyż podczas testowania obiektu mija się to z celem, zawsze będzie taka sama, dopiero przy regulacji obiektu.
Odpowiedź wahadła do zamkniętej pętli:
Wnioski:
Widzimy wyraźną róźnicę, prędkości obrotowej (radialnej) co jest oczywiście spowodowane innym kątem początkowym, dużo wyższym, przez co prędkość jest dużo łagodniejsza już po 2.5 sek trwania...
W obu przypadkach jest utrzymany rządany kąt przez nas.
3.
Teraz rozpatrzymy sieć, czyli obiekt i regulację dla linearyzacji ze sprzężeniem zwrotnym,
Również wykorzystamy do tego celu pomocniczy skrypt, odpowiednio wcześniej do tego przygotowany. Posłuży nam do tego appcs2 oraz appcs2b.
Tak samo jak wyżej czas zmieniony do 6 sekund z 4.
Sieć zawiera 4 warstwy oraz 5 neuronów, maxymalnie wykorzystuję do renowania 600 literacji i tyle wykorzystała, później zwiększymy ilość neuronów lecz nie znacznie, aby jej nie przeuczyć co jest częste przy sprzężeniu zwrotnym, gdysz ma zawsze poprzednie próbki i nie ma potrzeby na stosowanie dużej liczby neuronów, zwiększymy ilość literacji czy uda się przyuczyć ją do końca,ale to poźniej narazie wygląda to następująco:
Dość długi czas nauczania jest spowodowany, zmianą czasu z 4 na 6 sekunk, ale dla bezpieczeństwa i pewności warto tak zmienić i pozostawić.
Niżej rysunek:
Po wykonaniu nauczania, otrzymujemy wykres:
Perfekcyjna regulacja, znacznie szybsza od nieliniowej z poprzedniego zadania, oraz bardzej dynamiczna i łagodna przy tym. Przy podobnych parametrach (w poprzedniej sieci było 5 stopni, teraz tutaj mamy 10) bardzo szybki skok prędkości oborotowej, już po 2 sekundach następuje stabilizacjia do założonego kątu (90 stopni w tym przypadku) oraz prędkość radialna stabilizuje się do poziomu bliskiemu zeru, naturalnie gdybyśmy powiększyli wykres w okolicach zera oraz zwiększyli krok, zauważylibyśmy oscylacje w okolicach zera, gdyż regulator cały czas dąży do utrzymania założonego kątu wahadła.
Następnie nie zminiając parametrów sieci i regulatora, zmieniy mocno parametry początkowe.
Zwiększymy kąt początkowy na 45 stopni, lecz zmniejszymy prędkość oborotową, więc wyniki powinny być zbliżone do siebie.
To są przedziały wartości w jakich możemy zmieniać parametry:
% angle = [-10:40:190]*deg2rad;
% vel = [-90:36:90]*deg2rad;
% demand = [-180:40:180]*deg2rad;
% angle2 = [-10:10:190]*deg2rad;
Zmieniamy:
angle0 = 45*deg2rad;
vel0 = -20;
init_state = [angle0; vel0];
otrzymujemy:
Widzimy zatem, że wahadło prawidłowo zaeregowało w odwrotnym kierunku, co jest oczywiste, ze względu na prędkość obrotową w odrwotnym kierunku, po bardzo podobnym czasie okolo 2 sekund następuję stabilizacja, troszeczkę wychył ramienia zanim się ustabilizowało jest innymi, niż przewidywał regulator, lecz jest to spowodowane za malą siłą, poprzez ujemną wartość obrotową, oraz dość duży kąt wychyłu co normalnie jest zaletą, lecz nie tutaj przy użyciu innej prędkości obrotowej. Reasumując krzywe są poprawne, regulator bardzo dobrze sobie radzi z obiektem.
Teraz wrócimy do poprzedniej konfiguracji, czyli 10 stopni, lecz zmienimi liczbę neuronów na powiedzmy 15, oraz maksymalną liczbę literacji do 1200. Otrzymamy wówczas:
Proces uczenia przy 15 neuronach, zakończył się po 634 literacjach, gdyż został osiagnięty najniższy gradient bliski jedności. Jak zoabczymy niżej na wykresie, regulator działa poprawnie, bez większej zauważalnej róźnicy, jak przy przpadku wyżej.
Wnioski: jak już opisywałem we wcześniejszych wnioskach, ukł. regulacji ze sprzężeniem zwrotnym, zachowuję dużo dynamiczniej, szybciej oraz dużo pewniej niz w przypadku regulacji nieliniowej.
Wszystko widać na wykresach oraz wnioskach zamieszczonych wyżej.
Teraz przetestujemy program dedykowany, do tego ćwiczenia o nazwie mrefrobotarm, jest to dedykowany program do ramienia robota, który ma pokonać siły bezwładności, tak samo jak w przypadku wahadła, które badamy w naszym ćwiczeniu,
Wcześniej zaimportujemy do niego nasz gotowy model wahadła, przygotowany wcześniej pod simulinkiem.
Ogólny wygląd programu:
Okno konfiguracji regulatora:
Mieliśmy wykorzystać, nasz model wahadła, oraz jako pkt odniesienia funckję plinear.m którą wykorzystywaiśmy w poprzednim przykładzie.
Czyli na początku model wahadła pod simulinkiem:
Następnie patrzymy co zawiera funkcja plinear:
Interesuje nas tylko ten człon:
% CALCULATE DERIVATIVES
dangle = vel;
dvel = -9*angle - 6*vel + 9*demand;
ddemand = 0;
Musimy stowrzyć teraz model do tej funkcji lecz pod simulinkiem, wygląda on następująco:
Jak widać wszytkie wartości, nam się zgadzają. To będzie nasz pkt odniesienia.
Na razie zostawiamy ustawienia domyśle w programie i uruchamiamy proces uczenia, oraz patrzymy na wykres:
Jak widzimy, nałożyłem siatkę o skoku 3 sek na osi X, abyśmy mogli porównać lepiej wartości osiągane jak w zadaniu wyżej, gdyż własnie po tym czasie następowała stabilizacja. Jak widać wartości są niemalże identyczne. Osiągana wartość kąta jest generowana automatycznie co 10 sekund przez generator, oraz losowych wartości osiąganego kąta wahadła... z uwględnieniem czasu 9 sekund przez model odniesienia zbudowany pod simulinkiem, ze skryptu plinear.m czyli mamy jedno sekundową przerwę, abyśmy mogli dostrzeć ewentulane zaburzenia sterowania, które akurat tutaj nie występują.
Teraz zmienimy parametry nauczania regulatora, czyli ilość neuronów oraz warstwy, nie ruszamy wartości paramtrów maksymalnych i minimlanych , gdyż musielibyśmy odpowiednio budować nowy model odniesienia, co jest w tej chwili nam nie potrzebne i nie zrobiłoby to żadnej róznicy, gdyż własnie te parametry dobiera się pod model odniesienia.
W naszym regulatorze zmieniłem liczbę warstw ukrytych na 20, oraz w obiekcie na 10.
Po czym jest potrzeba wygenerowania danych uczących losowych dla naszego wahadła, zebrałem 1500 próbek, z deklarowanych wcześniej 10 000 ze wględu na skrócenie czasu, przerwaem proces i otrrzymałem
Trzy losowo wybrane próbki, do weryfikacji, widać bardzo dokładnie, że proces uczenia wystarczył w zupelności przy zachowaniu 1500 próbek, gdyż wyjścia wahadła i regulatora są identyczne, przy różnych danych wejściowych oraz nie powtarzających się błędach.
Nastepnie wykonujemy proces trenowania sieci:
Przy założonej przeze mnie wartości 600 literacji, wystarczyły zaledwie tylko 6 do pomyśłnej adaptacji, gdzie w poprzednim ćwiczeniu potrzebowaiśmy 634.
Generujemy dane dla naszego regulatora:
Następnie trenujemy nasz kontroler... wybrałem aż 30 segmentów, ze względu na dużą ilość warstw, dla bezpieczeństwa, aby nie doszło do „nie do trenowania”.
Podczas pracy wgląda to tak, a trwa dłużej niż 30 minut przy bardzo dobrej klasie komputera z dwu rdzeniowym procesorem. Około 1 minuty na każdy segmet w zależności na liczbę losowo wybranych epok.
Po skończonym trenowaniu mamy wyniki, które przedstawię niżej:
Widzimy dość spore błędy, ze wględu na mała liczbę wcześniejszych próbek, lecz musiałem się do takiej wartości ograniczyć ze względu na czas, który byłby potrzebny do większej ilości np. gdybym użył zamiast 1000 próbek, 10 000 każdy segment trwałby około 30 minut razy 30 segmentów to jest około 15 godzin potrzebnych na pełną adaptację. Gdybym ograniczył ilość segmentów, sieć napewno byłaby nie douczona, ze względu na dużą liczbę warstw.
Po ponownie przeprowadzonej symulacji wyniki:
WNIOSKI:
Niestety sieć, jednak jest nie douczcona, lecz gdybyśmy poczekali całe 15 godzin do zebrania pełnych próbek, sądzać po wykresie, sieć mogła by funkjonować co widać na wykresie, gdyż podąża dobrą „drogą”. Zyskalibyśmy na czasie stabilizacji, byłby znacznie krótszy, niż poprzednio co widać po bardzo szybkim i stromym zboczu narastających jak i opadających dla ujemnych wartości zadanych. Lecz mogły by się pojawić zniekształcenia, oraz drgania całego układu, co delikatnie widać na wykresie wyżej....
Odnosząc sie do powyższych metod, gdy nie zależy nam na jak najkrótszym czasie osiągniecia wartości zadanej, zdecydowanie lepszą, wygodniejszą metodą jest metoda nieliniowa, jest bardzo prosta i równie skuteczna, gdy zależy nam na większej dokładności, zastosujemy metodę z NN regulatorem, lecz potrzebnę są nam dokładniejsze dane o obiekcie, oraz musimy przeprwadzić długi i żmudny proces identyfikacji obiektu i regulatora.
KONIEC, mam nadzieję, że wystarczająco wyczerpałem temat.