课程设计(论文)基于OpenGL的机器人运动仿真设计.doc

上传人:laozhun 文档编号:3993453 上传时间:2023-03-30 格式:DOC 页数:16 大小:213.50KB
返回 下载 相关 举报
课程设计(论文)基于OpenGL的机器人运动仿真设计.doc_第1页
第1页 / 共16页
课程设计(论文)基于OpenGL的机器人运动仿真设计.doc_第2页
第2页 / 共16页
课程设计(论文)基于OpenGL的机器人运动仿真设计.doc_第3页
第3页 / 共16页
课程设计(论文)基于OpenGL的机器人运动仿真设计.doc_第4页
第4页 / 共16页
课程设计(论文)基于OpenGL的机器人运动仿真设计.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《课程设计(论文)基于OpenGL的机器人运动仿真设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于OpenGL的机器人运动仿真设计.doc(16页珍藏版)》请在三一办公上搜索。

1、 基于OpenGL的机器人运动仿真设计 摘要:仿真技术是机器人研究领域中的一个重要部分,随着机器人研究的不断深入,气气人仿真系统作为机器人设计和研究过程中安全可靠灵活方便的工具,发挥着越来越重要的作用。本文对基于OpenGL的机器人进行仿真设计,学习了机器人运动学的基础和OpenGL设计机器人仿真技术,并在Visual C+6.0编程环境中实现机器人双足行走。1 引言机器人作为机械制造业和信息产业结合的产物,正越来越广泛地应用于机械、汽车、军工、航空航天、造船、计算机、光学仪器、通信设备等行业,在很大程度上替代了人们的体力劳动,如制造、搬运、焊接以及其它各种危险、恶劣环境下的工作。其中仿真机器

2、人是外观和功能与人一样的智能机器人,能像人一样活动,有人的行为,仿真机器人能运动、甚至自己去“想”,会思考。研制出外观和功能与人一样的仿真机器人是现代科技发展的结果。全新组装的仿真机器人全身布满了感应器,让它可以根据感应到的声音和动作做出适当的反应,也让它对于光线和触觉的反应更加灵敏。计算机仿真是伴随着计算机的发展而形成的一门学科。它的研究起源于20世纪70年代,但由于受计算机软硬件水平的影响,很难得到广泛应用。它一般通过设计和构造一个客观世界某一系统的数理逻辑模型,并借助计算机对该模型进行实验的过程。对机器人进行计算机仿真是凭借计算机这一现代化工具研究机器人仿真的有效手段。在机器人的研制、设

3、计和试验过程中,需要经常对机器人进行运动分析,而机器人是多自由度、多连杆的空间机构,其运动学十分复杂,用手工计算不仅十分困难,而且极易出错,通常只有通过这种复杂系统的仿真才能解答机器人设计、制造、试验阶段及运行过程中出现的问题。随着CAD技术的发展,三维实体建模技术得到了广泛的应用。OpenGL是Open Graphics Library的缩写,它是SGI公司开发的一套高性能图形处理系统。OpenGL的特点包括:硬件无关性,可以在不同的平台上实现;建模方便,可以构建相当复杂的几何造型;出色的编程特性,由于OpenGL可以集成到各种标准视窗和操作系统中,因此基于OpenGL的三维仿真程序有良好的

4、通用性和可移植性。OpenGL 的库函数被封装在OpenGL32.d11动态链接库中,从客户应用程序发布的对OpenGL函数的调用首先被OpenGL32处理,在传给服务器后,被Winsrv.dll进一步进行处理,然后传递给 DDI (Device Driver Interface),最后传递给视屏驱动程序。 随着支持OpenGL的图形加速卡的出现和微机性能的提高,OpenGL在微机平台上也将广泛应用,这将促进快速开发高校、低成本的机器人仿真系统。2 OpenGL的基本建模技术利用OpenGL进行仿真时,首先需要根据机器人的实际形态及预期的运动建立起机器人的数学模型、集合模型及参数接口,以便将来

5、实现实时计算和运动模拟。接下来介绍OpenGL的实体建模基础。OpenGL提供了如下绘制图形的函数。1 绘制点OpenGL提供了一系列函数。他们都以glVertex开头,后面跟一个数字和1-2个字母。例如:glVertex2d glVertex2f glVertex3f glVertex3fv 数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个。 字母表示参数的类型,s表示16位整数(OpenGL中将这个类型定义为GLshort), i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei), f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLc

6、lampf), d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。 v表示传递的几个参数将使用指针的方式。2绘制图形 OpenGL要求指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前,并由glBegin来指明如何使用这些点。例如:glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.0f);glEnd(); 则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。另一方面,glBegin

7、支持的方式除了GL_POINTS和GL_LINES,还有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等 。我们还可以指定更多的顶点,然后画出更复杂的图形。3动画制作电影和动画的工作原理是快速的把看似连续的画面一幅幅的呈现在人们面前。一旦每秒钟呈现的画面超过24幅,人们就会错以为它是连续的。我们通常观看的电视,每秒播放25或30幅画面。但对于计算机来说,它可以播放更多的画面,以达到更平滑的效果。如果速度过慢,画面不够平滑。如果速度过快,则人眼未必就能反应得过来。对于一个正常人来说,每秒60120

8、幅图画是比较合适的。具体的数值因人而异。 假设某动画一共有n幅画面,则它的工作步骤就是: 显示第1幅画面,然后等待一小段时间,直到下一个1/24秒 显示第2幅画面,然后等待一小段时间,直到下一个1/24秒 显示第n幅画面,然后等待一小段时间,直到下一个1/24秒 结束 如果用C语言伪代码来描述这一过程,就是: for(i=0; in; +i) DrawScene(i); Wait(); 在计算机上的动画与实际的动画有些不同:实际的动画都是先画好了,播放的时候直接拿出来显示就行。计算机动画则是画一张,就拿出来一张,再画下一张,再拿出来。如果所需要绘制的图形很简单,那么这样也没什么问题。但一旦图形

9、比较复杂,绘制需要的时间较长,问题就会变得突出。让我们把计算机想象成一个画图比较快的人,假如他直接在屏幕上画图,而图形比较复杂,则有可能在他只画了某幅图的一半的时候就被观众看到。而后面虽然他把画补全了,但观众的眼睛却又没有反应过来,还停留在原来那个残缺的画面上。也就是说,有时候观众看到完整的图象,有时却又只看到残缺的图象,这样就造成了屏幕的闪烁。 如何解决这一问题呢?我们设想有两块画板,画图的人在旁边画,画好以后把他手里的画板与挂在屏幕上的画板相交换。这样以来,观众就不会看到残缺的画了。这一技术被应用到计算机图形中,称为双缓冲技术。即:在存储器(很有可能是显存)中开辟两块区域,一块作为发送到显

10、示器的数据,一块作为绘画的区域,在适当的时候交换它们。由于交换两块内存区域实际上只需要交换两个指针,这一方法效率非常高,所以被广泛的采用。 要启动双缓冲功能,最简单的办法就是使用GLUT工具包。我们以前在main函数里面写: glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 其中GLUT_SINGLE表示单缓冲,如果改成GLUT_DOUBLE就是双缓冲了。每次绘制完成时,我们需要交换两个缓冲区,把绘制好的信息用于屏幕显示。如果使用GLUT工具包,也可以很轻松的完成这一工作,只要在绘制完成时简单的调用glutSwapBuffers函数就可以了。3 仿真机器

11、人三维建模用OpenGL进行三维建模主要有两种方法:一个是用3DMax绘制出仿人机器人并将其转换成3DS格式文件,然后导入到程序中;另一个是直接用OpenGL的绘制函数绘制出仿人机器人。第一种方法是利用辅助库提供了一些基本的窗口管理函数,能够完成OpenGL与窗口系统的集成。用辅助库来进行开发,用户在编程时不必关心窗口系统的具体细节,就能够轻松开发出具有良好跨平台移植能力的OpenGL程序。利用OpenGL所提供的窗口系统的功能,采用这种方法能够充分利用窗口系统的功能,加入各种控件,开发出用户界面友好的程序。本文采用第二种方法,在Visual C+环境下利用OpenGL实现对仿真机器人的三维建

12、模和运动仿真,只需要调用OpenGL的辅助函数库Glut,图形界面由Visual C+完成。在辅助函数库Glut中提供了一些三维形体绘制函数,能够完成对如球、立方体、多面体等简单形体的绘制,利用简单形体组成机器人的三维建模。1)首先建立三维物体的顶点类。程序如下:class CMeshVertexpublic:float position3;float normal3;void SetPosition(float x, float y, float z)position0=x; position1=y; position2=z;void SetNormal(float x, float y,

13、float z)normal0=x; normal1=y; normal2=z;2)通过顶点的位置坐标及设置法线向量,以便之后对其进行渲染。然后建立简单形体的类,本文用圆柱体仿真机器人的双腿,用球体仿真关节部位。圆柱体和球体的规则类程序如下:class CMeshpublic:vector vertices;vector indices;void CreateSphere(float radius, int slices, int stacks);void CreateCylinder(float radius, float height, int slices, int stacks);vo

14、id Draw(void);/球体建模void CMesh:CreateSphere(float radius, int slices, int stacks)int n=slices, m=stacks;vertices.resize(n+1)*(m+1);indices.resize(6*n*m);int i, j, k;float theta, phi;float dtheta=2.0*PI/(float)n;float dphi=PI/(float)m;k=0;for (j=0; j=m; +j)phi=-0.5*PI+j*dphi;float cphi=cos(phi);float

15、sphi=sin(phi);for (i=0; i=n; +i)theta=i*dtheta;float ctheta=cos(theta);float stheta=sin(theta);verticesk.normal0=cphi*ctheta;verticesk.normal1=cphi*stheta;verticesk.normal2=sphi;verticesk.position0=radius*verticesk.normal0;verticesk.position1=radius*verticesk.normal1;verticesk.position2=radius*verti

16、cesk.normal2;+k;k=0;for (j=0; jm; +j)int v0=j*(n+1);for (i=0; in; +i)int v=v0+i;indicesk=v;indicesk+1=v+1;indicesk+2=v+n+1;indicesk+3=v+1;indicesk+4=v+n+2;indicesk+5=v+n+1;k+=6;/圆柱体建模void CMesh:CreateCylinder(float radius, float height, int slices, int stacks)int n=slices, m=stacks;int nv_disk=n+1;i

17、nt ni_disk=n*3;int nv_cy=(n+1)*(m+1);int ni_cy=6*n*m;float h2=0.5*height;vertices.resize(nv_disk*2+nv_cy);indices.resize(ni_disk*2+ni_cy);int i, j, k;float theta, z;float dtheta=2.0*PI/(float)n;float dz=height/(float)m;k=0;verticesk.SetNormal(0.0, 0.0, 1.0);verticesk.SetPosition(0.0, 0.0, h2);+k;for

18、 (i=0; in; +i)theta=i*dtheta;verticesk.SetNormal(0.0, 0.0, 1.0);verticesk.SetPosition(radius*cos(theta), radius*sin(theta), h2);+k;verticesk.SetNormal(0.0, 0.0, -1.0);verticesk.SetPosition(0.0, 0.0, -h2);+k;for (i=0; in; +i)theta=i*dtheta;verticesk.SetNormal(0.0, 0.0, -1.0);verticesk.SetPosition(rad

19、ius*cos(theta), radius*sin(theta), -h2);+k;for (j=0; j=m; +j)z=-h2+j*dz;for (i=0; i=n; +i)theta=i*dtheta;float ctheta=cos(theta);float stheta=sin(theta);verticesk.normal0=ctheta;verticesk.normal1=stheta;verticesk.normal2=0.0;verticesk.position0=radius*ctheta;verticesk.position1=radius*stheta;vertice

20、sk.position2=z;+k;k=0;int ibase=0;for (i=0; in-1; +i)indicesk=ibase;indicesk+1=ibase+i+1;indicesk+2=ibase+i+2;k+=3;indicesk=ibase;indicesk+1=ibase+n;indicesk+2=ibase+1;k+=3;ibase=nv_disk;for (i=0; in-1; +i)indicesk=ibase;indicesk+1=ibase+i+2;indicesk+2=ibase+i+1;k+=3;indicesk=ibase;indicesk+1=ibase+

21、1;indicesk+2=ibase+n;k+=3;ibase=2*nv_disk;for (j=0; jm; +j)int v0=ibase+j*(n+1);for (i=0; in; +i)int v=v0+i;indicesk=v;indicesk+1=v+1;indicesk+2=v+n+1;indicesk+3=v+1;indicesk+4=v+n+2;indicesk+5=v+n+1;k+=6; 其球体和圆柱体建模图,左为渲染前,右为渲染后,如下: 3) 建立机器人下肢模型,程序如下: /建立机器人类 class CRobotprotected:CMesh cylinder_mes

22、h;CMesh sphere_mesh;public:float leg1_radius, leg1_height; float leg2_radius, leg2_height; float leg3_radius, leg3_height; float leg4_radius, leg4_height;float body_radius, body_height;float joint1_radius,joint2_radius,joint3_radius,joint4_radius;float joint1_angle, joint2_angle, joint3_angle,joint4

23、_angle,body_dis;void Init(void);void Draw(void);void go(void); /初始化机器人的类 void CRobot:Init(void) cylinder_mesh.CreateCylinder(1.0,1.0,5,5); sphere_mesh.CreateSphere(1.0,5,5);joint1_angle=0.0;joint2_angle=0.0;joint3_angle=0.0; joint4_angle=0.0;joint1_radius=1.0;joint2_radius=1.0; joint3_radius=1.0;joi

24、nt4_radius=1.0;leg1_radius=1.0;leg1_height=5.0;leg2_radius=1.0;leg2_height=5.0;leg3_radius=1.0;leg3_height=5.0;leg4_radius=1.0;leg4_height=5.0;body_radius=2.5;body_height=2.0;body_dis=0.0;/机器人下肢建模void CRobot:Draw(void) /机器人的腰部glTranslatef(body_dis, 0.0, 10.0);glPushMatrix();glScalef(body_radius, bod

25、y_radius,body_height);cylinder_mesh.Draw();glPopMatrix(); /机器人的右腿与腰部关节glPushMatrix();glTranslatef(0.0, 1, -body_height/2);glPushMatrix();glScalef(joint1_radius,joint1_radius,joint1_radius);sphere_mesh.Draw();glPopMatrix();glPopMatrix(); /机器人的左腿与腰部关节 glPushMatrix();glTranslatef(0.0, -1, -body_height/

26、2);glPushMatrix();glScalef(joint3_radius,joint3_radius,joint3_radius);sphere_mesh.Draw();glPopMatrix();glPopMatrix();glPushMatrix(); /机器人的右大腿glTranslatef(0.0, 1, -body_height/2-joint1_radius/2);glRotatef(joint1_angle, 0.0, 1.0, 0.0);glTranslatef(0.0, 0.0, -leg1_height/2);glPushMatrix();glScalef(leg1

27、_radius, leg1_radius,leg1_height);cylinder_mesh.Draw();glPopMatrix(); /机器人的右腿关节glTranslatef(0.0,0.0,-leg1_height/2-joint2_radius/2); glPushMatrix();glScalef(joint2_radius,joint2_radius,joint2_radius);sphere_mesh.Draw();glPopMatrix(); /机器人的右小腿 glTranslatef(0.0, 0.0, -joint2_radius/2);glRotatef(joint2

28、_angle, 0.0, 1.0, 0.0);glTranslatef(0.0, 0.0, -leg2_height/2);glPushMatrix();glScalef(leg2_radius, leg2_radius, leg2_height);cylinder_mesh.Draw();glPopMatrix();glPopMatrix();glPushMatrix(); /机器人的左大腿glTranslatef(0.0, -1, -body_height/2-joint3_radius/2);glRotatef(joint3_angle, 0.0, 1.0, 0.0);glTransla

29、tef(0.0, 0.0, -leg3_height/2);glPushMatrix();glScalef(leg3_radius, leg3_radius,leg3_height);cylinder_mesh.Draw();glPopMatrix(); /机器人的左腿关节glTranslatef(0.0,0.0,-leg3_height/2-joint3_radius/2); glPushMatrix();glScalef(joint3_radius,joint3_radius,joint3_radius);sphere_mesh.Draw();glPopMatrix(); /机器人的左腿小

30、腿 glTranslatef(0.0, 0.0, -joint4_radius/2);glRotatef(joint4_angle, 0.0, 1.0, 0.0);glTranslatef(0.0, 0.0, -leg4_height/2);glPushMatrix();glScalef(leg4_radius, leg4_radius, leg4_height);cylinder_mesh.Draw();glPopMatrix();glPopMatrix();下图为机器人下肢模型:4 仿真机器人运动实现机器人运动学是研究机器人各个关节的位移关系、速度关系和加速度关系。本课题只涉及到位移关系,

31、机器人下肢设有4个关节。通过局部坐标系分别设定四个关节的位移关系。通过glScalef、glTranslatef、glRotatef函数来对坐标进行变化大小,位置,方向。通过设定单步形态的大小,方向来对改变运动状态。机器人行走的程序如下:void CRobot:go(void) if(joint1_angle=0)joint1_angle=-10;joint2_angle=10;body_dis+=2;joint3_angle=10;else if(joint1_angle=-10)body_dis+=4;joint1_angle=10;joint3_angle=-10;joint4_angl

32、e=10;else if(joint1_angle=10)body_dis+=4;joint1_angle=-10;joint2_angle=10;joint3_angle=10;通过设定功能键来进行机器人的交互,“0”键使机器人回到起点,“1”键使机器人向前移动一步。if(key=0)robot.body_dis=0;robot.joint1_angle=0;robot.joint2_angle=0;robot.joint3_angle=0;robot.joint4_angle=0; glutPostRedisplay();else if (key=1)robot.go(); glutPostRedisplay(); 其运动状态如下: 仿真机器人的运动与机器人运动学方程密不可分,它是建立在机器人各关节坐标变换矩阵基础上。最后实现了机器人行走的仿真过程。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号