基于OpenGL的数控加工在线测量仿真技术研究

2012-07-07 03:37唐文杰吴志军冯平法
图学学报 2012年2期
关键词:面片调用视图

唐文杰, 吴志军, 冯平法, 鲍 晟

(清华大学精密仪器与机械学系,北京 100084)

在数控加工过程中,零件每一道工序后主要检测的手段有在线检测和离线检测,目前的在线检测手段主要依靠手工检测。手工检测面对精度要求较高以及大型结构件时很难满足需求,因此离线并采用三坐标测量机进行检测成为大多数数控加工企业的首选。但是,对于大型结构件来说,零件一道加工工序后进行检测到下一道加工工序的过程中,有大量工作需要完成,造成了极大的工时和设备的浪费,因此基于测头的在线检测技术应运而生。相对于离线测量,在线检测具有如下优点[1]:第一,避免二次装夹误差,提高加工精度;第二,节省工件重新装卡时间,缩短生产周期;第三,减少昂贵的离线测量设备(如三坐标测量机)费用,节省生产成本。因此,大型结构件的在线检测技术越来越为各种加工企业所重视。

为了使数控加工人员更加全面及时的了解在线测量的进程和检测结果,需要对被测零件、测量点及测量结果进行实时仿真。在线测量的仿真技术是在线测量技术的重要组成部分,可以保证测量过程的稳定性和可靠性。OpenGL是一种广泛采用的图形系统与硬件的接口,主要用来对二维和三维实体对象的绘制。它包括100多个基本的图形操作函数,封装了大部分涉及几何建模、消隐、光照计算等图形处理函数。OpenGL作为一个性能优越的图形应用程序设计界面而广泛适用于各种档次的计算机环境,OpenGL已成为目前事实上的三维图形开发标准广泛应用于科学计算可视化、实体造型、CAD/CAM、虚拟现实、图像处理等领域[2]。本文重点论述了使用OpenGL相关技术来实现在线测量的实时仿真技术。

1 系统设计方案

如图1所示,在线测量硬件系统由3大部分构成:测头系统、数控机床以及上位PC机。测量时,机床主轴带动测头触碰到工件后完成一个数据点的测量,然后通过测头上的无线发射模块将测量数据传输至与数控系统(NCS)相连接的无线接收天线上,并将数据锁存于数控系统的存储变量中,最后将数控系统中测量点坐标值通过网络发送至上位PC机完成一次测量过程。

针对以上测量过程,在线测量仿真的主要内容为:被测零件模型显示;测量点理论值和理论位置显示;测量值和测头当前位置显示。在线测量软件仿真系统实现架构如图2所示。首先,通过调用MFC和OpenGL的类库来描述点、矢量、矩阵以及建立OpenGL环境;然后,在上述基础上建立描述三维集合对象的类用于显示三维模型;最后建立模型实时更新机制,软件在接收到测头数据后实时显示测头位置。图2中,理论数据由质量控制人员在测量前通过XML指导文件提供,作为在线测量评价的基准;测量数据由数控系统发送至上位机的数据,图1所示,其包含有测量点的 X、Y、Z坐标值信息;零件的 STL模型文件由CAD软件生成,以三角面片的形式描述模型的轮廓。

图1 在线检测系统组成图

图2 在线测量仿真系统软件框架

2 仿真关键技术

2.1 建立OpenGL仿真环境

采用OpenGL技术对图像进行显示和操作的步骤如图3所示,具体步骤为[3]:

1)构造点、线、多边形、三维模型、图像等几何要素,并创建对象的数学描述;

2)确定模型的色彩,同时确定光照条件、纹理映射方式等参数;

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

4)光栅化,及把景物模型的数学描述及色彩信息转换成计算机屏幕上的像素。

图3 使用OpenGL进行图形操作基本步骤

根据此流程,建立如图4所示的OpenGL显示环境。其中:

(1)CView类为 MFC的视图基类,在MFC"文档/视图"架构中,CView类是所有视图类的基类,它提供了用户自定义视图类的公共接口。

(2)COpenGLView类继承于CView类,是管理OpenGL仿真环境的类,主要用于处理用户和视图之间的交互信息,在COpenGLView类中定义了COpenGLDC对象来实现对OpenGL渲染环境的设置。

(3)COpenGLDC类是OpenGL的绘图类,封装了MFC下设置OpenGL环境和调用OpenGL函数绘制图形的功能,在COpenGLDC类中定义了CCamera对象来实现对视点的操作。

(4)CCamera类是OpenGL的取景设置类,主要通过视点变换来实现三维模型的取景。

(5)COMVView类继承于类 COpenGLView,是应用程序的视图类,主要用于建立与视图操作相关的方法映射。

图4 建立OpenGL显示环境

2.2 STL模型文件浏览

在仿真系统中,被测零件的三维模型由CAD系统以STL(Sterolithography)文件格式提供。STL文件由3D Systems公司开发,它使用三角形面片来表示三维实体模型,现已成为CAD/CAM系统接口文件格式的工业标准之一。目前,几乎所有的三维几何造型系统如 Pro-E、UG、Solidworks等都提供输出STL文件的功能。

如下列STL文件所示,在一个STL文件中,每一个三角面片由7行数据组成,第1行是三角面片指向实体外部的法向矢量数据,第3、4、5行数据分别为三角面片的3个顶点信息,沿指向实体外部的法向矢量方向逆时针排列,如图5所示。

图5 STL模型三角面片示意图

为了建立STL模型文件浏览器,需首先建立基础数学模型类以及三角面片对象类,具体步骤如下:

1)分别建立基于点、矢量、矩阵的基础类CPoint3D、CVector3D、CMatrix3D 用于实现对点、矢量、矩阵数据结构的描述和基本函数的建立。而实时仿真的其他功能的实现均建立在此基于点、矢量、矩阵类的基础上。其中,描述点的数据结构定义为:

typedef struct tagPoint3D{

double x; //定义点的x坐标

double y; //定义点的y坐标

double z; //定义点的z坐标

}POINT3D, *PPOINT3D;

描述空间矢量的数据结构定义为:

typedef struct tagVector3D{

double x; //定义法矢的x分量

double y; //定义法矢的y分量

double z; //定义法矢的z分量

}VECTOR3D, *PVECTOR 3D;

描述三维齐次空间变换矩阵的数据结构定义为:

typedef struct tagMatrix3D{

double A[4][4]; //定义描述矩阵的数组

}MATRIX3D, *PMATRIX 3D;

2)建立三角面片对象类CTriChip用于描述一个三角面片对象。此类描述了三角面片3个顶点以及法向矢量的数据结构,以及调用三角面片绘制函数的接口。描述三角面片顶点及法向矢量的数据结构定义为:

typedef struct tagTriChip3D{

CPoint3D p; //定义描述三角面片3个顶点的坐标

CVector3D v; //定义描述三角面片法矢

}TRICHIP3D, *PTRICHIP 3D;

调用三角面片绘制函数的接口方法为:

void CTriChip::Draw(COpenGLDC* pDC)

{

pDC->DrawTriChip(v.dx,v.dy,v.dz,p[0].x,p[0].y,p[0].z,

p[1].x,p[1].y,p[1].z,p[2].x,p[2].y,p[2].z);

}

3)建立STL模型类CSTLModel用于读入STL格式文件,获取三角面片信息,通过建立三角面片对象链表来组成单一的STL几何模型,最后显示三角面片对象链表以实现模型的三维显示。定义TriList变量描述三角面片对象链表的方法为:

CTypedPtrArray TriList;

CTypedPtrArray为MFC中的一个模板类,可以用它来定义一个管理对象指针的数组,该模板类所定义的对象包含了所有三角面片的信息,可通过读取该对象来显示描述零件模型的所有三角面片。读取STL模型文件并显示三维模型的算法流程如图6所示。

图6 读取并显示STL模型流程图

2.3 测量过程实时显示

在上述的基于OpenGL的STL模型浏览器的基础上建立测头实时仿真模块,需建立一个用以描述测头的类CProbeModel,此类包括描述测头尺寸和位置的数据结构,以及负责操作测头位置和绘制测头的方法。CProbeModel类定义如下所示:

class CProbeModel{

void DrawProbe(); //绘制测头

void SetPosition(); //设定测头坐标

CProbeModel(); //构造函数

CPoint3D m_Position; //定义测头坐标

};

测头测量过程实时显示函数调用流程如图7所示。

图7 测头仿真函数调用流程图

1)在视图类COMVView的DataIn方法中将测头数据采集上来后,使用GetDocument得到文档类COMVDoc的指针,并调用其MoveProbe()方法;

2)在文档类 COMVDoc中建立 CProbe-Model类的对象 m_Probe。调用 m_Probe的SetPosition()方法改变测头坐标的结果。在文档类中建立的对象在程序运行期间持久存在,得到文档类指针后即可获取m_Probe对象及其参数;

3)运行 CProbeModel的 SetPosition()方法,将m_Position的数值更替为测头当前坐标;

4)程序重新进入到 COMVView 的 DataIn方法,调用Invalidate()方法以重绘窗口;

5)重绘窗口后会调用视图类中的 OnDraw()方法,如果应用程序视图类COMVView没有重写OnDraw()方法,则会调用其父类CGLView的OnDraw()方法。调用 RenderScene()方法绘制OpenGL场景;

6)在 COMVView 中重写了 RenderScene()方法,程序通过 GetDocument得到文档类COMVDoc的指针后,调用 m_Probe的 Draw()方法绘制测头;

7)CProbeModel的Draw()方法以上述第3步得到的测头坐标值为位置参数,通过调用绘制圆柱体和球体的函数 DrawCylinder()和DrawCylinder()完成测头的绘制。

2.4 显示理论点位置

在测量开始前,需读取包含被测点理论值的测量指导文件,用于和测量值比较评价测量结果。在读取测量指导文件后,在线测量仿真系统即以三维点的形式将被测点显示于零件模型周围。

为了便于存储和读取,测量指导文件使用XML语言进行描述,包含了被测零件所有测量点的理论坐标和测量的法矢。测量指导文件的格式如下所示,其中x、y、z用于描述被测点的理论坐标值,i、j、k用于描述被测点测量法矢的分量。

<检测点列表>

<检测点>

<检测点>

.........

显示理论点位置的函数调用流程与2.3所述的描述测量过程实时显示的函数调用流程相类似。其实现流程如图8所示。

图8 理论点位置显示实现流程图

3 仿真实例

图9所示为数控加工在线测量仿真系统软件界面,界面顶部为功能按钮,左侧为三维显示控制按钮,中部为图形显示区域,用于显示被测零件、测量点和测头位置,右侧为测量结果列表。

图9 软件测量实例界面

数控加工在线测量仿真系统的运行流程为:第一,打开STL零件模型文件,显示模型的三维图形,可通过点击左侧按键来控制视图缩放和视角切换;第二,打开测量指导文件,于视图中显示被测点的理论位置,如图中的蓝色点所示;第三,和数控系统进行通讯,每测量完成一个点,图中测头模型就会根据测量数据对测量过程进行仿真。

4 结束语

本文探讨了在 Visual C++6.0环境下使用OpenGL实现数控加工在线测量软件仿真的方案。重点分析了在线测量实时仿真过程中OpenGL环境的设定,STL模型文件的读取以及测头的实时显示。通过现场实际运行表明该仿真系统可以实时仿真数控加工在线检测过程,正确显示测量结果,该系统有在数控加工企业中尤其是在大型结构件数控加工中推广应用的价值。

[1]何超杰, 高 健, 陈 新. 基于接触式测头的在线检测关键技术的研究[J]. 机床与液压, 2008, 36(2):170-173.

[2]吴 斌, 毕丽蕴. OpenGL编程实例与技巧[M]. 北京:人民邮电出版社, 1999: 10-12.

[3]王清辉, 王 彪. Visual C ++ CAD应用程序开发技术[M].北京: 机械工业出版社, 2003: 25-28.

猜你喜欢
面片调用视图
三维模型有向三角面片链码压缩方法
核电项目物项调用管理的应用研究
初次来压期间不同顶板对工作面片帮影响研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
5.3 视图与投影
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
甜面片里的人生
青海尕面片