Upload
others
View
68
Download
1
Embed Size (px)
Citation preview
1
LUCRARE DE LICENTA
Aplicatie grafica pentru controlul unui pendul
dublu neliniar
Absolvent
Alexandru Stefan
Coordonator
Asist.Ing. Dr. Valentin Tanasa
Bucuresti, 2013
Cuprins:
2
Capitolul 1: Introducere ................................................................................................................................ 4
Capitolul 2: Modelul matematic, modelare neliniara ..................................................................................11
2.1. Prezentare generala .....................................................................................................................11
2.2. Studiul problemei .........................................................................................................................12
2.3. Exemplificare ................................................................................................................................20
2.4. Tipuri de frecari ............................................................................................................................22
Capitolul 3: Controlul sistemului (strategii de comanda) ............................................................................24
3.1. Strategii de control ............................................................. Ошибка! Закладка не определена.
3.2. Aspecte preliminare ............................................................ Ошибка! Закладка не определена.
3.3. Proiectarea schemei de control ...................................................................................................28
3.4. CLF (Controler de Logica Fuzzy)....................................................................................................29
Capitolul 4: Aplicatie ....................................................................................................................................34
4.1. Continutul aplicatiei ..........................................................................................................................34
4.2. Sistemul de ecuatii ............................................................................................................................34
4.3. Metoda Dormand-Prince ..................................................................................................................35
4.4. Interfata .............................................................................................................................................36
Capitolul 5: Concluzii ....................................................................................................................................38
Anexa A: Codul aplicatiei ..............................................................................................................................39
A.1. Controler Fuzzy .................................................................................................................................39
A.2. Pendulul invers ..................................................................................................................................43
A.3. Pendulul invers dublu .......................................................................................................................46
A.4. Starea sistemului ...............................................................................................................................49
A.5. Metoda Dormand-Prince ..................................................................................................................50
A.6. Engine-ul aplicatiei: ...........................................................................................................................51
Anexa B: Interfata aplicatiei .........................................................................................................................54
B.1. Pendulul simplu .................................................................................................................................54
B.2. Pendulul dublu ..................................................................................................................................54
3
Bibliografie ...................................................................................................................................................55
4
Capitolul 1: Introducere
Scopul acestei lucrari este de a realiza o aplicatie grafica interactiva prin
intermediul carora studentii sa poata dezvolta si testa tehnici de control liniar sau neliniar
pentru sisteme de tip pendul invers. Sistemele de tip pendul sunt sisteme mecanice simple dar cu
dinamici neliniare si care sunt dificil de stabilizat. Sunt multe exemple din natura sau industrie
care se pot explica pe baza analogiilor cu un system de tip pendul. Prin urmare aceste sisteme
sunt adeseori folosite atat in scop educativ cat si in cercetare pentru a se ilustra concepte
specifice.
Aceasta aplicatie grafica este dedicata studiului unui pendul simplu sau a unui pendul
dublu invers cu carucior. Aplicatia permite simularea traiectoriilor unui asemenea pendul, avand
cunoscute setul de conditii initiale. De asemenea lucrarea permite implementarea de legi de
comanda potrivite.
În acestă lucrare sunt derivate ecuaţiile de mişcare pentru un pendul invers multiplu.
Sistemul pendulului este mai general şi include frecări de tip neliniar pentru a se potrivi
diverselor aplicaţii inginereşti. Ecuaţiile generalizate sunt dezvoltate în sistemul de coordonate
absolut folosind tehnicile lui Lagrange, apoi o transformare liniară simplă se propune pentru a
obţine setul de ecuaţii neliniare în sistemul de coordinate Devanit-Hartenberg.
1.1 Aspecte preliminare stabilizare sisteme de pendul invers
Stabilizarea sistemelor de pendul invers reprezinta o metodă aplicată in majoritatea
ariilor de control. Importanţa si frecvenţa analizelor acestor sisteme este definită de faptul că
acestea reprezintă mai multe aspecte. Sistemul de pendul invers este necostisitor si poate fi
construit si instalat cu usurinta in laboratoare in scop educational sau pentru activitatile de
cercetare.
Acestea sunt dezvoltate pentru a dezvolta teorii de control si algoritmi, intrucat sunt
in analogie cu numeroase sisteme din viata reala.
Un propulsor de racheta la lansare poate fi simulate ca un pendul invers cu o singura
conexiune rigida montat pe un carucior mobil. Studiul unui sistem cu trei conexiuni poate
5
contribui la dezvoltarea unor masini de locomotive bipede deoarece aceasta poate fi considerat un
model simplificat al omului stand intr-un picior. Sistemul de pendul invers cu multiconexiuni
poate fi tratat ca o aproximare bidimensionala pentru manipulatoare de roboti cu capacitate de
control redusa. Din cauza ca aceste sisteme sunt foarte instabile, multi-variabile si prezinta
neliniaritati care nu pot fi neglijate date de structura lor dinamica si fortele de frecare, pendulul
inversat este adeseori utilizat in obtinerea performantelor simularilor si in validarea tehnicilor de
control.
Figura 1.1 Lansare racheta Apollo 11 – exemplu pendru pendul simplu
Figura 1.2. Robot umanoid Asimo – exemplu pentru pendul dublu
6
In continuare, bazat pe lucrarea Eltohamy si Kuo (1999) s-a preluat studiul
bibliografic legat de controlul sistemelor de pendul invers care este redat in continuare.
Lucrarile publicate legate de stabilizarea si controlul sistemelelor de tip pendul invers
simplu, dublu si triplu pot fi separate in doua categorii principale:
Lucrari de cercetare care se bazeaza in totalitate pe simulari computerizate in
vederea validarii abordarilor;
Lucrari experimentale care investigheaza incertitudinile fizice cauzatoare de
aparitia unor diferente de performanta substantiale intre rezultatele simularii
pe computer si implementarile de control in timp real.
Dintre aceste lucrari care dezbat stabilizarea pendulului invers cu o conexiune bazat
pe simulari computerizate Chung si Litt (1986) au folosit o tehnica de estimare de tipul least
squares recursiva pentru a identifica dinamicile sistemului. Un controller de raspuns autoreglabil
si adaptiv utilizeaza aceasta informatie pentru a stabiliza sistemul in vederea starii de echilibru
verticale instabile. Un controller de raspuns PD (proportional si derivativ) este de asemenea
conceput pe baza modelului dinamic liniarizat al sistemului. Comparatia simularilor
computerizate a ambelor controllere, decalajele unghiulare initiale, perturbatiile de tip treapta si
sinusoidale dovedesc perfomanta superioara a primului controller. In locul rezolvarii unei
probleme neliniare cu doua puncte limita prin calculul variational, Andersin si Grantham (1989)
combina minimizarea functiei cu metoda de stabilitate Lyapunov si o aplica unui pendul neliniar
cu o singura conexiune pentru a produce un controller de raspuns optimal.
O constrangere asupra cuplului de control il limiteaza la mai putin de cuplul gravitational
al modelului. Simularile computerizate promit rezultate de succes si un controller care aduce
aproape toate traiectoriile la puncte de stabilitate.
Henders si Soudak (1992) studiaza comportamentul sistemului anterior cu ajutorul
unui controller liniar prin analiza planului de faza. Acestia au dezvaluit existenta atractoarelor cu
doua stari in sistem. Primul bazin de atractie este de o forma complexa si intindere limitata. Cu
toate astea sistemul de control creaza un punct stabil pentru acest atractor la originea planului de
faza. Al doilea atractor este un ciclu cu limita stabila si trage toate starile de sistem din afara
bazinului primului atractor. Pentru sistemele de pendul invers cu doua conexiuni Sahba (1983)
formuleaza criteriul de stabilitate al sistemului ca o constrangere de inegalitate infinit
dimensionala pentru a folosirea metodei Lyapunov.
7
Pentru a obtine stabilitate asimptotica, functia Lyapunov a sistemelor neliniare
permite incrementarea pe interval scurt in locul descresterii continue de-a lungul traiectoriilor de
stare. In final Sinha si Joseph (1994) utilizeaza transformarea Lyapuno-Floquet pentru a reduce
sistemul de pendul invers cu trei conexiuni variant in timp, fara carucior mobil, la o forma
potrivita pentru aplicatia metodelor de control invariante in timp. Tehnicile lor rezulta intr-un
model de controller simulat pe computer prin trei intrari de control. Cu toate acestea majoritatea
tehnicilor dicutate anterior sunt dificil de implementat deoarece formei controllerelor care duc in
timp real la un volum de calcul extensiv.
Pe de alta parte in experimentele in timp real un pendul invers cu o singura conexiune
poate fi stabilizat in starea verticala de echilibru instabil folosind un controller PD simplu. Mori
et al. (1976) a extins asta la modelul unui controller complex pentru a aduce la pozitie verticala
un pendul cu o conexiune si a-l mentine acolo. In primul rand un controller de tipul feedforward
este folosit in timpul perioadei de balans spre pozitia verticala apoi un regulator analog de tipul
observator pentru stabilizarea dinamica proiectat folosindu-se plasamentul polilor care este
activat in faza de stabilizare.
O tehnica mai simpla este folosita de Smith si Blackburn (1992). Acestia supun
pivotul pendulului la oscilatii verticale de frecventa inalta si obtin stari inversate stabile. Ostertag
si Carvalho – Ostertag (1993) compenseaza fortele de frecare din sistem folosind un compensator
fuzzy, apoi dezvolta un controller fuzzy stabil. De aici inainte, un controller de raspuns de stare
este folosit in concordanta cu un intrerupator de prag constant ca o compensare a frecarii.
Rezultatele de la ambele controllere sunt comparabile. Cu toate astea, controllerul de logica fuzzy
arata o stabilizare usor mai buna.
Pentru sistemele de pendul dublu invers care sunt mai complicate controllerul poate fi
proiectat liniarizand modelul sistemului si gasind un regulator care minimizeaza un index de
performanta patratica. Furuta el al. (1978) si Zu-ren et al. (1984) folosesc controllere de stare
analogice pentru a stabiliza astfel de sisteme in experimente. Zu-ren et al. (1987) a folosit un
controller digital care da o mai buna stabilizare. Maletinsky et al. (1981) nu masoara unghiul
conexiunii secundare in mod direct si tot reusesc sa controleze pendulul dublu invers intr-o
pozitie stabila. Un sistem cu doua conexiuni pe o sine inclinata este de asemenea controlat de
Furuta et al.(1980).
8
Desi toate controllerele in timp real listate mai sus pentru pendulul invers dublu sunt
proiectate linear, ele difera in filosofia care se afla in spatele deciziilor luate de catre regulator si
tipul de observatori folositi.
Problema mai dificila a stabilizarii unui pendul invers triplu in experimente a fost
studiata de Furuta et al. (1984), Meier zu Farwyg si Unbehauen (1990), Medrano-Cerda (1997)
and Eltohamy si Kuo (1997, 1998). In primele doua lucrari problema este simplificata prin
folosirea a doua motoare pentru a furniza intrari de control si controllere sunt din nou proiectate
prin minimizarea indexului de performata patratic bazat pe modele liniarizate ale sistemelor lor.
Cu toate astea sistemul triplu conectat al lui Furuta nu include un carucior mobil. In schimb
conexiunea de la baza este ascunsa la sol si controlabilitatea sistemului este incrementata fixand
bare orizontale pe conexiuni pentru a le incrementa inertia inertia si a facilita controlul. Desi
Meier zu Farwig si Unbenhauen au implementat un sistem care nu include un carucior mobil un
alt doilea motor este localizat in apropierea conexiunii de sus pentru a incrementa inertia si a
asigura cupluri stabilizatoare pentru conexiunile mijlocii si de sus. In Medrano-Cerda (1997) un
pendul invers triplu fixat pe un carucior care se poate misaca orizontal este stabilizat in pozitia
verticala folosind un singur actuator, adica, un motor DC care conduce caruciorul. In Eltohamy si
Kuo (1997-1998) un pendul invers triplu similar cu cel folosit in Medrano-Cerda (1997) este de
asemenea stabilizatfolosind o singura intrare pentru control. Trebuie de asemenea mentionat ca
un observator de ordin redus este folosit in Medrano-Cerda (1997) pentru a reconstrui acele
variabile de stare care nu sunt direct masurate. Pe de alta parte toate variabilele de stare sunt
furnizate direct de senzori digitali cu zgomot foarte redus, in Eltohamy si Kuo (1997-1998).
Din rezultatele experimentelor in timp real raportate in aceste lucrari se pare ca
stabilitatea unui sistem de control de tip feedback pentru pendul invers cu mai multe conexiuni
poate fi afectat foarte puternic de urmatorii factori:
1. Zgomotul in timpul masuratorilor care poate fi ocolit prin mai multe metode.
Prima metoda, se pot folosi filtre de zgomot desi adauga complexitate
sistemului. Observatori pot sa fie de asemenea folositi pentru a estima unele
din stari fara zgomot. Cu toate astea rata de testare a unui sistem de control
de multe ori depinde de tipul de observator folosit datorita extra
computatiilor necesare pentru ecuatiile observatorului. O solutie alternativa
este sa foloseasca senzori digitali aproape lipsiti de zgomot. Eltohamy si Kuo
9
(1997-1998). Astfel de senzori pot avea mase comparabile cu ale
conexiunilor.
2. Incertitudini care se manifesta in mare parte in coeficientii de frecare.
Estimand valorile acestora prin date experimentale si modelare, efectul lor
asupra sistemului poate fi vizualizat in simulare. Desi amelioreaza modelul
sistemului unii din termenii de frecare nu pot fi liniarizati deci nu au o
influenta directa asupra proiectarii regulatorului liniar.
3. In Eltohamy si Kuo (1997-1998) s-a gasit ca viteza de rotatie inalta a
conexiunii de top a unui pendul invers triplu poate afecta foarte mult efectul
de control prin saturarea amplificatorului analog. Aceasta poate fi depasita
redistribuind masa conexiunii de top pentru a cobori centrul de greutate mai
aproape de punctul pivotului.
Cu toate acestea pana acum, aceste probleme practice nu au fost adresate suficient in
lucrarile de cercetare precedente care se bazeaza pe simulare computerizata. Pentru a face
rezultatele care au fost cercetate pe baza simularii pe computer mai substantiale, acesti factori ar
trebui de asemenea inclusi in aceste simulari folosite in cercetarea controlului pentru pendulul
invers. In Larcombe (1991-1992) ecuatiile de miscare pentru un pendul invers multiplu sunt
formulate in sisteme de doua coordonate bazate pe presupuneri de distributie a masei in
conexiuni uniforme si fara frecare. Primul este sistemul de coordonate absolut in care unghiurile
conexiunilor sunt calculate tinand cont de pozitia pe verticala. Al doilea sistem de coordonate se
numeste Devanit-Hartenberg sau sistemul de coordonate alternativ, care este o metoda standard
pentru descrierea sistemelor kinematice a manipulatoarelor robotice. Larcombe si Torsney (1992)
au gasit o formulare matematica pentru enumerarea si identificarea starilor de echilibru ale
sistemelor de pendul multiplu. Intr-o alta lucrare Larcombe (1993) a aplicat manipularea
algebricii simbolice ecuatiilor dinamice liniarizate de bucla deschisa ale sistemului de pendul
dublu si au computat simbolic ecuatia sistemului caracteristic si polilor in bucla deschisa ca
functii ale parametrilor sistemului (masa, lungime, etc.).
Dupa cum am indicat mai sus modelele de sistem hardware folosite in majoritatea
experimentelor in timp real in general au distributie de masa a conexiunilor neuniforma datorita
folosirii actuatoarelor, a senzorilor si alte consideratii. De asemenea existenta frecarii poate afecta
performanta oricarui proiect de control al sistemului intr-un mod semnificativ. Cu toate astea
ecuatiile de miscare furnizate de Larcombe (1991-1992) pentru un sistem general de pendul
10
invers multiplu nu contin in mod explicit acesti factori. In plus, ecuatiile lui Larcombe, desi
elegante din punct de vedere matematic nu sunt scrise in mod direct in termeni de parametri
fizici, cum ar fi masa si lungimea conexiunilor.
In aceasta lucrare o formulare mai generala a ecuatiilor de miscare pentru un sistem
de pendul invers multiplu va fi aratata. Ecuatiile derivate aici sunt formulate in termeni de
parametri fizici ca cei din Tabelul 1 de mai jos si pot fi folositi in mod direct cu scopul simularii
computerizate. Includ factori cum ar fi ajustarea locatiilor centrelor de gravitate pentru conexiuni
plus modele de frecare vascoasa si Coulomb.
11
Capitolul 2: Modelul matematic, modelare neliniara
2.1. Prezentare generala
Consideram un pendul bidimensional cu n conexiuni montat pe un carucior mobil,
dupa cum este aratat in figura 1. Caruciorul este miscat orizontal de forta ±𝐹(𝑡). Nomenclatura
sistemului este data in tabelul 1.
Tabel 1. Nomenclatura sistemului
Simbol Descriere
M Masa carutului.
mi Masa conexiunii i.
li Distanta de la cea mai joasa conexiune la centrul de gravitate al conexiunii i.
Li Lunigimea totala a conexiunii i.
μi Unghiul conexiunii i fata de pozitia verticala.
gi Unghiul relativ dintre conexiunea (i + 1) si conexiunea i.
r Pozitia carutului fata de referintat.
Ii Momentul de inertie al conexiunii i.
cr Coeficientul de frecare vascoasa intre carut si sina.
ci Coeficientul de frecare vascoasa al conexiunii .
¹r Coeficientul dee frecare Coulomb intre carut si sina.
¹i Coeficientul de frecare al conexiunii i.
Conexiunile se presupun ca sunt rigide in formularile ce urmeaza. Pentru un astfel de sistem este
nevoie de n + 1 ecuatii. Modelul matematic este construit folosind metoda lui Lagrange
(Greenwood 1988) dupa cum urmeaza:
12
Figura 1 Pendul invers multi-link
(1)
𝑑
𝑑𝑡 𝜕𝑇
𝜕𝑞𝑗 −
𝜕𝑇
𝜕𝑞𝑗+𝜕𝑉
𝜕𝑞𝑗= 𝑈𝑗 𝑗 = 1,… , 𝑛 + 1 ,𝑈 = [𝐹, 0,0,… ,0]𝑇
Unde T si V sunt energia cinetica si respectiv potentiala ale sistemului. Starile sistemului,
q, depind de sistemul de coordonate ales. Daca unghiurile conexiunilor sunt masurate in
concordanta cu pozitia verticala starile vor fi:
(2)
𝑞 = (𝑟 𝜃1 …𝜃𝑛)𝑇
2.2. Studiul problemei
Furuta et al. (1980) a sugerat ca frecarile dintre carucior si sinele acestuia si cele dintre
conexiuni sunt o combinatie de frecari Coulomb si frecari vascoase. Coeficientii de frecare se pot
afla minimizand diferenta dintre raspunsurile experimentelor in timp real si modelelor simulate.
Efectul frecarii vascoase care amortizeaza pentru un sistem cu un coeficient de libertate n, este
prin forta totala de amortizare care actioneaza asupra sistemului si este egala cu - 𝑐𝑖𝑗𝑞𝑖𝑛
𝑖=1
unde 𝑐𝑖𝑗 sunt coeficientii de amortizare. Amortizarea este inclusa in ecuatia lui Lagrange prin
13
Functia de disipare Raleigh, D=1
2 𝑞𝑖𝑞𝑗
𝑛𝑗=1
𝑛𝑖=1 . Pentru sisteme care se disipeaza D este o forma
patratica semidefinita sau definita, pozitiva, a velocitatilor si este egala cu o jumatate din rata de
disipare a energiei mecanice instantanee a sistemului. Pentru a acomoda nevoia de variatie a
masei de distributie in sistemul hardware centrul de gravitate pentru fiecare conexiune nu va fi
presupus a fi in mijloc, i.e. 𝑙𝑖 ≠1
2𝐿𝑖 in tabelul 1. Folosind masuratoarea absoluta a unghiurilor,
energia de disipare cinetica, potentiala si de frecare sunt dupa cum urmeaza.
Energia cinetica:
(3)
𝑇 =1
2 𝐼𝑖𝜃𝑖
2 + 𝑚𝑖
𝑛
𝑖=1
∗ 𝑑
𝑑𝑡 𝑟 + 𝐿𝑘 sin 𝜃𝑘 + 𝑙𝑖sin(𝜃𝑖)
𝑖−1
𝑘=𝑖−𝑛
2
+ 𝑑
𝑑𝑡 𝐿𝑘 cos 𝜃𝑘 + 𝑙𝑖cos(𝜃𝑖)
𝑖−1
𝑘=𝑖−𝑛
2
+1
2𝑀𝑟′2
Energie potentiala:
(4)
𝑉 = 𝑚𝑖𝑔 𝑙𝑖cos(𝜃𝑖 + 𝐿𝑘cos(𝜃𝑘)
𝑖−1
𝑘=𝑖−𝑛
𝑛
𝑖=1
Energia de disipare:
(5)
𝐷 =1
2 𝑐𝑖(𝜃𝑖 − 𝜃𝑖−1)2
𝑛
𝑖=1
+1
2𝑐𝑟𝑟
′2
Ecuatiile Lagrange ale sistemului sunt date dupa cum urmeaza:
14
(6)
𝑈𝑗 =
𝑑
𝑑𝑡 𝜕𝑇
𝜕𝑞𝑗 −
𝜕𝑇
𝜕𝑞𝑗+𝜕𝑉
𝜕𝑞𝑗+𝜕𝐷
𝜕𝑞𝑗, (𝑗 = 1,… , 𝑛 + 1 )
𝑈 = [𝐹 − 𝑠𝑖𝑔𝑛 𝑟 𝜇𝑟𝑁𝑟 ,−𝑠𝑖𝑔𝑛 𝜃1 𝜇𝜃1𝑁𝜃1
,… ,−𝑠𝑖𝑔𝑛 𝜃𝑛 𝜇𝜃𝑛𝑁𝜃𝑛 ]𝑇
Pentru coordonata r, manipularea matematica a ecuatiilor ne da:
(7)
𝑑
𝑑𝑡 𝜕𝑇
𝜕𝑟 = 𝑀 + 𝑚𝑖
𝑛
𝑖=1
𝑟′′ + 𝑚𝑖
𝑛
𝑖=1
𝐿𝑘 cos 𝜃𝑘 𝜃𝑘′′ − sin 𝜃𝑘 𝜃𝑘
2 +
𝑖−1
𝑘=𝑖−𝑛
𝑚𝑖 𝑙𝑖 cos 𝜃𝑖 𝜃𝑖′′ − sin 𝜃𝑖 𝜃𝑖
2
𝑛
𝑖=1
𝜕𝑇
𝜕𝑟= 0
𝜕𝑉
𝜕𝑟= 0
𝜕𝐷
𝜕𝑟= 𝑐𝑟𝑟
Ecuatia dinamica neliniara este data de:
(8)
𝑀 + 𝑚𝑖
𝑛
𝑖=1
𝑟′′ + 𝐿𝑘 cos 𝜃𝑘 𝜃𝑘′′ − sin 𝜃𝑘 𝜃𝑘
2
𝑖−1
𝑘=𝑖−𝑛
𝑛
𝑖=1
𝑚𝑖
+ 𝑚𝑖𝑙𝑖 cos 𝜃𝑖 𝜃𝑖′′ − sin 𝜃𝑖 𝜃𝑖
2
𝑛
𝑖=1
+ 𝑐𝑟𝑟 = 𝐹 − 𝑠𝑖𝑔𝑛 𝑟 𝜇𝑟𝑁𝑟
Aplicatia ecuatiei lui Lagrange pentru coordonata 𝜃𝑖 da urmatoarele rezultate:
15
(9)
𝜕𝑇
𝜕𝜃𝑗= 𝐼𝑖𝜃𝑖 + 𝑚𝑖𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
cos 𝜃𝑖 𝑟 + 𝑚𝑖 𝐿𝑘 𝑙𝑖cos(𝜃𝑘 − 𝜃𝑖)𝜃𝑘
𝑖−1
𝑘=𝑖−𝑛
+ 𝑚𝑖𝑙𝑖2 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
𝜃𝑖
+ 𝐿𝑝cos(𝜃𝑝 − 𝜃𝑖)𝜃𝑝
𝑖−1
𝑝=𝑗−𝑛
𝑚𝑗𝐿𝑖 + 𝑚𝑗 𝑙𝑗𝐿𝑖cos(
𝑛
𝑗=𝑖+1
𝑛
𝑗=𝑖+1
𝜃𝑗 − 𝜃𝑖)𝜃𝑗
(10)
𝑑
𝑑𝑡 𝜕𝑇
𝜕𝜃𝑖 = 𝐼𝑖𝜃𝑖
′′ + 𝑚𝑖𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
cos 𝜃𝑖 𝑟′′ − 𝑚𝑖𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
sin 𝜃𝑖 𝜃𝑖𝑟′
+ 𝑚𝑖𝑙𝑖2 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
𝜃′′
+ 𝐿𝑘 cos 𝜃𝑘 − 𝜃𝑖 𝜃𝑘′′ − sin 𝜃𝑘 − 𝜃𝑖 (𝜃𝑘 − 𝜃𝑖)𝜃𝑘
𝑖−1
𝑘=𝑖−𝑛
𝑚𝑖𝑙𝑖
+ 𝑚𝑗 𝑙𝑗 cos 𝜃𝑗 − 𝜃𝑖 𝜃𝑗′′ − sin 𝜃𝑗 − 𝜃𝑖 (𝜃𝑗 − 𝜃𝑖)𝜃𝑗
𝑛
𝑗=𝑖+1
𝐿𝑖
+ 𝐿𝑝[cos 𝜃𝑝 − 𝜃𝑖 𝜃𝑝′′ − sin 𝜃𝑝 − 𝜃𝑖 (𝜃𝑝 − 𝜃𝑖)𝜃𝑝
𝑖−1
𝑝=𝑗−𝑛
] 𝑚𝑗
𝑛
𝑗=𝑖+1
𝐿𝑖
(11)
𝜕𝑇
𝜕𝜃𝑖= − 𝑚𝑖𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
sin 𝜃𝑖 𝜃𝑖𝑟′ + 𝑚𝑖 𝐿𝑘 𝑙𝑖sin(𝜃𝑘 − 𝜃𝑖)𝜃𝑖𝜃𝑘
𝑖−1
𝑘=𝑖−𝑛
+ 𝐿𝑚𝐿𝑖sin(𝜃𝑝 − 𝜃𝑖)𝜃𝑖𝜃𝑝
𝑖−1
𝑝=𝑗−𝑛
𝑚𝑗 + 𝑚𝑗 𝑙𝑗𝐿𝑖sin(𝜃𝑗 − 𝜃𝑖)𝜃𝑖𝜃𝑗
𝑛
𝑗=𝑖+1
𝑛
𝑗=𝑖+1
16
(12)
𝜕𝑉
𝜕𝜃𝑖= −𝑔 𝑚𝑖 𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
sin 𝜃𝑖
(13)
𝜕𝑇
𝜕𝜃𝑖= (𝑐𝑖 + 𝑐𝑖+1)𝜃𝑖
′ − 𝑐𝑖−1𝜃𝑖+1′ + 𝑐𝑖𝜃𝑖−1
′
In final cele n ecuatii neliniare corespondente unghiurilor absolute 𝜃𝑖 sunt:
(14)
𝑈𝑖+1 = 𝑚𝑖𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
cos 𝜃𝑖 𝑟′′ 𝐼𝑖 + 𝑚𝑖𝑙𝑖
2 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
𝜃𝑖′′
+ 𝐿𝑘[cos 𝜃𝑘 − 𝜃𝑖 𝜃𝑘′′ − sin 𝜃𝑘 − 𝜃𝑖 𝜃𝑘
′′ ]
𝑖−1
𝑘=𝑖−𝑛
𝑚𝑖𝑙𝑖
+ 𝑚𝑗 𝑙𝑗 [cos 𝜃𝑗 − 𝜃𝑖 𝜃𝑗′′ − sin 𝜃𝑗 − 𝜃𝑖 𝜃𝑗
′′ ]
𝑛
𝑗=𝑖+1
𝐿𝑖
+ 𝐿𝑝 [cos 𝜃𝑝 − 𝜃𝑖 𝜃𝑝′′ − sin 𝜃𝑝 − 𝜃𝑖 𝜃𝑝
2]
𝑗−1
𝑝=𝑗−𝑛
𝑚𝑗
𝑛
𝑗=𝑖+1
𝐿𝑖
− 𝑔 𝑚𝑖𝑙𝑖 + 𝑚𝑗𝐿𝑖
𝑛
𝑗=𝑖+1
sin 𝜃𝑖 + (𝑐𝑖 + 𝑐𝑖+1)𝜃𝑖′ − 𝑐𝑖−1𝜃𝑖+1
′ + 𝑐𝑖𝜃𝑖−1′
(i = 1, ..., n)
Ecuatiile pot fi rearanjate in forma dupa stare dupa cum urmeaza:
(15)
𝐹 𝑞 𝑞′′ + 𝐺 𝑞, 𝑞′ 𝑞′ + 𝐻 𝑞 = 𝐿(𝑞,𝑢)
17
Unde F si G sunt matrice patratice astfel:
(16)
𝐹𝑤𝑤 𝑞 =
𝑀 + 𝑚𝑖 ,𝑤 = 1
𝑛
𝑖=1
𝐼𝑤−1 + 𝑚𝑤−1𝐼𝑤−12 + 𝑚𝑗𝐿𝑤−1, 1 < 𝑤 ≤ 𝑛 + 1
𝑛
𝑗=𝑤
(17)
𝐹𝑤𝑣 𝑞 =
𝑚𝑖 𝐿𝑘cos(𝜃𝑘)
𝑣−2
𝑘=𝑣−𝑛−1
+
𝑛
𝑖=𝑣−1
𝑚𝑖𝑙𝑖cos(𝜃𝑖)
𝑛
𝑖=𝑣−1
,𝑤 = 1, 1 < 𝑣 ≤ 𝑛 + 1
𝑚𝑖 𝐿𝑘cos(𝜃𝑘)
𝑛−2
𝑘=𝑤−𝑛−1
𝑛
𝑖=𝑤−1
+ 𝑚𝑖𝑙𝑖cos(𝜃𝑖)
𝑛
𝑖=𝑤−1
, 𝑣 = 1, 1 < 𝑤 ≤ 𝑛 + 1
𝐿𝑘 cos 𝜃𝑘 − 𝜃𝑣−1
𝑤−2
𝑘=𝑤−𝑛−1
𝑚𝑤−1𝑙𝑤−1 + 𝑚𝑗 𝑙𝑗 cos 𝜃𝑗 − 𝜃𝑣−1
𝑛
𝑗=𝑤
𝐿𝑤−1
+ 𝐿𝑝 [cos 𝜃𝑝 − 𝜃𝑣−1 ]
𝑗−1
𝑝=𝑗−𝑛
𝑛
𝑗=𝑤
𝑚𝑗 𝐿𝑤−1
,𝑎𝑙𝑡𝑓𝑒𝑙
(18)
𝐺𝑤𝑣 𝑞, 𝑞′ = 𝑐𝑟 ,𝑤 = 1
𝑐𝑤−1 + 𝑐𝑤 , 1 < 𝑤 ≤ 𝑛 + 1
(19)
𝐺𝑤𝑣 𝑞, 𝑞′
=
0, 𝑣 = 1, 1 < 𝑤 ≤ 𝑛 + 1
− 𝑚𝑖𝑙𝑖 sin 𝜃𝑣−1 𝜃𝑣−1 − 𝐿𝑘sin(𝜃𝑣−1)𝜃𝑣−1
𝑤−2
𝑘=𝑤−𝑛−1
𝑛
𝑖=𝑤−1
𝑛
𝑖=𝑤−1
− 𝐿𝑘 sin 𝜃𝑘 − 𝜃𝑣−1 𝜃𝑣−1
𝑤−2
𝑘=𝑤−𝑛−1
𝑚𝑤−1𝑙𝑤−1 − 𝑚𝑗 𝑙𝑗 sin 𝜃𝑗 − 𝜃𝑣−1 𝜃𝑣−1
𝑛
𝑗=𝑤
𝐿𝑤−1
− 𝐿𝑝sin(𝜃𝑝 − 𝜃𝑣−1)𝜃𝑣−1
𝑗−1
𝑝=𝑗−𝑛
𝑛
𝑗=𝑤
𝑚𝑗 𝐿𝑤−1
,𝑎𝑙𝑡𝑓𝑒𝑙
18
H si L sunt vectori n X 1 si pot fi gasiti astfel:
(20)
𝐻𝑤 𝑞 =
0,𝑤 = 1
−𝑔 𝑚𝑤−1𝑙𝑤−1 + 𝑚𝑗𝐿𝑤−1
𝑛
𝑗=𝑤
sin 𝜃𝑤−1 ,𝑎𝑙𝑡𝑓𝑒𝑙
(21)
𝐿𝑤 𝑞,𝑢 = 𝐹 − 𝑠𝑖𝑔𝑛 𝑟 𝜇𝑟𝑁𝑟 ,𝑤 = 1
−𝑠𝑖𝑔𝑛 𝜃𝑤−1 𝜇𝜃𝑤−1𝑁𝜃𝑤−1
,𝑎𝑙𝑡𝑓𝑒𝑙
Pentru a rezolva ecuatiile dinamice neliniare forma spatiului de stare este extinsa pentru a
include starile si primelelor derivate dupa cum urmeaza:
Ecuatia (15) va deveni:
(22)
(1) 𝐹 𝑞 𝑞′′ = −𝐺 𝑞, 𝑞′ 𝑞′ −𝐻 𝑞 + 𝐿 𝑞,𝑢 𝑢𝑛𝑑𝑒 𝑞 = (𝑟 𝜃1 … 𝜃𝑛)𝑇
(2) 𝑋 = 𝑞𝑖𝑞𝑖 , 𝑖 = 1,… ,𝑛 + 1
Noua forma a spatiului de stare este data de:
(3) 𝐼 00 𝐹
𝑋′ = 0 𝐼0 −𝐺
𝑋 + 0−𝐻 + 0
𝐿
Sau
(23)
𝑋′ = 0 𝐼0 −𝐹−1𝐺
𝑋 + 0
−𝐹−1𝐻 +
0
𝐹−1𝐿
Sau
(24)
𝑋′ 𝑡 = 𝑓(𝑋 𝑡 ,𝑢 𝑡 )
Fiind data o stare initiala𝑋0 si folosind metoda de integrare numerica Runge-Kutta de
orice ordin, vectorul de stare 𝑋 𝑡 este usor de simulat.
19
Din motive practice ecuatiile de miscare neliniare pot fi formulate in sisteme de
coordonate diferite. In general senzorii de miscare unghiulara masoara unghiurile relative dintre
diferite conexiuni consecutive. Astfel, dinamica sistemului poate fi reformulata in sistemul de
coordonate Devanit-Hartenberg, in care starile cunt:
(25)
𝑞 = (𝑟 𝜃1 𝛾1 …𝛾𝑛−1)𝑇
Stiind ca:
(26)
𝛾𝑖 = 𝜃𝑖+1 − 𝜃𝑖 , 𝑖 = 1,… ,𝑛 − 1
𝜃𝑖 = 𝛾𝑘 + 𝜃𝑖
𝑖−1
𝑘=1
, 𝑖 = 2,… ,𝑛
Larcombe (1991) a reusit asta inlocuind 𝜃𝑖 cu γk + θ1(i = 2,… , n)𝑖−1
𝑘=1in ecuatiile de miscare
formulate in coordonate absolute. Din moment ce ecuatiile obtinute pot fi foarte complicate se
sugereaza ca ar fi mai simplu sa se rezolve ecuatia (23) mai intai dupa care se va transforma
vectorul de stare 𝑋 𝑡 in celalalt sistem de coordonate folosind o matrice de transformare T
definita ca:
(27)
𝑇𝑤𝑣 = 1,𝑤 = 𝑣,
−1,𝑤 = 𝑣 + 1,2 < 𝑤 ≤ 𝑛 + 1,𝑛 + 3 < 𝑤 ≤ 2𝑛 + 2,0,𝑎𝑙𝑡𝑓𝑒𝑙
Ca exemplu pentru un sistem de pendul invers dublu pentru a transforma de la vectorul de stare
X=(𝑟 𝜃1𝜃2 𝑟 𝜃1𝜃2)𝑇 la 𝑋𝑛𝑜𝑢 =(𝑟 𝜃1𝛾1 𝑟 𝜃1𝛾1)𝑇, matricea de transformare va fi:
𝑇 =
1 0 00 1 00 −1 1
0 0 00 0 00 0 0
0 0 00 0 00 0 0
1 0 00 1 00 −1 1
Si
𝑋𝑛𝑒𝑤 = 𝑇𝑋
20
2.3. Exemplificare
Ca validare a ecuatiilor prezentate anterior, ecuatiile de miscare pentru pendulul invers
dublu si triplu sunt extrase din setul de ecuatii dinamice neliniare generale si verificate cu ecuatii
specificate anterior derivate specific pentru fiecare sistem. Ecuatiile dinamice neliniare pentru un
sistem de pendul invers cu doua conexiuni, incluzand modelele de frecare vascoasa si Coulomb,
sunt dupa cum urmeaza:
(28)
𝑚 + 𝑚1 + 𝑚2 𝑟 + 𝑚1𝑙1 + 𝑚2𝐿1 cos 𝜃1 𝜃1 +𝑚2𝑙2 cos 𝜃2 𝜃2
+ 𝑐𝑟
− 𝑚1𝑙1 + 𝑚2𝐿1 sin 𝜃1 𝜃12 −𝑚2𝑙2sin 𝜃2 𝜃2
2 = 𝐹 − 𝑠𝑖𝑔𝑛 𝑟 µ𝑟𝑁𝑟
𝑚1𝑙1 + 𝑚2𝐿1 𝑟 + 𝐼1 + 𝑚1𝑙12 + 𝑚2𝐿1
2 𝜃1 + 𝑚2𝑙2𝐿1 cos 𝜃1 − 𝜃2 𝜃2
+ 𝑐1 + 𝑐2 𝜃1 − 𝑐2𝜃2
+ 𝑚2𝑙2𝐿1 sin 𝜃1 − 𝜃2 𝜃22 − 𝑔 𝑚1𝑙1 + 𝑚2𝐿1 sin𝜃1 = −𝑠𝑖𝑔𝑛 𝜃1 µ𝜃1
𝑁𝜃1
𝑚2𝑙2 cos 𝜃2 𝑟 + 𝑚2𝑙2𝐿1 cos 𝜃1 − 𝜃2 𝜃1 + 𝐼2 + 𝑚2𝑙2
2 𝜃2 − 𝑚2𝑙2𝐿1 sin 𝜃1 − 𝜃2 𝜃1
2 − 𝑐2𝜃1
+ 𝑐2𝜃2 − 𝑔𝑚2𝑙2 sin 𝜃2 = −𝑠𝑖𝑔𝑛(𝜃2)µ𝜃2𝑁𝜃2
Ecuatiile corespund cu cele prezentate in Furuta et al. (1987, 1980) care sunt derivate specific
pentru configurarea sistemelor lor hardware. Pentru sistemul cu trei conexiuni, ecuatiile dinamice
neliniare pot fi scrise in forma ecuatiei (15) in care:
F 𝑞 =
𝐴1 𝐴2 cos 𝜃1 𝐴3 cos 𝜃2 𝐴4 cos 𝜃3
𝐴9 cos 𝜃1 𝐴10 𝐴11 cos 𝜃1 − 𝜃2 𝐴12 cos 𝜃1 − 𝜃3
𝐴18 cos 𝜃2 𝐴19 cos 𝜃1 − 𝜃2 𝐴20 𝐴21 cos 𝜃2 − 𝜃3
𝐴28 cos 𝜃3 𝐴29 cos 𝜃1 − 𝜃3 𝐴30 cos 𝜃2 − 𝜃3 𝐴31
G(q,𝑞 )
=
𝐴5 𝐴6 sin 𝜃1 𝜃2 𝐴7 sin 𝜃2 𝜃2 𝐴8 sin 𝜃3 𝜃3
0 𝐴13 𝐴14 sin 𝜃1 − 𝜃2 𝜃2 + 𝐴15 𝐴16 sin 𝜃1 − 𝜃3 𝜃3
0 𝐴22 sin 𝜃1 − 𝜃2 𝜃1 + 𝐴23 𝐴24 𝐴25 sin 𝜃2 − 𝜃3 𝜃3 + 𝐴26
0 𝐴33 sin 𝜃1 − 𝜃3 𝜃1 𝐴35 sin 𝜃2 − 𝜃3 𝜃2 + 𝐴36 𝐴31
𝐻 𝑞 =
0𝐴17 sin 𝜃1
𝐴27 sin 𝜃2
𝐴34 sin 𝜃3
21
Tabel 2. Constantele sistemului
Constanta Valoare Constanta Valoare
𝐴1 M + 𝑚1+𝑚2 + 𝑚3 𝐴19 𝑚2𝑙2 + 𝑚3𝐿2 𝐿1
𝐴2 𝑚1𝑙1 + 𝑚2 + 𝑚3 𝐿1 𝐴20 𝐼2 + 𝑚2𝑙22 + 𝑚3𝐿2
2
𝐴3 𝑚2𝑙2 + 𝑚3𝑙2 𝐴21 𝑚3𝑙3𝐿2
𝐴4 𝑚3𝑙3 𝐴22 −𝐿1 𝑚2𝑙2 + 𝑚3𝐿2
𝐴5 𝑐𝑟 𝐴23 −𝑐2
𝐴6 −𝑚1𝑙1 − 𝑚2 + 𝑚3 𝐿1 𝐴24 𝑐2 + 𝑐3
𝐴7 − 𝑚2𝑙2 + 𝑚3𝑙2 𝐴25 𝑚3𝑙3𝐿2
𝐴8 −𝑚3𝑙3 𝐴26 −𝑐3
𝐴9 𝑚1𝑙1 + 𝑚2 + 𝑚3 𝐿1 𝐴27 −𝑔 𝑚2𝑙2 + 𝑚3𝐿2
𝐴10 𝐼1 + 𝑚1𝑙12 + (𝑚2 + 𝑚3)𝐿1
2 𝐴28 𝑚3𝑙3
𝐴11 𝑚2𝑙2 + 𝑚3𝐿2 𝐿1 𝐴29 𝑚3𝑙3𝐿1
𝐴12 𝑚3𝑙3𝐿1 𝐴30 𝑚3𝑙3𝐿2
𝐴13 𝑐1 + 𝑐2 𝐴31 𝐼3 + 𝑚3𝑙32
𝐴14 𝑚2𝑙2 + 𝑚3𝐿2 𝐿1 𝐴32 𝑐3
𝐴15 −𝑐2 𝐴33 −𝑚3𝑙3𝐿1
𝐴16 𝑚3𝑙3𝐿1 𝐴34 −𝑔𝑚3𝑙3
𝐴17 −𝑔 𝑚1𝑙1 + 𝑚2𝐿 + 𝑚3𝐿1 𝐴35 −𝑚3𝑙3𝐿1
𝐴18 𝑚2𝑙2 + 𝑚3𝑙2 𝐴36 −𝑐3
𝐿 𝑞, 𝑢 =
𝐹 − 𝑠𝑖𝑔𝑛(𝑟)µ𝑟𝑁𝑟−𝑠𝑖𝑔𝑛(𝜃1)µ𝜃1
𝑁𝜃1
−𝑠𝑖𝑔𝑛(𝜃2)µ𝜃2𝑁𝜃2
−𝑠𝑖𝑔𝑛(𝜃3)µ𝜃3𝑁𝜃3
22
𝐴𝑖-urile sunt constante ale sistemului si sunt date in tabelul 2. Aceste ecuatii sunt conform
celor procesate in Meier zu Farwig si Unbehauen (1990) cand masa motorului superior al
sistemului lor este combinata cu masa conexiunii.
2.4. Tipuri de frecari
Desi frecarea, care disipeaza energie intr-un sistem, ar parea sa fie o forta stabilizatoare s-
a aratat ca subestimarea marimii coeficientului de frecare poate cateodata sa duca la instabilitate
intr-un sistem de control cu feedback. Deasemenea frecarea a fost asociata cu un comportament
oscilatoriu. Cicluri de limitare generate de frecare au fost aratate intr-un sistem de carucior
simplu, simulat, si au fost observata experimental intr-un aparat pentru balansare.
Comportamentul oscilatoriu a fost prevazut teoretic intr-un sistem de balansare cu reactie.
Un model de frecare mai precis intre carucior si sina include frecare statica si Coulomb
(alunecare) cat si frecare vascoasa. Frecarea statica este frecarea care trebuie depasita pentru a
incepe miscarea, este astfel prezenta numai cand obiectul nu se misca. Frecarile Coulomb si
vascoasa sunt prezente doar cand sistemul se misca. Astfel cel mai simplu model care
incorporeaza toate acestea este:
𝐹𝑓𝑟𝑖𝑐 = 𝐹𝑠𝑡𝑎𝑡𝑖𝑐
𝐹𝐶𝑜𝑢𝑙𝑜𝑚𝑏 + 𝐹𝑣𝑎𝑠𝑐𝑜𝑎𝑠𝑎 𝑑𝑎𝑐𝑎 𝑥 = 0𝑑𝑎𝑐𝑎 𝑥 ≠ 0
Componentele vascoase au modele bine cunoscute:
𝐹𝑓𝑟𝑖𝑐 = −𝐹𝑎𝑝𝑙𝑖𝑐𝑎𝑡𝑎
µ𝑠𝐹𝑠𝑔𝑛 𝐹𝑎𝑝𝑙𝑖𝑐𝑎𝑡𝑎 𝑑𝑎𝑐𝑎 𝐹𝑎𝑝𝑙𝑖𝑐𝑎𝑡𝑎 < µ𝑠𝐹𝑁
𝑑𝑎𝑐𝑎 𝐹𝑎𝑝𝑙𝑖𝑐𝑎𝑡𝑎 ≥ µ𝑠𝐹𝑁
𝐹𝐶𝑜𝑢𝑙𝑜𝑚𝑏 = µ𝑐𝐹𝑠𝑔𝑛 𝑥 ,
𝐹𝑣𝑎𝑠𝑐𝑜𝑎𝑠𝑎 = −𝜀𝑥
Unde µ𝑠 , µ𝑐 , 𝜀sunt coeficientii frecarilor statice, Coulomb si vascoase, iar 𝐹𝑁este magnitudinea
fortei normale. In modelul nostru obiectul se misca orizontal deci 𝐹𝑁 = 𝑚 + 𝑀 𝑔. Valoarea a
diversi parametrii se pot determina experimental ca in tebelul urmator:
23
Parametrii Descriere Estimare
𝜇𝑠 coeficient frecare statica 0,08328
𝜇𝑐 coeficient frecare Coulomb 0,04287
𝜀 coeficient frecare vascoasa 0,3156
24
Capitolul 3: Controlul sistemului (strategii de comanda)
3.1. Strategii de control
Datorita faptului ca pendulul invers prezinta un sistem instabil este deseori folosit ca un
punct de reper pentru a verifica performantele si eficienta unui algoritm pentru reglare. Pendulul
invers este o combinatie de diverse arii de studiu, robotica, teoria controlului etc. Scopul este de
a aduce pendulul din pozitia de stare vertical jos in pozitia vertical sus si sa il mentinem acolo
odata atinsa. Caruciorul va trebui de asemenea sa fie pozitionat in pozitia initiala. Toate astea
trebuie facuta miscand caruciorul stanga si dreapta pe sinele acestuia evident fara a depasi
marginile. In teorie putem gasi o multime de algoritmi pentru stabilizare pe verticala. Wei et al a
prezentat un model de strategie neliniara pentru control prin descompunerea legii de control intr-
o secventa de pasi. Chung si Houser au propus o lege de stare neliniara bazata pe feedback pentru
a regla pozitia caruciorului cat si energia de balansare a pendulului. Zhao si Spong au aplicat o
strategie de control hibrida care stabilizeaza asimptotic global pentru toate conditiile initiale.
Metoda lor nu necesita sa ia in considerare lungimea sinei. Chatterjee et al. propune o lege de
control bazata pe energie care ridica si stabilizeaza un sistem carucior-pendul cu lungime a sinei
limitata si de asemenea forta de control limitata in simulare cat si in sistem real. O problema
majora cu metoda lor este proiectarea potentialelor si coeficientilor folosind intuitia si iteratii care
consuma timp. Toate aceste metode necesita o cunoastere amanuntita a dinamicii sistemului.
Folosirea logicii de control Fuzzy nu necesita cunoasterea amanuntita a sistemului ceea ce
devine foarte importand cand avem de aface cu sisteme neliniare complexe. Mai mult decat asta
modelarea dinamica a sistemelor arata o dependenta de parametrii mecanici ai acestora, acestia
fiind supusi multor modificari pe percursul vietii (unele din cauza micilor deteriorari), si
deasemenea o dependenta de parametrii dinamici care variaza odata cu actiunea performata.
Aceste considerente dau controlului fuzzy un avantaj asupra altor metode neliniare. S-au propus
mai multe tehnici de control fuzzy. Wong a adoptat algoritmul genetic pentru a tuna toate
functiile membre ale sistemului fuzzy pentru a mentine un pendul invers erect. Yamakawa a
proiectat un sistem hardware de control fuzzy foarte rapid si a folosit numai sapte reguli de
control pentru a regla un pendul invers. Dar aceste metode nu iau in considerare lungimea sinei.
Matsuura si Yasunobu au folosit amandoi informatia venita de la carucior pentru a construi un set
de 49 de reguli pentru a controla unghiul virtual dorit si apoi au folosit informatii despre unghiul
virtual si informatiile despre pendul pentru a construi un alt set de 49 de reguli fuzzy pentru
25
stabilizare totala. Majoritatea algoritmilor pentru control si stabilizare fuzzy folosesc un numar
mare de functii membru. Parametrii acestor functii sunt greu de gasit. Mai mult, numarul mare de
functii membru creste dificultatea gasirii regulilor.Ca o alternativa la abordarea conventionala de
control controlul fuzzy introduce informatii lingvistice. Cea mai dificila parte e controlului fuzzy
este constructia regulilor bazate pe experienta si intuitia operatorului. De asemenea ajustarea
functiilor membru ale controlului fuzzy este un pas important in strategia de control.
In aceasta lucrare se va prezenta o noua structura de control pentru conducerea unui
sistem cu un pendul invers neliniar cu frecare. Pentru a simplifica design-ul controlerului fuzzy
pentru balansarea controlerului si miscarea caruciorului la origine, sistemul de pendul invers este
descompus in doua sub sisteme unul pentru pendul si unul pentru carucior. Pentru aceste
subsisteme doua controlere pentru stabilizare sunt propuse, tinand cont de forma neliniara a
sistemului parinte. Schema de stare are o structura simpla care scade numarul de reguli fuzzy.
3.2. Aspecte preliminare
Figura 2 este desenul schematic al sistemului de pendul invers si carucior. Caruciorul este
capabil sa se miste pe o sina cu dimensiune limitata.
26
Figura 2. Sistem pendul invers si carut
Figura 3 arata diagrama a celor doua componente ale sistemului, pendulul si carutul,
separate.
Figura 3. Carut si pendul separate
In acest sistem tija pendulului este considerata fara masa, F este forta aplicata pentru
control, x este deplasarea carutului, θ este unghiul dintre pozitia pendulului curenta si cea
27
verticala, g este acceleratia gravitationala. Alti parametri sunt masa carutului M, masa pendulului
m, coeficientul de frecare al carutului b, lungimea de la centrul pendulului la ax si inertia
pendulului I.
Pentru simulare ecuatiile dinamice ale pendulului invers sunt dupa cum urmeaza:
𝑀𝑑2𝑥
𝑑𝑡2= 𝐹
𝑐𝑎𝑟𝑡
F = M𝑥 + b𝑥 + N
Unde N si P sunt fortele de interactune dintre carut si pendul.
𝑑2𝑥
𝑑𝑡2=
1
𝑀 𝐹 − 𝑁 − 𝑏
𝑑𝑥
𝑑𝑡
Pentru pendul
𝐼𝑑2𝜃
𝑑𝑡2= 𝜏
𝑝𝑒𝑛𝑑
𝑑2𝜃
𝑑𝑡2=
1
𝐼 𝑁𝑙 cos 𝜃 + 𝑃𝑙 sin𝜃
Este necesar sa introducem fortele de interactiune N si P intre carut si pendul pentru a
modela dinamica sistemului corect. Includerea acestor forte necesita modelarea dinamicilor x si y
ale pendulului in plus fata de theta. Astfel ecuatiile aditionale x si y pentru pendul sunt modelate
astfel:
𝑚𝑑2𝑥𝑝
𝑑𝑡2= 𝐹𝑥 = 𝑁
𝑝𝑒𝑛𝑑
𝑁 = 𝑚𝑑2𝑥𝑝
𝑑𝑡2
𝑚𝑑2𝑦𝑝
𝑑𝑡2= 𝐹𝑦 = 𝑃 −𝑚𝑔
𝑝𝑒𝑛𝑑
𝑃 = 𝑚(𝑑2𝑦𝑝
𝑑𝑡2+ 𝑔)
Cu toate astea 𝑥𝑝 𝑠𝑖 𝑦𝑝 sunt functii exacte ale lui theta. Astfel derivatele lor sunt
prezentate in functie de derivatele lui theta.
28
𝑥𝑝 = 𝑥 − 𝑙 sin 𝜃
𝑑𝑥𝑝
𝑑𝑡=
𝑑𝑥
𝑑𝑡− 𝑙 cos𝜃
𝑑𝜃
𝑑𝑡
𝑑2𝑥𝑝
𝑑𝑡2=
𝑑2𝑥
𝑑𝑡2+ 𝑙 sin𝜃
𝑑𝜃
𝑑𝑡
2
− 𝑙 cos 𝜃𝑑2𝜃
𝑑𝑡2
Si
𝑦𝑝 = 𝑙 cos𝜃
𝑑𝑦𝑝
𝑑𝑡= −𝑙 sin 𝜃
𝑑𝜃
𝑑𝑡
𝑑2𝑦𝑝
𝑑𝑡2= − 𝑙 cos𝜃
𝑑𝜃
𝑑𝑡
2
− 𝑙 sin𝜃𝑑2𝜃
𝑑𝑡2
Dupa inlocuirea in ecuatiile 7 si 9, avem:
N = m𝑑2𝑥𝑝
𝑑𝑡2= 𝑚
𝑑2𝑥
𝑑𝑡2+ 𝑙 sin𝜃
𝑑𝜃
𝑑𝑡
2
− 𝑙 cos𝜃𝑑2𝜃
𝑑𝑡2
P = m𝑑2𝑦𝑝
𝑑𝑡2= 𝑚 − 𝑙 cos 𝜃
𝑑𝜃
𝑑𝑡
2
− 𝑙 sin𝜃𝑑2𝜃
𝑑𝑡2
Folosind aceste ecuatii neliniare am simulat un sistem de pendul invers cu carucior intr-o
aplicatie vizuala.
3.3. Proiectarea schemei de control
Design-ul controlerului este un factor cheie al sistemului de pendul inversat. Controlerele
sunt folosite pentru a stabiliza un sistem instabil si pentru a-l face robust impotriva perturbatiilor.
Framework-ul acestui controler fuzzy este prezentat in figura urmatoare.
29
Figura 4. Diagrama bloc controler fyzzy
In figura numarul 4 sistemul de pendul invers cu carucior este controlat de doua
controllere separate, controlerul pentru unghiul pendulului si cel pentru pozitia carutului. Din
ecuatiile dinamice pentru acest sistem descoperim ca sunt doua obiecte dinamice, unul este
pendulul iar celalalt este carutul. Sa consideram controlul pentru carut si pentru pendul separate
ar facilita dezvoltarea controlerului cu un mecanism de reguli.
Cu toate astea este permisa o singura actiune pentru sistemul de pendul invers cu carucior
si anume forta aplicata asupra carutului. Astfel forta Fp a pendulului si forta Fc a caruciorului vor
trebui sa fie combinate intr-o singura forta de control F pentru sistem. Putem observa ca pentru a
suplimenta o forta de actiune pentru a impinge carutul in partea stanga va misca pendulul in
partea dreapta. Din aceasta cunostinta instinctiva este usor de vazut ca cele doua forte Fp si
respectiv Fc au semne opuse. Tinand cont ca scopul principal al acestui experiment este de a
balansa pendulul in stare erecta combinatia de forte va fi reprezentata astfel, F = Fp – Fc.
3.4. CLF (Controler de Logica Fuzzy)
CLF este una dintre cele mai de succes aplicatii din setul de teorii fuzzy, introdus de catre
Zadeh in 1965, caracteristicile sale majore fiind utilizarea variabilelor lingvistice in locul celor
30
numerice. Variabilele lingvistice sunt definite in limbaj normal (cum ar fi “mic” sau “mare”) si
pot fi reprezentate inseturi fuzzy.
Un set fuzzy este o extensie a unui se de tip crisp unde un element poate apartine numai
unui singur set (apartenenta totala) sau a nu apartine nici unui set (zero apartenenta). Un set fuzzy
permite apartenenta partiala ceea ce inseamna ca un element poate apartine mai multor seturi
concomitent.
Un set fuzzy A este caracterizat printr-o functie de apartenenta µ𝐴 care asigneaza fiecarui
obiect al unei clase o nota de apartenenta care poate varia intre 0 (zero apartenenta) si 1
(apartenenta totala) astfel vom avea:
µ𝐴 ∶ 𝑋 → 0,1
Ceea ce inseamna ca setul fuzzy A apartine unui set universal X (numit in general univers de
tratare) definit intr-o problema specifica. Un set fuzzy A este numit un singleton fuzzy unde este
un singur element 𝑥0 cu µ𝐴(𝑥0) = 1 in timp ce gradul de apartenenta al tuturor celorlalte va fi
zero.
Aceasta abordare permite caracterizarea comportamentului sistemului prin relatii simple
(reguli fuzzy) intre variabile lingvistice. In general regulile fuzzy sunt exprimate in forma
expresiilor conditionale fuzzy de tipul:
If x mic THEN y este mare
Unde x si y sunt variabile fuzzy si mic sau mare sunt etichete ale setului fuzzy. Daca sunt de la i
= 1 la n reguli setul de regult reprezentat de uniunea acestor reguli ar fi:
R = R1 else R2 else ...Rn
Un controler de logica fuzzy este bazat pe o colectie de R reguli de control. Executia
acestor reguli este guvernata de catre regula de inferenta compozitionala.
Structura generala a unui CLF este reprezentata in Figura 5 si este compusa din
componentele principale:
- O interfata de fuzzyficare care converteste date de intrare in variabile lingvistice
corespunzatoare,
- O baza de cunostinte care consta in o baza de date cu definitii lingvistice generale si
un set de reguli de control,
31
- O logica de decizie care face folos de cunostintele dini baza de date si de definitiile
lingvistice pentru a crea controlul fuzzy,
- Si in final o interfata de defuzzyficare care interpreteaza actiunea data de catre logica
de decizie pentru a spacifica o actiune sictemului.
Figura 5. Comfigurare de baza CLF
In aceasta lucrare vom creea doua controlere de tip fuzzy pentru pendul respectiv
carucior, fiecare controler va folosi doua variabile de intrare: controlerul pentru unghiul
pendulului va folosi doua erori una pentru unghiul fata de verticala si una care reiese din derivata
acesteia edot, iar carutul va folosi deasemenea doua erori una cu referinta la pozitia fata de starea
initiala x si una formata prin derivarea acesteia xdot. Iesirea acestor controlere ne vor da forta cu
care vom actiona asupra caruciorului.
Controlerele de logica fuzzy propuse pentru a controla pendulul invers folosesc functii de
apartenenta conventionale triunghiulare. Mai mult motorul de inferenta fuzzy implementeaza un
set de reguli IF-THEN-ELSE pentru eroarea unghiulara e si cea edot pentru forta Fp si eroarea de
pozitie a carutului x si respectiv cea edot pentru forta Fc. Toate sase universele de tratare sunt
32
impartite in trei seturi de valori fuzzy care se intrepatrund N (negativ), Z (zero) si P (pozitiv).
Figura 5 care urmeaza arata un exemplu luat dintr-o simulare Mathlab care arata functiile de
apartenenta si universurile de tratare pentru pendul. Pentru carucior vor fi similare. Crearea
regulilor este bazata pe cunostinta euristica a comportamentului sistemului si criterii teoretice.
Pentru a genera regulile acestei lucrari criteriul de baza este considerat ca: daca pendulul cade
intr-o anumita directie, impinge carutul in aceeasi directie pentru a contracara miscarea
pendulului. Noua reguli sunt definite pentru fiecare controler si tinute intr-o matrice. Matricea de
reguli pentru controlul unghiului pendulului este aratata in Tabelul 3 si este similara cu cea
pentru carucior.
Figura 6 Functiile de apartenenta pendul
34
Capitolul 4: Aplicatie
Aceasta aplicatie are scopul de a simula intr-un mediu digital un sistem cu pendul invers
cu carucior cu una sau doua conexiuni (simplu sau dublu). Un beneficiu al acestei aplicatii este ca
permite studiul implementarii unui regulator de tip fuzzy/ dar si a altor controllere pentru
conducerea sistemului cu pendul invers fara a necesita componentele experimentale costisitoare
ale unui astfel de mecanism sau diverse licente pentru programele folosite ca mediu de reglare.
4.1. Continutul aplicatiei
Aplicatia este construita in jurul unui Engine (de vazut anexa A.6.) care face legatura intre
diverse componente. Acesta initializeaza programul si imparte executia intr-un numar predefinit
de frame-uri per secunda, repetand anumiti pasi in fiecare frame.
Primul pas este de a transmite controlerului de logica fuzzy (clasa FuzzyController, de
vazut anexa A.1.) starea curenta a sistemului. Controlerul fuzzy va calcula in functie de aceasta
stare un raspuns, sub forma unei forte care va fi aplicata asupra carutului.
Engine-ul va prelua raspunsul si il va transmite in functie de caz uneia dintre clasele
InvertedPendulum (anexa A.2.) sau DoubleInvertedPendulum (anexa A.3.), acestea urmand sa
calculeze evolutia sistemului.Pentru a determina schimbarile in starea sistemului, vor fi
rezolvatesisteme de ecuatii diferentiale obtinute din modelul matematic al pendului invers,
prezentat in capitolul 2.Pentru rezolvarea sistemelor de ecuatii este folosita metoda Dormand-
Prince.
4.2. Sistemul de ecuatii
Inlocuind constantele si variabilele cunoscute din modelul matematic al pendului invers se
obtin sisteme de ecuatii diferentiale de forma:
Pendulul simplu:
𝑐11𝑟 + 𝑐12Ө = 𝐴
𝑐21𝑟 + 𝑐22Ө = 𝐵
Pendulul dublu:
𝑐11𝑟 + 𝑐12Ө1 + 𝑐13Ө2
= 𝐴
𝑐21𝑟 + 𝑐22Ө1 + 𝑐23Ө2
= 𝐵
𝑐31𝑟 + 𝑐32Ө1 + 𝑐33Ө2
= 𝐶
35
Pentru a obtine 𝑟 si Ө in cazul pendulului simplu, se rezolva sistemul prin a elimina pe
rand cate una dintre variabile. Rezultatul:
𝑟 =𝐴𝑐22 − 𝐵𝑐12
𝑐11𝑐22 − 𝑐21𝑐12
Ө =𝐵𝑐11 − 𝐴𝑐21
𝑐11𝑐22 − 𝑐21𝑐12
In cazul pendului dublu ecuatia se rescrie ca:
𝑐11 𝑐12 𝑐13
𝑐21 𝑐22 𝑐23
𝑐31 𝑐32 𝑐33
𝑟 Ө1
Ө2 =
𝐴𝐵𝐶
Notand matricea de coeficienti cu 𝑀 si inmultind la stanga cu 𝑀−1, se obtine:
𝑟 Ө1
Ө2 = 𝑀−1
𝐴𝐵𝐶
Starea sistemului este definita de multimea (𝑟, 𝑟 ,Ө1, Ө1 ,Ө2, Ө2
) – in cazul pendului
simplu este folosit un singur Ө – si se poate defini functia incrementala de schimbare a starii
sistemului astfel:
𝑟′ = 𝑟 𝑟′ = 𝑟 Ө1
′ = Ө1
Ө1′ = Ө1
Ө2′ = Ө2
Ө2′ = Ө2
Folosind acest sistem si metoda Dormand-Prince se va putea obtine starea urmatoare a
sistemului.
In ultimul pas dintr-un frame, starea sistemului este transmisa clase de desenare pentru a
putea observa schimbarile si in interfata aplicatiei.
4.3. Metoda Dormand-Prince
Numita si metoda DOPRI, metoda Domand-Prince este folosita in rezolvarea ecuatiilor
diferentiale ordinare. Metoda este membru al familiei de solutii Runge-Kutta, si foloseste sase
evaluari de functii pentru a calcula solutii de precizie de ordin 4 si 5. Diferentele intre aceste
solutii este apoi considerata ca fiind eroare solutiei (de ordin 4). Estimarea acestei erori
36
esteconvenabila pentru algoritmii de integrare adaptiva prin pasi. Cele 6 evaluari de functii sunt
executate folosind coeficientii din tabelul urmator:
Tabelul Butcher
0 1/5 1/5
3/10 3/40 9/40 4/5 44/45 -56/ 15 32/9
8/9 19372/6561 -25360/
2187 64448/6561 -212/729
1 9017/3168 -355/33 46732/5247 49/176 -5103/18656 1 35/384 0 500/113 125/192 -2187/6784 11/84
35/384 0 500/113 125/192 -2187/6784 11/84 5179/57600 0 7571/16695 393/640 -92097/ 339200 187/2100 1/40
Iar functia de evolutie va arata astfel:
K1 = f(stare initiala, F)
K2 = f(stare initiala + DormandPrince1(k1) * delta, F);
K3 = f(stare initiala + DormandPrince2(k1, k2) * delta, F);
K4 = f(stare initiala + DormandPrince3(k1, k2, k3) * delta, F);
K5 = f(stare initiala + DormandPrince4(k1, k2, k3, k4) * delta, F);
K6 = f(stare initiala + DormandPrince5(k1, k2, k3, k4, k5) * delta, F);
K7 = f(stare initiala + DormandPrince6(k1, k2, k3, k4, k5, k6) * delta, F);
Stare finala = stare initiala + DormandPrince7(k1, k2, k3, k4, k5, k6, k7) * delta;
Unde Ki sunt stari intermediare, f functie incrementara folosita de algoritmul de evolutie, delta
timpul trecut de la pasul anterior si F forta aplicata de controlerul fuzzy.
4.4. Interfata
In interfata aplicatiei se pot observa schimbarile din sistemul pendulului invers. Utilizatorului i se
da posiblitatea de a interactiona cu procesul in timp real, modificand parametrii in care functioneaza
sistemul. Parametrii configurabili sunt: masa si coeficientii de frecare ai caruciorului, masele si
coeficientii de frecare ale pendulelor, starea initiala a sistemului, precum si perturbari in sistem
actionand cu un anumit impuls asupra pendulelor. De asemenea exista posibilitatea de a schimba din
37
sistem dublu in sistem simplu si invers, sau de a reporni sistemul din starea initiala si utilizatorului poate
observa evolutia sistemului fara reglare sau cu reglare.
38
Capitolul 5: Concluzii
Crearea unui mediu digital pentru studiul aplicarii unuei logici de reglare de tip fuzzy
unui sistem de pendul(e) invers(e) prezinta diverse probleme si trebuie tratat systematic pentru a
le rezolva pe fiecare in parte. Una dintre probleme este implementarea unui set de ecuatii
dinamice generalizat cu care sa se poata intocmi modelul matematic pentru sistemul nostru de
pendul invers cu carucior. Pentru a face asta se va folosi metoda lui Lagrange (Greenwood 1988).
Trebuie de asemenea sa luam in considerare diversele tipuri de frecare ce vor aparea intr-un
sistem real si sa le implementam ca atare, iar aceasta poate prezenta propriile ei dificultati. Desi
frecarea este un tip de forta care disipa energie intr-un sistem si ar parea sa fie o forta
stabilizatoare, subestimarea marimii coeficientului de frecare poate cateodata sa duca la
instabilitate intr-un sistem de control cu feedback.
Referitor la design-ul controlerului, acesta este un factor cheie al sistemului de pendul
invers si prezinta propriile lui probleme la implementare. Pentru a integra un tip de control fuzzy
in aplicatia noastra vor trebui izolati factorii de interes care ne vor permite sa manipulam sistemul
creat. Pentru aceasta observam ca vor fi necesare patru intrari si anume unghiul pendulului cu
referinta la verticala, viteza unghiulara a pendulului, distanta dintre referinta carutului si pozitia
curenta a acestuia (pe sina de dimensiune finita) si viteza carutului. Pentru fiecare dintre acesti
factori va trebui definit cate un univers de tratare. Actiunea propriu zisa asupra sistemului se va
face cu ajutorul unei forte aplicata asupra carutului, care este calculata cu ajutorul celor patru
factori mentionati mai devreme.
Aplicatia, desi nu prezinta gradul de flexibilitate al mediilor de reglare oferite de
programe profesionale, este de sjuns pentru a studia si a testa reglarea fuzzy (pentru un sistem cu
pendul invers) si permite o buna intelegere a felului in care diferite forte (frecari, greutate, forta
care actioneaza asupra carutului etc.) actioneaza asupra sistemului.
39
Anexa A: Codul aplicatiei
A.1. Controler Fuzzy
publicclassFuzzyController { constbool DEBUG_FUZZY_CONTROLLER = false; constuint DEFAULT_THETA_FUZZY_STATE_GRADE = 3; constuint DEFAULT_D_THETA_FUZZY_STATE_GRADE = 2; constuint DEFAULT_X_FUZZY_STATE_GRADE = 2; constuint DEFAULT_D_X_FUZZY_STATE_GRADE = 3; constuint DEFAULT_FORCE_PENDULUM_FUZZY_STATE_GRADE = 4; constuint DEFAULT_FORCE_CART_FUZZY_STATE_GRADE = 4; constdouble DEFAULT_THETA_MAX_RANGE = 0.02; constdouble DEFAULT_D_THETA_MAX_RANGE = 0.4; constdouble DEFAULT_X_MAX_RANGE = 2.0; constdouble DEFAULT_D_X_MAX_RANGE = 0.03; constdouble DEFAULT_FORCE_PENDULUM_MAX_RANGE = 150.0; constdouble DEFAULT_FORCE_CART_MAX_RANGE = 80.0; staticuint theta_fuzzy_state_grade; staticuint d_theta_fuzzy_state_grade; staticuint x_fuzzy_state_grade; staticuint d_x_fuzzy_state_grade; staticuint force_pendulum_fuzzy_state_grade; staticuint force_cart_fuzzy_state_grade; staticdouble theta_max_range; staticdouble d_theta_max_range; staticdouble x_max_range; staticdouble d_x_max_range; staticdouble force_pendulum_max_range; staticdouble force_cart_max_range; staticFuzzyController instance = null; staticint [] debug_fuzzy_states = newint [6]; staticint [] saved_debug_fuzzy_states = newint [6]; staticint debug_same_result_count; staticdouble [] debug_input_values = newdouble [4]; public FuzzyController() { theta_fuzzy_state_grade = DEFAULT_THETA_FUZZY_STATE_GRADE; d_theta_fuzzy_state_grade = DEFAULT_D_THETA_FUZZY_STATE_GRADE; x_fuzzy_state_grade = DEFAULT_X_FUZZY_STATE_GRADE; d_x_fuzzy_state_grade = DEFAULT_D_X_FUZZY_STATE_GRADE; force_pendulum_fuzzy_state_grade = DEFAULT_FORCE_PENDULUM_FUZZY_STATE_GRADE; force_cart_fuzzy_state_grade =
40
DEFAULT_FORCE_CART_FUZZY_STATE_GRADE; theta_max_range = DEFAULT_THETA_MAX_RANGE; d_theta_max_range = DEFAULT_D_THETA_MAX_RANGE; x_max_range = DEFAULT_X_MAX_RANGE; d_x_max_range = DEFAULT_D_X_MAX_RANGE; force_pendulum_max_range = DEFAULT_FORCE_PENDULUM_MAX_RANGE; force_cart_max_range = DEFAULT_FORCE_CART_MAX_RANGE; for (int i = 0; i < 6; i++) { saved_debug_fuzzy_states[i] = 0; } debug_same_result_count = 0; } privatestaticint GetFuzzyState(double value, uint grade, double max_range) { System.Diagnostics.Debug.Assert(max_range > 0.0 && grade > 0); double fuzzy_state = value * (double)grade / max_range; int result; if (fuzzy_state > 0) { if (fuzzy_state > (double)grade - 0.5) { return (int)grade; } result = 0; while (fuzzy_state > 0.5) { result++; fuzzy_state -= 1.0; } return result; } else { if (fuzzy_state < -(double)grade + 0.5) { return -(int)grade; } result = 0; while (fuzzy_state < -0.5) { result--; fuzzy_state += 1.0; } return result; } } privatestaticint GetThetaFuzzyState(double theta) { return GetFuzzyState(theta, theta_fuzzy_state_grade, theta_max_range);
41
} privatestaticint GetDThetaFuzzyState(double d_theta) { return GetFuzzyState(d_theta, d_theta_fuzzy_state_grade, d_theta_max_range); } privatestaticint GetXFuzzyState(double x) { return GetFuzzyState(x, x_fuzzy_state_grade, x_max_range); } privatestaticint GetDXFuzzyState(double d_x) { return GetFuzzyState(d_x, d_x_fuzzy_state_grade, d_x_max_range); } privatestaticdouble GetForcePendulum(double theta, double d_theta) { System.Diagnostics.Debug.Assert(force_pendulum_fuzzy_state_grade >= Math.Max(theta_fuzzy_state_grade, d_theta_fuzzy_state_grade)); int theta_fuzzy_state = GetThetaFuzzyState(theta); int d_theta_fuzzy_state = GetDThetaFuzzyState(d_theta); int sum = theta_fuzzy_state + d_theta_fuzzy_state; int force_pendulum_fuzzy_state = (sum> 0) ? (sum> (int)force_pendulum_fuzzy_state_grade ? (int)force_pendulum_fuzzy_state_grade : sum) : (sum< -(int)force_pendulum_fuzzy_state_grade ? -(int)force_pendulum_fuzzy_state_grade : sum); if (DEBUG_FUZZY_CONTROLLER) { debug_fuzzy_states[0] = theta_fuzzy_state; debug_fuzzy_states[1] = d_theta_fuzzy_state; debug_fuzzy_states[4] = force_pendulum_fuzzy_state; } return force_pendulum_max_range * (double)force_pendulum_fuzzy_state / (double)force_pendulum_fuzzy_state_grade; } privatestaticdouble GetForceCart(double x, double d_x) { System.Diagnostics.Debug.Assert(force_cart_fuzzy_state_grade >= Math.Max(x_fuzzy_state_grade, d_x_fuzzy_state_grade)); int x_fuzzy_state = GetXFuzzyState(x); int d_x_fuzzy_state = GetDXFuzzyState(d_x); int sum = x_fuzzy_state + d_x_fuzzy_state; int force_cart_fuzzy_state = (sum> 0) ? (sum> (int)force_cart_fuzzy_state_grade ?
42
(int)force_cart_fuzzy_state_grade : sum) : (sum< -(int)force_cart_fuzzy_state_grade ? -(int)force_cart_fuzzy_state_grade : sum); if (DEBUG_FUZZY_CONTROLLER) { debug_fuzzy_states[2] = x_fuzzy_state; debug_fuzzy_states[3] = d_x_fuzzy_state; debug_fuzzy_states[5] = force_cart_fuzzy_state; } return force_cart_max_range * (double)force_cart_fuzzy_state / (double)force_cart_fuzzy_state_grade; } publicstaticdouble GetForce(SystemStatus s, double dt) { /* Make sure FuzzyController is initialized */ if (instance == null) { instance = newFuzzyController(); } if (DEBUG_FUZZY_CONTROLLER) { debug_input_values[0] = s.theta; debug_input_values[1] = s.d_theta; debug_input_values[2] = s.x; debug_input_values[3] = s.d_x; } double force_pendulum = GetForcePendulum(s.theta, s.d_theta); double force_cart = GetForceCart(s.x, s.d_x); if (DEBUG_FUZZY_CONTROLLER) { bool same = true; for (int i = 0; i < 6; i++) { if (saved_debug_fuzzy_states[i] != debug_fuzzy_states[i]) { same = false; break; } } if (same) { debug_same_result_count++; Console.Out.Write("."); Console.Out.Write("Input: Theta = "); Console.Out.Write(debug_input_values[0]); Console.Out.Write(", DTheta = "); Console.Out.Write(debug_input_values[1]); Console.Out.Write(", X = "); Console.Out.Write(debug_input_values[2]); Console.Out.Write(", DX = "); Console.Out.Write(debug_input_values[3]); Console.Out.Write(", NEXT_DT = "); Console.Out.Write(dt);
43
Console.Out.WriteLine(); } else { Console.Out.Write(debug_same_result_count); Console.Out.WriteLine(); Console.Out.WriteLine(); Console.Out.Write("Input: Theta = "); Console.Out.Write(debug_input_values[0]); Console.Out.Write(", DTheta = "); Console.Out.Write(debug_input_values[1]); Console.Out.Write(", X = "); Console.Out.Write(debug_input_values[2]); Console.Out.Write(", DX = "); Console.Out.Write(debug_input_values[3]); Console.Out.Write(", NEXT_DT = "); Console.Out.Write(dt); Console.Out.WriteLine(); Console.Out.Write("Fuzzy States: Theta = "); Console.Out.Write(debug_fuzzy_states[0]); Console.Out.Write(", DTheta = "); Console.Out.Write(debug_fuzzy_states[1]); Console.Out.Write(", X = "); Console.Out.Write(debug_fuzzy_states[2]); Console.Out.Write(", DX = "); Console.Out.Write(debug_fuzzy_states[3]); Console.Out.Write(", FP = "); Console.Out.Write(debug_fuzzy_states[4]); Console.Out.Write(", FC = "); Console.Out.Write(debug_fuzzy_states[5]); Console.Out.WriteLine(); Console.Out.Write("Force = "); Console.Out.Write(force_pendulum - force_cart); Console.Out.WriteLine(); for (int i = 0; i < 6; i++) { saved_debug_fuzzy_states[i] = debug_fuzzy_states[i]; } } } return force_pendulum - force_cart; } }
A.2. Pendulul invers
classInvertedPendulum { constdouble DEFAULT_CART_MASS = 2.0; constdouble DEFAULT_CART_VISCOUS_FRICTION = 0.0; constdouble DEFAULT_CART_COULOMB_FRICTION = 0.0;
44
constdouble DEFAULT_PENDULUM_MASS = 0.1; constdouble DEFAULT_PENDULUM_LENGTH = 2.0; constdouble DEFAULT_PENDULUM_DISTANCE_TO_CENTER = 0.5; constdouble DEFAULT_PENDULUM_INERTIA_MOMENTUM = DEFAULT_PENDULUM_MASS * DEFAULT_PENDULUM_LENGTH * DEFAULT_PENDULUM_LENGTH / 3.0; constdouble DEFAULT_PENDULUM_VISCOUS_FRICTION = 0.0; constdouble G = 9.8; // Let's note: // Constants: // M = cart mass // m = pendulum mass // l = distance from pendulum base to center of gravity // I = pendulum moment of inertia // cc = cart viscous friction // cp = pendulum viscous friction // u = cart Coulomb friction // G = gravity // // Variables: // pA = pendulum angular position // pDA = pendulum angular velocity (derived position) // pDDA = pendulum angular acceleration (derived velocity) // cX = cart position // cDX = cart velocity (derived position) // cDDX = cart acceleration (derived velocity) // cos = cos(pA) // sin = sin(pA) // // The next differential equations must be solved: // (M+m) * cDDX + (m * l * cos) * pDDA = // -cc * cDX + (m * l * sin) * pDA * pDA - (sgn(cDX) * u * (M + m) * G)) // + F; // (m * l * cos) * cDDX + (I + m * l * l) * pDDA = // -cp * pDA + G * m * l * sin; // // By noting: // A = M+m // B = (m * l * cos) // C = -cc * cDX + (m * l * sin) * pDA * pDA - (sgn(cDX) * u * (M + m) * G)) // D = (m * l * cos) // E = I + m * l * l // H = -cp * pDA + G * m * l * sin // The next system is obtained: // A * cDDX + B * pDDA = C + F // D * cDDX + E * pDDA = H // So cDDX and pDDA can be computed as: // cDDX = ((C + F) * E - H * B) / (A * E - D * B) // pDDA = ((C + F) * D - H * A) / (B * D - E * A) // These results are used when computing system evolution staticdouble cart_mass; staticdouble pendulum_mass; //static double length; // unused for single inverted pendulum staticdouble l; staticdouble inertia; staticdouble cc;
45
staticdouble uc; staticdouble cp; staticdouble total_mass; staticdouble m_l; staticdouble i_and_m_l_l; staticdouble u_total_mass_G; staticdouble m_l_G; staticInvertedPendulum instance = null; private InvertedPendulum() { cart_mass = DEFAULT_CART_MASS; pendulum_mass = DEFAULT_PENDULUM_MASS; l = DEFAULT_PENDULUM_DISTANCE_TO_CENTER; inertia = DEFAULT_PENDULUM_INERTIA_MOMENTUM; cc = DEFAULT_CART_VISCOUS_FRICTION; uc = DEFAULT_CART_COULOMB_FRICTION; cp = DEFAULT_PENDULUM_VISCOUS_FRICTION; ComputeConstants(); } privatestaticvoid ComputeConstants() { total_mass = cart_mass + pendulum_mass; m_l = pendulum_mass * l; i_and_m_l_l = inertia + m_l * l; u_total_mass_G = uc * total_mass * G; m_l_G = m_l * G; } privatestaticvoid check() { if (instance == null) { instance = newInvertedPendulum(); } } privatestaticSystemStatus EvolutionHelper(SystemStatus s, double f) { SystemStatus result = newSystemStatus(); double sin = System.Math.Sin(s.theta); double cos = System.Math.Cos(s.theta); double sgn = (s.d_x == 0.0) ? 0 : ((s.d_x > 0) ? 1.0 : -1.0); // A = M+m // B = (m * l * cos) // C = -cc * cDX + (m * l * sin) * pDA * pDA - (sgn(cDX) * u * (M + m) * G)) // D = (m * l * cos) // E = I + m * l * l // H = -cp * pDA + G * m * l * sin double a = total_mass; double b = m_l * cos; double c =
46
-cc * s.d_x + m_l * sin * s.d_theta * s.d_theta - sgn * u_total_mass_G; double d = b; double e = i_and_m_l_l; double h = -cp * s.d_theta + m_l_G * sin; // cDDX = ((C + F) * E - H * B) / (A * E - D * B) // pDDA = ((C + F) * D - H * A) / (B * D - E * A) double c_and_f = c + f; double ae_minus_bd = a * e - b * d; result.x = s.d_x; result.d_x = (c_and_f * e - h * b) / ae_minus_bd; result.theta = s.d_theta; result.d_theta = (h * a - c_and_f * d) / ae_minus_bd; return result; } publicstaticSystemStatus Evolution(SystemStatus s, double f, double dt) { check(); // Use Dormand–Prince method SystemStatus [] temp = newSystemStatus [7]; temp[0] = EvolutionHelper(s, f); temp[1] = EvolutionHelper(s + dt * DormandPrince.DP1(temp), f); temp[2] = EvolutionHelper(s + dt * DormandPrince.DP2(temp), f); temp[3] = EvolutionHelper(s + dt * DormandPrince.DP3(temp), f); temp[4] = EvolutionHelper(s + dt * DormandPrince.DP4(temp), f); temp[5] = EvolutionHelper(s + dt * DormandPrince.DP5(temp), f); temp[6] = EvolutionHelper(s + dt * DormandPrince.DP6(temp), f); return s + dt * DormandPrince.DP7(temp); } publicstaticdouble GetPendulumLength() { return DEFAULT_PENDULUM_LENGTH; } }
A.3. Pendulul invers dublu
classDoubleInvertedPendulum { constdouble DEFAULT_CART_MASS = 2.0; constdouble DEFAULT_CART_VISCOUS_FRICTION = 0.0; constdouble DEFAULT_CART_COULOMB_FRICTION = 0.0; constdouble DEFAULT_PENDULUM_MASS_1 = 0.1; constdouble DEFAULT_PENDULUM_LENGTH_1 = 2.0; constdouble DEFAULT_PENDULUM_DISTANCE_TO_CENTER_1 = 0.5; constdouble DEFAULT_PENDULUM_INERTIA_MOMENTUM_1 = DEFAULT_PENDULUM_MASS_1 * DEFAULT_PENDULUM_LENGTH_1 * DEFAULT_PENDULUM_LENGTH_1 / 3.0; constdouble DEFAULT_PENDULUM_VISCOUS_FRICTION_1 = 0.0;
47
constdouble DEFAULT_PENDULUM_MASS_2 = 0.1; constdouble DEFAULT_PENDULUM_LENGTH_2 = 2.0; constdouble DEFAULT_PENDULUM_DISTANCE_TO_CENTER_2 = 0.5; constdouble DEFAULT_PENDULUM_INERTIA_MOMENTUM_2 = DEFAULT_PENDULUM_MASS_2 * DEFAULT_PENDULUM_LENGTH_2 * DEFAULT_PENDULUM_LENGTH_2 / 3.0; constdouble DEFAULT_PENDULUM_VISCOUS_FRICTION_2 = 0.0; constdouble G = 9.8; staticdouble cart_mass; staticdouble cart_vf; staticdouble cart_cf; staticdouble m1; staticdouble L1; staticdouble l1; staticdouble I1; staticdouble vf1; staticdouble m2; staticdouble L2; staticdouble l2; staticdouble I2; staticdouble vf2; private DoubleInvertedPendulum() { cart_mass = DEFAULT_CART_MASS; cart_vf = DEFAULT_CART_VISCOUS_FRICTION; cart_cf = DEFAULT_CART_COULOMB_FRICTION; m1 = DEFAULT_PENDULUM_MASS_1; L1 = DEFAULT_PENDULUM_LENGTH_1; l1 = DEFAULT_PENDULUM_DISTANCE_TO_CENTER_1; I1 = DEFAULT_PENDULUM_INERTIA_MOMENTUM_1; vf1 = DEFAULT_PENDULUM_VISCOUS_FRICTION_1; m2 = DEFAULT_PENDULUM_MASS_2; L2 = DEFAULT_PENDULUM_LENGTH_2; l2 = DEFAULT_PENDULUM_DISTANCE_TO_CENTER_2; I2 = DEFAULT_PENDULUM_INERTIA_MOMENTUM_2; vf2 = DEFAULT_PENDULUM_VISCOUS_FRICTION_2; ComputeConstants(); } staticDoubleInvertedPendulum instance = null; privatestaticvoid check() { if (instance == null) { instance = newDoubleInvertedPendulum(); } } staticdouble Mt; staticdouble mt; staticdouble I1t;
48
staticdouble I2t; staticdouble m2l2; staticdouble ml2L1; privatestaticvoid ComputeConstants() { Mt = cart_mass + m1 + m2; mt = m1 * l1 + m2 * L1; I1t = I1 + m1 * l1 * l1 + m2 * L1 * L1; I2t = I2 + m2 * l2 * l2; m2l2 = m2 * l2; ml2L1 = m2 * l2 * L1; } privatestaticSystemStatus EvolutionHelper (SystemStatus s, double f) { SystemStatus result = newSystemStatus(); double sin = System.Math.Sin(s.theta); double cos = System.Math.Cos(s.theta); double sin2 = System.Math.Sin(s.theta2); double cos2 = System.Math.Cos(s.theta2); double sin_diff = System.Math.Sin(s.theta - s.theta2); double cos_diff = System.Math.Cos(s.theta - s.theta2); double sign = (s.x == 0.0) ?0 : (s.x > 0.0 ? 1.0 : -1.0); Matrix3x3 coefficients = newMatrix3x3(Mt, mt * cos, m2l2 * cos2, mt, I1t, ml2L1 * cos_diff, m2l2, ml2L1 * cos_diff, I2t); result.x = s.d_x; result.d_x = 0; result.theta = s.d_theta; result.d_theta = 0; result.theta2 = s.d_theta2; result.d_theta2 = 0; coefficients.Invert(); coefficients.RightMultiplyWithVector( -cart_vf * s.d_x + mt * sin * s.d_theta * s.d_theta + m2l2 * sin2 * s.d_theta2 * s.d_theta2 - sign * cart_cf * Mt * G, -(vf1 + vf2) * s.d_theta + vf2 * s.d_theta2 - ml2L1 * sin_diff * s.d_theta2 * s.d_theta2 + G * mt * sin, ml2L1 * sin_diff * s.d_theta * s.d_theta + vf2 * (s.d_theta - s.d_theta2) + G * m2l2 * sin2, ref result.d_x, ref result.d_theta, ref result.d_theta2); return result; } publicstaticSystemStatus Evolution(SystemStatus s, double f, double dt) { check(); // Use Dormand–Prince method SystemStatus[] temp = newSystemStatus[7]; temp[0] = EvolutionHelper(s, f); temp[1] = EvolutionHelper(s + dt * DormandPrince.DP1(temp), f); temp[2] = EvolutionHelper(s + dt * DormandPrince.DP2(temp), f);
49
temp[3] = EvolutionHelper(s + dt * DormandPrince.DP3(temp), f); temp[4] = EvolutionHelper(s + dt * DormandPrince.DP4(temp), f); temp[5] = EvolutionHelper(s + dt * DormandPrince.DP5(temp), f); temp[6] = EvolutionHelper(s + dt * DormandPrince.DP6(temp), f); return s + dt * DormandPrince.DP7(temp); } publicstaticdouble GetFirstPendulumLength() { return L1; } publicstaticdouble GetSecondPendulumLength() { return L2; } }
A.4. Starea sistemului
publicclassSystemStatus { publicdouble x; /* the position of the cart */ publicdouble d_x; /* velocity of the cart */ publicdouble theta; /* angular position of pendulum */ publicdouble d_theta; /* angular velocity of pendumul */ publicdouble theta2; publicdouble d_theta2; publicstaticSystemStatusoperator+(SystemStatus x, SystemStatus y) { SystemStatus result = newSystemStatus (); result.x = x.x + y.x; result.theta = x.theta + y.theta; result.theta2 = x.theta2 + y.theta2; result.d_x = x.d_x + y.d_x; result.d_theta = x.d_theta + y.d_theta; result.d_theta2 = x.d_theta2 + y.d_theta2; return result; } publicstaticSystemStatusoperator -(SystemStatus x, SystemStatus y) { SystemStatus result = newSystemStatus(); result.x = x.x - y.x; result.theta = x.theta - y.theta; result.theta2 = x.theta2 - y.theta2; result.d_x = x.d_x - y.d_x; result.d_theta = x.d_theta - y.d_theta; result.d_theta2 = x.d_theta2 - y.d_theta2; return result;
50
} publicstaticSystemStatusoperator *(SystemStatus x, double a) { SystemStatus result = newSystemStatus(); result.x = x.x * a; result.theta = x.theta * a; result.theta2 = x.theta2 * a; result.d_x = x.d_x * a; result.d_theta = x.d_theta * a; result.d_theta2 = x.d_theta2 * a; return result; } publicstaticSystemStatusoperator *(double a, SystemStatus x) { return x * a; } }
A.5. Metoda Dormand-Prince
classDormandPrince { staticdouble[] DP = { // DP1 (0): (double)1/5, // DP2 (1-2): (double)3/40, (double)9/40, // DP3 (3-5) (double)44/45, -(double)56/15, (double)32/9, // DP4 (6-9) (double)19372/6561, -(double)25360/2187, (double)64448/6561, -(double)212/729, // DP5 (10-14) (double)9017/3168, -(double)355/33, (double)46732/5247, (double)49/176,
-(double)5103/18656, // DP 6 (15-20) (double)35/384, (double)0, (double)500/1113, (double)125/192, -(double)2187/6784, (double)11/84, // DP 7 (21-27) (double)5179/57600, (double)0, (double)7571/16695, (double)393/640, -(double)92097/339200, (double)187/2100, (double)1/40 }; publicstaticSystemStatus DP1(SystemStatus[] k) { return DP[0] * k[0]; } publicstaticSystemStatus DP2(SystemStatus[] k) { return DP[1] * k[0] + DP[2] * k[1]; } publicstaticSystemStatus DP3(SystemStatus[] k)
51
{ return DP[3] * k[0] + DP[4] * k[1] + DP[5] * k[2]; } publicstaticSystemStatus DP4(SystemStatus[] k) { return DP[6] * k[0] + DP[7] * k[1] + DP[8] * k[2] + DP[9] * k[3]; } publicstaticSystemStatus DP5(SystemStatus[] k) { return DP[10] * k[0] + DP[11] * k[1] + DP[12] * k[2] + DP[13] * k[3] + DP[14] * k[4]; } publicstaticSystemStatus DP6(SystemStatus[] k) { return DP[15] * k[0] + DP[16] * k[1] + DP[17] * k[2] + DP[18] * k[3] + DP[19] * k[4] + DP[20] * k[5]; } publicstaticSystemStatus DP7(SystemStatus[] k) { return DP[21] * k[0] + DP[22] * k[1] + DP[23] * k[2] + DP[24] * k[3] + DP[25] * k[4] + DP[26] * k[5] + DP[27] * k[6]; } }
A.6. Engine-ul aplicatiei:
publicclassEngine { publicstaticSystemStatus systemStatus; privatestaticEngine instance = null; staticbool use_double; long lastFrameTime; constlong FRAME_RATE = 60; constlong FRAME_LENGTH = 1000 / FRAME_RATE; publicconstdouble WORLD_HEIGHT = 8.0; publicconstdouble WORLD_WIDTH = 32.0; public Engine() { if (instance != null) { return; } instance = this; use_double = true; systemStatus = newSystemStatus (); systemStatus.x = 0.0;
52
systemStatus.d_x = 0.0; systemStatus.theta = 0.4; systemStatus.d_theta = 0.0; systemStatus.theta2 = 0.0; systemStatus.d_theta2 = 0.0; // start thread Thread thread = newThread(newThreadStart(run)); thread.Start(); } publicvoid run() { // start a stopwatch to count time Stopwatch stopwatch = Stopwatch.StartNew(); stopwatch.Start(); // initialize last frame time lastFrameTime = stopwatch.ElapsedMilliseconds; while (true) { long frameTime; do { // wait for at least frameLength Thread.Sleep(0); frameTime = stopwatch.ElapsedMilliseconds; } while (frameTime - lastFrameTime < FRAME_LENGTH); // get elapsed time double elapsedTime = (double)(frameTime - lastFrameTime) / 1000; lastFrameTime = frameTime; /* just for debug */ //elapsedTime = 0.016; if (use_double) { systemStatus = DoubleInvertedPendulum.Evolution(systemStatus, FuzzyController.GetForce(systemStatus, elapsedTime), elapsedTime); } else { systemStatus = InvertedPendulum.Evolution(systemStatus, FuzzyController.GetForce(systemStatus, elapsedTime), elapsedTime); } Main.Draw(); } } publicstaticSystemStatus GetSystemStatus() { return systemStatus;
53
} publicstaticvoid GetLengths(refdouble length1, refdouble length2) { if (use_double) { length1 = DoubleInvertedPendulum.GetFirstPendulumLength(); length2 = DoubleInvertedPendulum.GetSecondPendulumLength(); } else { length1 = InvertedPendulum.GetPendulumLength(); length2 = 0.0; } } }
55
Bibliografie
ANDERSON, M. J., and GRANTHAM, W. J., 1989, Lyapunov optimal feedback control
of a nonlinear inverted pendulum.Transactionsof the ASME, 111, 554± 558.
CHUNG, J. C. H., and ITT,M., 1986, Self-tuning control of an invertedpendulum. ISA,
517± 533.
ELTOHAMY, K. G., and KUO, C. Y., 1997, Real time stabilization of atriple link
inverted pendulum using single control input. IEEProceedings± Control Theory and
Applications, 144, 498± 504; 1998,Nonlinear optimal control of a triple link inverted pendulum
withsingle control input. International Journal of Control, 69, 239± 256.
FURUTA, K., OCHIAI, T., and ONO, N., 1984, Attitude control of atriple inverted
pendulum.International Journal of Control, 39,1351± 1356.
FURUTA, K., OKUTANI, T., and SONE, H., 1978, Computer control of adouble
inverted pendulum.Computer & Electrical Engineering, 5,67± 84.FURUTA, K., HIROYUKI, K.,
and KOSUGE, K., 1980, Digital control ofa double inverted pendulum on an inclined
rail.International Journalof Control, 32, 907± 924.
GREENWOOD, D. T., 1988, Principles of Dynamics (Prentice Hall).
HENDERS,M. G., and SOUDAK, A. C., 1992, In-the-large behaviour ofan inverted
pendulum with linear stabilization. International Journalof Non-linear Mechanics, 27, 129± 138.
LARCOMBE, P. J., and TORSNEY, B., 1992, On the control of a twodimensionalmulti-
link inverted pendulum: the enumeration andidentification of equilibrium states. International
Journal ofSystems Science, 23, 2291± 2308.
MALETINSKY, W., SENNING, M. F., and WIEDERKEHR, F., 1981,Observer based
control of a double pendulum. Proceedings of the8th IFAC Triennial World Congress, Kyoto, pp.
3383± 3387.
MEDRANO-CERDA, G. A., 1997, Robust stabilization of a tripleinverted pendulum-
cart.International Journal of Control, 68, 849±865.
K. Tanaka and M. Sugeno , “Stability analysis and design of fuzzy Control systems”,
Fuzzy sets and systems, Vol. 45. pp. 135-156, 1992.
56
C.W. Tao, et al., “Fuzzy hierarchical swing- Up and sliding position Controller for the
inverted pendulum–cart system”, Fuzzy Sets and Systems (2008),ScienceDirect
L. A. Zadeh, “Outline of a new approach of the analysis of complex system and decision
processes,” IEEE Trans. Syst., Man, Cybern.,vol. SMCJ, no. 1, pp. 28-44, 1963.
T. J. ROSS, Fuzzy Logic with Engineering Applications, McGraw-Hill, Inc., 1991.
K.G. Eltohamy, C.-Y. Kuo, Nonlinear generalized equations of motion for multi-link
inverted pendulum systems , International Journal of Systems Science , Vol. 30, Iss. 5, 1999