油田虚拟培训系统的多用户交互技术研究
2019-01-23刘贤梅李朝顺
刘贤梅, 李朝顺
(东北石油大学 计算机与信息技术学院, 大庆 163000)
0 引言
虚拟现实技术的不断发展与广泛应用,大大改善了传统油田员工的培训方式[1]。通过虚拟现实技术建立计算机虚拟的、可操作的培训系统,使油田员工能够在虚拟的环境下学习如何对设备进行操作以及如何应对突发事件,使安全操作的培训更加方便、逼真并易于接受。但就目前油田方面针对虚拟仿真培训的应用,仅停留在能够实现完成具有临场感的三维可视化场景,提供固定情节模式下角色与其他模型进行简单交互的培训。对于油田作业培训过程中所要求的多岗位、多工种的高协作性,现有的虚拟仿真培训系统因无法实现全方位、多角色的协同学习而缺陷明显。
针对上述问题,本文利用Unity 3D开发平台,使用C#语言,采用客户端/服务器模式,将多用户交互技术应用到油田仿真培训系统中,从而提高了油田作业培训的效率、效果,降低培训成本和安全隐患,对油田单位具有巨大的潜在的经济价值,对油田新型培训模式的发展有着重要意义[2]。
1 虚拟场景中多用户交互培训需求
在仿真培训场景中,通过创建作业人员的替身(avatar)来使培训用户具有临场感受,每一个进入场景中的用户都具有唯一的替身来标识。当多个用户处于同一场景中时,用户替身的位置和方向表明了该用户在场景中的视点。因此,仿真场景中的多用户交互培训应满足如下需求:
(1) 能逼真地模拟油田作业场景。尽可能逼真的模拟作业的现场环境,包括培训场景的大小、布局和各种作业设备的三维构造等。
(2) 能感知其他用户的存在和行为。每个加入到仿真培训场景的用户,都能观察到其他用户的替身。通过观察其他用户的替身行为,获知其他用户的当前行为。
(3) 能与其他用户进行交互和交流。通过控制用户替身和其他用户进行交互操作,并且利用输入设备发送文字信息实现培训人员之间的相互交流。
2 系统总体设计
2.1 系统框架结构设计
对上述需求进分析,通过分层结构思想提出的系统框架结构如图1所示。
系统采用C/S(Client/Server)架构,分为客户端和服务器端两部分。
客户端主要显示仿真培训场景和用户的替身角色,用户通过输入设备对替身进行控制操作,利用聊天面板编辑发送文字信息和其他用户进行在线交流。交互层对每一个用户创建替身,实现仿真培训场景的场景一致性维护和多用户交互操作的并发控制以及在线交流等功能。数据层存储模型数据、试题数据等信息。分层结构使系统具有良好的扩展性、灵活性和可维护性[3]。
图1 培训系统框架结构
2.2 多用户交互工作原理
仿真培训系统中,替身和场景的状态一致性控制与用户在线交流分别由不同的程序完成。客户端和服务器端之间采用TCP进行替身和场景的状态数据传递。客户端负责发送本地用户替身和场景变化的数据给服务端,同时从服务器端接收其他用户和场景的最新状态数据并进行实时更新,从而达到多用户状态的一致性控制。用户之间的在线交流也采用TCP进行数据的发送和接收,从而能够保证交流信息的实时性。系统中多用户交互的工作原理如图2所示。
图2 交互工作原理
3 关键技术研究
3.1 用户替身的创建及交互控制
替身作为用户在仿真培训场景中的主要操作对象,能够使用户切身感受到接近实际现场的作业环境。系统为每一个进入培训场景中的用户自动创建替身,每个替身均通过ID进行唯一性标识。如图3所示。
(1) ID=1角色(2) ID=2角色
图3 用户替身
用户的替身被创建好之后,可以通过输入设备控制替身在仿真培训场景中漫游。通过键盘按键W、S、A、D控制替身的前、后、左、右移动[4]。移动过程中,通过Animator Controller播放人物运动动画。获取按键输入使用Input.GetKey(KeyCode.W)方法,控制替身移动则采用transform.Translate(new Vector3(distance,0,0)),设置不同的Vector参数来控制不同的移动方向。对于替身视角变化,脚本中使用Input.GetAxis("Mouse X")和Input.GetAxis("Mouse Y")来获取鼠标在屏幕水平和竖直方向的位移,使替身视角随鼠标移动而变化。
在操控替身进行漫游时,用户想要操作场景中的某一设备则通过鼠标点击设备进行选中,获得设备的操作权限后进行相应的操作。通过 Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition)方法,使主相机根据鼠标点击位置发出射线,对射线触碰到的模型进行选取判断。
3.2 多用户操作冲突解决模型
培训系统中的所有用户均会被分配不同的操作任务,包括独立操作和多用户协同操作的任务。针对在培训过程中,多个用户对同一设备进行独立操作而发生冲突的问题,提出一种冲突解决模型。通过声明一个int型的数组flag[]来保存场景中设备部件的操作权限是否已被用户获取。假设一个部件编号为x,当flag[x]=1,表示该部件正在被某个用户操作,其他用户均不能对其选中和操作,并通过弹窗消息进行提示;当flag[x]=0时,则表示用户可以获取该部件的操作权限,选中该部件获得权限后进行相应操作。flag数组由服务器同步到所有的客户端,使所有的用户均能实时获取到场景中可操作部件的权限信息。
3.3 协同操作的实现
培训过程中针对某些设备的协同操作任务,需要多个用户协同完成。参与操作的用户通过输入设备输入操作信息(Package),操作信息包括对设备位置移动,角度变化。客户端将操作信息通过SendStatus方法发送到服务器,由服务器ProcessPackage方法进行处理。如果服务器判断多个用户的操作信息一致(如:操作设备向上移动),则向客户端发送可执行指令,由客户端执行对应操作。当操作信息不一致时(如:用户1操作设备向上移动,用户2操作设备向右移动),则操作不会执行。多用户协同操作设备使其向上移动一段距离,如图4所示。
图4 协同操作设备
3.4 多人在线聊天
在进行油田作业仿真培训过程中,为便于在仿真开始后用户进行操作任务分配和操作过程中多用户之间的交流沟通和协作,构建一个在线交流功能模块。
在服务器端的类中,定义一个ArrayList来保存聊天用户 IP,用户连接服务器成功后将当前在线的用户 IP 地址添加到队列中,然后不断的从客户端接收消息,对信息进行UTF-8编码后向 IP 队列中的用户广播消息,编码能够确保汉字信息能够被传递。服务器类的描述方法如下:
class ChatClient
{
public ArrayList ALLClients = new ArrayList( ); //客户列表
public string _client IP; //客户端 IP
public ChatClient( );// 把当前用户实例加入用户列表当中
public void ReceiveMessage( );//接受客户端消息
public void SendMessage( );// 向客戶端发送消息
public void Broadcast( );// 向客户端广播消息
}
在客户端中,通过 GUI 的连接按钮发送聊天请求,并设置聊天名称,在输入框中输入聊天消息,客户端获取消息后对消息进行编码后发送给服务器端,同时将服务器广播的消息解码后显示在 GUI 的聊天信息界面中。用户聊天界面如图5所示。
4 总结
本文通过对虚拟环境下多用户交互关键技术研究,并将研究成果应用于油田作业仿真培训系统。该系统通过建立多人网络虚拟环境,实现了多人在线实时交互功能,弥补了多数培训系统只能进行独立岗位学习的缺点,优化了虚拟仿真培训的开发模式,提升了虚拟培训效果。为了避免网络延迟、系统运行卡顿、模型相交重叠等情况,还需要在数据传递、系统优化、碰撞检测等方面进一步研究。
图5 聊天界面