基于Unity 3D的采煤机虚拟培训系统设计

2022-05-06 07:39高志广
中国新技术新产品 2022年3期
关键词:维修保养功能模块采煤机

石 洋 高志广 郭 爽

(三一重型装备有限公司,辽宁 沈阳 110027)

0 引言

虚拟现实技术是物联网的关键技术之一,将虚拟现实技术引入采煤机培训系统,可以直观地展示产品的参数规格、功能特性等信息。同时,采煤机长期处于地下恶劣的工况环境中,一旦发生停机故障就会严重损害企业利益。因此,在采煤机无故障运行时,积极展开有针对性地数字化虚拟培训尤为重要。

运用Unity 3D技术对采煤机虚拟培训系统进行开发,通过设置密码管理、设备基本信息、结构展示、工作原理、维修保养、平台拓展等模块,可以为使用者搭建一个实时交互的虚拟环境,模拟采煤机在运行过程中的状态,从而完成全面了解采煤机以及对企业员工进行岗前培训的工作,使员工快速掌握采煤机的相关知识。该文介绍了基于Unity 3D的采煤机虚拟培训系统的设计流程、结构和功能,分析了该系统的优点,对开展有针对性的虚拟培训具有重要意义。

1 系统总体方案

采煤机虚拟培训系统以Unity 3D引擎作为系统开发平台,建模工具采用Creo6.0,在Maya中进行分级重组之后,导出FBX格式,然后导入Unity 3D中,完成培训系统场景设计。Unity 3D是由Unity Technologies 开发的跨平台引擎,该软件具有可视化编程、支持Open GL、支持Direct11以及集成了Phys X3.3物理系统等特点,因此在虚拟现实仿真领域具有广泛的应用实例。

1.1 系统总体框架

采煤机虚拟培训系统采用三层软件架构体系,由显示模块、操作模块以及功能模块组成,系统架构如图1所示:1)显示模块。搭建采煤机作业环境,在Unity 3D平台中对采煤机的工作部件进行展示和管理。2) 操作模块。操作模块实现该培训系统的密码设置、GUI界面显示以及人机交互等功能。3) 功能模块。功能模块通过编写C++脚本来展示采煤机的工作原理以及维修保养要点,还可以对采煤机的工作过程、液压原理以及重要部件的拆卸与安装进行动画仿真。

图1 系统架构图

1.2 系统开发流程

采煤机虚拟培训系统的硬件环境为云桌面,处理器为Intel(R) Xeon Gold 6254 CPU @ 3.10GHz,RAM 32G。可以通过键盘、手柄等硬件对采煤机虚拟培训系统的功能模块进行操控。该系统的开发流程图如图2所示。

图2 系统开发流程图

2 软件系统设计

为了实现该系统维修保养的逼真程度和重要部件拆卸与安装的功能,需要搭建采煤机的三维模型和虚拟作业环境。

2.1 三维建模与场景搭建

为了重现采煤机的作业现场,根据采煤机外形尺寸并通过Creo6.0软件搭建采煤机的模型,考虑到后续要用Maya软件及Unity 3D开发平台对该模型进行操作,为提高Maya软件及Unity 3D开发平台的工作效率,因此需要简化建模,减少不必要的零件组装(例如铭牌等部件)。同时,将机械支撑部分建模成整体,便于后续处理。经过简化建模后的采煤机包括左截割部组件、右截割部组件、行走部、过桥组件、机身组件、长滑靴组件、短滑靴组件、销轴组件、拖缆组件、水系统和液压系统等部分。其中,电气系统未建模,而是用EPLAN导出电气系统原理图,以二维图的形式展示后续Unity 3D开发平台中的工作原理界面。采煤机建模完成后需要搭建作业场景,如图3所示。将采煤机三维模型导入Maya中进行渲染、分级重组以及格式转换,将导出后的FBX格式的文件再导入Unity 3D中,在Unity 3D中进行场景搭建,搭建完的场景基本可以还原采煤机的真实工作环境。

图3 场景模型

2.2 人机交互设计

Unity 3D支持多种编译脚本,该系统基于C#语言编写系统脚本,IDE采用Microsoft Visual Studio 2019。该系统设置了用户登录密码验证、重要部件结构展示、工作原理仿真、重要部件的拆卸与安装虚拟动画展示以及维修保养要点知识等主要界面。这些功能模块均采用人机交互模式,可人工操纵鼠标对某一项功能进行逐步操作,从而提升使用者的直观感受。

使用鼠标控制采煤机模型,可以对采煤机模型进行移动、旋转、缩放和多角度观察,还可以对采煤机的重要部件的结构、工作原理、重要部件拆卸与安装以及维修保养方法等内容进行展示、操作,系统地学习采煤机的结构与原理。

用鼠标左键按住模型对其进行拖动控制、鼠标滑轮缩放模型、鼠标中键按住旋转模型的部分脚本如下。

if (MoveCam.instance.isRight) {

//获取目标点坐标。弃用

//x += MoveCam.instance.getTargetPos().x * xSpeed * 0.002f;

//y -=MoveCam.instance.getTargetPos().y * ySpeed * 0.002f;

x += getTargetPos().x * xSpeed * 0.002f;

y -= getTargetPos().y * ySpeed * 0.002f;

} else {

x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;

y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

}

x = ClampAngle(x, xMinLimit, xMaxLimit);

y = ClampAngle(y, yMinLimit, yMaxLimit);

//print(Input.GetAxis("Mouse X"));

//print( Input.GetAxis("Mouse Y"));

//print(x);

//print(y);

}

//if( Input.GetMouseButton(1))

//{

//string str = EventSystem.currentToString().Substring(EventSystem.current.ToString().IndexOf(":"), 32);

//string str2 = str.Substring(str.IndexOf("(") + 1, str.IndexOf(")")- str.IndexOf("(") - 1);

// float xx = float.Parse(str2.Split(',')[0]);

// float yy = float.Parse(str2.Split(',')[1]);

// //distanceY += Input.GetAxis("Mouse Y") * ySpeed *0.002f;

// distanceY += yy * ySpeed * 0.0002f;

// //distanceY = Mathf.Clamp(distanceY, minDistanceY,maxDistanceY);

// //print(Input.GetAxis("Mouse X"));

// //print( Input.GetAxis("Mouse Y"));

// //print(x);

// //print(y);

// }

/*if((Input.mousePosition.x > 0)&&

(Input.mousePosition.x < Screen.width * leftCam.rect.width)&&

(Input.mousePosition.y > Screen.height * leftCam.rect.y)&&

(Screen.height > Input.mousePosition.y))

{*/

//if((Input.mousePosition.x > 0)&&

// (Input.mousePosition.x < Screen.width * leftCam.rect.width)&&

// (Input.mousePosition.y > Screen.height * leftCam.rect.y)&&

// (Screen.height > Input.mousePosition.y))

//{

if (!IsRaycastUI02()) {

distance += Input.GetAxis("Mouse ScrollWheel") * mSpeed;

distance = Mathf.Clamp(distance, minDistance, maxDistance);

}

//}

Quaternion rotation = Quaternion.Euler(y, x, 0.0f);

Vector3 disVector = new Vector3( 0.0f, 0.0f, -distance );

Vector3 position = rotation * disVector+target.position;

//adjust the camera

if( needDamping )

{

transform.rotation = Quaternion.Lerp(transform.rotation,rotation, Time.deltaTime*damping);

transform.position = Vector3.Lerp(transform.position, position,Time.deltaTime*damping);

}

else

{

transform.rotation = rotation;

transform.position = position;

}

2.3 功能模块设计

功能模块主要包括工作原理仿真和维修保养要点2个部分。其中,工作原理仿真模块重点展现采煤机重要部件的结构、液压系统、电气系统和水系统的工作原理。液压系统、水系统采用真实的管路布置图,可直观展现系统工作时的液体流动线路以及驱动零部件的原理,电气系统则无具体布置图,仅通过二维原理图展示电气原理。维修保养要点模块展示重要部件结构、拆卸与安装动画过程以及维修保养等相关信息。结构展示和拆卸与安装动画均可逐级向下拆解,直至不可分解的焊接件,可以直观地展现采煤机的结构,并还原真实的拆卸与安装过程。

将经Creo6.0建模后的整机模型导入Maya软件后,对重要部件进行分类分组管理,不仅避免了过多零件给Unity 3D的层级视图管理带来的困难,而且还加快了查找零件的速度,提升了开发效率。将分类分组后的模型导入采煤机虚拟培训系统,展示为左截割部、右截割部、左滚筒、右滚筒、长滑靴、短滑靴、行走部、液压系统、水系统以及电气系统等部分。截割部等重要部件可以继续向下一组成部分逐级分解,直至分解为组成部分。每个重要部件均配有原理展示动画和功能说明。左截割部的齿轮动力传动如图4所示(动力传输方向为电机——一轴组件——二轴组件——三轴组件——四轴组件——五轴组件——行星组件,动力传输部件用粗线显示)。

图4 齿轮动力传动图

水系统采用虚拟液流的流动展示水系统的工作原理。外喷雾水路的液流流动图如图5所示(外喷雾水路流向为进水口——冷却器——壳体内部水道——壳体底部水道——喷嘴)。

图5 外喷雾水路

2.3.2 维修保养模块

维修保养模块重点展现重要部件的拆卸与安装以及保养要点。在模拟拆卸与安装的过程中,根据采煤机设计的特点,用动画形式展示拆卸与安装过程,可以通过人机交互的操作来控制。Unity 3D的Tween功能包括多种动画类型。在脚本中设置零部件运动过程中的开始位置坐标和结束位置坐标,可以展现该零件的运动轨迹。通过编写脚本也可使零件的运动轨迹消失,零部件的拆卸与安装过程就是通过该功能实现的,在编写脚本的过程中,需要不断调整采煤机模型的内部参数,使模拟效果更加丝滑、真实。

针对行走部的维修保养,导向滑靴和行走轮的拆卸过程如下:拆下行走箱盖板螺栓,并拆下行走箱盖板露出轴头盖;采用顶丝将轴头盖顶出后拆除行走部螺栓和垫圈;利用壳体螺纹和螺钉拆除行走壳体组焊件后取出油封,最后拆除导向滑靴组焊件和销轨轮。具体拆卸过程如图6所示。

图6 导向滑靴和行走轮拆卸过程图

3 系统整体试验

采用鼠标和键盘对采煤机虚拟培训系统进行操作控制。使用键盘输入密码登录该系统的操作界面。使用鼠标选择相应功能按钮触发对应功能。

为了验证该系统是否能满足采煤机服务人员的培训要求,邀请100名服务人员对该系统进行测试。通过与100名服务人员的共同测试与交流表明,该系统功能模块完整,系统响应迅速,动画过渡丝滑,人机交互性较强。系统测试结果见表1。

表1 系统测试结果

4 结语

该文设计了一种基于Unity 3D的采煤机虚拟培训系统,以三维模型为载体,采用交互式动画展示采煤机的重要部件架构。该系统搭载采煤机真实控制面板,用实景化的方式展示了拆卸与安装过程以及维修保养要点。同时,该系统以三维布管模型为载体,还原真实系统的运行状态,展示采煤机整机运动及系统的工作原理。服务人员通过学习该系统可以完整、系统地了解采煤机,从而达到提升服务人员故障维修水平的目的。

猜你喜欢
维修保养功能模块采煤机
煤矿用隔爆型采煤机电机FMECA分析
拖拉机维修保养10忌
输电线路附着物测算系统测算功能模块的研究
谈煤矿机电设备维修保养和修旧利废工作
M市石油装备公服平台网站主要功能模块设计与实现
功能模块的设计与应用研究
露天采矿挖掘机的维修保养
MGTY300/700-1.1D采煤机制动系统分析改进
AM500采煤机小支臂改造
MG300/700-WD采煤机调高系统的改造