1、基于 OpenGL 的五轴插补仿真软件设计第 23 卷V01.23第 9 期No.9重庆工学院(自然科学)JournalofChongqingInstituteofTechnology(NaturalScience)2009 年 9 月Sep.2009基于 OpenGL 的五轴插补仿真软件设计孙友生,谢明红(华侨大学机电及自动化学院,福建泉州 362021)摘要:论述了基于时间分割法的五轴联动数控机床插补算法原理 .利用 OpenGL 强大的图形接口和 VisualC+6.0 的编译环境编写了基于时间分割法的五轴插补仿真软件 .介绍了软件的总体设计过程,数据结构设计和软件具体实现过程.结果表明
2、:软件提供的界面简单友好,操作方便,图形显示流畅,具有真实感;该软件能够有效验证基于时间分割法的五轴插补算法的正确性.关键词:五轴数控插补算法;OpenGL;VisualC+中图分类号:TG659 文献标识码:A 文章编号:16710924(2009)09014205SimulationSoftwareDesignofFive-axisInterpolationBasedonOpenGLSUNYou-sheng,XIEMinghong(CollegeofMechanicalEngineeringAutomation,HuaqiaoUniversity,Quanzhou362021,China)
3、Abstract:Thetheoryoffive-axisnumericalcontrolmachinetoolinterpolationalgorithmbasedontime.sharingmethodisdiscussed.ThesimulationsoftwareoffiveaxisinterpolationbasedontimesharingmethodisprogrammedbyusingthepowerfulgraphicinterfaceofOpenGLandthecompilerenvironmentofVisualC+6.0.Thegeneraldesign.thedata
4、structuredesignandtheimplementationdetailofthesoftwareisintroduced.Theresultindicatesthattheinterfaceofthesoftwareisfriendly,theoperationofthesoftwareiseasy,thegraphicdisplayssmoothly,andthesoftwaregivesstrongsenseofreality.Theaccuracyofthefiveaxisinterpolationalgorithmbasedontimesharingmethodiseffe
5、ctivelyverifiedbythesoftware,andcanbeusedincomputersimulationoffiveaxisinterpolationusingotheralgorithmwithsomeslightmodification.Keywords:fiveaxisinterpolationalgorithm;openGL;visualC+十一般来说,五坐标联动是指数控机床的,l,z3 个平动坐标和绕 ,l,z 轴旋转的 3 个转动坐标 A,c 中的任意 5 个坐标的插补运动,通常是,y,z 与 3 个旋转坐标 A,c 中的任意 2 个的组合联动.按照旋转轴的不同,
6、可以把五轴联动机床分为 AB,AC 和 BC3 类 .五轴联动机床可用于加工复杂的高精度零件,对航空航天,模具制造等都有重要意义.五轴联动数控机床的插补算法是五+收稿日期:20090615基金项目:泉州市科技项目资助(24200832).作者简介:孙友生(1982 一),男,福建漳州人,硕士研究生,主要从事五轴数控方面的研究;谢明红(1968 一), 男,博士,研究员,硕士生导师,主要从事各种数控系统开发,CAD/CAM 软件开发,计算机自动检测系统开发.孙友生,等:基于 OpenGL 的五轴插补仿真软件设计 143轴联动中的关键技术.OpenGL 实际上是一种图形与硬件接口,它严格按照计算机
7、图形学原理设计,符合光学和视觉原理,非常适合可视化仿真系统.与其他图形程序设计接口不同,OpenGL 提供了十分清晰明了的图形函数.OpenGL 强大的图形函数不要求开发者把物体模型的数据写成固定的数据格式,开发者可以直接使用自己的数据.1 基于时间分割法的五轴插补算法原理五轴数控插补算法与两轴,三轴数控插补算法最大的区别是:五轴数控插补存在转角问题.基于时间分割法直线段插补比较简单,只需计算出直线段的始端和末端转角,在精插补的过程中再按照线性插补算法对旋转角度进行插补即可_3J.基于时间分割法圆弧插补算法相对复杂.首先根据轮廓步长计算其所对应的步距角,然后以轮廓设置机床类型根据机床类型 J调
8、用相应模块 I1_一匝蛔.j.一NC 代码显示 lT一符合语法要求加工类型判断步长作为圆弧上相邻 2 个插补点之间弦长,根据步距角,计算由前一插补点到后一个插补点的各个平动坐标轴的进给量,最后求取相应的转角大小,并计算附加位移.其中计算较为困难的是求取新的平动坐标值.平动坐标值可由圆弧圆心指向起点的矢量,绕过圆心的旋转轴单位矢量旋转一个步距角,所得的矢量即为圆心指向下一个插补点的矢量,由圆心坐标即可求出下一个插补点的平动坐标.矢量的旋转可表示为初始矢量左乘绕任意旋转轴的旋转变换矩阵.2 软件整体设计软件首先设置五轴机床的类型,然后读取 NC代码,处理并得到相关的数据,最后利用这些数据进行绘图操
9、作,实现仿真,流程如图 1 所示.,Y,YtY直线处理模块圊羲处理模块 II 忽略据到 CArray 对图 1 软件设计流程定时器调整坐标系调用作 II 调用画刀周指令 JJ 具措令144 重庆工学院首先设置用于仿真加工的五轴数控机床类型,即 AB,AC 或 BC 型,便于仿真时的数据操作和处理,不同的机床类型所采用的处理模块不同.读取五轴 NC 代码文件,校验代码是否符合五轴 NC代码语法要求,当出现语法错误时,提醒用户做出相应的调整.逐行提取代码中有用的信息:加工类型,平动坐标值和旋转坐标值等.对不同的加工类型调用不同的处理模块.考虑到仿真的方便性,在软件中忽略了除直线和圆弧以外的辅助加工
10、信息,如开关冷却液等.按基于时间分割法的五轴数控插补方法,对提取到的原始数据进行处理并将其保存到 CArray 对象中,最后利用 OpenGL 提供的接口函数绘制加工图形和运动刀具.3 数据结构设计在五轴加工代码中有平动坐标和旋转坐标,而且任何类型的五轴机床加工时都会有,y,z 坐标.程序设计了 XYZPOSITION 类用于保存这些平动坐标.该类包含有 3 个公有型成员变量,Y,z.为便于数据的传递 ,保存和操作,编写了拷贝构造函数并重载了加,减运算符,类的定义为:classXYZPOSITIONpublic:XYZPOSITION();/默认构造函数virtual XYZPOSITION(
11、);/析构函数/用于保存平动坐标的成员变量double;doubleY;doublez;XYZPOSITION(doublexVal,doubleyVal,doublezVa1);XYZPOSITIONreonstXYZPOSIT【ONoldxyz);/拷贝构造函数/加,减运算符重载friendXYZPOSITIONoperator+(XYZPOSITIONpl,XYZPOSITIONp2);friendXYZPOSITIONoperator 一(XYZPOSITIONpl,XYZPOSITIONp2);在五轴加工中除了平动坐标外,还有旋转坐标,而且在处理圆弧数据时存在圆心坐标和因旋转运动产生
12、的附加位移等其他信息.针对不同的五轴数控机床类型定义了 3 个结构体 AB,AC 和BC.以 AB 型的五轴数控机床为例 ,定义为:structABintG;/加工类型doubleA,B;/旋转角度XYZPOSITIONxyz;/点的坐标XYZPOSITIONIJK;/圆心相对圆弧起点的坐标XYZPOSITIONdelta;/附加位移;这样就完成了用于不同五轴机床类型数据保存的基本数据类型设计.但是因为在程序运行之前并不清楚将会计算生成多少个插补数据点和中间数值,所以程序中需要动态分配内存以更好的利用内存空间.CArray 集合类可以实现动态分配内存空间.接下来定义一个 CArray 集合类变
13、量存储 AB,AC 或 BC 结构体.以 AB 类型的五轴机床为例,定义为:CArrayAB,ABm_myArrayAB;这样在计算生成完插补数据和其他的中间点数据后即可通过 CArray 的 Add 函数将数据保存至 inmyArrayAB,便于 OpenGL 绘图.4 软件实现4.1 利用 VisualC+6.0 建立 OpenGL 绘图框架OpenGL 提供了与 VisualC+的接口,在 VC中可以调用执行 OpenGL 的相关指令完成作图.OpenGL 绘图框架的基本建立步骤为 J:1)首先通过 VisualC+6.0 的创建向导创建基于 MFC 的单文档应用程序 ,程序名称为FAM
14、T,其他步骤按默认设置即可.2)在框架类中切分窗口为 2 行 1 列,分别用于显示图形和 NC 代码.在 CMainFrame 类中添加CSplitterWnd 型变量 IllwndSplitter.添加孙友生,等:基于 OpenGL 的五轴插补仿真软件设计 145OnCreateClient 虚函数,并在该函数中通过 ITIwndSplitter 调用 CreateStatic 和 CreateView 函数完成切分窗口的工作.3)创建一个继承自 CView 的类并命名为CMyOpenGLView.在该类头文件中包含 OpenGL 的头文件:g1.h,glu.h,glaux.h 并链接相应的
15、库文件 opengl32.1ib,glu32.1ib,glaux.1ib.考虑到 OpenGL 对 WMCREATE,WMERASEBKGND,WMSIZE,WMDESTROY 消息的处理方式与 MFC 的默认处理方式不同 ,而且程序的视图类将继承自 CMyOpenGLView 类,故可在该类中响应处理上述消息.此外,一旦设定了一个DC 的位图格式,该 DC 所联系的窗口的位图格式也随之设定.该窗口若含有子窗口或者有兄弟窗口,这些兄弟/子窗口的位图格式如果没有设成与对应 RC 一致的格式 ,OpenGL 在它们上面绘图就容易出错,因此必须更改窗口的默认类型.在 OnCreate 消息响应函数中
16、完成视图的初始化:设置视图背景颜色,清除颜色缓存和深度缓存,设置像素格式,设置 RC 等;在 OnEraseBkgnd 消息响应函数中直接返回true,避免视图中的内容被擦除;在 OnSize 消息响应函数中通过 glOrtho 函数设置改变窗口大小;在 OnDestroy 消息响应函数中完成窗口销毁的工作;重载 PreCreateWindow 函数 ,并将窗口类型设置成 WSCLIPCHILDRENIWSCLIPSIBLINGS.4)设置程序视图类的基类为CMyOpenGLView,这样 CMyOpenGLView 类的公有属性将被 CFAMTView 类所继承,这样就可以在程序的视图窗口中
17、利用 OpenGL 进行绘图.4.2 软件实现数据的处理放在文档类中,而数据的显示放在视图类中,便于数据封装.1)设置机床类型在 CFAMTDoc 类中添加 int 型成员变量 nlnType,用以保存机床类型.添加“设置“菜单,点击该菜单时弹出“机床类型设置 “对话框.在CFAMTDoc 类中响应“设置 “菜单的消息,保存机床类型到 I11 一 nType 变量中 .对 AB,AC,BC3 种类型,innType 的值分别为 l,2,3.2)打开读取 NC 代码在 CFAMTDoc 类中响应“打开“ 按钮的消息.校验代码的语法正确性.读取 NC 文件并在视图切分窗口的第 2 个窗口中显示文件
18、内容.根据 NC文件的行数动态分配内存空间.通过 innType 的值获取机床类型的相关信息,利用 CStdioFile 类提供的 ReadString 函数逐行读取文件,查询 NC 代码中关键字和数值,并保存数值.NC 代码的查询如下:CStringstr=一 T(“);CStringstrtemp=T(“);stdFile.ReadString(str);/stdFile 为CStdioFile 对象doStrtemp+=str.GetAt(i);i+:if(i=str.GetLength()break;while(str.GetAt(i)=0)(str.GetAt(i)=9)ll(str
19、.GetAt(i)=.)II(str.GetAt(i)=,_);/字符为 09,小数点 “.“和负号“ 一“.这样就把 NC 代码中关键字的数值保存成字符串至 strtemp 中,然后通过 atof 函数可将字符串变量转换成 double 型变量,从而获取 NC 代码中关键字的相应数值.若某行 NC 代码中未指定某个关键字的数值,则以上一行代码的相应关键字数值填充.3)处理生成插补数据数据的处理主要是根据五轴数控插补的时间分割法数学模型,计算每个插补步中的插补点的平动坐标和旋转坐标.由于旋转运动必将使刀具相对工件在空间上发生位置变化,产生附加位移,因此,必须在生成插补点数据的同时计算保存附加位
20、移,便于 OpenGL 作图.计算生成的数据最终保存在 InmyArrayAB,InmyArrayAC 或 In146 重庆工学院myArrayBC 中 .至此完成了作图所需的所有原始数据的计算保存.4)利用 OpenGL 仿真加工当利用 OpenGL 仿真加工时,首先添加响应WM_TIMER 消息以打开定时器,定时周期为 1ms.在其响应函数 OnTimer 中从 InmyArrayAB,nlmyArrayAC 或 inmyArrayBC 中不断读取相关数据,在视图框架中完成欲仿真加工的图形绘制.同时利用 glTranslatef 和 glRotatef 坐标变换函数,变换 OpenGL 的坐标系统到所需的位置和姿态上,调用刀具绘制函数在坐标系的原点绘制旋转刀具,并将原有的绘图轨迹擦除 L8J.这样总体看来是刀具沿着指定的轨迹不断做擦除动作,从运动轨迹