基于OpenGL的工业机器人三维仿真设计与实现
关键词:机器人;三雄仿真;OpenGL;离线壕程
1 引言
机器人离线编程(OIP,OffLineProgram)具有不需要停止机器人工作和可以通过图形仿真来避免实际机器人运动中的碰撞等优点。目前国内基本没有针对机器人仿真的成型工具,国外有一些商品软件如 RoboCAD,ROTSY,Evision等系统,但是RoboCAD价格比较昂贵,不能够普遍推广;ROTSY是基于Motoman机器人的一套仿真系统,但是他的普遍性不强而且价格也比较高。本文以江苏省“十五”攻关项目网络化焊接机器人研制课题为背景,设计了基于OpenGL的工业机器人三维仿真机离线软件RobotM,完成了对于Couma机器人的离线仿真程序开发。
OpenGI是与图形硬件无关的程序设计接口,而且OpenGI的类库完成三维图形的底层操作,同时又具有建模方便、实时三维仿真、真实感强、平台独立性、真实性强、对于系统的要求并不是很高等优点。所以RobotM利用OpenGL和微软的VC+开发工具以及MFC类库作为底层的图形库接口实现仿真设计。离线仿真原理如图1所示。
2 系统结构详述
系统模块图如图2所示。
图2说明了RobotM采用了分层次结构设计的方法,将整体程序设计成为3层结构,每一层的设计都相对独立,从而提高了程序的可移植性并且减轻了程序的维护难度。
2.1模型层设计
模型层利用OpenGI和MFC类库,构建了一系列底层的类对象,RobotM利用这些封装好的类对象来构建场景以及完成场景和用户的交互。在RobotM设计中增加了空间实体、空间模型、机器人模型的概念。
空间实体就是单个的最简单的部件,而空间模型是若干个实体按照一定方式的组合。由于机器人仿真具有一定的特殊性,把机器人设定为一个实体或者一个模型显然是不合适的,所以可以把机器人以每一个转轴为界限分割成若干部分,而把分割好的各个部分都作为空间模型,从而形成了若干空间实体一空间模型,若干空间模型一机器人模型的组合方式。
利用这种分层次的组合方式可以很容易控制仿真程序的显示和交互,例如利用RobotM仿真一个汽车焊接生产线时,用一个空间模型对象来描述汽车对象可以很容易地控制这个汽车对象。RobotM对于每种空间实体类型都利用OpenGI提供的GlgenList/glCallList函数实现了一套构建/绘制的函数,利用空间实体一空间模型一机器人模型的组织方式和C++面向对象技术中的多态性,最终把机器人模型和空间模型的绘制工作都归结为空间实体对象的绘制。
RobotM把仿真内容保存为流文件。文件是按照分层结构且以相对路径存储并设计的,即工作区、机器人模型、空间模型、路径等文件如图2所示,用户通过打开工作区文件从而搜索并获取其他类型文件的信息以建立场景对象。机器人、模型、路径文件都可以为其他的工程所用,具有比较良好的重用性;相对路径使得用户即使改变了工程目录存放的位置也不会影响文件的获取,增加了RobotM的健壮性。
2.2场景层设计
场景层主要功能是完成场景中对象的建立、保存、绘制以及交互。作为模型层和示教层的中间层,场景层是机器人仿真系统中的连接部分。场景层从文件建立的过程如图3所示。
由图3可以看出场景的建立是一个从若干文件到仿真程序的空间实体对象的转换过程,RobotM把用户选取的工作区和其他一系列的文件转化为RobotM 可以识别的数据结构对象;同样的,把RobotM中的数据结构对象根据一定规则写入文件完成了保存过程。场景的绘制是仿真程序的重要部分。场景层利用模型层的实体绘制的接口,通过场景一(机器人)一空间模型一空间实体的方式调用各自的绘制函数,RobotM需要在屏幕上显示动画来表示仿真结果,所以程序的绘制效率十分重要。
除了运用普通的OpenGI绘制的各种增加效率的方式之外,本文为提高绘图效率,在RobotM中提出了“必要重构”的方法。即利用几个BOOI量做为场景的各个部分(包括机器人模型、空间模型等部分)的重构标志(重构是指利用OpenGL提供的glGenIist函数将需要绘制的内容保存在内存区域中,每次绘制时直接从中提取,而不需要再次组织)。RobotM在绘制的每一帧都只重构改变过位置或者旋转角度的对象(机器人模型和空间模型对象包括在内),而对于没有改变的对象则直接调用glCallList将对象绘制出来。这样每一帧的绘制效率有很大提高,在程序仿真的时候不会出现显示打顿的现象。
基于OpenGI的工业机器人三雏仿真设计与实现场景的交互提供给用户比较便捷的操作功能。用户根据自己的需要可以修改观察和控制整个场景的方式(如旋转、平移、改变光照等),还可以直接用鼠标在场景中选取目标点或者空间实体。
2.3示教层设计
示教层主要是完成离线编程设计。上2层已经为示教层的设计打下了良好的基础。机器人离线编程的关键内容是能够根据用户的输入确定仿真程序中机器人的运动方式和机器人运动位置,这种关系与实际机器人和示教盒之间的关系相类似。RobotM通过保存各个位置点和各个点之间的运动方式来描述机器人运动的轨迹来实现仿真。
RobotM有一个小型解释器,他能够实现机器人编程语言和RobotM能够识别的运动文件格式的相互转换。由于机器人编程实现的运动程序编译器有自己的语法和语义,所以RobotM必须能够实现控制柜运行的机器人控制文件和RobotM设计的程序相互转换。
RobotM提供了2种确定机器人仿真运动末端点的方式:即转角运动和定点运动。转角运动如同实际机器人运动中的示教盒示教,能够通过用户输入在仿真程序中,使得指定的机器人各个关节部分运动,从而实现机器人的转角运动;而定点运动是RobotM中相对来说比较重要的同时也是转角运动无法做到的。利用场景层提供的接口,用glLoadName给场景中的每个需要确定位置的空间实体/空间模型/机器人模型创建惟一标示的ID,在用户鼠标选取空间中的点时利用ID来确定用户所选取的对象,在获取对象之后利用OpenGI的glUnProjeet函数获取鼠标点击位置在空间中的“世界”坐标系下的位置,完成鼠标平面坐标一空间坐标的转换,利用仿真机器人的运动方法使仿真机器人末端点运动到该空间坐标,从而确定机器人需要运动到的某个点的位置。
通过若干步的上述2种过程的重复,完成这一系列点的设置,可以创建出路径文件。路径文件可以用来仿真也可以下传到机器人控制柜。
c++相关文章:c++教程
评论