郭斯羽,鮑美華,唐 求,唐 璐
(1.湖南大學(xué)電氣與信息工程學(xué)院,湖南長沙410082;2.長沙醫(yī)學(xué)院,湖南長沙 410219)
面向教學(xué)的Matlab/Simulink仿真動(dòng)畫實(shí)現(xiàn)
郭斯羽1,鮑美華2,唐 求1,唐 璐1
(1.湖南大學(xué)電氣與信息工程學(xué)院,湖南長沙410082;2.長沙醫(yī)學(xué)院,湖南長沙 410219)
本文給出了一種Matlab仿真過程動(dòng)畫顯示模塊實(shí)現(xiàn)方法。該方法利用Matlab語言編寫S函數(shù)動(dòng)畫模塊,在采樣時(shí)刻更新時(shí)刻,利用Matlab圖像操作繪制和顯示動(dòng)畫幀,實(shí)現(xiàn)了仿真動(dòng)畫顯示。所得S函數(shù)模塊可集成到仿真模型中演示仿真過程,彌補(bǔ)了Matlab/Simu link仿真基本都是曲線顯示而沒有動(dòng)畫演示的缺陷。
Matlab;Simu link;仿真動(dòng)畫
由于Matlab/Simulink強(qiáng)大的科學(xué)計(jì)算、仿真和可視化功能,它不僅在工程設(shè)計(jì)開發(fā)領(lǐng)域應(yīng)用廣泛,在課堂教學(xué)中也得到重視,各學(xué)科中的基于Matlab的各類教學(xué)軟件與工具包不斷涌現(xiàn)[1,2]。此外,Matlab還提供了外部編程接口、跨平臺代碼生成以及Web發(fā)布能力,進(jìn)一步提高了Matlab的應(yīng)用靈活性,文獻(xiàn)[3,4]即為其若干應(yīng)用實(shí)例。
雖然Matlab能方便地顯示系統(tǒng)趨勢曲線,但對于課堂教學(xué)而言,學(xué)生更期望以動(dòng)畫形式將系統(tǒng)演化過程展示出來。而一般的Matlab圖形函數(shù)難以繪制出生動(dòng)的動(dòng)畫。目前常見的Matlab教學(xué)應(yīng)用主要基于曲線繪制,很少見到動(dòng)畫形式的過程演示。文獻(xiàn)[5]雖然在特定Matlab工具箱中對提供的動(dòng)畫生成S函數(shù)進(jìn)行了適當(dāng)修改來進(jìn)行無人飛行器仿真過程的動(dòng)畫顯示,但文中并未介紹動(dòng)畫顯示模塊的構(gòu)造和實(shí)現(xiàn)。
本文給出了一種利用Simulink的S函數(shù)以及Matlab圖像操作與顯示的Simu link仿真動(dòng)畫顯示模塊的設(shè)計(jì)與實(shí)現(xiàn)方法。其要點(diǎn)在于:①明確了在S函數(shù)中進(jìn)行動(dòng)畫繪制和顯示的恰當(dāng)位置;②進(jìn)行動(dòng)畫顯示的Matlab窗口的管理;③為保證獲得平滑的動(dòng)畫效果的動(dòng)畫幀更新的合適方法。通過這種方法,用戶自行編寫生成仿真動(dòng)畫圖像幀的函數(shù),并在自定義S函數(shù)模塊恰當(dāng)位置調(diào)用這些函數(shù)來針對系統(tǒng)當(dāng)前狀態(tài)與輸入進(jìn)行圖像繪制;④將動(dòng)畫S函數(shù)模塊集成到仿真模型中實(shí)現(xiàn)仿真動(dòng)畫演示。
S函數(shù)是Simu link模塊的計(jì)算機(jī)語言描述,可以利用Matlab語言或C、C++、Fortran語言來編寫。本文需要利用Matlab的圖像顯示窗口顯示仿真動(dòng)畫,因此只采用了更便于使用Matlab各工具箱函數(shù)的Matlab語言來實(shí)現(xiàn)S函數(shù)。
Sim ulink進(jìn)行仿真的主要流程步驟如圖1所示。為簡單起見,該示意圖僅給出了相關(guān)的主要步驟。初始化步驟主要對模塊的輸入輸出個(gè)數(shù)、連續(xù)和離散狀態(tài)個(gè)數(shù)等參數(shù)進(jìn)行設(shè)置,仿真過程中僅被執(zhí)行一次的其他初始化工作也都在此階段進(jìn)行;模塊離散狀態(tài)改變、采樣時(shí)刻改變事件處理部分是實(shí)現(xiàn)動(dòng)畫顯示的主要部分;終止處理則是在仿真結(jié)束之前執(zhí)行的各種清理操作。
圖1 Simu link仿真過程主要流程示意圖
Matlab語言編寫的S函數(shù)又分 Level-1和Level-2兩種。Level-1的S函數(shù)只支持包括上述的流程步驟在內(nèi)的少數(shù)S函數(shù)特性,故Matlab推薦使用Level-2的S函數(shù)。但對于動(dòng)畫顯示而言,只需根據(jù)模塊輸入來產(chǎn)生動(dòng)畫圖像幀而沒有更多的計(jì)算、狀態(tài)和信號流控制,所以簡單情況下也可采用。
仿真動(dòng)畫的顯示主要涉及初始化及采樣時(shí)刻更新兩步:在初始化7中載入動(dòng)畫的相關(guān)參數(shù)與數(shù)據(jù),在采樣時(shí)刻更新中繪制對應(yīng)當(dāng)前時(shí)刻系統(tǒng)狀態(tài)與輸入的動(dòng)畫幀并顯示。
在Matlab中,一幅圖像常用一個(gè)二維或三維矩陣來描述和操作:二維矩陣或者表示一幅灰度圖像,或者表示一幅索引圖像,其中每個(gè)元素對應(yīng)了一個(gè)顏色索引值,通過該值可從與該圖像配合的顏色映射表中獲得各像素點(diǎn)的實(shí)際色彩;三維矩陣則通常表示一幅RGB圖像或其他顏色空間定義下的圖像,其中前兩維代表像素的y坐標(biāo)與x坐標(biāo),第三維的大小為3,分別代表紅、綠、藍(lán)三色分量值。矩陣元素的數(shù)據(jù)類型多為double型或uint8型,前者對應(yīng)歸一化到[0,1]區(qū)間的灰度值,后者對應(yīng)常見的0~255灰度級的灰度值。通過直接對圖像矩陣像素位置上的矩陣元素賦值,即可完成對圖像像素的灰度或顏色的設(shè)定。
實(shí)際上為了方便繪制,可將動(dòng)畫的畫面分為活動(dòng)區(qū)域與非活動(dòng)區(qū)域?;顒?dòng)區(qū)域可以使用矩形等簡單形狀以方便改變其中的像素值,非活動(dòng)區(qū)域則可以在初始化步驟一次性獲取其中像素點(diǎn)的坐標(biāo)和值,在繪制動(dòng)畫幀時(shí)通過簡單地直接賦值就能完成,同時(shí)還能將活動(dòng)區(qū)域剪裁成為實(shí)際需要的形狀。
圖像可通過imshow函數(shù)加以顯示:h=imshow(img);其中im g為需要顯示的圖像,h是生成的圖像顯示窗口的句柄。根據(jù)該句柄,可以獲取圖像顯示窗口的所有相關(guān)屬性。對于本文而言,最重要的有 CData、Tag、UserData和 HandleVisibility等:①CData儲存了當(dāng)前窗口所顯示圖像的數(shù)據(jù),利用set(h,`CData',newFrame)語句即可將顯示窗口內(nèi)的圖像更新為new Frame圖像。而且使用這種方法進(jìn)行更新,其效果類似于慣常使用的“雙緩沖”動(dòng)畫顯示方法,可以獲得平滑的動(dòng)畫效果;②Tag可用來標(biāo)識窗口,對每個(gè)動(dòng)畫模塊所用的顯示窗口,可將Tag賦值為唯一的窗口名,通過findobj函數(shù)便可判斷顯示窗口是否存在,由此可控制動(dòng)畫顯示窗口實(shí)例的個(gè)數(shù);③UserData存放了用戶定制的數(shù)據(jù),所有與動(dòng)畫有關(guān)的數(shù)據(jù)如非活動(dòng)區(qū)域的坐標(biāo)與像素值都可存放于此;④HandleVisibility可以用來顯示或隱藏圖像顯示窗口。
仿真動(dòng)畫顯示的Level-1的S函數(shù)實(shí)現(xiàn)框架簡要介紹如下。S函數(shù)的標(biāo)準(zhǔn)接口為blockname(t,x,u,flag),其中 t、x、u 、flag 分別為仿真時(shí)刻 、當(dāng)前輸入、當(dāng)前系統(tǒng)狀態(tài)與當(dāng)前仿真步驟;各仿真時(shí)刻動(dòng)畫幀應(yīng)根據(jù) t、x、u來繪制;在仿真初始化時(shí)(即flag=0時(shí)),根據(jù)需要獲取如非活動(dòng)區(qū)域坐標(biāo)與像素值等全局性動(dòng)畫數(shù)據(jù),繪制初始幀動(dòng)畫,利用im show函數(shù)顯示初始幀并創(chuàng)建動(dòng)畫顯示窗口,利用set函數(shù)將全局?jǐn)?shù)據(jù)存放于窗口的UserData屬性之中;在仿真時(shí)刻更新時(shí)(即flag=2),利用get函數(shù)獲取全局動(dòng)畫數(shù)據(jù),根據(jù)新的 t、x、u值繪制動(dòng)畫幀,并利用更新顯示窗口CData屬性的方式更新動(dòng)畫幀,從而完成動(dòng)畫的顯示工作。
[示例1]注入流量可設(shè)定,輸出流量由液位決定的自平衡水箱的水位仿真。在工作點(diǎn)附近,該液位對象可通過一個(gè)一階環(huán)節(jié)來描述。對象的傳遞函數(shù)設(shè)為
注入流量按方波形式變化,方波的幅值為1,周期為3000,占空比50%。
在此示例中,我們利用W indow s的畫筆程序繪制了一個(gè)簡單的水箱圖形如圖2左側(cè)所示,并使用綠色(非活動(dòng)區(qū)域沒有使用的任意顏色均可)繪出了液位可能的變化區(qū)域,并保存為位圖文件。對象的輸出范圍為0~1,設(shè)定0對應(yīng)的液位高度為可能液位高度的1/3,此時(shí)1對應(yīng)的液位高度為可能液位高度的2/3。
在初始化步驟中,利用im read函數(shù)讀入動(dòng)畫位圖,通過尋找圖中綠色的坐標(biāo)點(diǎn)來獲取動(dòng)畫活動(dòng)區(qū)域及與之互補(bǔ)的非活動(dòng)區(qū)域,并將這些數(shù)據(jù)存放于UserData之中。在仿真更新時(shí)刻,根據(jù)液位對象的輸出求出圖像中對應(yīng)的液位高度,然后利用藍(lán)色繪出液位,再繪制出非活動(dòng)區(qū)域,從而完成動(dòng)畫幀。利用以上對象和動(dòng)畫顯示模塊構(gòu)建的Simulink模型及其仿真過程快照如圖2右側(cè)所示。
圖2 自平衡液位對象的仿真過程快照
[示例2]爐溫變化過程仿真如圖3所示。在這個(gè)仿真示例中,我們使用了Matlab提供的黑-紅-橙-白熱的hot顏色映射來形象地表示爐膛的溫度高低;此外,通過設(shè)定溫度報(bào)警限,還可以利用綠、橙和紅色來顯示不同溫度下的溫度計(jì)內(nèi)液柱(因黑白印刷,圖上顏色均以灰度不同顯示),以起報(bào)警的作用,如圖左側(cè)所示。實(shí)現(xiàn)與示例1類似,只不過對不同的活動(dòng)區(qū)域(爐膛和溫度計(jì)液柱)及非活動(dòng)區(qū)域,直接使用了3個(gè)區(qū)域蒙片來加以描述,方便了使用。
圖3 爐膛溫度對象的仿真過程快照
從示例可以看出,相比于常見的如文獻(xiàn)[1,2]中的Matlab教學(xué)仿真工具,本文的方法顯得更為生動(dòng)。在某些Matlab工具箱的示例中也具有動(dòng)畫顯示功能(如模糊邏輯工具箱示例slcp),但與這些利用Matlab圖形功能實(shí)現(xiàn)的動(dòng)畫相比,本文方法不但可以做到更加精美,而且顯示過程平滑無閃爍,更適于進(jìn)行演示。圖3右側(cè)給出了構(gòu)建的模型和仿真過程快照。
以上兩個(gè)示例都僅有一個(gè)輸入,因此可以很方便地利用Level-1的S函數(shù)完成動(dòng)畫顯示。如果需要描述的輸入和狀態(tài)很多,那么可行的做法是利用Level-2的S函數(shù)對信號總線的支持來使模塊的輸入端口更為簡潔,而Level-1的S函數(shù)是不支持信號總線的。
本文給出了一種在Matlab/Sim ulink中實(shí)現(xiàn)仿真過程動(dòng)畫顯示的方法,通過編寫S函數(shù)動(dòng)畫顯示模塊,在仿真初始化部分進(jìn)行動(dòng)畫相關(guān)數(shù)據(jù)的初始化,并利用Matlab對圖像數(shù)據(jù)的簡單矩陣描述和對矩陣的便捷操作,在采樣時(shí)刻更新部分繪制對應(yīng)當(dāng)前時(shí)刻的系統(tǒng)輸入與狀態(tài)的動(dòng)畫幀,最終更新動(dòng)畫顯示窗口中的圖像數(shù)據(jù),來達(dá)到動(dòng)畫展示仿真過程的目的。通過仿真過程動(dòng)畫展示,可以使利用Matlab/Simulink仿真功能的課堂教學(xué)更具生動(dòng)性,使學(xué)生能獲得對系統(tǒng)動(dòng)態(tài)特性的感性認(rèn)識。
[1] A.Gelen,T.Yalcinoz.An educational softw are package for Thyristor Sw itched Reactive Power Compensators using Matlab/Simulink[J].Simulation Modelling P ractice and Theory,2010,18,(3):366-377
[2] 王松.基于M ATLAB的系統(tǒng)仿真教學(xué)軟件的設(shè)計(jì)[J].北京:計(jì)算機(jī)仿真,2005,22,(11):278-281
[3] 梅志紅,鄧文華.基于matlab與vb集成技術(shù)的通信系統(tǒng)仿真軟件的開發(fā)[J].北京:計(jì)算機(jī)仿真,2004,21,(6):195-199
[4] R.Bucher,S.Balemi.Rapid controller prototyping with Matlab/Simulink and Linux[J].Con trol Engineering Practice,2006,14,(2):185-192
[5] 李聰穎,顧文錦,王士星.基于Animation的6-DOF無人飛行器可視化半實(shí)物仿真[J].北京:計(jì)算機(jī)仿真,2004,21,(12):7-9
Teaching Oriented Animation Implementation for Matlab/Simulink Simulations
GUO Si-yu1,BAO Mei-hua2,TANG Qiu1,TANG Lu1
(1.Collegeo f E lectrical and In formation Engineer ing,Hunan University,Changsha 410082,China;2.Changsha Med ical University,Changsha 410219,China)
A method for building simulation process animation blocks in Matlab is proposed.The Matlab programming language isused to code the S-function animation blocks.Matlab image processing functions are adop ted to draw and disp lay animation frames at the sampling time updating stage o f the S-function,realizing the animation of the simulation.The S-function blocks obtained can be conveniently integrated into simu lation models to anim ate the sim ulation p rocess,providing amethod to overcome the shortcoming of the lack of animation in Matlab/Sim ulink sim ulations,most of which use trend curves for sim ulation disp lay.
Matlab;Simu link;sim ulation anim ation
TP391.9
A
1008-0686(2011)02-0085-04
2010-08-03;
2010-11-24
郭斯羽(1975-),男,博士,副教授,主要從事圖像處理、機(jī)器視覺、系統(tǒng)建模與仿真的研究工作,E-mail:syguo75@163.com;
鮑美華(1978-),女,碩士,講師,主要從事計(jì)算機(jī)仿真的教學(xué)應(yīng)用、藥理學(xué)的研究工作,E-mail:mhbao78@163.com;
唐 求(1970-),女,博士,副教授,主要從事虛擬儀器、自動(dòng)控制的研究工作,E-m ail:tangqiu07@hnu.cn
唐 璐(1978-),男,博士,講師,主要從事系統(tǒng)工程、系統(tǒng)建模與仿真的研究工作,E-mail:tangl@126.com