基于OpenGL的六自由度机器手建模仿真

时间:2009-09-01

  摘 要:介绍了在交互式C语言开发平台LabWindows/ CVI 下,利用OpenGL 图形系统的功能来设置LabWindows/ CVI 与OpenGL 的图形接口、建立OpenGL 光照、视图和渲染描述表及利用OpenGL基本图元建立六自由度机器手的三维模型的新方法,并且利用OpenGL的双缓存技术实现了仿真系统的交互式界面。在此开放的仿真系统下,可直观、正确地模拟机器手的运动情况,还能方便地进行机器手运动轨迹的仿真研究。

  机器手三维建模仿真是机器人各项仿真中的一个重要组成部分,对于机器手的运动轨迹仿真有重要的指导意义。LabWindows/ CVI(以下简称CVI) 是美国NI 公司推出的交互式C 语言开发平台。其集成化开发环境、交互式编程方法、函数面板和丰富的库函数大大增强了语言的功能,为熟悉C 语言的开发人员提供了一个理想的软件开发平台[1]。由于在CVI 中已经集成了OpenGL 图形标准,并且OpenGL编程类似于C 编程,实际接口就是C,相对基于Visual C++基础类库MFC 和OpenGL 开发的三维仿真平台,在CVI 中利用可视化技术,开发基于OpenGL 的三维图形更方便快捷,同时可在此三维模型平台上方便地进行轨迹规划和控制算法等方面的仿真研究。

  1 OpenGL的简介和基本操作过程

  1.1 OpenGL简介

  OpenGL图形系统是图形硬件的一种软件接口。OpenGL是SGI公司开发的开放式三维图形标准,它实质上就是一个三维图形和模型库,具有高度的可移植性,可以在多种操作系统平台上运行,例如各种版本的Windows、Unix/ Linux 和Mac OS等,具有非常快的渲染速度。它可以对计算机图形技术进行控制,产生逼真的图像或者虚构出现实世界没有的图像,是高性能图形和交互式场景处理的工业标准[2]。OpenGL 是一种高性能的开放式图形库,它的图形API以函数形式提供了115个库函数、43个实用库函数GLU、31个编程辅助库函数GLAUX以及若干个X-Windows/MS-Windows专用库函数GLX/WGL。OpenGL提供了多种三维图形的绘制方法,包括线框绘制方式、深度优先方式、反走样方式、平面明暗处理方式、光滑明暗处理方式、阴影和纹理方式、运动模糊方式、大气环境效果、深度域效果[3]。OpenGL的这些功能可以实现逼真的三维绘制效果,创建交互性三维场景和视景动画。

  1.2 OpenGL的基本操作过程

  OpenGL对三维图形操作可以归纳为:场景描述、设置光照、观察场景、光栅化,这个过程与人们观察世界的过程是一致的,其具体操作步骤如下:

  (1) 根据基本图形建立景物模型,并对所建立的模型进行数学描述;

  (2)把景物模型放在三维空间中合适的位置,并设置视点(Viewpoint),以观察场景;

  (3) 计算模型中所有物体的色彩,同时确定光照条件、纹理映射方式等;

  (4) 把景物模型的数学描述及其色彩信息转化至屏幕上的像素,即光栅化(RasterizATIon)。在这些步骤的执行过程中,OpenGL 还可能执行其他操作,如图1所示。

  程序从图1的左侧进入,经过一系列的运算处理,将几何顶点数据和图像像素数据加工后生成待显示的帧。另外,景物光栅化之后被送入帧缓存前,还可以根据需要对像素进行操作。

  2 在LabWindows/CVI中配置OpenGL

  在CVI开发环境中使用OpenGL开发三维仿真图形的关键是如何配置CVI和OpenGL的图形接口。

  2.1 添加与OpenGL相关的头文件和库文件

  在CVI下创建一个新的工程文件:OGLHand.prj,在OGLHand.c文件首部添加4个头文件:

  #include

  #include//基本库

  #include//实用库

  #include//辅助库

  在CVI编辑器的主菜单“edit”中选取“Add Files to Project”下的“Library”,在弹出的对话框里选取CVIsdklib中的3个库文件:glu32.lib、glaux.lib和opengl32.lib并添加到当前工程中。

  2.2 设置CVI与OpenGL图形接口

  虽然OpenGL已经内嵌在CVI中,但是要让CVI控件显示OpenGL图形,必须把CVI的picture控件转换成OpenGL控件。需要在工程中添加函数cviogl.fp,其路径为:CVItoolslibcustctrl。并在OGLHand.c文件首部添加:#include'cviogl.h'。

  在主函数main()里调用函数将CVI的picture控件转换成OpenGL控件并返回控件句柄OGLCtrl,再调用InitControl()函数初始化OpenGL属性,调用int OGLRefreshGraph(int Panel_Handle,int OGL_Control_Id)函数及时更新OpenGL控件图形的场景和图形属性。

  3 基于LabWindows/CVI和OpenGL的机器手三维建模

  3.1建立OpenGL光照、视图及透视模式

  视图决定模型在场景中的位置,同时要选择一个有利的观察点来观察场景。通过定义光照、视图及透视模式就能在二维屏幕上显示出立体的三维图形,这些都放在InitControl()函数中定义,包括初始化系统光照和初始化视图位置。

  // 初始化系统光照

  OGLSetCtrlAttribute(hPanel,this->hControl,

  OGLATTR_LIGHTING_ENABLE, 1);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_LIGHT_SELECT, 1);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_LIGHT_ENABLE, 1);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_LIGHT_DISTANCE, 2.0);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_LIGHT_LATITUDE, 30.0);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_LIGHT_LONGITUDE, 150.0);

  // 初始化系统视图位置

  OGLSetCtrlAttribute(hPanel,this->hControl,

  GLATTR_PROJECTION_TYPE,OGLVAL_PERSPE CTIVE);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_VIEW_DIRECTION,OGLVAL_    USER_DEFINED);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_VIEW_CENTERX, 0.0);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_VIEW_CENTERY, 0.0);

  OGLSetCtrlAttribute(hPanel, this->hControl,

  OGLATTR_VIEW_CENTERZ, 1.0);

  3.2 建立渲染描述表

  渲染图像就是计算机根据模型创建图像的过程,即三维图形的显示过程。要把一个物体的三维坐标变换为屏幕上的像素坐标,终使图形在屏幕上显示。

  OpenGL坐标变换包括:几何变换、投影变换、剪取变换和视区变换,三维图形的显示流程如图2所示。

  视区变换矩阵:GLViewport(x,y,width,height);其中,参数x,y是视区在屏幕窗口坐标系中的左上角坐标,width和height分别为视区的高度和宽度。注意变换只对其后的一系列操作产生影响,如在此之前屏幕上已有图形,则变换对其不产生影响。变换后如交换缓存,则可形成动画,否则只在平面上作图。

  3.3 建立六自由度机器手模型

  OpenGL提供对二维和三维图形的基本操作,但是并不提供描述复杂几何物体及建立复杂物体模型的手段,因而必须寻找自身的三维建模方法。对不太复杂的模型直接利用OpenGL的基本三维图元(点、线、面)来构造,既方便又快捷,易于对模型进行操作和控制,缺点是建模的灵活度不大,不过对于建造本系统的三维模型已足够[4]。

  对实物进行一定简化后建立的模型是由一些圆柱体、长方体和球体组合而成。采用顺序描述各个子体的方法来建立六自由度机器手模型。gluCylinder()用来绘制一个中空的二次柱面作为底座。gluDisk()用来绘制一个垂直于Z轴的圆盘。gluSphere()用来绘制一个球体作为关节。glRotatef()表示把当前矩阵与一个表示旋转的物体的矩阵相乘,以逆时针的方向绕着从原点到目标点的直线旋转。参数Rotation指定了旋转的度数。glTranslatef()把当前矩阵与一个表示移动物体的矩阵相乘,这个移动矩阵由函数的参数指定,经过平移的矩阵成为当前的变换矩阵。由于在OpenGL里描述下一个物体都是在前一个物体的基础上,因此每次都需要对新坐标中心进行定位。例如当创建好机器人手臂的段后,为了创建手臂的第二段,需要使用函数glTranslate()把局部坐标系统移动到下一个节点。

  模型的构建过程采用分层结构,即在相应的关节坐标系中构建各个模块,这样可以实现独立控制,使其能够绕着各自的坐标轴旋转。两只机器手的三维图形如图3所示。

  3.4 机器手可视化仿真

  机器人仿真的研究已经成为机器人学中一个引人瞩目的领域,对于验证机器人工作原理、工作空间及进行运动学研究等都具有非常重要的指导意义。而机器手作为机器人不可缺少的部分,对其进行三维可视化仿真可以使研究者对机器人运动方式有一个感性的认识,可以帮助研究人员对机器人身体各个部分的位置关系建立正确的方程,可用于检验轨迹规划和作业规则的正确性和合理性,可为离线编程技术的研究提供一种有效的验证手段。显然,采用可视化仿真技术的好处在于:

  (1)从上位机的图形上就可以看到机器手的运动情况,增加了视觉效果;

  (2)对于机器手在危险环境或者远距离工作,而人又无法到达现场时,采用此项技术的意义是明显的,它可以保证人在上位机系统进行实时监控机器手的工作状况,以便发出新的控制指令。

  3.4.1实现控制机器手仿真界面

  在仿真界面上设置了机器手的观察者位置、肩关节、肘关节位置变换旋钮,以及机器手爪子的分合选项,左右手控制选项,镜头距离拉近,退出选项。如图4所示。


  3.4.2 实现机器手的动画

  为了实现平滑的动画效果,OpenGL采用双缓存技术,双缓存是指位平面被分为前台缓存(显示缓存)和后台缓存(内存缓存)。后台缓存计算场景、生成动画,前台缓存显示后台缓存已经画好的画面。所以只有前台缓存才被显示。

  因此当完整的画面在后台缓存中画出以后,就调用SwapBuffers()函数,使其成为为前台可见。这样循环往复,隐藏了画图的过程,视频图像可以在人眼觉察不到的时间间隔交替出现,于是看起来所有的画面都是连续的。所以通过仿真界面可以控制机器手的运动轨迹。

  利用CVI 和OpenGL的接口以及OpenGL 在三维图形中的卓越表现,建立了机器手的模型,设计了基于LabWindows/CVI 和OpenGL 的六自由度机器手三维仿真系统,能够直观、正确、快捷地模拟现实机器手的运动情况。作为进一步的研究,在此基础上,可以进行机器手视觉的仿真研究。


  
上一篇:基于数字信号处理器的稳态视觉诱发
下一篇:基于分布式的逆变电源并联控制技术

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料