董立岩, 王越群, 李永丽
(1. 吉林大学 计算机科学与技术学院, 长春 130012; 2. 东北师范大学 信息科学与技术学院, 长春 130117)
随着科学技术的发展, 教育实验的水平不断提高。为解决现实实验中的成本过高、 时间空间受限和安全隐患等问题, 虚拟实验室[1](Virtual Laboratory)被广泛应用。国内外很多科学研究者对虚拟设备和虚拟实验室进行了研究, 如Hodges等[2]提出了虚拟仿真化学实验室; Burke等[3]提出了虚拟发动机实验室; Hristov等[4]对虚拟实验室的发展状况及优缺点进行了详细说明。虚拟实验室是基于虚拟现实技术构建的模拟现实中各种教学实验室的系统。1989年, 美国的Wolf教授最早提出了虚拟实验室的概念, 用以描述一个计算机网络化的虚拟实验室环境。Wolf教授形象地把虚拟实验室称为没有围墙的研究中心, 形象地表明了虚拟实验的特性: 不受时间和空间的局限[5]。
电力拖动又称电机传动, 是用电动机作为原动力拖动生产机械的一种工作结构, 由电源、 电动机、 控制设备、 传动机构以及工作机构5个子系统组成。在电力拖动实验教学中, 由于使用高电压会对实验人员造成一定的危险性, 而且工业电动机和一些控制设备体积大、 噪音大以及价格昂贵, 不利于进行真实实验[6]。笔者针对上述问题, 研究了基于Unity3D的电机拖动实验虚拟仿真系统, 不仅可解决上述问题, 还可减少实验器材的磨损, 节约能源, 给实验人员提供更大的实验乐趣。
Unity3D技术是实现虚拟仿真实验室的主要技术[7], 笔者设计的基于Unity3D的电机拖动虚拟仿真系统具有逼真的电机拖动实验环境[8], 良好的人机交互实验平台; 具备导入已有的实验数据进行选择部署测试电动机反应的功能; 能准确模拟各种电器设备在不同的连接部署情况下电动机的反应, 并生成实验数据。
图1 系统主要结构图 Fig.1 Structure diagram of the system
基于Unity3D的电机拖动仿真系统是基于虚拟现实技术构建的模拟现实中电机拖动实验教学的系统。系统各模块之间的关系如图1所示。系统定义了3个基本类: 电器、 导线和IO(Input Output)。由于IO接口也属于电器的一部分, 所以IO类继承电器类的部分属性。这3个类分别写在3个脚本文件中, 方便调用。在实现类LianJiePanel中, 按照功能把函数分为绘制函数、 导入模块、 系统函数和辅助函数4类, 通过调用3个小类和辅助包, 实现了系统的各种功能需求。
连接好的电路图(见图2)可抽象成图结构(见图3), 其中每个IO接口为一个节点, 每条导线为一条边。赋值时就相当于对图3中的所有节点进行广度优先遍历, 直到分析完一个电器的所有IO接口后再分析下一个电器[9]。
图2 电路图 图3 抽象电路图的图结构 Fig.2 Circuit diagram Fig.3 Circuit diagram abstracted into graphs
针对图1系统中各模块间的相互关系, 笔者将详细分析其实现功能和实现过程。
绘制函数主要用于进行界面的设计与实现。实验仿真系统主要有欢迎界面和机床电气连接界面。在进入欢迎界面后, 可选择机床电气连接进入主页面, 或直接退出训练。点击欢迎界面的机床电气连接, 界面会对该系统的各个功能进行简单介绍。进入主页面内, 顶层菜单可实现各种电器部署及联调功能, 也可删除电器和导线, 通过侧边菜单栏可添加各种电力拖动和各种导线。
除了界面绘制函数以外, 还有绘制电器、 连线以及IO接口等绘制函数。Unity3D技术内置渲染引擎, 引擎使用扩展名为FBX(三维创作与交换格式)的模型, 通过模型和内置引擎的渲染, 电器设备和导线连接显得更加真实立体[10], 操作更简单。
在自锁实验平台中, 需导入已有的实验数据文件并对其解析, 以进行下一步的实验操作。该系统针对涉及的3种基本类对象, 分别定义了导入文件中数据的属性含义, 根据第1个字段属性值确定导入的基本类对象, 并初始化相关属性。
读取文件时, 若第1个字段属性值为DQ, 则表示该条数据为电器信息。电器的属性主要包括ID(Identity), 是否显示, 初始化位置x, 初始化位置y, 索引(第几个电器), 并用逗号隔开。其中主属性是dq_index, 即电器的名称和它的索引值, 用来确定实验中唯一的电器设备。对于热继电器, 除了这些基本的属性外, 还需要设置它的热区, 以实现通过点击热区的时间长短改变热继电器状态的特性, 而热区需要电器的相对位置, 并可随着电器位置的移动而改变。读取文件时, 若第1个字段属性值为IO, 则表示该条数据为IO接口信息。IO接口是电器上的一部分, 所以除了继承电器的部分属性还有些新的属性, 包括电压值大小, 电压类型, 所属的电器, 转接点数目等属性信息。读取文件时, 若第1个字段属性值为XL, 则表示该条数据为导线信息。导线的属性包括ID, 颜色和线条类型等, 其中用#加上起始IO的ID和终止IO的ID作为主属性ID, 用其唯一标识一条导线。
该虚拟仿真系统的系统函数主要有ONGUI(), FixedUpdate()和Start()。
1) Start函数在系统第1次执行时调用, 主要功能包括调用各个初始化子函数, 设置一些全局变量的默认值, 并导入背景图片、 要显示的按钮名称以及帮助提示等资源信息。
2) 在系统调用完Start函数后, 系统会调用ONGUI函数, 这个函数的主要功能是绘制GUI组件, 根据不同的电器模型调用不同的绘制函数, 并根据FixedUpdate函数不断更新的变量值实时更新绘制函数。
3) FixedUpdate函数用来实时监听鼠标和键盘的当前状态, 并根据不同的状态改变电器模型。比如鼠标处在按钮位置上, 就会显示该按钮的介绍信息。而电器模型的改变将导致整个实验的连接状态、 部署状态发生改变, 从而完成实验。
辅助函数主要辅助绘制函数以及系统函数的实现, 主要有两类辅助函数。一类辅助函数是Find系列, 主要根据电器的索引值或ID查找实验中的电器或IO接口。其主要思想是遍历所有对象, 找到符合条件的对象, 并将其返回。另一类辅助函数是赋值函数, 主要用于对电压赋值。根据IO接口及相应的ID信息将入口的电压值和电压类型等信息都赋值给出口。
系统运行平台分为开放平台和自锁平台。在开放平台中, 各种电器和导线可以任意连接部署。在自锁实验平台中, 对已有的实验数据进行读取, 然后选择需要的电器和导线再部署连接。
通过在开放平台创建一个电机拖动实验的实例(见图4), 选择电器导线连接部署, 对电器进行联调后, 可观察到通电后电动机的转动情况。
图4 开放平台的电器连接Fig.4 Electrical connection of open platform
图5为自锁实验的原理图, 自锁实验读取已有实验中电器导线的部署数据, 选择想要的电器进行部署(见图6), 然后可选择按照开放平台手动连接导线或按照实验数据自动连接导线, 最后进行电器联调, 通过电流就可观测电动机的运转情况。
图5 自锁实验的原理图 图6 自锁实验的选择 Fig.5 Schematic of self-locking test Fig.6 Selection of self-locking test
通过实验可观察到系统的运行效果, 验证了实验的可行性与多样性。实验效果表明, 系统能良好模拟实验中各种操作, 真实性强, 运行效率快。
笔者针对电机拖动实验设计研发虚拟仿真系统, 解决了传统实验中可能遇到的操作危险、 设备资源不足、 时间不好协调等问题, 同时提高了学生们实验的积极性, 使每名同学都能动手完成整个实验, 并自主创新实验, 不用担心器材损坏。该系统功能完善, 操作简单易学, 人机交互性能好, 利用了Unity3D技术, 渲染的电器线路使电路图更加形象直观。