基于OpenGL三维软件的设计_第1页
基于OpenGL三维软件的设计_第2页
基于OpenGL三维软件的设计_第3页
基于OpenGL三维软件的设计_第4页
基于OpenGL三维软件的设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章基于OpenGL技术的软件系统设计机器人三维运动仿真是机器人各项仿真中一个很重要的组成部分。它对于验证机器人工作原理、工作空间及进行碰撞检测等都具有非常重要的指导意义40本章通将如何在Windows环境下使用VC+、OpenGL实现物体的三维实时运动仿真,并利用“模糊神经网络算法”来解决机械手臂到达指定环境中的某点位置运动的问题,为机械运动控制系统的三维运动仿真及操作控制提供了一种新的方法52。OpenGL技术的实现OpenGL的概述OpenGL(全称:OpenGraphicsLibrary)是定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专

2、业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRISGL0IRISGL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRISGL的基础上开发了OpenGLoOpenGL的英文全称是“OpenGraphicsLibrary”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。OpenGL是与硬件无关的软件接口,可以在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之

3、间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。在OpenGL的基础上还有OpenInventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用,其中,OpenInventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块

4、,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了WindowsNT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩

5、指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL1.5又新增了“OpenGLShadingLanguage,该语言是“OpenGL2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。OpenGL2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabSo2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL2.0将由OpenGL1.3的现有功能加上与之完全兼容的新功能所组成,如图5-1。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次

6、彻底的精简。止匕外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令51。OpenGL三维成形过程OpenGL具有超强的图形绘制能力,包括绘制物体、启动光照、管理位图、纹理映射、动画、图形增强及交互技术等功能。综合以上功能,作为图形硬件的软件接口,OpenGL主要是将三维的物体投影到一个二维平面上,之后处理得到像素,进行显示。OpenGL首先将物体转化为可以描述物体几何性质的顶点(Vertex)与描述图像的像素(Pixel),在执行一系列操作后,最终将这些数据转化成像素数据。也就是说,OpenGL是基于点的。在OpenGL中,无论何种情况,指令总是被顺序处理。有一组顶点定义的图元

7、(Pirmitive)执行完绘制操作后,后继图元才能作用53。简单的图形生成过程如图1.1所示。(1)对图元的定义:图元由一组顶点定义,这一组顶点可以是一个或是多个顶点。每个顶点信息可以是二维的也可以是三维的,可以使用24个坐标。顶点信息可以由位置坐标、颜色值、法向量、纹理坐标组成。法线、纹理、颜色值会在处理每个顶点的过程中被使用和改变。纹理坐标决定图元上纹理图像的映射方式;法线是用于光照计算的;颜色与颜色的变化取决于是否有光照。OpenGL将点、线段、多边形等通过在函数glBegin()和glEnd()之间一系列顶点的数据绘制出图形。(2)对图元的操作:OpenGL用交换矩阵、光照、反走样、

8、像素操作等方法控制图元的绘制。图元的操作处理过程结束后,只留下图元可见部分,准备进行光栅化(投影)处理54。像素处理比较特殊:对像素、位图、影像直接进行像素操作,然后进行光栅化,后者是有些数据被存储在纹理中供顶点使用。(3)光栅化(RasterizationM程:将图元转化为二维图像,完成每个图像点的颜色与深度的计算,生成结果为基片(Fragment),即各图元的二维结果。(4)基片操作:处理过程包括基片是否遮挡、测试、融合等,最后得到像素,存入显示帧缓冲中,完成整个绘制过程。顶点法向颜色纹理像素顶点像素图元、像素操作光栅化基本操作帧缓冲顶点零件加工图5-1OpenGL图形绘制过程基于VC+中

9、的OpenGL技术的实现基于OpenGL的开放性接口,利用目前流行功能强大的VisualC+开发环境编程,VisualC+以其与OpenGL接口的高兼容性,是的开发过程简单易用。VC+编程平台几乎所有世界级的软件,从Web浏览器到面向任务的企业级应用,都是使用MicrosoftVisualC+开发系统来开发的。要用C+来开发Windows的高性能应用程序,VisualC+是效率较高的首选工具之一。VisualC+作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。本次设计采用VisualC+6.0作为开发软件。OpenGL3D建模工具OpenGL能够

10、建立两种三维几何模型。一种是线框模型.一种是表面模型。在进行建模时任意复杂的三维实体用一个个小的多边形面来近似表示。OpenGL的辅助库实际上也采用了这种方式来绘制图形。建模的关健就是设法把复杂的三维实体分解为小多边形。OpenGL通过以下格式来定义多边形:glBegin(GL_POl,YGoN);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,3.0,0.0);giVertex3f(3.0,3.0,0.0);glVertex3f(4.0,1.5,0.0);glVertex3f(3.0,0.0,0.0);glEnd();OpenGL的建模实质上就是根据所给定的顶点

11、数据和面信息建立起各个多边形面元,并将其存储到显示列表中,在需要时予以调用。目前较为常用的有3几种建模方案。(1)利用OpenGL的辅助库函数。如前所述,辅助库也提供了一些绘制简单实体的函数,如果所要绘制的几何形状比较简单可直接采用,若对于复杂的几何形体则显得有些力不从心。辅助库中绘制实体的函数.命令格式也限制得很死。例如,绘制圆柱体的函数。只能为沿z向伸展,且以原点为圆心。绘蒯这些形体虽然可只执行一条指令。可是必须经过平移和旋转变换后才能满足最终要求,使建模过程变得非常繁琐,同时也影响了系统的效率。(2)利用现有的CAD系统来完成建模。商品化的CAD软件(如AutoCAD、lAGlI、Sol

12、idworks等),具有很强的三维建模能力。能够用交互的方式十分方便地建立起复杂的几何模型,用它们来辅助完成建模工作是十分合适的。关键是如何从几何造型文件中提取出几何形体数据,用于OpenGL绘图。这就需要对图形文件的格式有深入的了解。三维建模应用中的考虑综合以上三种方法,对于简单标准的实体,直接采用辅助库函数建模;对简单的实体如多边形的拉伸、回转体等则采用自定义手工建模的方法。而对于比较复杂的曲面等,则利用AutoCAD等CAD软件绘制所需图形在OpenGL中读取显示的方法。在VC+6.0开发环境下开发OpenGL应用程序需解决OpenGL与VC+6.0窗口系统的接口问题,主要是为OpenG

13、L创建适当的图形操作描述表并设置正确的像素格式。此外就是要将OpenGL编程与VC+中的事件编程相结合。在VC+6.0事件处理程序中,利用OpenGL进行图形绘制,从而真正地将OpenGL融入到程序中,使之于程序的其他部分有机地结合成为一个整体。OpenGL的绘图方式与Windows的一般的绘图方式是不同的,其区别主要表现在以下3个方面:Windows用GDI绘图。GDI是Windows中二维图形的绘图接口,GDI绘图内容包括点、线、面以及一系列绘图笔刷等。这些绘制内容可以输出到屏幕内存或打印机等设备。这种方式是在Windows的设备描述表(DevieeConiexts简称为DC)52中进行的

14、。所有的Windows图形程序中都需要申请一个DC并在DC中完成各种绘图操作。OpenGL采用的是渲染描述表(RenderContext简称RC)绘图。实际上,在OpenGL应用程序中RC与DC的工作方式是相同的。对于GDI,DC存储了各种图形绘图操作的状态变量;而Rc中存储了OpenGL所需的渲染信息如象素格式等。(3)象素格式。象素格式决定了子象素颜色的设置与DC和RC相关联的辅助缓冲区象素格式的设置,其内容是OpenGL调用与Windows绘制操作之间的中间转换设置。因此要在Windows环境下实现OpenGL函数功能,就必须先设置象素格式。OpenGL为windows提供了一系列处理象

15、素格式的函数,这些函数是:ehoosePixelFormat用来比较传过来的象素格式描述和OpenGL支持的象素格式,返回一个最佳匹配的象素格式索引:setPixelFormat,用格式索引来设置DC的象素格式,另外OpenGL窗口风格必须包含wsCLIPCHILDREN和wsCLIPSIBLINGS类型,否则设置失败。在VC+6.0可以编写只有一个窗口需要绘制的单文档程序和多个窗口需要绘制的多文档程序。在本文中只需要一个窗口来绘制机械手模型,所以采用单文档模式。基于单文档的OpenGL图形程序框架的基本步骤如下:(1)设置编程环境为了能够使用即OpenGL命令,首先需要在预编译头文件STDA

16、FX.H中添加:#includegl/gl.h、#includegl/glu.h、#includegl/glaux.h,这样预编译头文件才能提供对OpenGL库和用户库的支持34。还应当通过Project菜单下的“Settings”选项在Link选项卡中链接以下库:OPENGL32.LIB、GLU32.LIB以及GLAUX.LIB。(2)建立程序框架新建一个基于单文档的工程,利用MFCClasswizard添力口消息WMCREATE、WMDESTROY、WMSIZE和WMTIMER的响应函数。按OpenGL的要求设置好窗口的属性和风格,并设置好显示的象素格式。在PreCreateV石ndow函

17、数中设置视窗口为具有WSCLIPCHILDREN和wsCUPSIBLINGS风格的窗口,以保证成功地设置像素格式。在setupPixelFormat函数中设置象素格式:PIXELFORMATDESCRIPTORPfd=sizeof(PixELFoRMATDEseRToR)/pfd结构的大小1,PFD_DRAW_TO_WINDOW,PFD_SUPPORT_OPENGL,PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,0/支持在窗口中绘图/支持OpenGL/双缓存模式/R

18、GBA颜色模式/24位颜色深度/忽略颜色位/没有非透明度缓存/忽略移位位/无累加缓存/忽略累加位/32位深度缓存/无模板缓存/无辅助缓存/主层/保留/忽略层,可见性和损毁掩模/版本号;一般说来上述象素结构,需要用户改动的地方较少,最有可能改动的就是PFD_DOUBLEBUFFER,这个参数的意义是支持双缓存机制,若要用OpenGL实现动画,则必须选择此参数。在结构pfd(PixelFormatDescriptor)定义完之后,调用ChoosepixelFormat确定pfd结构是否存在。若返回值为TRUE,则调用函数setPixelFormat为DC设置象素格式。(3)获得Windows设备描

19、述表,然后为其设置象素格式,并与的渲染描述表联系起来。在InitializeOPenoL中关联DC和RC。M_pDC=pDC:获取Windows设备描述表;SetUppixelFormat():为DC设置象素格式;M_hRC二wglCreateContext(m_pDC->GetsafeHde(),用设置好象素格式的DC来创建OpenGL的M_hRC:wglMakeCurrent(M_pDC->GetsafeHdc(),M_hRC),该函数把RC和DC相连接起来,并且通过该函数,应用程序可以随时连接到一个不同的RC。另外,释放RC也可通过该函数来完成。(4)调用OpenGL命令进行

20、图形绘制。在RendersceneS数中进行图形绘制和控制。SwapBuffers(m_pDC->GetSafeHdc():该函数是Win32API提供的一个用于OpenGL的函数。当OpenGL使用双缓存技术以支持动画显示时,需要使用该函数将在BackBuffer上绘制的场景交换到FrontBuffer中显示,SwapBuffers()需要与图形操作描述表相联的设备描述表句柄作为参数。在该函数之后可以编写控制过程的函数。(5)退出程序,在onDestroy函数中释放DC和RC。wglMakeCurrent(hDC,NULL):释放绘制描述表;wglDeleteContext(hRC):

21、删除绘制描述表;ReleaseDC(hwin,hDC):释放设备描述表53。完成上述操作后,基于OpenGL的开发平台就创建好了。基于WINDriver的USB驱动开发在当前较为流行的驱动开发工具有:Windrver、WINDDK、DRIVERSTDIO等,其中Windriver具有简洁高效、不涉及操作系统底层编程并且具有很好的兼容性的特点56。只要掌握一种编程语言、熟悉相应设备的工作机制,任何人都能在短时间内利用Windriver开发出令人满意的设备驱动。这是因为Windrver把所有繁杂的底层操作都封装在一个内核模块中,而提供给用户标准的WindriverAPI函数来实现硬件访问。如此则将

22、驱动开发的繁杂工作变成了仅仅是调用硬件操作的标准API函数,大大的简化了驱动开发者的工作、加快了开发周期。而且它支持包括Windows系列、WindowsCE、Linux和Solars等多种操作系统。同时可以利用多种集成开发环境和编程语言来实现,支持的集成开发环境包括VB、VC、Delphi和C+Builder等,编程语言包括C、Pascal和Basic等57。在同类工具中,Windriver在这方面具有明显的优势。Windriver开发设备驱动的一般方法是:在配置并安装好设备之后,用户可以打开Windriver的驱动向导DriverWizard,首先在向导中配置设备资源,包括I/O地址范围,

23、如有必要还可以设置内存、寄存器地址范围以及用到的中断口;然后用户可以对设备进行一些测试操作,检验硬件的有效性;设置完成之后,用户可以选择一种特定的开发环境或编程语言,让Windriver根据用户的先前设置生成一个相应开发环境下的设备驱动样本。用户可以直接利用驱动样本中的标准WindriverAPI函数来实现对硬件的操作和访问58。而API函数实际上要通过Windrivrer的内核模块才能实现硬件访问,其结构框架如图一所示。这属于用户模式的驱动程序,一般情况下此种模式便已够用。如果用户模式驱动的性能不能满足实际需要,效率不够高,用户可以在此基础上开发内核模式的驱动(KernelPlugIn)。内

24、核模式59的驱动性能一般要优于用户模式的驱动,只是其开发过程稍微复杂一点。具体如何利用Windriver开发USB驱动包括以下步骤60:(1)配置并安装设备到PC机;(2)运行DriverWizard,配置设备资源,并完成设备测试;(3)选择驱动开发环境,利用DriverWizard产生相应的设备驱动样本;(4)在相应的开发环境中,移植驱动样本中的API函数代码,并编写具体的功能代码,建立用户模式的驱动程序;(1)动态加载Windriver的内内核模块;(2)打包发布驱动程序。用户所写代码Windriver代码用户级驱罚”(EXEorDLL)i用户模式WinDriverAPI函数(Windrv

25、r.h)内核级驱动(SYSorVXD)用户内核函数WinDriver(SYSorVXD)内核嵌入用户驱动代码图5-2Windriver结构框本系统使用Windriver配合VC+6.0开发USBD12的驱动,编译发布后包含“My_USBDriver.inf”和“My_USBDriver.sys”两个文件,其具体操作不再叙述。软件系统的设计通过上述关键设计技术,使用VC+设计了本控制系统软件。软件设计的主题思想是模块化设计,将各需要的模块打包设计,使用dll动态程序链接库的模式调用,具软件结构图如图5-3所示。从图中可以看出,本软件一共使用了4条线程,分别为USB通讯线程、OPEGL三维模型线程

26、、用于操作界面线程、推理线程,各个线程采用Windows消息队列的形式实现数据的交互,USB线程负责采集数据后交与交与推理线程计算控制电压角度,同时采集的位置信息交与OpenGL线程绘制三维图形,在用户更改参数后,用户界面操作线程将数据交与推理机制或者USB通讯线程。使用Windows线程技术,有效的防止了消息冲突和误处理,提高了数据交互速度底层物理硬件通讯事件机制物理硬件机器手臂物理模型参数模糊神经网络模型m推理线程Wess:POWER_INIT_USB():USBPOINT1Read():USBPOINT1Read():USBPOINT2Read():USBPOINT3Read()USB通

27、讯线程用户界面线程用户编程文本ndowsepip*excut_Pos()arm1_Pos()arm2_Pos()arm3_Pos()arm4_Pos()arm5_Pos()基于OPENGL机器人模型线程物理硬件图5-3软件设计结构框图通过上述设计出系统软件界面如图5-4所示。).070图5-4系统软件界面图图5-5关键操作对话框该软件的使用方式如下:(1)连接六自由度机器手臂电气线缆;(2)检查各个连接部件是否完好,通电;(3)插入USB六自由度控制系统;(4)打开软件,此时软件将自动检测是否有设备连接,如果设备连接良好,则在会在连接状态上显示“设备已连接”,如果设备断线,则显示“设备离线”,

28、此时需要检查线路后重新连接USB电缆,然后点击“刷新设备连接”;(5)点击“操作控制区”中的“设备归零位”,此时手臂的各个关节将运动起来,自动找到设备0点;(6)编写控制程序a)在“程序控制”界面中,选择“新建”控制文件。此时将有文本框将显示“000START'、“空行”、“001END”;b)在基本运动中选取基本控制,如选取“S轴旋转”,将出现图5-5对话框,旋转“左旋”、“0-60”度、中速后确定,文本控制将显示“000START”、“001L1B-L-ZS60”、“空行”、“002END”;c)如此选取其他轴的运动,和运动之间穿插上述完成后执行下面程序指令、延时执行以下指令等,具

29、体指令表见表5-1所示;(8)点击“运行”、或“演示”按钮。(9)同时观察三维窗口中或机械手臂的运行状态。表5-1六自由度机器手臂伪码指令表指令名称伪码1号关节旋转L1B12号关节旋转L2B3号关节旋转L3B4号关节旋转L4B5号关节旋转L5B6号关节抓取L6B左旋或+旋L左旋或-旋R下笔旋转LB当前转动范围NS原点转动范围ZS爪抓取力度GN爪松开RN开始START结束END延时T(n)2等待执行W跳转2JP(n)21、左右指令编写为在英文状态下使用,半角;2、T(n)中n表示延时时间长短,单位为ms;JP(n)中n表示跳转指令编号;3、表格中所有指令为专用语言,不具备其他任何语言的意义;机器

30、手臂性能测试与分析性能测试通过对末端执行器手爪握力、手臂伸展运动过程中带负载、不带负载的重复定位进行了测试。在测试过程中,将都以水平面作为运动区域平面伸展范围分析,测试如下进行。(1)末端执行器-手爪握力测试通过对末端执行器手爪受力标定后,在手爪上安装一个经过标定的认证的20Kg测力传感器,经由软件控制手爪的握力,每次握住十分钟后张开爪,继而增加握力,如此反复。握力每次增加1Kg,手臂姿态为垂直水平面。经过测试后,其实验数据见表5-2。表5-2手爪握力测试末端执行器状态间隔时间(分钟)测量值握紧1Kg101Kg松开100Kg握紧2Kg102Kg松开100Kg握紧3Kg103Kg松开100Kg握紧4Kg104Kg松开140Kg握紧5Kg105Kg松开200Kg握紧6Kg106Kg松开OO0.05Kg握紧7Kg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论