background image

 

Zachodniopomorski Uniwersytet 

Technologiczny 

Inteligentne Układy Sterowania

 

T

EMAT

:

 

S

YNTEZA NEURONOWEGO REGULATORA OBIEKTU DYNAMICZNEGO

.

 

(

WAHADŁO ODWRÓCONE

)

 

Emil Łobocki 

Michał Mania 

 

Prowadzący: 

Dr Janusz Paplioski 

D

ATA ODDANIA

 

O

CENA

P

ODPIS

 

Witam panie doktorze, na wstępie chciałem bardzo przeprosid za tak późny termin, zarazem proszę o 
wyrozumiałośd, ze względu na moją niedyspozycyjnośd (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 poruszad, gdyż nie 
przerabialiśmy jej na laboratorium i wykładach, lecz postaram się w miarę sił coś uwzględnid... 

 
 
 

1.  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. 
 
 
 

2.  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 zobaczyd dokładniejszą 
stabilizację i późniejsze ewntualne „piki”. Wartości początkowe zmieniamy w pliku appcs1b. 

background image

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: 

 

 

background image

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śd” 
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;

 

background image

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 zakooczone po 69 lieteracjach. 
 
Odpowiedź wahadła, widad 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. 

 

 

background image

 
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śd jest dużo łagodniejsza już po 2.5 sek 
trwania... 
W obu przypadkach jest utrzymany rządany kąt przez nas. 
 

3. 
Teraz rozpatrzymy sied, 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. 
 
Sied zawiera 4 warstwy oraz 5 neuronów, maxymalnie wykorzystuję do renowania 600 literacji i tyle 
wykorzystała, później zwiększymy ilośd neuronów lecz nie znacznie, aby jej nie przeuczyd 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śd literacji czy uda się przyuczyd ją do kooca,ale to 
poźniej narazie wygląda to następująco: 
 
Dośd długi czas nauczania jest spowodowany, zmianą czasu z 4 na 6 sekunk, ale dla bezpieczeostwa i 
pewności warto tak zmienid i pozostawid. 
 
Niżej rysunek: 

background image

 

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śd 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śd oborotową, więc wyniki 
powinny byd zbliżone do siebie. 

background image

To są przedziały wartości w jakich możemy zmieniad 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śd 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śd obrotową, 
oraz dośd 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: 

background image

 

Proces uczenia przy 15 neuronach, zakooczył 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 widad na wykresach oraz wnioskach zamieszczonych wyżej. 
 

4.  Teraz przetestujemy program dedykowany, do tego dwiczenia o nazwie mrefrobotarm, jest 

to dedykowany program do ramienia robota, który ma pokonad siły bezwładności, tak samo 
jak w przypadku wahadła, które badamy w naszym dwiczeniu, 
Wcześniej zaimportujemy do niego nasz gotowy model wahadła, przygotowany wcześniej 
pod simulinkiem. 
 
Ogólny wygląd programu: 

background image

 

Okno konfiguracji regulatora: 

 

 
Mieliśmy wykorzystad, 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;

 

 
 
 

background image

Musimy stowrzyd teraz model do tej funkcji lecz pod simulinkiem, wygląda on następująco: 

 

Jak widad 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ównad lepiej wartości 
osiągane jak w zadaniu wyżej, gdyż własnie po tym czasie następowała stabilizacja. Jak widad 
wartości są niemalże identyczne. Osiągana wartośd 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 dostrzed ewentulane 
zaburzenia sterowania, które akurat tutaj nie występują. 
 
Teraz zmienimy parametry nauczania regulatora, czyli ilośd neuronów oraz warstwy, nie 
ruszamy wartości paramtrów maksymalnych i minimlanych , gdyż musielibyśmy odpowiednio 
budowad 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. 

background image

 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, widad 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: 

background image

 

 
Przy założonej przeze mnie wartości 600 literacji, wystarczyły zaledwie tylko 6 do pomyśłnej 
adaptacji, gdzie w poprzednim dwiczeniu potrzebowaiśmy 634. 
 
Generujemy dane dla naszego regulatora: 

 

 
 

background image

Następnie trenujemy nasz kontroler... wybrałem aż 30 segmentów, ze względu na dużą ilośd 
warstw, dla bezpieczeostwa, 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 skooczonym trenowaniu mamy wyniki, które przedstawię niżej: 

 

Widzimy dośd spore błędy, ze wględu na mała liczbę wcześniejszych próbek, lecz musiałem 
się do takiej wartości ograniczyd 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śd 
segmentów, sied napewno byłaby nie douczona, ze względu na dużą liczbę warstw. 
 
 
 

background image

Po ponownie przeprowadzonej symulacji wyniki: 

 

 
WNIOSKI: 
Niestety sied, jednak jest nie douczcona, lecz gdybyśmy poczekali całe 15 godzin do zebrania 
pełnych próbek, sądzad po wykresie, sied mogła by funkjonowad co widad na wykresie, gdyż 
podąża dobrą „drogą”. Zyskalibyśmy na czasie stabilizacji, byłby znacznie krótszy, niż 
poprzednio co widad po bardzo szybkim i stromym zboczu narastających jak i opadających dla 
ujemnych wartości zadanych. Lecz mogły by się pojawid zniekształcenia, oraz drgania całego 
układu, co delikatnie widad 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 przeprwadzid długi i żmudny proces identyfikacji obiektu i regulatora.  
 
KONIEC, mam nadzieję, że wystarczająco wyczerpałem temat.