APP下载

面向教学的Matlab/Simulink仿真动画实现

2011-01-27郭斯羽鲍美华

电气电子教学学报 2011年2期
关键词:液位示例绘制

郭斯羽,鲍美华,唐 求,唐 璐

(1.湖南大学电气与信息工程学院,湖南长沙410082;2.长沙医学院,湖南长沙 410219)

面向教学的Matlab/Simulink仿真动画实现

郭斯羽1,鲍美华2,唐 求1,唐 璐1

(1.湖南大学电气与信息工程学院,湖南长沙410082;2.长沙医学院,湖南长沙 410219)

本文给出了一种Matlab仿真过程动画显示模块实现方法。该方法利用Matlab语言编写S函数动画模块,在采样时刻更新时刻,利用Matlab图像操作绘制和显示动画帧,实现了仿真动画显示。所得S函数模块可集成到仿真模型中演示仿真过程,弥补了Matlab/Simu link仿真基本都是曲线显示而没有动画演示的缺陷。

Matlab;Simu link;仿真动画

0 引言

由于Matlab/Simulink强大的科学计算、仿真和可视化功能,它不仅在工程设计开发领域应用广泛,在课堂教学中也得到重视,各学科中的基于Matlab的各类教学软件与工具包不断涌现[1,2]。此外,Matlab还提供了外部编程接口、跨平台代码生成以及Web发布能力,进一步提高了Matlab的应用灵活性,文献[3,4]即为其若干应用实例。

虽然Matlab能方便地显示系统趋势曲线,但对于课堂教学而言,学生更期望以动画形式将系统演化过程展示出来。而一般的Matlab图形函数难以绘制出生动的动画。目前常见的Matlab教学应用主要基于曲线绘制,很少见到动画形式的过程演示。文献[5]虽然在特定Matlab工具箱中对提供的动画生成S函数进行了适当修改来进行无人飞行器仿真过程的动画显示,但文中并未介绍动画显示模块的构造和实现。

本文给出了一种利用Simulink的S函数以及Matlab图像操作与显示的Simu link仿真动画显示模块的设计与实现方法。其要点在于:①明确了在S函数中进行动画绘制和显示的恰当位置;②进行动画显示的Matlab窗口的管理;③为保证获得平滑的动画效果的动画帧更新的合适方法。通过这种方法,用户自行编写生成仿真动画图像帧的函数,并在自定义S函数模块恰当位置调用这些函数来针对系统当前状态与输入进行图像绘制;④将动画S函数模块集成到仿真模型中实现仿真动画演示。

1 Simulink S函数简介

S函数是Simu link模块的计算机语言描述,可以利用Matlab语言或C、C++、Fortran语言来编写。本文需要利用Matlab的图像显示窗口显示仿真动画,因此只采用了更便于使用Matlab各工具箱函数的Matlab语言来实现S函数。

Sim ulink进行仿真的主要流程步骤如图1所示。为简单起见,该示意图仅给出了相关的主要步骤。初始化步骤主要对模块的输入输出个数、连续和离散状态个数等参数进行设置,仿真过程中仅被执行一次的其他初始化工作也都在此阶段进行;模块离散状态改变、采样时刻改变事件处理部分是实现动画显示的主要部分;终止处理则是在仿真结束之前执行的各种清理操作。

图1 Simu link仿真过程主要流程示意图

Matlab语言编写的S函数又分 Level-1和Level-2两种。Level-1的S函数只支持包括上述的流程步骤在内的少数S函数特性,故Matlab推荐使用Level-2的S函数。但对于动画显示而言,只需根据模块输入来产生动画图像帧而没有更多的计算、状态和信号流控制,所以简单情况下也可采用。

仿真动画的显示主要涉及初始化及采样时刻更新两步:在初始化7中载入动画的相关参数与数据,在采样时刻更新中绘制对应当前时刻系统状态与输入的动画帧并显示。

2 动画的绘制与显示

在Matlab中,一幅图像常用一个二维或三维矩阵来描述和操作:二维矩阵或者表示一幅灰度图像,或者表示一幅索引图像,其中每个元素对应了一个颜色索引值,通过该值可从与该图像配合的颜色映射表中获得各像素点的实际色彩;三维矩阵则通常表示一幅RGB图像或其他颜色空间定义下的图像,其中前两维代表像素的y坐标与x坐标,第三维的大小为3,分别代表红、绿、蓝三色分量值。矩阵元素的数据类型多为double型或uint8型,前者对应归一化到[0,1]区间的灰度值,后者对应常见的0~255灰度级的灰度值。通过直接对图像矩阵像素位置上的矩阵元素赋值,即可完成对图像像素的灰度或颜色的设定。

实际上为了方便绘制,可将动画的画面分为活动区域与非活动区域。活动区域可以使用矩形等简单形状以方便改变其中的像素值,非活动区域则可以在初始化步骤一次性获取其中像素点的坐标和值,在绘制动画帧时通过简单地直接赋值就能完成,同时还能将活动区域剪裁成为实际需要的形状。

图像可通过imshow函数加以显示:h=imshow(img);其中im g为需要显示的图像,h是生成的图像显示窗口的句柄。根据该句柄,可以获取图像显示窗口的所有相关属性。对于本文而言,最重要的有 CData、Tag、UserData和 HandleVisibility等:①CData储存了当前窗口所显示图像的数据,利用set(h,`CData',newFrame)语句即可将显示窗口内的图像更新为new Frame图像。而且使用这种方法进行更新,其效果类似于惯常使用的“双缓冲”动画显示方法,可以获得平滑的动画效果;②Tag可用来标识窗口,对每个动画模块所用的显示窗口,可将Tag赋值为唯一的窗口名,通过findobj函数便可判断显示窗口是否存在,由此可控制动画显示窗口实例的个数;③UserData存放了用户定制的数据,所有与动画有关的数据如非活动区域的坐标与像素值都可存放于此;④HandleVisibility可以用来显示或隐藏图像显示窗口。

仿真动画显示的Level-1的S函数实现框架简要介绍如下。S函数的标准接口为blockname(t,x,u,flag),其中 t、x、u 、flag 分别为仿真时刻 、当前输入、当前系统状态与当前仿真步骤;各仿真时刻动画帧应根据 t、x、u来绘制;在仿真初始化时(即flag=0时),根据需要获取如非活动区域坐标与像素值等全局性动画数据,绘制初始帧动画,利用im show函数显示初始帧并创建动画显示窗口,利用set函数将全局数据存放于窗口的UserData属性之中;在仿真时刻更新时(即flag=2),利用get函数获取全局动画数据,根据新的 t、x、u值绘制动画帧,并利用更新显示窗口CData属性的方式更新动画帧,从而完成动画的显示工作。

3 仿真动画显示模块示例

[示例1]注入流量可设定,输出流量由液位决定的自平衡水箱的水位仿真。在工作点附近,该液位对象可通过一个一阶环节来描述。对象的传递函数设为

注入流量按方波形式变化,方波的幅值为1,周期为3000,占空比50%。

在此示例中,我们利用W indow s的画笔程序绘制了一个简单的水箱图形如图2左侧所示,并使用绿色(非活动区域没有使用的任意颜色均可)绘出了液位可能的变化区域,并保存为位图文件。对象的输出范围为0~1,设定0对应的液位高度为可能液位高度的1/3,此时1对应的液位高度为可能液位高度的2/3。

在初始化步骤中,利用im read函数读入动画位图,通过寻找图中绿色的坐标点来获取动画活动区域及与之互补的非活动区域,并将这些数据存放于UserData之中。在仿真更新时刻,根据液位对象的输出求出图像中对应的液位高度,然后利用蓝色绘出液位,再绘制出非活动区域,从而完成动画帧。利用以上对象和动画显示模块构建的Simulink模型及其仿真过程快照如图2右侧所示。

图2 自平衡液位对象的仿真过程快照

[示例2]炉温变化过程仿真如图3所示。在这个仿真示例中,我们使用了Matlab提供的黑-红-橙-白热的hot颜色映射来形象地表示炉膛的温度高低;此外,通过设定温度报警限,还可以利用绿、橙和红色来显示不同温度下的温度计内液柱(因黑白印刷,图上颜色均以灰度不同显示),以起报警的作用,如图左侧所示。实现与示例1类似,只不过对不同的活动区域(炉膛和温度计液柱)及非活动区域,直接使用了3个区域蒙片来加以描述,方便了使用。

图3 炉膛温度对象的仿真过程快照

从示例可以看出,相比于常见的如文献[1,2]中的Matlab教学仿真工具,本文的方法显得更为生动。在某些Matlab工具箱的示例中也具有动画显示功能(如模糊逻辑工具箱示例slcp),但与这些利用Matlab图形功能实现的动画相比,本文方法不但可以做到更加精美,而且显示过程平滑无闪烁,更适于进行演示。图3右侧给出了构建的模型和仿真过程快照。

以上两个示例都仅有一个输入,因此可以很方便地利用Level-1的S函数完成动画显示。如果需要描述的输入和状态很多,那么可行的做法是利用Level-2的S函数对信号总线的支持来使模块的输入端口更为简洁,而Level-1的S函数是不支持信号总线的。

4 结语

本文给出了一种在Matlab/Sim ulink中实现仿真过程动画显示的方法,通过编写S函数动画显示模块,在仿真初始化部分进行动画相关数据的初始化,并利用Matlab对图像数据的简单矩阵描述和对矩阵的便捷操作,在采样时刻更新部分绘制对应当前时刻的系统输入与状态的动画帧,最终更新动画显示窗口中的图像数据,来达到动画展示仿真过程的目的。通过仿真过程动画展示,可以使利用Matlab/Simulink仿真功能的课堂教学更具生动性,使学生能获得对系统动态特性的感性认识。

[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的系统仿真教学软件的设计[J].北京:计算机仿真,2005,22,(11):278-281

[3] 梅志红,邓文华.基于matlab与vb集成技术的通信系统仿真软件的开发[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无人飞行器可视化半实物仿真[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-),男,博士,副教授,主要从事图像处理、机器视觉、系统建模与仿真的研究工作,E-mail:syguo75@163.com;

鲍美华(1978-),女,硕士,讲师,主要从事计算机仿真的教学应用、药理学的研究工作,E-mail:mhbao78@163.com;

唐 求(1970-),女,博士,副教授,主要从事虚拟仪器、自动控制的研究工作,E-m ail:tangqiu07@hnu.cn

唐 璐(1978-),男,博士,讲师,主要从事系统工程、系统建模与仿真的研究工作,E-mail:tangl@126.com

猜你喜欢

液位示例绘制
2019年高考上海卷作文示例
常见单位符号大小写混淆示例
超萌小鹿课程表
常见单位符号大小写混淆示例
基于STM32燃气热水锅炉液位控制系统设计与实现
石油储罐液位开关的应用分析
“全等三角形”错解示例
放学后
宝马530车冷却液液位过低报警
在转变中绘制新蓝图