徐思遠,楊偉群
(北京航空航天大學(xué) 機械工程及自動化學(xué)院,北京 100191)
3D打印技術(shù)(3D Printing),也被稱為增材制造技術(shù)(Addtive Manfacturing,AM)。美國材料與試驗協(xié)會(ASTM)于2009年成立了3D打印技術(shù)委員會(F42委員會),該委員會隨后給出了3D打印技術(shù)的明確定義:3D打印技術(shù)是一種與傳統(tǒng)的材料加工方法截然相反,基于三維CAD模型數(shù)據(jù),通過增加材料逐層制造的方式。
由于STL模型文件是多數(shù)快速原型系統(tǒng)所應(yīng)用的標(biāo)準(zhǔn)文件類型,在不同平臺轉(zhuǎn)換時通用性更高,故對該類型文件的研究顯得尤為重要。STL文件格式簡單,具有高可重用性,高性能,高移植性,跨平臺的優(yōu)點。但同時也正因為格式簡單造成了存儲的信息不夠,其中的拓撲結(jié)構(gòu)信息、尺寸信息、特征信息都需要利用反向工程求解。本文基于STL模型文件,重建模型拓撲結(jié)構(gòu)、進行模型缺陷檢測、提取擬合模型特征并進行公差的計算,并提出一種可以應(yīng)用于3D打印技術(shù)的質(zhì)量表征技術(shù)。
STL(Stereolithography)是由3D Systems公司開發(fā)一種文件格式,最早出現(xiàn)在該公司開發(fā)的光固化成型技術(shù)的CAD軟件中。STL格式將零件的表面分解為無數(shù)的小三角面片,每個三角面片有三個頂點和一個法向量組成,法向量垂直于三角面片指向零件外側(cè)。如圖1所示,圖1(a)是三角面片的數(shù)據(jù)結(jié)構(gòu):法向量和頂點都是由笛卡爾坐標(biāo)系中x、y、z三個坐標(biāo)組成,在三角面片的內(nèi)部存儲中第一個是法向量,隨后是三個頂點,頂點的排列順序沒有規(guī)定。圖1(b)是三角面片的示意圖。
圖1 STL文件中的三角面片
由于三角化算法的局限性,導(dǎo)致STL數(shù)據(jù)模型有以下不足:用小三角形面片近似實體表面降低了精度;因STL模型中各三角形面片間沒有拓撲信息,三角形面片間的公用結(jié)點需要多次存儲;沒有表示STL數(shù)據(jù)模型三角形面片之間的鄰接關(guān)系;為提高精度多個三角形面片進行近似時,很可能出現(xiàn)某個頂點的分離。
為了在缺陷檢車和特征擬合階段可以高效的訪問到模型的面片拓撲信息,必須重新建立模型的拓撲結(jié)構(gòu),保存點、線、面的鄰接關(guān)系、所屬關(guān)系。圖2是點、線、面的數(shù)據(jù)結(jié)構(gòu)。
圖2 點、線、面的存儲數(shù)據(jù)結(jié)構(gòu)
從數(shù)據(jù)結(jié)構(gòu)中可以看出,在點、線、面的數(shù)據(jù)中各自存儲了所屬的上級特征和所包含的下級特征,建立了點-邊關(guān)系、點-面關(guān)系和邊-面關(guān)系,得到了模型數(shù)據(jù)的拓撲關(guān)系,為分析算法提供了數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)。
由于一個三角面片中含有三個頂點,每一個頂點又可以存在于不同的若干個三角面片中,因此有頂點的重復(fù)存儲,從STL文件中讀出的三角面片頂點數(shù)據(jù)是冗余的,這樣會浪費存儲空間,也有可能造成數(shù)據(jù)的不一致錯誤,因此在建立拓撲結(jié)構(gòu)的過程中,完成了冗余點的剔除,使得算法更加簡潔高效。
為了保證擬合程序的順利進行,必須確保STL模型的正確性。所以對模型的缺陷檢查尤為重要,本章闡述了STL模型文件的常見缺陷及檢測算法。
STL模型是通過對三維實體模型進行表面三角面片離散得到的,只能在一定精度上實現(xiàn)與理論模型的配準(zhǔn)。在CAD造型中,文件常常需要在多個CAD軟件之間進行轉(zhuǎn)換。由于軟件之間實現(xiàn)方式的差異以及二進制文件中由于數(shù)據(jù)精度造成的四舍五入偏差,STL文件往往會出現(xiàn)各種各樣的缺陷及異常。這會在文件處理和打印處理時造成異常,甚至直接反映在打印成品上,造成質(zhì)量缺陷。
STL模型需要遵循以下規(guī)范:1)共定點規(guī)則,三角面片需要與鄰近面片有重合的兩個頂點;2)取向規(guī)則,面片的法向量必須遵循右手定則,并且不可以指向?qū)嶓w內(nèi)部;3)充滿規(guī)則,三角面片必須連續(xù)充滿實體表面。
在此規(guī)范基礎(chǔ)上,STL模型常見的缺陷有空洞、法向量反向、縫隙與重疊、錯位、多余、不共頂點等。圖3為常見缺陷示意圖。
圖3 常見缺陷示意圖
1)法向量反向:由于三角面片中頂點記錄順序混亂,有可能造成法向量的錯誤,以至于實際的法向量與已經(jīng)記錄的三角面片的法向量不一致的情況出現(xiàn),因此有必要設(shè)計算法檢測法向量反向的錯誤。
由于法向量嚴(yán)格遵守右手定則,故可以根據(jù)三頂點確定的符合右手定則的向量與文件中的法向量比較,方向一致則為正確的法向量。首先由三個頂點得到兩個向量,計算兩個向量的叉積可得到復(fù)合右手定則的法向量。將得到的法向量與原法向量進行點積計算,若結(jié)果大于零則可確定該處法向量沒有發(fā)生反向錯誤。依次計算每個三角面片的法向量。
2)懸邊和懸面檢測:懸邊是由于數(shù)據(jù)誤差或面片丟失導(dǎo)致所屬面只有一個的邊。懸面是由于三角面片丟失造成連接面少于三個的面片。由于拓撲關(guān)系的建立,這兩個缺陷的檢測相對容易。只需要將邊結(jié)構(gòu)中的e_faceId.size()和面結(jié)構(gòu)中的neighborFaceId.size()取出來判斷即可。
3)面間裂縫和空洞檢測:這類缺陷是由于計算誤差或面片丟失造成的。對于裂縫和空洞,首先他們的邊都是懸邊。根據(jù)前文可以從懸邊缺陷中得到,其中,空洞是首尾相連構(gòu)成的一個環(huán)。用模型中所有的懸邊構(gòu)造一個無向圖,通過無向圖的廣度優(yōu)先遍歷,可以得到頂點序列,然后再找出屬于空洞的邊,懸邊數(shù)組中去除空洞邊就是裂縫邊了。
提取屬于某個特征的數(shù)據(jù)點的總體思路是:先獲得一個屬于該幾何特征的三角面片,然后遍歷這個三角面片的相鄰三角面片,從中找到同樣屬于該幾何特征的三角面片,依次遞歸尋找該三角面片的相鄰三角面片中屬于當(dāng)前幾何特征的三角面片,直到找到所有的三角面片。然后從找到的所有三角面片提取出不重復(fù)的所有數(shù)據(jù)點。即是所有屬于當(dāng)前幾何特征的數(shù)據(jù)點。
1)棱邊要素數(shù)據(jù)點的提取。如圖4是STL模型中兩個平面相交形成的棱邊,圖4(a)是STL模型渲染圖,圖4(b)是STL模型示意圖,圖4(c)是理想平面要素。本文以圖4(b)中所示的一組相鄰的三角面片作為棱邊要素,棱邊要素的數(shù)據(jù)點是這些三角面片所包含的不重復(fù)的點。圖4(c)中要提取的數(shù)據(jù)點屬于平面F1、F2相交形成棱邊,、分別是這兩個平面的法向量,朝向幾何體外側(cè)。要提取的三角面片需要滿足以下兩個條件:
(2)三角面片在棱邊法向量上的投影在棱邊的起點終點之間。
圖4 STL模型中的棱邊
2)平面要素數(shù)據(jù)點的提取。按照前面介紹的思路,第一步先從紅黑樹中提取一個屬于平面要素的數(shù)據(jù)點。找第一個數(shù)據(jù)點的方法是先在理論模型中取理想平面上一點,再在STL模型中找與之距離最近的三角面片。之所以找最近的三角面片,不直接找最近的點是因為在STL模型中三角片的數(shù)量遠遠少于頂點的數(shù)量。在理想模型中取點時一般取平面中心的點,這樣可以保證在STL模型中與之最近的點同樣屬于該平面。下一步是從面紅黑樹中讀取三角面片的相鄰三角面片,并判斷相鄰三角面片是否屬于該平面。相鄰三角面片滿足以下條件的可以認(rèn)為屬于該平面:
(1)把理想平面邊界和三角面片投影到坐標(biāo)面內(nèi),該三角面片在該平面內(nèi)的投影在平面邊界投影的范圍內(nèi);
(2)該三角面的法向量與理想平面的法向量成小角度。
如圖4所示,t1和t2是兩個三角面片,t1'和t2'分別是它們在坐標(biāo)平面的投影,一個在平面邊界投影范圍內(nèi),另一個在平面邊界投影的范圍外,應(yīng)用條件一可知t1屬于該理想平面,t2不屬于該理想平面。在選擇投影坐標(biāo)平面時,遵循使平面投影的面積最大原則。平面法向量那個方向的分量絕對值最大,說明垂直該分量的坐標(biāo)面即為所選坐標(biāo)面。
圖5 平面在坐標(biāo)面內(nèi)的投影
3)圓柱面要素數(shù)據(jù)點的提取。提取圓柱面要素的數(shù)據(jù)點同樣是先提取屬于當(dāng)前圓面要素的三角面片,然后從中找出所有不重復(fù)的點。凡是屬于圓柱面的三角面片需要滿足以下三個條件:
(1)三角面片到理想圓柱面軸線的距離近似為理想圓柱面的半徑;
(2)三角面片的法向量與理想圓柱軸線夾角近似等于90°;
(3)三角面片應(yīng)當(dāng)位于理想圓柱面上下底面之間。
擬合幾何特征的過程可以看做是求解方程組的過程:加入某個幾何特征上的點都滿足f(p,x)=0,其中x是未知變量,x=(x1,x2,…,xn)T∈Rn,p是測量點,p=(px,py,pz)T∈R3。代入m個測量點后得到一系列方程組:
在用最小二乘法擬合特征時,該方程組是非線性方程組,解非線性方程組的方法有牛頓法[44]、高斯牛頓法、Levenberg-Marquardt(L-M)法,其中應(yīng)用最廣的還是L-M法。L-M法,中文名稱列文伯格-馬夸爾特法,是對高斯牛頓法的一種修正,加快了收斂速度[45]。使用LM法進行最小二乘尋優(yōu),關(guān)鍵是適當(dāng)目標(biāo)函數(shù)和合適的初始值。
1)空間直線的擬合??臻g直線的點向式方程如下,其中點P0(x0,y0,z0)是直線上任意一點,向量(m,n,p)是直線的單位法向量:
那么點(x,y,z)到該直線的距離為:
給定一組N個數(shù)據(jù)點{(xi,yi,zi),i=1,2,…,N},優(yōu)化目標(biāo)函數(shù)為:
變量共有5個:x0、y0、z0、m、n,式中p用代替。擬合結(jié)果獲得直線上一點的坐標(biāo)和直線單位法向量。
2)平面擬合。用平面上一點P0(x0,y0,z0)和平面的單位法向量(m,n,p)來表示任意平面,若P(x,y,z)是平面上任意點,那么垂直:
那么點P(x,y,z)到該平面的距離為:
給定一組N個數(shù)據(jù)點{(xi,yi,zi),i=1,2,…,N},優(yōu)化目標(biāo)函數(shù)為:
變量共有5個:x0、y0、z0、m、n。擬合結(jié)果獲得平面上一點的坐標(biāo)和平面的單位法向量。
給定一組N個數(shù)據(jù)點{(xi,yi,zi),i=1,2,…,N},優(yōu)化目標(biāo)函數(shù)為:
變量共有6個:x0、y0、z0、m、n、R,式中p用代替。擬合結(jié)果獲得圓柱中心軸線上一點的坐標(biāo)和軸線的單位法向量。
在計算多幾何要素公差的某些公差項目,比如線性尺寸公差的定義是兩個提取平面的局部尺寸,在計算局部尺寸時需用到擬合導(dǎo)出中心平面,而擬合導(dǎo)出中心平面按照定義是兩個平行的擬合組成平面的中心平面,雖然這兩個平面的理想平面是平行的,但實際上兩個組成平面的擬合平面不一定平行,我們還是用平面上一點和平面的單位法向量來描述一個平面,那么在兩個擬合提取平面上各取一點,它們的中點在擬合導(dǎo)出中心平面上,法向量為兩個擬合提取平面法向量的角平分線方向的向量。圖6是計算擬合導(dǎo)出平面的過程。平面F1、F2是兩個提取組成平面,F(xiàn)3是要求的擬合導(dǎo)出中心面。點p1、p1分別是擬合組成平面F1、F2上一點,向量、分別是F1、F2的法向量。點p3是點p1、p1中點,向量是、的角平分線。擬合導(dǎo)出中心面F3由點p3、單位向量來描述。
圖6 擬合導(dǎo)出平面
在計算含有基準(zhǔn)的公差項目時,基準(zhǔn)的位置應(yīng)當(dāng)是幾何要素的理想位置,但是由測量得到數(shù)據(jù)點無法知道理想位置,因此用擬合得到的幾何要素作為理想幾何要素。
在計算公差時需要大量計算空間直線與三角面片集合(或者點云)的交點,比如求點到提取平面的距離,求兩平面間距離時的局部尺寸等等。計算直線與三角面片集合(點云)的方法有很多種,本文采取的方法如圖7所示,已知擬合平面F,空間直線L,交點為P,在平面的點云數(shù)據(jù)中搜索找到離點P最近的三個點p1、p2、p3,這三個點可以組成一個三角面片,三角面片的中點是p',p'即是直線L與平面的實際交點。
圖7 直線與平面交點
求點p的過程如下,已知平面F上一個點P1(P1x,P1y,P1z),法向量為(n1x,n1y,n1z),直線上一點P2(P2x,P2y,P2z),法向量(n2x,n2y,n2z)。直線的參數(shù)方程為:
平面的點法式方程為:
解上面三個方程得到:
把t代入直線方程得到交點坐標(biāo)。
STL數(shù)據(jù)模型可視化的實現(xiàn)是在線服務(wù)以及加工中的一個重要環(huán)節(jié)。模型可視化功能的實現(xiàn)有助于對STL文件進行診斷,良好的模型顯示效果對客戶的直觀感受及正確的選擇實體的切片方向有積極的效果。本次設(shè)計充分利用Three.js卓越的渲染能力和交互使場景處理能力,在WEB前端實現(xiàn)STL數(shù)據(jù)模型的可視化。如圖8是加載完成的STL模型。
圖8 加載完成的STL模型文件
Three.js為用于3D場景渲染的Java Script開源庫,并且由于其具有極強兼容性,支持加載多種式的文件,所以以Three.js引擎作為工具對STL模型進行加載和渲染。Three.js庫中包含許多個工具文件,每一個文件中都封裝著完成特定功能的方法。Three.js文件是Three.js引擎中使用頻率最高的工具文件,其中封裝了調(diào)整場景、攝像機和材質(zhì)的相關(guān)方法,可以方便快捷地對渲染場景進行初始化。Three.js引擎發(fā)展至今已經(jīng)有了多種加載器,可以支持JSON、OBJ、STL、CTM等多種格式。
圖9 引入JavaScript文件
使用Three.js引擎對STL模型進行讀取之前,首先要引入必要的JavaScript文件,如圖9所示,STLLoader.js是STL文件對應(yīng)的加載器文件,文件中封裝了讀取STL二進制文件和STL文本文件數(shù)據(jù)并初始化網(wǎng)格體的方法;TrackballControls.js是控制模型視角變換的函數(shù)庫文件;AsciiEffect.js是添加ASCII動畫效果的js文件。
如圖10所示,依次通過初始化渲染場景(設(shè)置相機位置、光源位置及屬性等)、加載STL文件、渲染計算等步驟實現(xiàn)STL模型的可視化。其中scene是一個場景容器,用來跟蹤并保存所有需要渲染的物體。
圖10 初始化流程
本例所用的機器采用先臨三維科技公司自主研發(fā)的Shining3D-Scanner系列三維掃描儀。使用激光掃描儀掃描打印好的組件得到STL模型,本例中命名為model.stl。使用STL模型解析算法和錯誤檢測算法對模型進行分析,得到的模型信息結(jié)果和錯誤信息結(jié)果如圖11所示。其中的反向面片、殼體和島孔錯誤使用Magics軟件處理,由于微小面片對本例分析不會造成影響,故不考慮該問題。
圖11 模型信息和錯誤信息
本例選取了尺寸公差、平行度公差、平面度公差作為特征擬合的檢測項目。如圖12所示為幾何精度參數(shù)檢測界面和檢測結(jié)果。使用PMI標(biāo)注功能,將檢測結(jié)果直接標(biāo)注在三維零件上。其中綠色標(biāo)注代表符合公差要求,紅色標(biāo)注代表超出公差要求范圍。
圖12 幾何精度參數(shù)檢測結(jié)果
近年來3D打印技術(shù)受到了廣泛的關(guān)注,但是在3D打印技術(shù)缺乏有效的數(shù)字化質(zhì)量表征技術(shù),嚴(yán)重阻礙了3D打印技術(shù)的推廣應(yīng)用。本文針對該問題系統(tǒng)研究了基于STL模型的數(shù)字化模型數(shù)據(jù)分析、質(zhì)量表征參數(shù),從幾何精度、表面質(zhì)量和其他質(zhì)量參數(shù)三個方面進行了深入研究,為產(chǎn)品質(zhì)量數(shù)字化檢測提供了新的思路。