現(xiàn)代控制理論是建立在狀態(tài)空間基礎(chǔ)上的一種控制理論,是自動(dòng)控制理論的一個(gè)主要組成部分。在現(xiàn)代控制理論中,包括線性系統(tǒng)和非線性系統(tǒng),定常系統(tǒng)和時(shí)變系統(tǒng),單變量系統(tǒng)和多變量系統(tǒng),它們?cè)诮V蠖急磉_(dá)為矩陣形式,因此通過計(jì)算機(jī)進(jìn)行控制系統(tǒng)的仿真,實(shí)質(zhì)就是利用計(jì)算機(jī)來進(jìn)行矩陣運(yùn)算。小型控制系統(tǒng)進(jìn)行仿真時(shí),所涉及的控制算法以及矩陣運(yùn)算量都是有限的,因此對(duì)仿真的效能要求較低。而當(dāng)需要進(jìn)行復(fù)雜系統(tǒng)的仿真試驗(yàn)時(shí),不僅編寫相應(yīng)的控制算法消耗大量的人力,較低的程序執(zhí)行效率也將消耗大量的計(jì)算機(jī)運(yùn)算能力,因此選取和使用快捷高效的仿真開發(fā)方法顯得尤其必要。
Matlab是一種應(yīng)用廣泛的數(shù)學(xué)類科技應(yīng)用軟件,在數(shù)值運(yùn)算尤其是矩陣運(yùn)算方面有著非常好的表現(xiàn),用戶不需要深刻了解算法及編程技巧,只需掌握了入門的數(shù)學(xué)知識(shí)和程序設(shè)計(jì)能力就可以利用其進(jìn)行復(fù)雜的科學(xué)計(jì)算,如今已經(jīng)成為學(xué)界理論分析和實(shí)驗(yàn)研究所必須掌握的軟件工具之一。但限于其本身是一種解釋方式運(yùn)行的高級(jí)計(jì)算機(jī)語言,在進(jìn)行重復(fù)計(jì)算工作時(shí)執(zhí)行效率較低,且運(yùn)算過程不能脫離計(jì)算機(jī)環(huán)境進(jìn)行。VC++是微軟公司推出的開發(fā)環(huán)境Visual Studio中的一個(gè)組成部分,用戶可以利用其進(jìn)行快速的Windows應(yīng)用程序開發(fā),設(shè)計(jì)出圖形界面豐富的功能軟件,但是在編寫矩陣運(yùn)算時(shí)缺少專業(yè)的數(shù)據(jù)類型變量,當(dāng)編寫復(fù)雜的算法時(shí)不免要消耗大量的編程時(shí)間[1][2]。
比較兩者的優(yōu)缺點(diǎn)后不難發(fā)現(xiàn),Matlab易于使用但是在仿真時(shí)程序運(yùn)行效率低[3],實(shí)時(shí)性較差,使用條件有限,VC++不便于直接進(jìn)行矩陣計(jì)算但是代碼運(yùn)行效率高,實(shí)時(shí)性較好,應(yīng)用范圍廣,也就是說,如果通過混合編程能讓兩者的優(yōu)勢(shì)互補(bǔ),在工作中將大大減少在算法編程方面的工作量,并且能夠改善仿真程序代碼的運(yùn)行效率以及實(shí)時(shí)性,為科研工作和工程開發(fā)提供更強(qiáng)大的技術(shù)支持。
目前VC++與Matlab相結(jié)合的混合編程主要有以下幾種方法[4]:
這種處理方法不要求鏈接整個(gè)Matlab,只需嵌入必要的Matlab引擎庫,節(jié)省了大量的系統(tǒng)資源,使應(yīng)用程序整體性能更好,處理效率更高,但這種混合編程的方法需要Matlab在后臺(tái)適時(shí)運(yùn)行不能脫離Matlab環(huán)境,嚴(yán)重影響了程序的通用性,因此這種方法在實(shí)際開發(fā)過程中很少采用。
圖1 新建 VC++對(duì)話框程序
圖2 設(shè)計(jì)程序界面
圖3 單級(jí)倒立擺系統(tǒng)仿真框圖
圖4 Simulink仿真模型得到的仿真結(jié)果
圖5在VC++中求解反饋增益 矩陣 K
圖6 根據(jù)VC++中求得的增益矩陣K得到的仿真結(jié)果
圖7 Matlab中求解增益矩陣K消耗 的時(shí)間
圖8 VC++中求解增益矩陣K消耗的時(shí)間的方法
這種方法是對(duì)Matlab函數(shù)庫和一種補(bǔ)充,用戶可以自已編寫一些高效或者具有特定功能的函數(shù),利用編譯器把它們編譯為mex文件,供Matlab調(diào)用,相當(dāng)于添加自定義的Matlab函數(shù)。
這種方法通過指定的編譯器,把由Matlab編寫的m函數(shù)文件編譯成動(dòng)態(tài)鏈接庫文件(dll)。只需在程序開發(fā)和發(fā)布中包含其生成的動(dòng)態(tài)庫,就可以在VC++程序中調(diào)用封裝好的Matlab函數(shù),實(shí)現(xiàn)數(shù)值算法的運(yùn)用。這種方法可以使程序脫離Matlab運(yùn)行環(huán)境,減少文件外部存儲(chǔ)空間的占有量,并實(shí)現(xiàn)了代碼共享。
COM技術(shù)是一種應(yīng)用廣泛、方便靈活的方法,是利用Matlab提供的Deploy Tool工具實(shí)現(xiàn)Matlab與C/C++的混合編程。COM給軟件開發(fā)人員提供了一種共享二進(jìn)制代碼的方法,但是由于缺乏可視化界面,其應(yīng)用范 圍受到一定限制。
從實(shí)際應(yīng)用角度考慮,前兩種編程方法雖然簡(jiǎn)便,但適用范圍狹窄,第四種方法適用性好于前兩種方法,但需要用戶掌握較高的程序設(shè)計(jì)水平,不便于科研人員使用。本文選用第三種方法進(jìn)行編程,并以控制工程中經(jīng)典的單級(jí)倒立擺系統(tǒng)的LQR線性二次型調(diào)節(jié)器的設(shè)計(jì)為例,描述這一方法的實(shí)現(xiàn)過程,驗(yàn)證其在控制系統(tǒng)仿真中能夠帶來的優(yōu)勢(shì)之處。
本文所采用的軟件版本是Visual Studio 2008和Matlab R2010a。
(1)Matlab編譯環(huán)境的設(shè)置
控制算法從Matlab到VC++的代碼轉(zhuǎn)制要通過編譯器來進(jìn)行,所以首先要設(shè)置Matlab的編譯環(huán)境。啟動(dòng)Matlab R2010a,在命令窗口中輸入命令mbuildsetup,根據(jù)出現(xiàn)的提示選擇合適的編譯器,本文所使用的是Microsoft Visual C++ 2008。
(2)編寫包含函數(shù)算法的m文件并且進(jìn)行編譯
本例中m文件實(shí)現(xiàn)了單級(jí)倒立擺系統(tǒng)矩陣x˙= A x+ B u 和LQR控制反饋增益矩陣的函數(shù)fu nction[K,S,E]=myLQR(Info,Q,R,N)的求解過程。這里需要說明的是,m文件應(yīng)是函數(shù)的實(shí)現(xiàn)而不是單純的腳本文件,而且從混合編程的角度來講,編譯腳本文件不具備實(shí)際意義。
Matlab提供了三種使用Matlab編譯器的方式[5]:①在Matlab環(huán)境中使用mcc命令;②在系統(tǒng)命令環(huán)境中使用mcc.exe(在Windows上);③在Matlab環(huán)境中使用Deployment Tool。
以第①種方法為例,m文件編寫完成后,在Matlab中修改當(dāng)前工作文件夾路徑為包含m文件的文件夾路徑。在Matlab命令窗口中輸入:mcc- W cpplib:myLQR-T link:lib m yLQR.m即可將m文件編譯為動(dòng)態(tài)鏈接庫文件。
(3)建立VC++工程并進(jìn)行屬性設(shè)置
新建一個(gè)空白的對(duì)話框工程。
如圖1所示,在項(xiàng)目-屬性-配置屬性-C/C++的附加包含目錄中加入”MATLAB PATHR2010aexterninclude”,其中MATLAB PATH是Matlab在硬盤中的安裝路徑。
在項(xiàng)目-屬性-配置屬性-鏈接器的附加庫目錄中加入”MATLAB PATHR2010aexternlibwin32microsoft”。
在項(xiàng)目-屬性-配置屬性-鏈接器-輸入的附加依賴項(xiàng)中加入”mclmcrrt.lib myLQR.lib”。
將上一步中由m文件生成的頭文件、動(dòng)態(tài)鏈接庫文件和靜態(tài)鏈接庫復(fù)制到VC++工程文件夾目錄下。
(4)VC++界面設(shè)計(jì)及數(shù)據(jù)接口編程
根據(jù)單級(jí)倒立擺的基本參數(shù),以及LQR線性二次型調(diào)節(jié)器的加權(quán)參數(shù),設(shè)計(jì)VC++對(duì)話框的圖形界面,并使用mwArray類型變量配置動(dòng)態(tài)鏈接庫函數(shù)的數(shù)據(jù)接口,如圖2所示。
(1)Matlab中的運(yùn)算結(jié)果
在Simulink中依據(jù)單級(jí)倒立擺的系統(tǒng)仿真框圖建立仿真程序模型,如圖3所示。
選取一組適當(dāng)?shù)膯渭?jí)倒立擺系統(tǒng)參數(shù)[6]。
表1 單級(jí)倒立擺系統(tǒng)參數(shù)
根據(jù)單級(jí)倒立擺系統(tǒng)的系統(tǒng)模型[7]。
將得到 的最優(yōu)反饋增益矩陣K加到Simulink仿真模型中的反饋增益環(huán)節(jié)上。仿真后得到輸出結(jié)果為小車位移x和擺桿傾角Ψ,如圖圖4所示。
(2)VC++中的運(yùn)算結(jié)果
在求解LQR二次型最優(yōu)控制反饋增益矩陣的程序中輸入與 前文中單級(jí)倒立擺系統(tǒng)相同的系統(tǒng)參量,并進(jìn)行計(jì) 算,得到最佳反饋增益矩陣K,如圖5所示。
選擇時(shí)間軸T=0:0.005:10,使用lsim命令可以求得此單級(jí)倒立擺系統(tǒng)的輸出響應(yīng)分別為小車位移x和擺桿傾角Ψ,如圖6所示。
對(duì)比兩次仿真的結(jié)果可以得出結(jié)論,利用編譯器編譯m文件得到的動(dòng)態(tài)鏈接庫文件所包含的函數(shù)能夠正確進(jìn)行矩陣運(yùn)算,得到LQR二次型最優(yōu)控制反饋增益矩陣K。
在Matlab中使用其自帶的Profiler工具統(tǒng)計(jì)myLQR函數(shù)求解反饋增益矩陣K時(shí)所消耗的時(shí)間為5 14毫秒如圖7所示。
而在VC++中,在調(diào)用myLQR函數(shù)的語句前后分別使用GetTickCount()函數(shù)查詢當(dāng)前系統(tǒng)時(shí)間,兩次查詢的結(jié)果作差后,即得到VC++執(zhí)行函數(shù)myLQR求解矩陣K所消耗的運(yùn)算時(shí)間,如圖8所示。
程序運(yùn)行后得到VC++中調(diào)用myLQR函數(shù)消耗時(shí)間為442毫秒,如前文圖5所示。說明了在進(jìn)行相同的矩陣運(yùn)算時(shí),VC++環(huán)境下具有略優(yōu)于Matlab環(huán)境下的代碼運(yùn)行效率。
可以看到,通過使用混合編程技術(shù)把Matlab中有關(guān)于控制算法的函數(shù)轉(zhuǎn)編為VC++可用的動(dòng)態(tài)鏈接庫形式,在用戶沒有進(jìn)行任何控制算法編寫的情況下,就可以完成在VC++中對(duì)控制系統(tǒng)的控制變量的求解,進(jìn)而完成控制系統(tǒng)仿真。免去了用戶需要親自編寫C/C++控制算法的繁瑣工序,只需用戶編寫一部分接口程序即可,而且通過單級(jí)倒立擺系統(tǒng)最優(yōu)控制反饋增益矩陣的求解實(shí)例還可以論證,這種編程方法集成了兩個(gè)軟件的優(yōu)點(diǎn),使得生成的程序同時(shí)具備較好的運(yùn)行效率和實(shí)時(shí)性、普適性,拓展了Matlab在現(xiàn)代控制理論系統(tǒng)仿真中的適用范圍,有助于縮減新型控制算法的編程周期,為新型控制算法的研究與開發(fā)提供了一種新的編程思路。
[1]張亮,王繼陽.MATLAB與C/C++混合編程[M].人民郵電出版社,2008.
[2]劉維.精通Matlab與C/C++混合程序設(shè)計(jì)(第二版)[M].北京航空航天大學(xué)出版社,2006.
[3]李曦,唐琳.在MATLAB中運(yùn)行其他可執(zhí)行軟件的方法[J].微計(jì)算機(jī)信息,2006,22(3-3).
[4]楊剛,姚華.實(shí)用航空發(fā)動(dòng)機(jī)LQR權(quán)陣選取方法[J].南京航空航天大學(xué)學(xué)報(bào),2006(4).
[5]Robin G.Qiu and Yongfeng Ju Research on MATLAB Programming Efficiency.Mei Xiao et al.,2011,Applied Mechanics and Materials,135-136,788.
[6]BaiLi Zhang,JiangGuo Wang,The Analysis and Simulation of First-Order Inverted Pendulum Control System Based on LQR.ISIP2010 Third International Symposium.
[7]Hongliang Wang,Haobin Dong,Lianghua He,etc.Design and Simulation of LQR Controller with the Linear Inverted Pendulum,ICECE2010 International Conference.
[8]Shiyong Yang,Liping Xu,Peijin Wang.“Study on PID Control of a Single Inverted Pendulum System”vol.S1,2007.