当前位置:首页 > 工业控制 > 电子设计自动化
[导读]摘 要:介绍了在交互式C语言开发平台LabWindows/ CVI 下,利用OpenGL 图形系统的功能来设置LabWindows/ CVI 与OpenGL 的图形接口、建立OpenGL 光照、视图和渲染描述表及利用OpenGL基本图元建立六自由度机器手的三维模

摘 要:介绍了在交互式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 的六自由度机器手三维仿真系统,能够直观、正确、快捷地模拟现实机器手的运动情况。作为进一步的研究,在此基础上,可以进行机器手视觉的仿真研究。



来源:博士0次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭