Documente Academic
Documente Profesional
Documente Cultură
FAKULTET ELEKTROTEHNIKE
MAGISTARSKI RAD
UDK BROJ:
004.896:004.421(043.2)
004.942
Cilj ovog rada je pokazati mogućnosti automatske generacije koda softverskim rješenjima za
linearni model prediktivnog upravljanja. Konkretno, rad kroz primjere pokazuje mogućnost
generisanja široko upotrebljivog C koda prilagođenog za embedded aplikacije. Sama
implementacija algoritma razmatra mnoga ograničenja embedded aplikacija u realnom vremenu
a naročito aplikacija za mikrokontrolere: mala memorija, precizirano vrijeme izvršavanja.
Za potrebe ovog rada korišteno je open source rješenje pod imenom μAO-MPC koje je
razvijeno u Laboratoriju za teoriju sistema i automatsku kontrolu pri Univerzitetu u Magdeburgu.
Predstavlja Python paket koji pruža i MATLAB/simulink interfejs za generirani C kod. Osim
samog Python interpretera za potrebe rada korišteni su i paketi za razne matematičke proračune
poput NumPy, SciPy, Slyot.
Činjenica da definisanjem sistema kroz njegove parametre kao finalni produkt dobijamo C
kod za upravljanje MPC kontrolerima je impresivna. Generisani C kod je u potpunosti
kompatibilan sa ISO C89/C90 standardom i nezavisan je od platforme. Kod je moguće direktno
koristiti u embedded aplikacijama na popularnim platformama kao što su Arduino, Raspberry ili
bilo kojim drugim aplikacijama koje podržavaju C kod poput mnogih aktuelnih generacija
programabilnih logičkih kontrolera (PLC).
ii
Abstract
The aim of this work is to demonstrate the ability of automatic code generation with software
solutions for a linear model predictive control. Specifically, this paper through examples
demonstrates the ability to generate a widely used C code adjusted for embedded application.
Specific implementation of the algorithm works with many embedded application constraints in
real time, and in particular microcontroller applications: low memory, deterministic execution
time.
For the purpose of this work, an open source solution called μAO-MPC was used, developed
in the Laboratory of System Theory and Automatic Control at the University of Magdeburg. It
represents a Python package that also provides a MATLAB / simulink interface for the generated
C code. In addition to the Python interpreter itself for the needs of the work, packages for various
mathematical calculations such as NumPy, SciPy, Slyot were used.
The fact that defining the system through its parameters as the final product we get the C
code to control MPC controllers is impressive. The generated C code is fully compatible with the
ISO C89 / C90 standard and is independent of the platform. The code can be directly used in
embedded applications with popular platforms such as Arduino, Raspberry or any other
application which accepts C code, like many current generation programable logic controllers
(PLC).
iii
Sadržaj
Poglavlje 1 Uvod u MPC ................................................................................................................ 7
1.1 Teorija i principi MPC-a .................................................................................................. 8
1.1.1 Baziranje predikcije na modelu............................................................................................. 8
1.1.2 Odabir trenutnog ulaza i smanjenje horizonta .................................................................... 10
1.1.3 Optimalne ili performanse sigurnosti .................................................................................. 11
1.1.4 Tuniranje ............................................................................................................................. 11
1.1.5 Manipulisanje ograničenjima .............................................................................................. 12
1.1.6 Sistematska upotreba budućih zahtjeva .............................................................................. 12
1.1.7 Sistematski dizajn upravljanja za multivarijabilne sisteme................................................. 12
1.1.8 Matematički opis MPC problema ....................................................................................... 13
Poglavlje 2 Uvod u muAO-MPC .................................................................................................. 16
2.1 Šta je muAO-MPC ......................................................................................................... 16
2.1.1 ltidt modul ........................................................................................................................... 16
2.2 Instaliranje softverskih paketa ........................................................................................ 17
2.2.1 Zahtjevi instalacije .............................................................................................................. 17
2.2.2 Bildanje i instalacija ............................................................................................................ 18
2.1 Razvoj open source softvera .......................................................................................... 19
2.2 Pregled promjena............................................................................................................ 20
Poglavlje 3 Način rada softvera .................................................................................................... 21
3.1 Kratak uvod u Python ..................................................................................................... 21
3.1.1 Prazan prostor ..................................................................................................................... 22
3.1.2 Python liste.......................................................................................................................... 22
3.1.3 NumPy ................................................................................................................................ 22
3.1.4 Indeksiranje ......................................................................................................................... 23
3.2 Osnovni MPC problem................................................................................................... 23
3.2.1 Opis MPC problema............................................................................................................ 23
3.2.2 Generiranje C koda ............................................................................................................. 24
3.2.3 Korištenje generisanog C-koda ........................................................................................... 25
3.2.4 Testiranje sa Python-om...................................................................................................... 26
3.3 Složeniji MPC problem .................................................................................................. 27
3.3.1 Opis MPC problema............................................................................................................ 27
iv
3.3.2 Generisanje C koda ............................................................................................................. 29
3.3.3 Korištenje generisanog C koda ........................................................................................... 30
3.3.4 Testiranje sa Python-om...................................................................................................... 31
3.4 Koji je sljedeći korak? .................................................................................................... 32
Poglavlje 4 MPC kontroleri .......................................................................................................... 33
4.1 Kreiranje MPC kontrolera .............................................................................................. 33
4.1.1 MPC podešavanja ............................................................................................................... 33
4.1.2 Sistem modul ...................................................................................................................... 34
4.1.3 Kreiranje Python MPC objekta ........................................................................................... 35
4.1.4 Generisanje C koda ............................................................................................................. 36
4.2 Upotreba MPC kontrolera .............................................................................................. 37
4.2.1 Osnove MPC ....................................................................................................................... 37
4.2.2 Korištenje Python interfejsa ................................................................................................ 38
4.2.3 Korištenje C implementacije ............................................................................................... 41
Poglavlje 5 Dodatne funkcije ........................................................................................................ 42
5.1 Klase simulacije u Python-u ........................................................................................... 42
5.1.1 Jednostepena simulacija ...................................................................................................... 42
5.1.2 Višestepena simulacija ........................................................................................................ 43
5.2 Podešavanje – tuniranje .................................................................................................. 44
5.2.1 Osnove podešavanja............................................................................................................ 44
5.2.2 Parametar odstupanja .......................................................................................................... 44
5.2.3 Podešavanje Hessian-a ........................................................................................................ 45
5.3 Automatski odabir stabilizirajuće matrice...................................................................... 47
5.3.1 Ključna riječ auto ................................................................................................................ 47
5.4 MATLAB/Simulink interfejs ......................................................................................... 48
5.4.1 Zavisnosti ............................................................................................................................ 48
5.4.2 Kreiranje interfejsa .............................................................................................................. 48
5.4.3 Korištenje MATLAB interfejsa .......................................................................................... 49
5.4.1 Korištenje Simulink interfejsa ............................................................................................ 50
v
Popis slika
vi
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
Poglavlje 1
Uvod u MPC
7
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
Kako bismo predvidjeli buduće ponašanje procesa, moramo imati model kako se proces
ponaša. Konkretno, ovaj model mora pokazati zavisnost izlaza na trenutnu izmjerenu varijablu i
trenutne / buduće ulaze. Ovaj model ne mora biti linearan (npr., Funkcija prijenosa, prostor
stanja) i zapravo može biti vezan za bilo šta.
Kao ljudska bića često koristimo nejasne (fuzzy) modele, a ipak postižemo vrlo preciznu
kontrolu; na primjer, ako se vozimo u trećem stepenu prijenosa, brzinom 40 km/h, a ne nailazimo
na uspon, onda dajući komandu za ubrzanje (pritiskom na papučicu gasa) trebalo bi rezultirati
dobrim ubrzanjem. Ključna stvar koju treba primjetiti jeste da precizni model nije uvijek
neophodan da bi dobili dobru kontrolu; jer se odluke ažuriraju redovito, što će se nositi s nekim
nesigurnostima modela u relativno brzom vremenskom mjerilu. U gore navedenom primjeru,
neuspjeh postizanja dobrog ubrzanja uočit će se vrlo brzo usporedbom stvarnog ponašanja s
predviđenim ponašanjem modela; na primjer, jesam li u tačnom stepenu prijenosa, vozim li 40, a
ne 20, itd.? Odluku o najboljem upravljanju kontinuirano ažuriramo koristeći podatke iz ove
usporedbe.
Modeli koji se koriste u MPC-u su uglavnom namijenjeni da predstavljaju ponašanje
kompleksnih dinamičkih sistema. Dodatna složenost MPC kontrolnog algoritma uglavnom nije
potrebna da bi se obezbijedila adekvatna kontrola jednostavnih sistema, koji često dobro
kontrolišu generički PID kontroleri . Glavne dinamičke karakteristike koje su teške za PID
kontrolere podrazumijevaju velika kašnjenja i dinamiku velikog reda.
MPC modeli predviđaju promjenu zavisnih varijabli modeliranog sistema koja će biti
uzrokovana promjenama nezavisnih varijabli . U hemijskim procesima, nezavisne varijable koje
regulator može podesiti često su zadate vrijednosti regulatornih PID kontrolera (pritisak, protok,
temperatura, itd.) ili konačnih kontrolnih elemenata (ventili, amortizeri itd.). Nezavisne varijable
8
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
koje regulator ne može podesiti, koriste se kao smetnje. Zavisne varijable u ovim procesima su
druga mjerenja koja predstavljaju ili kontrolne ciljeve ili ograničenja procesa.
MPC koristi trenutna mjerenja sistema, trenutačno dinamičko stanje procesa, MPC modele i
ciljeve i ograničenja procesnih varijabli za izračunavanje budućih promjena zavisnih
varijabli. Ove promjene se izračunavaju kako bi zadržale zavisne varijable blizu ciljnih, poštujući
ograničenja na nezavisne i zavisne varijable. MPC uglavnom šalje samo prvu promjenu svake
nezavisne varijable koja se implementira, i ponavlja izračunavanje kada je potrebna sljedeća
promjena.
U praksi većina MPC algoritama koristi linearne modele jer je ovisnost predviđanja o
budućim izborima kontrole tada linearna, a to olakšava optimizaciju kao i off-line analizu
očekivanog ponašanja zatvorene petlje. Međutim, nelinearni modeli se mogu koristiti tamo gdje
korišteno računalno opterećenje nije problem, a linearne aproksimacije nisu dovoljno tačne.
Također je važno napomenuti ovdje komentar „koji odgovara svrsi“. U prediktivnoj kontroli,
model se koristi isključivo za izračunavanje izlaznih predviđanja sistema, tako da model
odgovara svrsi ako daje dovoljno precizne prognoze. Napor i detalji aplicirani u fazi modeliranja
trebali bi to odražavati. Možda nema potrebe modelirati svu fiziku, hemiju i unutrašnje
ponašanje procesa kako bi dobili model koji daje pouzdano predviđanje, i zapravo ne treba
modelirati sve ove detalje ako to nije potrebno. Osnovno pravilo navodi da se treba koristiti
najjednostavniji model kojem se može pribjeći. Sažeto rečeno: model se koristi za generiranje
predviđanja sistema. Treba upotrijebiti najjednostavniji model koji je prikladan za tu svrhu, tj.
daje dovoljno tačna predviđanja.
9
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
varijabli koje treba dodati zajedno da se predvidi odgovor zavisne varijable. Ovo
pojednostavljuje problem kontrole na seriju direktnih matričnih algebarskih izračunavanja koje
su brze i robusne.
Kada linearni modeli nisu dovoljno dobri da zamjene stvarne nelinearne procese, može se
koristiti nekoliko pristupa. U nekim slučajevima, varijable procesa mogu se transformirati prije i
/ ili nakon linearnog MPC modela kako bi smanjili nelinearnost. Proces se može kontrolirati
pomoću nelinearnog MPC-a koji koristi nelinearni model direktno u kontrolnoj
aplikaciji. Nelinearni model može biti u obliku empirijskih podataka (npr. Vještačke neuronske
mreže) ili dinamičkog modela velike vjernosti zasnovan na osnovnim masenim i energetskim
balansima. Nelinearni model može biti linearizovan da izvede Kalman filter ili da odredi model
za linearni MPC.
Algoritamska studija El-Gherwi, Budman i El Kamel pokazuje da korištenje pristupa sa
dvostrukim modom može pružiti značajno smanjenje online izračunavanja, a istovremeno
održavati uporedne performanse sa neizmjenjenom implementacijom. Predloženi algoritam
rješava N konveksne probleme optimizacije paralelno zasnovane na razmjeni informacija među
kontrolerima.
Prije nego je moguće odabrati trenutnu akciju kontrole, potrebno je imati kriterije za procjenu
koja je akcija najbolja. Budući da je MPC obično implementiran na računaru, to zahtijeva
numeričko definisanje kako bi se mogao napraviti tačan proračun, tj. koja predviđena ulazna
putanja daje najnižu numeričku vrijednost troškovima. Izbor funkcije troškova je područje
inženjerskog i teorijskog prosuđivanja, ali također stvara mnogo rasprava u akademskoj
zajednici, tako da nećemo raspravljati o tome.
Praktično iskustvo je da sve dok se slijede neke osnovne smjernice, izbor troškova često ima
malo uticaja na performanse zatvorene petlje. Glavni zahtjev je da trošak ovisi o budućim
kontrolama i da niske vrijednosti troškova vode ka dobrim performansama zatvorene petlje -
dobro definirano za proces koji je u pitanju. Naravno, izbor troška utiče na složenost primjenjene
optimizacije i ovo je također oblast razmatranja. Zbog toga su dvonormna mjerenja popularna,
kako bi optimizacija bila jednosmjerna.
Razmotrimo ponovno proces vožnje. Uobičajeno je razmotriti cestu nekoliko desetina metara
ispred sebe i predvidjeti sve potencijalne opasnosti. Dok se krećemo cestom, dio puta unutar
okvira našeg dometa vidljivosti se kreće s nama kako bismo uvijek mogli vidjeti sljedećih
nekoliko desetina metara. To je u biti uzmičući horizont, odnosno granica naše vizije (otprilike
200 metara) uvijek se kreće istom brzinom kojom se i mi krećemo – dakle, uzmiče. To znači da
stalno prikupljamo nove informacije iz udaljenog horizonta i ove informacije koriste se za
ažuriranje naših kontrolnih akcija (odluka). Prediktivna kontrola djeluje baš ovako: razmatra se
predviđeno ponašanje unutar nekog horizonta u budućnosti i istovremeno predviđa jedan naredni
uzorak u budućnosti u svakom uzastopnom trenutku uzorkovanja. Budući da su dostupne nove
informacije, ulazna trajektorija se automatski mijenja kako bi se uzela u obzir. Važno pitanje je,
10
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
međutim, koliko velik bi trebao biti ovaj horizont? Korištenjem ljudske intuicije, očito je da taj
horizont mora biti veći od vremena rješavanja sistema – u suprotnom ignorira se ponašanje s
značajnom dinamikom. Razmislimo o tome šta bi se dogodilo ako smo za vrijeme vožnje gledali
samo 20-ak metara ispred pri brzini 100 km/h (tj. daleko ispod distance kočenja) – sigurno bi se
srušili ili izletili s ceste na prvoj oštroj krivini.
Da bismo vrlo precizno upravljali procesom, potreban nam je vrlo precizan model. Neki uvid
u ovo mogu se dati usporedbom sa reketnim sportovima. Kada učite sport, vaš um ima samo
neprecizan model o tome kako pokreti ruku, itd. utiču na putanju lopte. Kao rezultat toga,
kontrola, smjer, itd. su loši. Kako vježbate, vaš interni model postaje tačniji i time poboljšava
kvaliteta vaše igre. Ovo ima značajne uticaje na složenost budućih strategija upravljanja koje se
mogu razmotriti. Početnik koristi jednostavne strategije, jer imaju jednostavan model. Njihov je
cilj zadržati loptu u igri - oni misle samo o trenutnom potezu. Stručnjak, s druge strane, može
razmišljati o nekoliko poteza unaprijed i ciljati loptu vrlo precizno kako bi izgradio otvaranje
kojim bi osvojio poen. Isto vrijedi i za MPC. Nema smisla odabrati sljedećih 10 kontrolnih
poteza za optimiziranje dinamičkih performansi tijekom prijelaza ako imate loš model; bolje je
otići na sigurnu, možda sporiju opciju da se barem krećete u pravom smjeru i odaberete samo
jedan potez. Nasuprot tome, ako imate tačan model, možete pouzdano odabrati kontrolne poteze
tokom većeg budućeg horizonta i očekivati bolje dinamičke rezultate; bilo bi ludo, žrtvujući
potencijal, odabrati samo jedan potez u isto vrijeme.
1.1.4 Tuniranje
11
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
Teško je generalizirati dalje od toga jer svaki proces ima različite prioritete koji mogu biti suviše
suptilni da bi se uključili u opšte smjernice.
Neki autori smatraju da ne bi trebalo biti skaliranja težinama ulaznih podataka uopće, budući
da je cilj vidjeti izlaze u željenoj tački sa bilo kakvim potrebnim ulazima. U ovom slučaju je
najvažnije da pažljivo postavimo funkciju troškova kako bi izbjegli pretjerano tunirane zakone o
upravljanju i inverziju karakteristika ne-minimalne faze. Na primjer, ne smijemo tražiti nerealno
brzu izmjenu izlaza i ograničiti prostor dopuštenih ulaznih putanja prema onima koji se kreću
glatko.
Jedna od glavnih osobina koja prodaje MPC je njegova sposobnost on-line manipulacije
ograničenjima na sistematski način, zadržavajući u određenoj mjeri granice stabilnosti i
performanse zakona bez ograničenja. Algoritam to čini optimiziranjem predviđenih performansi
podložnim zadovoljavanju ograničenja. Na primjer, vozač utrke optimizira brzinu, podložnu
ograničenju da automobil ostaje na stazi. Ako bi optimizirali brzinu bez uzimanja eksplicitnog
razmatranja ograničenja, njihova vremena krugova zapravo bi bila daleko sporija.
Pojedinosti o tome kako su ograničenja uključena uveliko ovise o algoritmu koji se
primjenjuje o čemu nećemo detaljisati. Odabrani algoritam ovisit će o dostupnim sredstvima (tj.
vezan uz potencijalno povećanje dobiti) i vremenu uzorkovanja. Što više možete potrošiti, to ste
bliži pravom ograničenom optimumu koji će vaš algoritam vjerovatno dobiti.
Prilikom vožnje, ako vidimo krivinu ispred sebe, prilagodimo stanje (brzina, stepen prijenosa,
itd.) automobila tako da možemo sigurno proći krivinu. Tipično, PID tip zakona upravljanja bavi
se krivinom samo kada se nađemo tu uz eventualnu opasnost slijetanja sa ceste zbog
prekomjerne brzine kojom ulazimo u krivinu. Može se dodati feedforward (upravljanje
unaprijed), ali taj dizajn može biti za prvu ruku.
Obrnuto, MPC automatski uključuje feedforward i štaviše to radi na sistemski način.
Optimizacija troškova uzima u obzir buduće promjene u željenoj trajektoriji i mjerljivim
poremećajima i tako ih uključuje kao unutrašnji dio cjelokupnog dizajna kontrole.
Još jedna velika prodajna osobina MPC algoritma jeste da se mogu nositi s multivarijabilnim
(MIMO ili multi-input-multi-output) sistemima na sistematski način. Dobro je poznato da je PID
12
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
(tradicionalno upravljanje) dizajn za visoko interaktivne MIMO sisteme vrlo zahtjevan. Iako su
rješenja razvijena kroz kombinaciju iskustvo i vrijeme, često su suboptimalna i mogu biti vrlo
raštimovana. Čak i alati poput multivarijabilnog Nyquista često ne dovode do izravnog dizajna.
Poteškoća s podešavanjem PID-a za MIMO sisteme zapravo se odnosi na model; PID tipovi
dizajna koriste relativno malo informacija o postrojenju i stoga nisu u mogućnosti učinkovito se
nositi sa interakcijom. MPC algoritmi, s druge strane, zahtijevaju i koriste model i stoga
iskorištavaju više informacija. Time se sistematski dizajn i analiza znatno olakšavaju. Kod MPC-
a se specificira indeks performansi tako da u nekom smislu imamo sistemski dizajn; to jest,
dobijamo najbolje performanse po cijeni navedenoj za dati model. Iskustvo je pokazalo da je to
učinkovit način rješavanja interakcije (MIMO problemi), a osim toga daje i dobru propusnost i
dobitne / fazne margine za nominalni slučaj.
13
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
𝑖=1 𝑖=1
Nelinearni model prediktivne kontrole ili NMPC je varijanta modela prediktivne kontrole
(MPC) koja se karakteriše upotrebom nelinearnih sistemskih modela u predviđanju. Kao i u
linearnom MPC, NMPC zahtjeva iterativno rješenje problema optimalnog upravljanja na
konačnom horizontu predviđanja. Dok su ovi problemi konveksni u linearnom MPC, u
nelinearnom MPC oni više nisu konveksni. Ovo predstavlja izazove za teoriju stabilnosti NMPC
kao i numeričko rješenje.
Numeričko rješenje problema NMPC optimalnog upravljanja obično se zasniva na direktnim
metodama optimalnog upravljanja pomoću šema optimizacije tipa Newton, u jednoj od
varijanti: direktno jednokratno snimanje , metoda direktnog višekratnog snimanja ili direktna
kolokacija. NMPC algoritmi obično eksploatišu činjenicu da su uzastopni problemi sa
optimalnom kontrolom slični jedni drugima.
Ovo omogućava efikasnu inicijalizaciju postupka rješenja tipa Newton pomoću odgovarajuće
izmjene iz prethodno izračunatog optimalnog rješenja, čime se štede znatne količine vremena
izračunavanja. Sličnost uzastopnih problema se još više koristi kod algoritama za praćenje
putanje (ili "iteracijama u realnom vremenu") koji nikada ne pokušavaju da preusmjere bilo koji
problem optimizacije u konvergenciju, već umjesto toga samo potraži jednu iteraciju ka
rješavanju najnaprednijeg NMPC problema, prije prelaska na sljedeći, koji je prikladno
inicijalizovan.
Iako su aplikacije NMPC-a u prošlosti uglavnom bile korištene u procesnoj i hemijskoj
industriji sa relativno sporim stopama uzorkovanja, NMPC se sve više primjenjuje na aplikacije
14
1.1Teorija i principi MPC-a ____________________________________________ Uvod u MPC
sa visokim stepenom uzorkovanja, npr. u automobilskoj industriji ili čak kod distribuisanih stanja
u prostoru ( sistemi distribuiranih parametara ). Kao aplikacija u vazduhoplovstvu, nedavno je
NMPC korišten za praćenje optimalnih trajektorija za praćenje / izbjegavanje terena u realnom
vremenu.
Eksplicitni MPC (eMPC) omogućava brzu procjenu kontrolnog zakona (u rasponu od
mikrosekundi), što je u potpunom kontrastu sa online MPC. Eksplicitni MPC zasniva se
na tehnikama parametarskog programiranja , gdje je rješenje problema MPC-a koji se formuliše
kao problem optimizacije unaprijed izračunat offline. Ovo offline rješenje, tj. zakon o kontroli
često je u obliku djelimičnog afinitetnog djelovanja (PWA), pa je dobijanje optimalne kontrole
učinjeno smanjivanjem na samo procjenu funkcije. Pošto implementacija eMPC-a ne zahtjeva
značajne računske resurse (u poređenju sa online MPC-om), ona je jedinstvena za kontrolu
sistema sa brzom dinamikom.
Robusne varijante Model Predictive Control (MPC) mogu da objasne postavljene ograničene
poremećaje pri tome i dalje osiguravajući zadovoljavanje ograničenja stanja. Postoje tri glavna
pristupa robusnom MPC:
Min-max MPC . U ovoj formulaciji optimizacija se vrši u odnosu na sve moguće evoluacije
smetnje. Ovo je optimalno rješenje za linearne robusne probleme upravljanja, ipak nosi visoku
cijenu proračuna.
MPC sabijanja ograničenja. Ovdje se ograničenja stanja uvećavaju za datu marginu, tako da
se može garantovati da će trajektorija biti pronađena pod bilo kojom evoluacijom poremećaja.
Cijev MPC koristi nezavisni nominalni model sistema i koristi kontroler povratne sprege
kako bi se osiguralo da stvarno stanje konvergira nominalnom stanju. Količina razdvajanja koja
se zahtjeva od ograničenja stanja određena je robusnim pozitivno invarijantnim (RPI) skupom,
što predstavlja skup svih mogućih odstupanja stanja koja se mogu javiti usljed smetnje sa
kontrolerom povratne sprege.
Višestepeni MPC koristi formulaciju scenarija stabla aproksimirajući prostor neizvjesnosti sa
skupom uzoraka i pristup je nekonzervativan jer uzima u obzir da su informacije o mjerenju
dostupne u svakom trenutku predviđanja i odluke u svakoj fazi mogu biti drugačije i mogu
djelovati kao sredstvo za suzbijanje efekata neizvjesnosti. Međutim, nedostatak pristupa je da
veličina problema eksponencijalno raste sa brojem neizvjesnosti i horizontom predviđanja.
Komercijalni MPC paketi su dostupni i obično sadrže alate za identifikaciju i analizu modela,
dizajniranje i podešavanje kontrolera, kao i evaluaciju performansi kontrolera.
Istraživanje komercijalno dostupnih paketa pružili su SJ Qin i TA Badgwell u Control
Engineering Practice 11 (2003) 733-764.
Glavne razlike između MPC i LQR su da se LQR optimizuje u fiksnom vremenskom prozoru
(horizontu), dok se MPC optimizuje u vremenskom horizontu koji se povlači, i da se novo
rješenje često izračunava, dok LQR koristi jedno (optimalno) rješenje za cijeli vremenski
horizont. Stoga, MPC omogućava optimizaciju u realnom vremenu pod grubim
ograničenjima iako obično rješava problem optimizacije u manjim vremenskim prozorima nego
unutar cijelog horizonta i stoga dobija suboptimalno rješenje.
15
2.1Šta je muAO-MPC ___________________________________________ Uvod u muAO-MPC
Poglavlje 2
Uvod u muAO-MPC
Ovaj modul kreira model prediktivne kontrole (MPC) kontroler za linerane vremenski
nepromjenljive (lti), vremenski diskretne (dt) sisteme sa ulaznim i (opcinalno) ograničenjima
stanja kao i kvadratnu funkciju troškova. MPC problem je formulisan kao konveksan sažetak
kvadratnog programa koji se rješava pomoću proširene Lagrange-ove jednačine uz Nesterovu
gradijentnu metodu.
Opis MPC problema se zadaje u fajl pod nazivom modul sistema (pogledati Modul sistema
za više detalja). Nakon pisanja ovog fajla sljedeći korak je zapravo automatsko generiranje C-
koda. To se radi u dva jednostavna koraka:
1. Stvaranje muaompc objekta iz modula sistema i
2. Pisanje C-koda na osnovu tog objekta
16
2.2Instaliranje softverskih paketa __________________________________ Uvod u muAO-MPC
U nastavku je dat matematički opis podešavanja MPC-a. Sistem predviđen za upravljanje dat
je sa x = Adx + Bdu, gdje su C x , R n i u Cu R m vektor stanja i vektor ulaza. x je
stanje u sljedećem trenutku uzorkovanja. Vremenski diskretni sistem i ulazne matrice redom su
obilježene sa Ad i Bd.
MPC se podešava na sljedeći način:
1 N 1
min
u
(( x j x _ ref j )T Q(x j x _ ref j ) (u j u _ ref j )T R(u j u _ ref j ))
2 j 0
1
( x N x _ ref N ) T P( x N x _ ref N )
2
zadovoljavajući:
x j 1 Ad x j Bd u j , j 0, , N 1
u _ lb u j u _ ub, j 0, , N 1
e _ lb K x x j K u u j e _ ub, j 0, , N 1
f _ lb Fx N f _ ub
x0 x
Nizovi x _ ref , i u _ ref označavaju trenutne i ulazne reference redom. One se daju onlajn,
po defoltu.
17
2.2Instaliranje softverskih paketa __________________________________ Uvod u muAO-MPC
C89/90 kompajler. Kako bi kompajlirali generisani kod potreban nam je C/C++ kompajler
koji podržava C89/90 ili kasnije standarde.
Opciono, ukoliko želimo imati još neke dodatne funkcije potrebno je sljedeće:
C99 kompajler. Za kompajliranje Python interfejsa u C kod potreban je kompajler koji
podržava promjenjivu dužinu nizova. GCC, testirana verzija 4.6 i 4.8. To je popularan kompajler
koji podržava standard C90 i C99 programskog jezika C. U stvari bilo koji kompajler koji
podržava C90/C99 bi trebao da radi. To isključuje Visual C ++ Express Edition (neće raditi jer
ne podršava C99). GCC port za Windows je MinGW.
SciPy verzija 0.11 ili novija se preporučuje jer obezbjeđuje nekoliko funkcija.
Slycot se koristi za izračunavanja stabilizacijskih matrica.
I to je sve što se tiče instaliranja paketa. U nastavku će biti opisano kako koristiti dati
program.
Instaliranje iz source koda na Windows sistemima izvodimo na sljedeći način:
Kako Windows sistemi po defoltu ne sadrže potrebne pakete, savjet je da se alat instalira pod
Linuxom ili OS X ako je moguće. Ako je Windows preferiran, preporučuje se instaliranje
Anaconda platforme koja sadrži sve neophodne python pakete. Ako ne postoji prethodno
iskustvo sa instaliranjem softvera baziranih na C ekstenziji pod Windowsom, savjet je instalirati
muaompc toolbox bez Python interfejsa.
Za punu instalaciju muaompc radimo sljedeće:
Instaliramo C99 kompajler, npr Visual Studio 2015 Community Edition ili MinGW.
18
2.1Razvoj open source softvera ___________________________________ Uvod u muAO-MPC
Ako preferiramo instalaciju muaompc bez Python interfejsa za C kod, dovoljno je instalirati
Anacondu (nije potreban Visual Studio ili drugi kompajleri) i pratimo sljedeća uputstva.
Za instalaciju bez Python interfejsa (bez opcije kompajliranja) dovoljno je postupiti na
sljedeći način:
Za sve operativne sisteme (Linux, Windows, OS X), ako C99 kompajler nije dostupan, ili
Python interfejs za C kod nije potreban (npr. želimo samo generisati C kod za korištenje u
mikrokontroleru, nekoj C/C++ aplikaciji, ili za MATLAB interfejs) muaompc može biti
instaliran bez Python interfejsa na sljedeći način:
Pozicioniramo se u folder gdje smo otpakovali muaompc (folder koji sadrži setup.py i
install.cfg),
Deaktiviramo Python interfejs mjenjanjem konfiguracijskog fajla install.cfg:
Zamjenimo {"interface": 1} sa {"interface": 0} i sačuvamo fajl.
Nastavimo instalaciju toolboxa kao u prethodnom slučaju, npr. za Windows startamo
Anaconda Prompt, prebacimo se u muaompc folder i tipkamo:
19
2.2Pregled promjena ____________________________________________ Uvod u muAO-MPC
Verzija 0.4.0
Izvorno izdanje
20
3.1Kratak uvod u Python _________________________________________ Način rada softvera
Poglavlje 3
Način rada softvera
U ovom poglavlju predstavljamo vrlo jednostavan, korak po korak, tutorial koji naglašava
glavne karakteristike muaompc. Razmatraćemo dva primjera za ltidt modul. Tutorial za ovaj
modul razmatra dva tipa MPC problema:
1. Mali sistem samo sa ulaznim ograničenjima
2. Veći sistem sa mješovitim ograničenjima.
Prvi primjer pomaže pri razumjevanju same procedure automatskog generiranja koda. Drugi
primjer pokazuje najčešće karakteristike muaompc paketa. Prije nego nastavimo sa muaompc
tutorialom daćemo kratak uvod u Python vještine potrebne za pisanje sistemskog modula.
Napomena: Ukoliko ste već upoznati sa Python-om možete preskočiti ovo poglavlje. Sve što
trebate znati je da se matrice koje opisuju MPC postavke unose kao liste listi ili kao
dvodimenzionalni NumPy nizovi ili NumPy matrice.
Iako poznavanje Python-a nije potrebno za korištenje ovog alata postoji nekoliko stvari za
koje bi korisnici koji nisu upoznati sa Pythonom trebali znati prije prelaska na sljedeći odlomak:
1. Prazan prostor se računa
2. Python liste pomažu u kreiranju matrica
3. NumPy obezbjeđuje neku funkcionalnost sličnu MATLAB-u
4. Indeksi nizova počinju nulom
Slijedi detaljno objašnjenje svake od ovih stavki.
21
3.1Kratak uvod u Python _________________________________________ Način rada softvera
Prilikom pisanja modula sistema u narednim poglavljima pazite da nema praznog prostora
(kao što je tab, space itd) na početku svake linije.
Python liste predstavljaju kolekciju objekata odvojenih zarezima unutar kvadratnih zagrada.
Matrice i vektori se unose kao liste numeričkih listi. Na primjer jedinična matrica 2x2 unosi se
kao:
c = [[5], [5]]
Striktno govoreći I i c nisu matrice ali se interno pretvaraju u njih uz pomoć ltdit modula.
3.1.3 NumPy
Ovo omogućava korištenje nekih funkcija sličnih onima u MATLABu. Od posebnog interesa
su: diag, eye, zeros, ones. Na primjer jedinična matrica 2x2 može se unijeti kao
I = eye(2)
ili
I = diag([1, 1])
Naredbe zeros i ones imaju poseban zapis jer zahtjevaju veličinu matrice kao listu. Na
primjer, vektor kolona c odozgo može se zapisati kao
c = 5 * ones([2, 1])
22
3.2Osnovni MPC problem ________________________________________ Način rada softvera
3.1.4 Indeksiranje
Najjednostavniji problem koji može biti podešen za litdt modul je problem sa ograničenim
ulazima. Jedan od primjera toga nalazi se unutar tutorial foldera
muaompc_root/muaompc/_ltidt/tutorial, gdje je muaompc_root putanja za root folder u kojem
su ekstraktovani muaopc izvori (sources).
Mi kao sistem posmatramo DC-motor koji se može predstaviti sa:
1
y T
( Ku y )
0 1 0
Ac 1 , Bc K
0 T T
23
3.2Osnovni MPC problem ________________________________________ Način rada softvera
Parametri kontrolera
Horizontalna dužina je navedena kao koraci parametra N. U ovom slučaju izaberemo
vrijednost N=10. Dodatni parametri za kontroler su težinske matrice. Obično se biraju
postupkom podešavanja. Za ovaj primjer podesit ćemo ih da budu jedinične matrice
odgovarajuće veličine, odnosno, Q I R 2 x 2 , i R 1. Pored toga podesit ćemo P kao “auto“ pa
će je računati kao stabilizirajuću matricu.
Napomena: za korištenje “auto“ funkcije mora biti instaliran Slycot.
Sistem modul
Sada imamo potrebne informacije za pisanje Python sistemskog modula. Jedini zahtjevi su da
sadrži odgovarajuću Python sintaksu, ime matrica treba biti kako je opisano u sekciji sistemski
modul i naziv fajla treba završavati sa .py. U svom tekst editoru otipkajte sljedeće:
T = 0.1
K = 0.2
dt = T / 10
N = 10
# continuous time system
Ac = [[0, 1], [0, -1/T]]
Bc = [[0], [K/T]]
# input constraints
u_lb = [[-100]]
u_ub = [[100]]
# weighting matrices
Q = [[1, 0], [0, 1]]
R = [[1]]
P = "auto"
Sada kad smo napisali sys_motor.py modul nastavljamo sa kreiranjem mpc objekta. U
folderu koji sadrži sys_motor.py pokrenemo svoj Python interpreter i unesemo:
24
3.2Osnovni MPC problem ________________________________________ Način rada softvera
import muaompc
mpc = muaompc.ltidt.setup_mpc_problem("sys_motor")
mpc.generate_c_files()
I to je to. Ako je sve prošlo kako treba unutar trenutnog foldera trebao bi se nalaziti novi
folder pod nazivom cmpc. Kao alternativa za unošenje prethodnog koda možmo pokrenuti fajl
main_motor.py u tutorijal folderu koji sadrži upravo taj kod. Tutorijal folder već sadrži
sys_motor.py primjer. U narednom poglavlju pokazat ćemo kako se koristi generisan C kod.
Savjet: ako generisanje C koda nije bilo uspješno probajmo proslijediti ulazni parametar
verbose=True u funkciju setup_mpc_problem. Ispisat će dodatne informacije o postupku
generisanja koda. Na primjer:
mpc = muaompc.ltidt.setup_mpc_problem("sys_motor", verbose=True)
Savjet: po defoltu generisani C kod koristi dvostruku preciznost - float (64-bitni) za sve
proračune. Moguće je definisati različite numeričke reprezentacije preko ulaznog parametra
numeric funkcije generate_c_files. Na primjer za korištenje jednostruke preciznosti (32-bitni)
brojeva, utipkajte sljedeće:
mpc.generate_c_files(numeric="float32")
U cmpc folderu naći ćete sve automatski generisane kodove za trenutni primjer. Uključujući i
primjer Makefile koji kompajlira generisani kod u biblioteku koristeći GNU kompajler kolekciju
(gcc). Potrebno je prilagoditi Makefile instaliranom kompajleru.
Sada nastavljamo ka korištenju generisanog c-koda. Napravimo main_motor.c u postojećem
folderu (jedan nivo iznad cmpc foldera). Prva stvar koju trebamo uključiti je fajl zaglavlja
biblioteke koje se nalazi na putanji cmpc/include/mpc.h. Prije nego nastavimo, primjetimo
nekoliko stvari. mpc.h zaglavlje stavlja programeru na raspolaganje nekoliko korisnih konstanti,
na primjer MPC_STATES je broj stanja, MPC_INPUT je broj ulaza (sve dostupne konstante se
nalaze unutar cmpc/include/mpc_const.h). Ovo nam pomaže da na lak način definišemo za sve
varijable odgovarajuće veličine. Pored toga cmpc/include/mpc_base.h sadrži definiciju tipa
real_t, koji se koristi za sve numeričke operacije i algoritame. Na taj način je lako promijeniti
numerički tip cijelog algoritma (na primjer od jednostruke preciznosti do dvostruke preciznosti).
U ovom primjeru je po defoltu postavljen nivo dvostruke preciznosti. Imajući ovo u vidu
možemo deklarisati vektor stanja kao real_t x[MPC_STATES]; unutar naše main funkcije.
Moramo imati pristup nekim od varijabli algoritma, na primjer MPC ulazima sistema i
postavkama algoritma. To se radi kroz polja struct mpc_ctl strukture (deklarisane u mpc_base.h).
Instanca ove strukture je automatski definirana i nazvana ctl. Da bi joj pristupili u našem
programu moramo je deklarisati u našoj main funkciji kao extern struct mpc_ctl ctl.
25
3.2Osnovni MPC problem ________________________________________ Način rada softvera
Sljedeći korak je konfiguracija algoritma. U ovom slučaju imamo ograničen ulaz. Jedini
parametar koji trebamo podesiti je iteracija algoritma. Za ovaj jednostavni slučaj uzećemo deset
iteracija postavljajući ctl.conf->in_iter = 10.
Pretpostavimo da je trenutno stanje x 0.1 0.5T . Možemo riješiti naš MPC problem za
ovo stanje ako pozovemo mpc_ctl_solve_problem(&ctl, x);. Rješenje se smješta u niz
veličine MPC_HOR_INPUTS (dužina horizonta pomnožena brojem ulaza) prikazan u ctl.u_opt.
Možemo pristupiti njegovom prvom element koristeći zapis ctl.u_opt[0]. Primjer
kompletnog koda izgleda ovako:
#include <stdio.h> /* printf */
#include "cmpc/include/mpc.h"
int main(void)
{
real_t x[MPC_STATES];
extern struct mpc_ctl ctl;
ctl.conf->in_iter = 10;
x[0] = 0.1;
x[1] = -0.5;
mpc_ctl_solve_problem(&ctl, x);
printf("u[0] = %f \n", ctl.u_opt[0]);
printf("\n SUCCESS! \n");
return 0;
}
U tutorial folderu se između ostalog nalazi i main_motor.c fajl sa kodom iznad zajedno sa
makefileom. Kompajliramo kod tipkajući make motor (možda bude potrebno modifikovati
Makefile ili napraviti vlastiti). Ako je kompajliranje bilo uspješno trebali bi vidjeti novi exe fajl
pod nazivom motor. Ako ga pokrenemo na kraju teksta ispisanog na konzoli trebali bi vidjeti
riječ SUCCESS!
Napomena: Pri svakom auto generiranju C koda izbriše se cijeli cmpc folder pa se zato kao
mjera opreza preporučuje da nikakve važne fajlove ne snimamo u taj folder.
26
3.3Složeniji MPC problem ________________________________________ Način rada softvera
import muaompc
import numpy as np
mpc = muaompc.ltidt.setup_mpc_problem("sys_motor")
Mpc objekat sadrži mnoge metode i strukture podataka koje će pomoći da testiramo svoj
kontroler prije implementacije u C-u. Već prije smo spominjali metod generate_c_files. Python
interfejs će se automatski podesiti za MPC kontoler odmah nakon što pristupimo ctl atributu
našeg mpc objekta, bez potrebe za kompajliranjem bilo čega. Stoga isto možemo dobiti kao u
prethodnom C kodu sa jednostavnijom Python sintaksom. U Python interpreter utipkamo
sljedeće:
ctl = mpc.ctl
ctl.conf.in_iter = 10
x = np.matrix([[0.1], [-0.5]])
ctl.solve_problem(x)
print(ctl.u_opt[0])
print("SUCCESS!")
U ovom poglavlju razmotrićemo nešto složeniji problem. Međutim postupak koji slijedimo je
isti: prvo opisati problem, zatim generisati iz njega C kod i na kraju koristiti generisani kod.
Razmatrat ćemo problem koji predstavlja mnoge funkcije dostupne u ltidt modulu. Kod za
ovaj primjer može se naći unutar tutorial foldera muaompc_root/muaompc/_ltidt/tutorial, gdje je
muaompc_root putanja do root foldera muaompc.
Sljedeći je razmatran sistem u Cessna Citation 500 avionima predstavljen u ([4] strana 64).
.
Kontinuirano vremenski linearni model je dat sa x Ac x Bc u, y Cx , gdje je
27
3.3Složeniji MPC problem ________________________________________ Način rada softvera
x 4 je visina (m)
Parametri kontrolera
Knjiga ([4]) predlaže korištenje jediničnih matrica odgovarajućih dimenzija kao težinske
matrice Q i R. Umjesto toga izabraćemo ih kao dijagonalne matrice koje daju slične preformanse
kontrolera i mnogo manji broj Hessiana MPC kvadratnog programa, željena mogućnost pri bilo
kojem numeričkom algoritmu.
Sistemski modul
U ovom slučaju naš sistemski modul se naziva sys_aircraft.py. On je već diskretizovan jer je
raspon stope ograničenja lakše uključiti na ovaj način. To izgleda ovako:
from numpy import diag # similar effect with: from numpy import *
dt = 0.5
N = 10
mu = 100
# discrete-time system
Ad = [[ 0.23996015, 0., 0.17871287, 0., 0.],
[ -0.37221757, 1., 0.27026411, 0., 0.],
[ -0.99008755, 0., 0.13885973, 0., 0.],
[-48.93540655, 64.1, 2.39923411, 1., 0.],
[0., 0., 0., 0., 0.]]
Bd = [[-1.2346445 ],
[-1.43828223],
28
3.3Složeniji MPC problem ________________________________________ Način rada softvera
[-4.48282454],
[-1.79989043],
[1.]]
# Weighting matrices for a problem with a better condition number
Q = diag([1014.7, 3.2407, 5674.8, 0.3695, 471.75])
R = diag([471.65])
P = Q
# input constraints
eui = 0.262 # rad (15 degrees). Elevator angle.
u_lb = [[-eui]]
u_ub = [[eui]]
# mixed constraints
ex2 = 0.349 # rad/s (20 degrees). Pitch angle constraint.
ex5 = 0.524 * dt # rad/s * dt input slew rate constraint in discrete time
ey3 = 30.
# bounds
e_lb = [[-ex2], [-ey3], [-ex5]]
e_ub = [[ex2], [ey3], [ex5]]
# constraint matrices
Kx = [[0, 1, 0, 0, 0],
[-128.2, 128.2, 0, 0, 0],
[0., 0., 0., 0., -1.]]
Ku = [[0],
[0],
[1]]
# terminal state constraints
f_lb = e_lb
f_ub = e_ub
F = Kx
Prije nego nastavimo napravićemo nekoliko napomena. Koristimo Numpy pri formiranju
diagonalnih matrica Q i R uz pomoć funkcije diag. Konačno uporedimo naziv varijabli
korištenih u sistemskom modulu sa MPC problemom opisanom u odjeljku litdt modul. Pored
toga opcioni kazneni parameter mu je izabran koristeći procedure opisane u dijelu Osnove
tuniranja. Konačno težinske matrice Q i R su od jediničnih matrica pretvorene u matrice
prikazane iznad koristeći funkcije u odjeljku Podešavanje Hessian-a.
Sada kad smo napisali system modul nastavljamo sa kreiranjem instance muaompc.ltidt
klase. Prebacimo se u folder koji sadrži fajl sys_aircraft.py i u Python interpreter utipkajmo
sljedeće:
import muaompc
mpc = muaompc.ltidt.setup_mpc_problem(’sys_aircraft’)
mpc.generate_c_files()
Ako je sve uredu pojaviće se novi folder pod nazivom cmpc. Ili jednostavnije prebacimo se u
tutorial folder i pokrenemo fajl main_aircraft.py, koji sadrži isti Python kod kao ovaj iznad.
29
3.3Složeniji MPC problem ________________________________________ Način rada softvera
Unutar cmpc foldera nalazi se automatski generisan kod za prethodni primjer (ukoliko ste
prethodno generisali kod za osnovni tutorial bit će prepisan). Uključen je također i Makefile koji
kompajlira generisan kod u biblioteku koristeći GNU kolekciju kompajlera (GCC). Sljedeći
korak je iskoristiti generisani kod. Prvi dio main_aircraft.c fajla smješten u tutorial folderu
identičan je prvom djelu main_aircraft.c fajla koji se nalazi u osnovnom MPC problemu.
Konfiguracija algoritma
Sljedeći korak je konfiguracija algoritma. U ovom slučaju imamo sistem sa ulaznim
ograničenjima i ograničenjima stanja. Jedini parametar koji trebamo podesiti je broj ponavljanja
algoritma. Algoritam sa ograničenim ulazima je produžena Lagrangeova metoda što znači da
zahtjeva petlju sa dvostrukom iteracijom (unutrašnja i spoljašnja petlja).
Simulacijom utvrđujemo da sa 24 unutrašnje iteracije i dvije spoljašnje dobijamo prihvatljivu
aproksimaciju MPC problema koristeći warmstart strategiju.
ctl.conf.in_iter = 24; /* number of internal iterations */
ctl.conf.ex_iter = 2; /* number of external iterations */
ctl.conf.warmstart = 1; /* automatically warmstart algorithm */
30
3.3Složeniji MPC problem ________________________________________ Način rada softvera
return 0;
}
Pokretanje koda
Unutar trenutnog foldera nalazi se između ostalog i fajl main_aircraft.c koji sadrži prethodni
kod skupa sa Makefile-om. Kompajlirajte kod tipkajući make aircraft (možda će biti potrebno
urediti Makefile). Ukoliko je kompilacija bila uspješna pojaviće se novi fajl pod nazivom
aircraft. Ukoliko ga pokrenete ispisaće riječ SUCCEESS! na dnu tekst displeja u konzoli.
Probajmo sada sve to koristeći Python interfejs. Kao i inače pozicioniramo se u tutorial
folder, pokrenemo svoj Python interpreter i u njemu napišemo:
import muaompc
import numpy as np
mpc = muaompc.ltidt.setup_mpc_problem("sys_aircraft")
ctl = mpc.ctl
s = 40
ctl.conf.in_iter = 24
ctl.conf.ex_iter = 2
ctl.conf.warmstart = True
n, m = mpc.size.states, mpc.size.inputs
x = np.zeros([n, 1])
x[3] = -400
for i in range(s):
ctl.solve_problem(x)
31
3.4Koji je sljedeći korak? _________________________________________ Način rada softvera
x = mpc.sim.predict_next_state(x, ctl.u_opt[:m])
# x = ctl.sys.Ad.dot(x) + ctl.sys.Bd.dot(ctl.u_opt[:m]) # predict
print("step:", i, "- u[0] = ", ctl.u_opt[0], "; x = ", x.T)
print("SUCCESS!")
32
4.1Kreiranje MPC kontrolera _________________________________________ MPC kontroleri
Poglavlje 4
MPC kontroleri
Ovaj odjeljak detaljno objašnjava generisanje MPC kontrolera za date MPC postavke.
1 N 1
min imize (( x j x _ ref j )T Q( x j x _ ref j )
u 2 j 0
Gdje je x j 1 Ad x j Bd u j , j 0,..., N 1
33
4.1Kreiranje MPC kontrolera _________________________________________ MPC kontroleri
u _ lb u j u _ ub, j 0,..., N 1
e _ lb K x x j K u u j e _ ub, j 0,..., N 1
f _ lb Fx N f _ ub
x0 x
Sekvence x_ref i u_ref označavaju reference stanja i ulaza redom. Date su online. Po defoltu
referenca je početne vrijednosti.
Matrice koje opisuju MPC postavke čitaju se iz system modula. U osnovi system modul se i
sastoji od matrica koje opisuju MPC postavke.
Sistem matrice mogu biti date u diskretnom ili kontinuiranom vremenu.
- K x se imenuje kao Kx
34
4.1Kreiranje MPC kontrolera _________________________________________ MPC kontroleri
- K u se može imenovati kao Ku. Ako nije određen postavlja se kao nulta matrica
odgovarajuće veličine.
Ako bilo koji od e_lb, e_ub ili Kx nije definisan tada se smatra da je MPC postavka bez
ograničenja trenutnog staja.
Ograničenja terminalnog stanja su opciona:
ukoliko bilo koje od F, f_lb ili f_ub nisu određeni svako od njih se postavlja kao Kx, e_lb,
e_ub redom.
Parametar odstupanja µ od proširene Lagrangeove metode je opcionalan. Ako je naveden
onda se mora nazvati mu i mora biti pozitivan realan broj. Ako nije naveden onda se računa
automatski što se i preporučuje.
Sve matrice se prihvataju kao Python liste listi ili kao numpy nizovi ili numpy matrice.
Sistem modul se može zapisati i kao MATLAB mat fajl koji se sastoji od potrebnih matrica
koristeći njihove navedene nazive.
Na primjer, ulazno ograničen vremenski kontinualan LTI sistem drugog reda može biti
opisan sljedećeim system.py Python modulom:
Ac = [[0, 1], [-1, -1]]
Bc = [[0], [1]]
dt = 0.5
N = 10
Q = [[1, 0], [0, 1]]
R = [[1]]
P = Q
u_lb = [[-10]]
u_ub = [[10]]
Sljedeća funkcija kreira MPC objekat za sistem modul. Funkcija pripada ltidt modulu.
ltidt.setup_mpc_problem (system_name, verbose=False)
system_name (string ili Python modul) – string sa nazivom Python modula koji sadrži
opis sistema npr. za system.py sistem_name=“system“, ili system_name=“system.py“.
35
4.1Kreiranje MPC kontrolera _________________________________________ MPC kontroleri
može biti također ime MATLAB mat fajla. U tom slučaju naziv fajla mora imati
ekstenziju .mat npr za system.mat parametar je dat sa system_name=“system.mat“.
Uslovno, Python modul može biti dat kao ulaz. Pa tako ako uradimo import system onda
je system_name=system.
Sljedeća funkcija je dostupna za sve MPC objekte i generira C kod iz podataka MPC
objekata.
_MPCBase.generate_c_files(numeric=’float64’,fracbits=None,matlab
=False,singledir=False)
36
4.2Upotreba MPC kontrolera _________________________________________ MPC kontroleri
fracbits (integer or None) – cijeli broj veći od 0 koji pokazuje broj frakcionih bita
reprezentacije sa fiksnom tačkom. (EXPERIMENTAL) samo potrebno ako je numeric
tipa „fip“.
singledir (bool) – ako je vrijednost True, kompletan generisani kod je sačuvan u jedan
folder. Korisno u primjeru Arduino mikrokontrolera.
Na primjer, pretpostavimo da system.py sadrži validne MPC postavke i pretpostavimo da
želimo generisati kod za odgovarajući mikrokontroler za programiranje pomoću Simulinka.
import muaompc
mpc = muaompc.ltidt.setup_mpc_problem("system")
mpc.generate_c_files(numeric="float32", matlab=True)
# you will find the generated C code in the current directory
Kao što je pokazano u tutorialima za osnovnu upotrebu µAO-MPC nije potrebno poznavati
posebno MPC teoriju. Međutim za korištenje naprednijih funkcija potrebno je bolje poznavati
MPC. Ovo poglavlje počinje osnovnim teorijama o MPC-u i nastavlja sa detaljnim opisom
nekoliko načina na koje µAO-MPC može riješiti MPC probleme.
37
4.2Upotreba MPC kontrolera _________________________________________ MPC kontroleri
Parametarski QP
QP zavisi od trenutnog stanja sistema i referenci putanja ukoliko postoje. Naš parametarski
QP možemo izraziti u sljedećem obliku:
1
min u T Hu u T g ( x, x ref , u ref )
u 2
uuu
subject to
z ( x) Eu z ( x)
Posljednja stvar koju trebamo primjetiti je to da je g () jedini izraz koji zavisi od referentnih
putanja. Za poseban slučaj početne regulacije (gdje su obje reference nula) jednostavno pišemo
g(x).
U ovom odjeljku opisujemo dvije glavne funkcije kontrolera dostupne korisnicima µAO-
MPC. Radi lakšeg objašnjavanja prvo ćemo razmotriti Python interfejs. Poslije toga ćemo
razmotriti ekvivalentne mada malo složenije C funkcije. Python interfejs može poslužiti za
izradu prototipa i simulaciju MPC kontrolera. C funkcije su zapravo implementacija samog
kontrolera.
38
4.2Upotreba MPC kontrolera _________________________________________ MPC kontroleri
39
4.2Upotreba MPC kontrolera _________________________________________ MPC kontroleri
Obično je samo prvi ulazni vektor u MPC šemi za optimalnu unosnu sekvencu u_opt
značajan, npr. prvi inputs elementi u u_opt.
Na primjer, pretpostavimo da je mpc MPC objekat sa samo ograničenjima ulaza i želimo da
sva stanja budu podešena na 2, startajući sa svim stanjima 3.
mpc.ctl.conf.in_iter = 5 # configuration done only once
mpc.ctl.conf.warmstart = True # use warmstart
mpc.ctl.x_ref = numpy.ones(mpc.ctl.x_ref.shape) * 2
40
4.2Upotreba MPC kontrolera _________________________________________ MPC kontroleri
C funkcije
Funkcije koje su dostupne korisniku opisane su u C API u mpc.h fajlu. Python i MATLAB
interfejsi nude potpuno iste funkcionalnosti kao i C interfejs ali sa pojednostavljenom sintaksom.
U svim slučajevima približno rješenje u_opt se nalazi unutar ctl strukture. Na primjer u C
programu prvom elementu sekvence se pristupa uz pomoć ctl->u_opt[0], u Python-u
pomoću ctl.u_opt[0] a u MATLAB-u ctl.u_opt[1].
41
5.1Klase simulacije u Python-u ______________________________________ Dodatne funkcije
Poglavlje 5
Dodatne funkcije
Ovo poglavlje predstavlja neke dodatne funkcije koje omogućavaju kreiranje naprednijih
MPC kontrolera.
Ovaj pododjeljak pokazuje kako se vrlo lako može napraviti simulacija ponašanja sistema.
Bilo koji napravljeni MPC objekat sadrži instancu klase simulacije MPCSim, koji se po difoltu
naziva sim.
Najosnovniji metod jednostavno računa sljedeće stanje, npr. vrijednost stanja pri narednom
koraku uzorkovanja za dati ulaz.
MPCSim.predict_next_state(xk, uk)
Računa sljedeće stanje xk1=A*xk+B*uk
Parametri
uk (numpy nizovi) – ulaz koji se primjenjuje na sistem. Mora biti veličine inputs.
42
5.1Klase simulacije u Python-u ______________________________________ Dodatne funkcije
Parametri
steps (int) – broj diskretnih koraka simulacije. Period svakog koraka je vrijeme
diskretizacije dt.
x_ini (numpy niz) – početno stanje od kojeg simulacija počinje. Mora biti
veličine states.
import numpy as np
T = 10
mpc.ctl.x_ref = np.zeros(mpc.size.hor_states)
mpc.ctl.u_ref = np.zeros(mpc.size.hor_inputs)
mpc.sim.regulate_ref(T, np.ones(mpc.size.states))
mpc.sim.data.x # contains the state evolution
mpc.sim.data.u0 # contains the applied inputs
43
5.2Podešavanje – tuniranje __________________________________________ Dodatne funkcije
u0=None
Ulazni vektor sistema pri svakom momentu uzorkovanja.
x=None
Stanje vektora sistema pri svakom trenutku uzorkovanja.
Primjer
Primjer koji iscrtava rezultate simulacije koristeći matplotlib dostupan je na putanji
examples/ltidt/sim_matplotlib.
Postoje samo dva parametra koja se podešavaju a to su broj unutrašnjih i broj vanjskih
iteracija. U mnogim slučajevima podešavanja to je lako i intuitivno. Za probleme bez
ograničenja stanja samo je bitan broj unutašnjih iteracija. Ovi parametri su određeni onlajn.
Trenutno, odabir tih parametara se pravi u potpunosti od strane korisnika. U mnogim
ugrađenim sistemima broj iteracija može biti ograničen snagom procesora računara. Općenitije,
korisnik mora uporediti preformanse MPC kontrolera koje dobijamo rješenjem sa pouzdanim
programom za rješavanje (kao što je CVXOPT) nasuprot rješenjima dobijenim od µAO-MPC za
dati broj iteracija. Na primjer, poređenje se može napraviti koristeći stazu troškova u svakoj tački
putanje. Na kraju tačan broj iteracija najviše zavisi od aplikacije.
Opcionalno, treća vrijednost koja se podešava je parametar odstupanja µ koji se bira oflajn
(navedeno je u sistem modulu). µAO-MPC će po difoltu automatski izračunati dobru vrijednost
za µ ako nije već specificirana što se preporučuje. Grubo rečeno, veliki parametar odstupanja
povlači mali broj spoljašnjih iteracija potrebnih za dobijanje dobrih performansi naročito kad su
aktivna ograničenja. Kako god, više unutrašnjih iteracija je potrebno jer se broj uslova
unutrašnjeg problema povećava. Također vrijedi i suprotno, mala vrijednost µ doprinosi lakšem
rješavanju unutrašnjeg problema posebno ako nisu aktivna ograničenja stanja. Kad su aktivna
ograničenja stanja potreban broj spoljašnjih iteracija je veći.
Do sada bi trebalo biti jasno da je odabir odgovarajuće vrijednosti za µ (ne previše niska i ne
previše visoka vrijednost) od presudnog značaja.
Iako se ne preporučuje, µAO-MPC dozvoljava iskusnom korisniku da eksplicitno postavi
vrijednost za µ u sistem modulu. Odabir parametra µ je olakšan uz pomoć naredbe
44
5.2Podešavanje – tuniranje __________________________________________ Dodatne funkcije
Sada mu sadrži vrijednost parametra odstupanja koja nije ni previše visoka ni previše niska.
Ovo je samo početna vrijednost koja nam može pomoći za finija podešavanja. Funkcija koja je
dobrodošla pri finijem podešavanju µ je calc_int_cn. Računa broj stanja unutrašnjeg
problema za listu parametara µ. Nastavimo sa primjerom:
mpc.tun.calc_int_cn([0.5 * mu, 2 * mu])
vratiće nam broj stanja za svaki parametar na listi. Ovo nam pomaže da ispitamo da li odabrani
mu ne čini naš interni problem nemogućim. Sljedeći odjeljak predstavlja proceduru koja nam
pomaže da smanjimo broj stanja Hessian od QP i isto tako internog problema dozvoljavajući
upotrebu veće vrijednosti za mu i samim tim čini rješavanje brže.
Osnovni algoritam optimizacije korišten od strane µAO-MPC daje izvrsne rezultate za niže
brojeve stanja (npr ispod 100). Da bi ovo postigli posežemo za funkcijom reduce_H_cn koja u
osnovi rješava nelinearne programe (NLP).
MPCTuning.reduce_H_cn(xref,uref,stw,inw,cn_ub=100,stw0=None,
inw0=None)
Pronalazi težinske matrice za smanjenje broja Hessian-ovog uslova.
Parametri:
xref (numpy nizovi) – putanja koju stanje treba pratiti. xref je dimenzija
(states,points).
uref (numpy nizovi) – sekvenca ulaza za datu putanju stanja xref. uref je
dimenzija (inputs, points).
stw (numpy niz) – relativne težine stanja date kao vektor dimenzija (states, 1).
Ovaj vektor odgovara dijagonali težinske matrice stanja Q odnosno Q=diag(stw).
inw (numpy nizovi) – relativne težine ulaza dat kao vektor dimenzija (inputs).
Ovaj vektor odgovara dijagonali ulazne težinske matrice R odnosno R=diag(inw).
cn_ub (skalar) – gornja granica Hessian broja stanja. Mora biti veći od 1.
45
5.2Podešavanje – tuniranje __________________________________________ Dodatne funkcije
stw0 (none ili numpy niz) – početno nagađanje rješenja za rješenje težinskog
stanja. Ukoliko je vrijednost None računa se kao jedinična matrica odgovarajućeg
oblika.
inw0 ( none ili numpy niz) – početno nagađanje rješenja za težinski ulaz
oblika inputs. Ako je vrijednost None računaće se kao jedinična matrica
odgovarajućih dimenzija.
Izlazi
Riječnik sa dijagonalama novopodešenih težina. Ključne riječi su sljedeće:
Date reference putanje stanja i ulaza (xref, uref), razlika između simulirane putanje za
neograničen sistem (sa početnim uslovom prve tačke putanje (xref, uref)) mora biti
minimizirana u odnosu na dijagonalnu težinsku matricu QP-a. Problem se predstavlja kao
nelinearni program (NLP).
Ovaj NLP uzima referentnu putanju kao ulaz (za sekvence stanja i ulaza) referentne težinske
matrice koje postavljaju željene preformanse kontrolera i gornju granicu broja stanja QP
Hessian-a. NLP vraća težinske matrice koje daju slične performanse kontrolera i čini H (broj
stanja Hessian) nižim od određene gornje granice. Kako je ovaj NLP općenito nekonveksan
možda neće biti jedinstveno rješenje, i pronalazak rješenja može zavisiti od početnog pogađanja
za težinsku matricu.
1. Ručno podesimo svoj MPC kontroler kao i inače. U tom trenutku samo su prihvatljive
dijagonalne matrice. Ove matrice se koriste kao osnova NLP.
2. Generišemo putanju za stanja i odgovarajuće ulazne sekvence koja predstavlja MPC
aplikaciju.
46
5.3Automatski odabir stabilizirajuće matrice ____________________________ Dodatne funkcije
Ključna riječ auto služi da se trenutno stanje težinske matrice P bira automatski tako da je
terminalna cijena kontrolna Lyapunova funkcija za postavke modela prediktivne kontrole.
Razmatramo sljedeće slučajeve:
sistem otvorene petlje je stabilan i kod njega su samo ulazi ograničeni. Kao izlaz se
vraća matrica rješenje Lyapunoove jednačine. U ovom slučaju tačka regulacije
zatvorene petlje sistema je globalno eksponenecijalno stabilna.
par (Ad, Bd) se također može stabilizovati s tim da postoje ograničenja i na ulazu i na
stanjima. Rješenje diskretne algebarske Riccatijeve jednačine se vreća kao izlaz.
Tačka regulacije je asimptotski (eksponencijalno) stabilna skupa sa oblasti privlačenja
X N ( X s ).
47
5.4MATLAB/Simulink interfejs ______________________________________ Dodatne funkcije
Ako su oba uslova ispunjena tada se Lyapunova jednačina može riješiti. Ako jedan od uslova
nije ispunjen tada se rješava diskretna Ricatti jednačina.
U tom slučaju X N se definiše kao skup stanja za koje je MPC problem izvodljiv. X S je tada
bilo koji podskup skupa MPC optimalnih vrijednosti.
5.4.1 Zavisnosti
Generisanje koda
Prvo moramo generisati kod koji predstavlja MATLAB interfejs. Jedino što trebamo uraditi
je dodati opciju matlab=True pri pozivanju generatora. Sljedeće Python komande će
generisati MATLAB/Simulink interfejs za primjer sys_motor.mat:
48
5.4MATLAB/Simulink interfejs ______________________________________ Dodatne funkcije
import muaompc
mpc = muaompc.ltidt.setup_mpc_problem(’sys_motor.mat’)
mpc.generate_c_files(matlab=True)
Generisani cmpc folder sadrži dva nova foldera koji se nazivaju matlab i simulink pored
uobičajenih C fajlova. Sadrži sve kodove za MATLAB i Simulink interfejs. Slijedi i detaljni
opis.
Kompajliranje interfejsa
Kada se jednom napravi kod interfejsa sljedeći korak je kompajliranje MATLAB interfejsa.
Startamo MATLAB, postavimo generisan cmpv/matlab folder kao radni folder i pozovemo
naredbu make koja izvršava make.m skriptu. Na primjer pretpostavimo da smo u folderu gdje
smo generisali podatke, unutar MATLABA unesimo:
>> cd cmpc/matlab
>> make
Korištenje interfejsa
Sada možemo koristiti interfejs koji je enkapsuliran unutar klase nazvane mpc_ctl koja
predstavlja MPC kontroler. Jednostavno deklarišemo instancu te klase koju obično zovemo ctl
(kontroler). Na primjer:
ctl = mpc_ctl; % create an instance of the class
ctl.conf.in_iter = 10; % configure the algorithm
x = [0.1; -0.5]; % current state
ctl.form_qp(x) % form the QP for the current state
qpx = ctl.qpx; % qpx contains the QP in standard form
u = quadprog(qpx.HoL, qpx.gxoL, [], [], [], [], qpx.u_lb, qpx.u_ub);
ctl.solve_problem(x); % solve the MPC problem for current state
ctl.u_opt % display the computed input sequence
norm(u - ctl.u_opt) % ctl.u_opt is the MPC approximation of u
Primjer
49
5.4MATLAB/Simulink interfejs ______________________________________ Dodatne funkcije
Kompajliranje interfejsa
Kao što je već objašnjeno, za generaciju prekonfigurisanog Simulink modela moramo
postaviti parametar matlab=True pri pozivanju generatora. Ovaj model se nalazi u
cmpc/simulink folderu. Da bi pokrenuli dati model moramo uraditi sljedeće:
Primjer
50
Zaključak
51
Bibliografija
[1] Zometa, P., Kögel, M. and Findeisen, R., “muAO-MPC: A Free Code Generation Tool for
Embedded˙Real-Time Linear Model Predictive Control,” Proc. American Control Conference,
Washington D.C., USA, 2013.
[2] Kögel, M., Zometa, P. and Findeisen, R., “On tailored model predictive control for low cost
embedded systems with memory and computational power constraints,” technical report, 2012.
[3] Kögel, M. and Findeisen, R., “Fast predictive control of linear, time-invariant systems using an
algorithm based on the fast gradient method and augmented Lagrange multipliers,” in Proc.
2011 IEEE Multi-conference on Systems and Control, pages 780-785, Denver, USA, 2011.
[4] Maciejowski, J. M., “Predictive Control with Constraints,” Pearson Education, 2002.
[5] Waschl, H. and Alberer, D. and del Re, L., “Numerically Efficient Self Tuning Strategies for
MPC of Integral Gas Engines,” in Proc. IFAC World Congress 2011, pp. 2482-2487.
[6] Rawlings, J., Mayne, D., “Model Predictive Control: Theory and Design,” Nob Hill Pub., 2009.
[7] Grüne, L., Pannek, J., “Nonlinear Model Predictive Control,” Springer-Verlag, 2011.
52