虚拟维修教学系统仿真.docx
- 文档编号:11778179
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:16
- 大小:362.93KB
虚拟维修教学系统仿真.docx
《虚拟维修教学系统仿真.docx》由会员分享,可在线阅读,更多相关《虚拟维修教学系统仿真.docx(16页珍藏版)》请在冰豆网上搜索。
虚拟维修教学系统仿真
虚拟维修教学系统仿真
*****
学科专业:
机械工程1408班
学号:
*************
任课教师:
***
武汉理工大学
2015年6月
虚拟维修教学系统仿真
摘要:
本文通过对虚拟维修教学系统的研究与开发,重点描述了虚拟维修教学系统中关键技术的研究以及功能模块的实现。
主要研究了虚拟场景建模技术,人机交互界面的设计,碰撞仿真的检测,自由漫游运动的实现等方面内容,并基于OSG平台完成上述要求。
关键词:
OSG;虚拟维修;人机交互;碰撞检测
Virtualmaintenanceteachingsystemsimulation
Abstract:
Inthispaper,theresearchanddevelopmentofvirtualmaintenanceteachingsystem,thekeytechnologyresearchandfunctionmoduleofthevirtualmaintenanceteachingsystemaredescribedindetail.Inthisresearch,thevirtualscenemodelingtechnology,thedesignofthehumancomputerinteractioninterface,thedetectionofthecollisionsimulation,therealizationofthefreeroaming,andtheaboverequirementsarecompletedbasedontheOSGplatform.
Keywords:
OSG;virtualmaintenance;humancomputerinteraction;collisiondetection
1绪论
1.1引言
设备的维修在设备生命周期中占有非常重要的地位。
在设备的使用过程中,使用引起的有形磨损等各种有害现象的不断累积增加,对于使用单位,会造成多方面的经济损失。
随着虚拟现实技术的蓬勃发展及其广泛应用,虚拟维修仿真成为了当前研究热点。
虚拟现实技术是在计算机图形学、计算机仿真技术、人机接口技术、多媒体技术以及传感技术的基础上发展起来的交叉学科[]。
近年来,虚拟维修仿真技术已经从单一的机械产品开发延伸到军工,航天等领域,仿真对象也从简单的机械设备扩展到复杂系统。
根据研究的目的不同,虚拟维修仿真可以应用到以下三个领域:
维修性设计、保障性规划、人员培训[]。
本文所搭建的是一个主要以人员培训为主的虚拟维修教学仿真系统,该类虚拟维修仿真充分利用虚拟现实技术营造逼真的训练环境,利用计算机仿真技术来模拟再现维修过程,从而向培训者提供直观可信的专业知识,使受训人员得到全方位的培训,获取现实般的维修经验。
1.2国内外现状
作为虚拟维修在实际应用中最成功的案例就是哈勃太空望远镜的虚拟维修训练工程[]。
在哈勃望远镜工作不久,管理人员发现其光学系统出现了问题,无法完成既定任务。
经过调研,美国宇航局决定不把它带回地球维修,而是派宇航员去太空对其进行维修,这就需要在地面运用虚拟现实技术,搭建一个虚拟维修平台以供维修人员进行修理学习。
经过几个月的训练后将维修人员送入太空,并且圆满的完成了任务。
南洋理工大学机械与宇航工程学院的LiJingRong提出了一种面向虚拟样机的桌面虚拟维修仿真系统,集成了一种新型拆装序列规划技术和优化算法,并以离心泵系统的维修为例展示了该系统进行拆卸维修培训的良好性能[]。
德国的EberhardBluemel等人,为了给维修人员提供多层次的训练,开发了一套交互式虚拟维修训练系统。
该系统提供了四种不同层次的训练模式,通过循序渐进的学习,根据不同的学习层次,设置不同的人机交互难度。
该系统实用性强,训练效果良好[]。
VDVAS系统,是由浙江大学开发的虚拟装配设计系统,此系统实现了虚拟环境中可以直接修改所有零部件的几何模型和产品设备的装配操作[]。
哈尔滨工业大学的黄忠念等人,为了弥补传统鱼雷维修培训存在的不足,设计了一个面向鱼雷的虚拟维修训练系统。
该系统能实现鱼雷模型和虚拟环境的实时渲染功能,并且鱼雷的零部件都可以完成拆装功能[]。
2虚拟维修教学系统框架
虚拟维修教学系统主要包括三维建模、运动建模、虚拟拆装、交互控制、故障诊断、维修教学等,其总体框架如图1所示。
图1虚拟维修系统总体框架
2.1仿真引擎OSG
本系统所使用的图形引擎为OSG,其全称为OpenSceneGraph,它是基于OpenGl技术开发,是一套基于C++平台的应用程序接口API。
OSG是一个开源系统,其开发的目的在于将3D场景定义为空间中一系列连续的对象,进行三维世界的管理。
它围绕场景图形的概念,并为图形应用程序的开发提供许多附加的实用工具,使开发人员从实现和优化底层图形的调用中解脱出来[]。
作为图形开发工具,OSG有着自身的优点:
(1)高效性,其支持多种虚拟场景裁剪剔除技术、顶点缓冲对象、多线程渲染、场景动态更新、LOD技术等,进行高效的场景渲染[];
(2)快速开发,OSG封装了OpenGL的大部分功能,开发者不需在关注底层代码,只用理解和掌握其实质内容,懂得操控使用这些库函数就可以实现快速开发[];(3)支持多种数据格式,OSG核心库中有个osgDB类,提供文件读写接口,支持多种格式的3D模型文件、常见的音频文件、图形图像文件、字体文件等,若用户有需求,还可以加载用户自定义的文件格式;(4)可扩展性,基于场景图形内核,因此具有强大的可扩展能力,应用程序窗口的无关性对用户自主开发界面提供了更大的空间。
OSG可以被应用于不同领域,并根据不同需要进行二次开发。
2.2数据库搭建
数据库技术在虚拟维修教学系统中起着重要的作用,作为系统的数据支撑层,提供了系统仿真所需的所有多媒体资源及数据资源。
我将其分为了维修模型库和维修数据库。
维修模型库应包含虚拟场景的建模,即用户在仿真操作时周边的环境,维修场所及场所中的工具、环境等;虚拟样机的三维模型,既有总装体,也有各个零部件,同时还应该包括处于故障状态下的三维模型;声音及粒子特效用于设备运转的真实场景。
在维修教学时的拆卸与安装步骤中提供各个零部件的模型,除此之外还应该包括维修时的工具的模型库。
图2小电机模型
维修数据库主要包括维修工艺,故障库和试题库。
维修工艺即使对维修过程的工艺规划,如应该先拆卸哪个零件,在拆卸过程应该注意的事项等,其可以通过影音和文本教学相结合的形式,通过调用视频文件或者维修工艺卡的方式进行讲解;故障库是用于展示维修样机的故障状态,可以使用图片或者3D模型的形式保存,在需要使用时调用即可;试题库则是用于进行教学后的考核,可以安排如选择题,操作题等多种题型,设定某一需要维修部件的拆卸/装配操作顺序,考察操作人员是否可以按照操作流程进行维修,若出现了错误则可以及时的反馈并做出相应的记录,最后进行总的测评,进行维修教学效果的评价。
2.3图形用户界面
图形用户界面是为了简化用户和计算机交互而设计的计算机窗口[]。
该窗口上的每一个选项都是一个具有相关功能的对象,它是最直观,最高效的与用户交互的方式。
GUI的开发方案有很多种,比如在Windows系统中使用MFC开发的框架,在开源系统中使用QT等。
本文中虚拟维修教学系统的界面使用VisualStudio开发,开发语言为C#,如图3所示为用户注册界面,培训人员在进入系统之前要先进行注册,注册信息会保存到数据库中。
图3系统用户注册界面
进入系统后,可以选择要进行维修教学的模型,如图4所示。
图4系统的模型选择界面
维修教学的界面使用了与OSG结合很好的CEGUI,这是一款开源的UI引擎,它允许用户使用自定义的图片描述通用控件,达到美化界面的要求。
这里我们使用CEGUI和OSG相结合达到鼠标键盘控制维修过程的目的,这是一种非沉浸式的虚拟维修,主要利用CEGUI图形界面库集成到鼠标键盘拆卸技术中,实现了更加友好的人机操作界面,利用CEGUI对零件的拆卸顺序进行了优化,同时零件节点树为用户提供了很好的拆卸导航。
在拆卸界面上,用户可直接选取某一零件,选中后零件的名称会在图形界面上高亮显示,此时用户可以利用键盘上相应按键实现拖曳。
其实现效果如图5所示。
图5结合CEGUI和OSG的虚拟维修
在OSG中,键盘的响应是通过事件处理器osgGA:
:
GUIEventHandler类实现的,它作为OSG键盘交互事件的处理终端,提供了可扩展的虚函数handle,通过类的派生和虚函数的重构,实现用户自定义的交互事件处理工具。
handle函数里面的形参:
时间适配器ea:
获取当前传入此适配器的事件;动作适配器aa:
获取传入的是当前所用的视图对象View,可以用来控制视景器的变化。
响应事件的部分代码如下:
boolMoveHandler:
:
handle(constosgGA:
:
GUIEventAdapter&ea,osgGA:
:
GUIActionAdapter&aa,osg:
:
Object*,osg:
:
NodeVisitor*){
…
switch(ea.getEventType())
{
caseosgGA:
:
GUIEventAdapter:
:
KEYDOWN:
//是否按下了键盘
{
if(ea.getKey()==osgGA:
:
GUIEventAdapter:
:
KEY_Left){…}
//响应左键
elseif(ea.getKey()==osgGA:
:
GUIEventAdapter:
:
KEY_Right){…}
//响应右键
…
}
}
}
而鼠标的交互则分为两种:
一是OSG自带的Dragger类的实现,二则是使用CEGUI实现。
利用OSG中的Dragger类进行拖曳拆卸,拖曳技术它可以在XYZ轴三个方向对零件进行平移操作。
将拖曳器与零件节点共同添加到父节点中,即可实现对该零件的拖曳。
该技术使操作人员手动模拟对各个零件进行拆卸,使操作人员对拆卸过程和顺序有更清楚地练习和熟知,实现的效果如图6所示。
图6鼠标拖曳
其实现的部分代码如下:
//selection为MatrixTransform类型变量,scene为零件节点
selection->addChild(scene);
//根据name产生拖曳器
osgManipulator:
:
Dragger*dragger=createDragger(name);
osg:
:
Group*root=newosg:
:
Group;
//将零件节点和拖曳节点置于同一父节点
root->addChild(selection);
root->addChild(dragger);
最后将root变量返回并添加到场景中即可实现对零件的拖曳。
二是可以选择将图形用户接口CEGUI和3D图形开发库OSG相结合进行实现,用户可直接通过选取某一零件,零件的名称会在图形界面上高亮显示。
用户也可以按顺序选择操作的零件,选中后,与该零件匹配的拖曳器会显现供用户操作.键盘上的Tab键可以进行拆卸模式和观察模式的转换,在观察模式下不能进行拆卸,但是可以对模型拆卸情况进行旋转查看。
3关键技术的实现
3.1场景建模
在虚拟维修场景中,虚拟场景的建模分为两部分,一是维修场景的建模;而是维修对象的建模[]。
首先建立对象物体的几何模型,确定其空间位置和几何元素的属性。
然后再在其基础上再进行实时绘制、立体显示,形成一个虚拟世界。
维修对象的建模一般采用三维建模,使用solidworks等三维建模软件绘制CAD模型。
我们一般将原CAD模型保存成3ds格式,导入3DMAX中,对模型进行渲染,纹理贴图等,使之更加接近我们需要的场景,增强真实感。
然后在3DMAX中导出OSG和IVE格式的文件,以配合我们需要的OSG渲染引擎。
这种格式的文件正是为了完整的描述可视化仿真模型数据库的要求而诞生的。
从数据模型库的结构来看,IVE格式是一种树状的层次化结构,采用这种结构是基于两点考虑:
一是这种结构可以方便的将模型按照几何特性进行有效的组织,并将其转化为能够方便的进行编辑和移动的节点的形式;二是这种树状结构非常适合实时系统进行各种遍历操作。
所谓节点(node)就是构建层次化模型数据库最基本的元素或模块。
3.2场景树的构建
对于场景的建模,通常使用工程建模软件完成对维修对象的三维建模后,需要通过相关的方法导出虚拟维修训练仿真系统可以支持的模型格式。
在这个最终的模型数据文件中一般只包含了维修对象的几何形状尺寸信息及父子层次关系,显然不能够完全满足虚拟维修过程仿真训练系统中维修对象信息的需要。
因此还需要建立一个更为全面的维修对象信息模型,其中包含了零部件的几何以及位置信息、零部件的位姿信息、操作状态信息、层次关系信息、零部件相互约束关系信息和故障信息等。
这些信息需要存储在后台数据库中。
产品的装配树就是对产品装配体建立树形结构目录[]。
OSG采用树层次的场景图(SceneGraph)结构组织虚拟场景:
将原有装配体转换成为场景图的空间变换组节点MatrixTransform,零件转换为叶节点Geode。
除此之外,给每个Geode零件节点添加一个Matrixtransform父节点用于控制该零件的位移和变形。
并经这些节点全部添加到一个根节点Group上控制整个场景。
场景图的层次结构对于几何对象在三维空间的组织和管理十分有效。
模型中的一个子装配体对应OSG模型的一个组节点,而某零件的运动路径对应了OSG中该零件节点的动画路径(AniamationPath)。
而模型在虚拟环境中的变形移动则是用一个齐次矩阵来表示。
3.3渲染优化
由于大型模型零部件数量大,所需要显示的三角形面片数量巨大,为提高实时绘制效率,采用LOD技术对几何模型进行简化。
结合不同精度的模型,在OSG中调制范围,实现在不同的视点距离范围内,显示不同精度的模型的效果。
除了LOD技术,仿真程序还会使用裁剪的方法控制绘制的效率。
结合了视椎体裁剪,背面裁剪等技术将模型中的小型零部件在远视点的情况下裁剪。
其中的算法公式为:
(1)
式中b为近平面投影半径,e为单位向量,v为视点,c点为包围盒中心,p为视点到近平面的距离。
根据1式,设立一个N为阈值,当π*b2 图7近平面投影估算半径 近年来GPU(图形处理单元)发展迅猛,具备强大的并行处理能力和很高的存储器带宽,其计算性能已大大超越CPU。 尤其是CUDA计算架构技术的出现更是加速了基于GPU的复杂场景并行绘制算法的发展,是解决该问题的一个重要途径。 3.4自由漫游的实现 三维世界的交互技术相当于一种“控制-显示”的映射,用户设备(例如鼠标、键盘等)想系统输入控制信息,然后想系统用户输出执行结果。 三维交互涉及的任务繁多,包括三维场景对象的选择和操控、三维世界中的导航漫游、改变三维场景的状态。 作为一款全面的实时渲染引擎,OSG实现了三维场景的漫游以及场景中三维对象的操控这两种主要的三维场景交互方式。 漫游是三维世界中一种基础性的导航任务。 三维场景中的漫游器改变的是观察者(也就是相机)的位置以及观察方向,三维世界及世界中的物体是不发生绝对位移和心态变化的;对于另一个站在原地的观察者而言,眼前的一切仍然维持原状。 OSG中已经封装了一些类用于实现漫游场景。 如默认场景漫游方式osgGA: : TrackballManipulator类等。 我们即可以按照预先设定的路径进行导航漫游(AnimationPAthManipulator类),也可以强制用户的各种运动围绕一个特定的位置(NodeTrackerManipulator类)。 亦或我们可以通过派生自GUIEventHandler的MatrixManipulator类来自定义我们需要的漫游方式,通过接受来自外设,如键盘、鼠标的指令进行场景漫游。 下列代码实现了使用键盘W、A、S、D对场景的漫游浏览。 boolTravelManipulator: : handle(constosgGA: : GUIEventAdapter&ea,osgGA: : GUIActionAdapter&us) { switch(ea.getEventType()) { caseosgGA: : GUIEventAdapter: : KEYDOWN: { if((ea.getKey()=='w')||(ea.getKey()=='W')||(ea.getKey()==osgGA: : GUIEventAdapter: : KEY_Up)) {ChangePosition(osg: : Vec3d(m_vStep*cosf(osg: : PI_2+m_vRotation._v[2]),m_vStep*sinf(osg: : PI_2+m_vRotation._v[2]),0.0)); returntrue; } elseif((ea.getKey()=='s')||(ea.getKey()=='S')||(ea.getKey()==osgGA: : GUIEventAdapter: : KEY_Down)) { ChangePosition(osg: : Vec3d(-m_vStep*cosf(osg: : PI_2+m_vRotation._v[2]),-m_vStep*sinf(osg: : PI_2+m_vRotation._v[2]),0.0)); returntrue; } elseif((ea.getKey()=='a')||(ea.getKey()=='A')) { ChangePosition(osg: : Vec3d(-m_vStep*sinf(osg: : PI_2+m_vRotation._v[2]),-m_vStep*cosf(osg: : PI_2+m_vRotation._v[2]),0.0)); returntrue; } elseif((ea.getKey()=='d')||(ea.getKey()=='D')) { ChangePosition(osg: : Vec3d(m_vStep*sinf(osg: : PI_2+m_vRotation._v[2]),m_vStep*cosf(osg: : PI_2+m_vRotation._v[2]),0.0)); returntrue; } 3.5碰撞检测 在虚拟现实中,用户感觉虚拟对象应该是“真实”存在的,例如飞机不可能穿过一座山飞过去,人不可以穿墙而过。 这要求虚拟现实系统必须实时、准确判断虚拟物体之间是否发生了碰撞[]。 通常碰撞检测可以分为静态碰撞检测,伪动态碰撞检测和碰撞动态检测三类[]。 本文所研究的伪动态碰撞检测是根据活动对象的运动路径检测它是否在某一离散的采样位置方向上与环境相交,即在进行虚拟维修时,拆卸或者安装时零件之间是否会有碰撞。 在虚拟拆装系统中,碰撞往往不但发生在虚拟环境的物体与物体之间,也会发生在物体与场景之间,因此,需要判断输入的物体与其他物体以及场景之间是否发生了碰撞,并给出相应的碰撞位置等信息。 图8碰撞检测基本框架 当装配体零件数量很大时,需要处理的碰撞次数太大,影响到仿真效率,所以碰撞仿真也需要优化。 通过由粗到精的思路,对维修场景中的模型的碰撞检测分层次的进行。 图9逐步求精 如图9所示的AABB、OBB等都是层次包围盒算法中的包围盒,层次包围盒算法基本思想是用大小合适的包围盒将这种几何体包裹,由于包围盒所占的空间大于几何体的空间,如果两个几何体所在的包围盒不相交,则两个几何体一定不会发生碰撞,然后再用更紧密的包围盒去测试,直到最后的三角面片算法。 目前常用的包围盒有包围球、轴对齐包围盒、方向包围盒和离散有向多面体等几种类型。 (1)包围球: 构建简单,相互间求交也很快捷,但缺点是紧密型差,会增加许多无意义的检测。 只需要判断两球的球心距离大于两球半径之和,则两球没有发生碰撞,反之,则发生了碰撞。 如图10所示,左图中两个包围球相交,这样第一次检测会显示两个模型发生碰撞;而在右图就没有包围球相交,因此,这次检测会正确地显示两者并没有发生碰撞。 图10包围球二维模型 (2)轴对齐包围盒(AABB): 轴向包围盒是比较常用的包围盒,被定义为一个平行坐标轴的最小六面体。 通过比较几何体中各元素的的顶点坐标x,y,z,分别求出最大值(Xmax,Ymax,Zmax)和最小值(Xmin,Ymin,Zmin)生成包围盒的8个顶点坐标,建立平行于坐标轴的最小正六面体。 AABB的相 图11轴对齐包围盒 交测试,只有当两个AABB在三个坐标轴上的投影都产生了重叠,这两个AABB才在空间中相交,即最多两两比较6次就可以得到是否碰撞的结论,其伪码如下: AABB_intersect(A,B) { foreachi∈{X,Y,Z} if(Aimin>BimaxORBimin>Aimax)returnfalse; returntrue; } (3)方向包围盒(OBB): OBB与AABB的区别在于是相对于坐标轴任意方向的包含该对象的最小长方体。 图12方向包围盒与轴对齐包围盒的比较 (4)离散方向多面体(K-DOP): k-DOP包围盒是指由k/2对平行平面包围而成的凸多面体(k为平面法向量个数)。 K值越大,包围盒越紧密,更加接近实体,但是检测会变的更加复杂。 AABB实际上是一个6-DOP。 图13K-DOP包围盒模型 不难看出,上述四种包围盒,复杂性由简到繁的顺序为包围球、AABB、OBB、K-DOPs;从包围盒的紧凑性来考虑,则刚好相反。 包围盒构造越简单,其相交次数也就越少,碰撞检测速度越快;而构造越复杂的紧凑型越好,而相交测试复杂,相应检测次数就越多,检测速度就越慢。 因此,我们在选择包围盒时,应根据具体的实际情况来组合选择一种或多种包围盒来满足具体的应用。 4总结 通过对虚拟维修仿真教学系统的实现,主要是为了方便对当前的大型、复杂的操作设备的维修教学。 一方面可以在设备实体生产之前,通过虚拟维修操作的模拟仿真,可以检测设计中的一些缺陷,可以提前修改,更重要的作用是在于培训维修人员,通过半沉浸,沉浸的虚拟维修环境,使培训的学生更加真实的,更加直观的接受维修培训,从而获得更好的培训效果。 参考文献
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟 维修 教学 系统 仿真