馮清秀 阿占文
(華中科技大學(xué)機(jī)械科學(xué)與工程學(xué)院,湖北 武漢 430074)
快速成型技術(shù)是目前制造領(lǐng)域的熱點(diǎn)問題,該技術(shù)的特點(diǎn)是對計算機(jī)軟件有高度依賴性。目前國內(nèi)有部分快速成型設(shè)備生產(chǎn)企業(yè)擁有自主研發(fā)的軟件,但大部分仍依賴國外軟件,快速成型軟件設(shè)計成為限制其發(fā)展的重要因素,在國內(nèi)已有的快速成型產(chǎn)品成本中,軟件部分占了很大比例。在該項技術(shù)快速發(fā)展的將來,為了提高產(chǎn)品競爭力,降低成本,自主設(shè)計研發(fā)成型軟件是一個趨勢,而如何提高穩(wěn)定性以及算法效率、軟件優(yōu)化是最關(guān)鍵的問題[1-2]。
1.1.1 人機(jī)界面設(shè)計
對快速成型設(shè)備來說,人機(jī)交互界面是人與設(shè)備之間的橋梁,一個穩(wěn)定、友好、高效的人機(jī)交互界面可以極大地增強(qiáng)產(chǎn)品的用戶體驗。本文設(shè)計的軟件人機(jī)主界面由6 個區(qū)域組成,分別是:標(biāo)題欄、文字菜單、快捷菜單、主視圖區(qū)、整體信息顯示區(qū)、概要信息顯示區(qū)。如圖1、圖2 所示。標(biāo)題欄可以顯示所打開文件的路徑和文件名,快捷菜單可供用戶快速找到常用操作按鈕,主視圖區(qū)是基于OpenGL 的模型顯示窗口,可以進(jìn)行縮放、平移、旋轉(zhuǎn)操作,還可以根據(jù)用戶選擇進(jìn)行主視圖、俯視圖、右視圖等的視圖切換,或者根據(jù)用戶選擇進(jìn)行STL、輪廓、填充路徑等模型切換。
此外還有一個用于分層顯示的子界面,在這個子界面中可以查看整個模型的某一層的具體信息,如:輪廓形狀、填充路徑、面積、填充間距、偏置次數(shù)等,還可以進(jìn)行加工仿真和動畫播放,直觀地觀察各層加工路徑和動畫仿真,檢查分層及路徑生成中的錯誤。
1.1.2 軟件功能設(shè)計
本文所設(shè)計的軟件可以運(yùn)行在主流的Windows、Linux 和Mac 三個系統(tǒng)平臺,可以實現(xiàn)以下功能:
(1)STL 模型的縮放、平移、旋轉(zhuǎn)顯示;
(2)按用戶指定厚度、范圍和方向進(jìn)行分層;
(3)按用戶指定填充間距和輪廓偏置次數(shù),進(jìn)行分區(qū)復(fù)合填充。判別內(nèi)外環(huán),輪廓分組以及路徑優(yōu)化;
(4)輸入/出CLI 文件和支撐添加;
(5)加工路徑仿真和分層顯示。
各個功能如圖3 所示。
快速成型軟件需要管理的數(shù)據(jù)有模型的三角面片頂點(diǎn)、輪廓交點(diǎn)、填充線段等,數(shù)據(jù)量非常大(一般零件都具有上千個三角面片)。一個合理的數(shù)據(jù)結(jié)構(gòu)不僅可以提高算法效率,還會使程序清晰明了,提高可讀性,降低軟件開發(fā)難度。本文運(yùn)用面向?qū)ο蟮木幊谭绞剑O(shè)計了7 個類來管理這些數(shù)據(jù),分別是頂點(diǎn)類(QVertex)、三角形類(QTriangle)、模型類(QBody)、層類(QLayer)、輪廓類(QContour)、掃描線類(QScan-Path)和填充線類(QFillPath)。數(shù)據(jù)結(jié)構(gòu)如圖4 所示。圖4 中箭頭方向表示了類之間的包含關(guān)系,如三角面片類包含了頂點(diǎn)類,模型類包含了層類和三角面片類,層類包含了輪廓類,輪廓類包含了掃描線類,掃描線包含了填充線類,這也完全符合人的思維:將一個模型劃分為幾個具體模塊,這是數(shù)據(jù)結(jié)構(gòu)的定義依據(jù)。
因為在讀取模型文件之前不知道有多少個三角面片,同樣在分層之前也無法得知會分為多少層,而在確定對象的值之前需要提前分配內(nèi)存,如果用數(shù)組則需要二次或者多次分配。為解決此問題,運(yùn)用了C++語言中的Vector 類模板,它可以動態(tài)分配內(nèi)存,存取極其方便。本軟件中頂點(diǎn)對象(vector)、三角面片對象(triangle)、層對象(layer)、輪廓對象(contour)、掃描線對象(scanpath)、填充線對象(fillpath)都定義為Vector 類型。在面向?qū)ο缶幊讨?,類的屬?變量)代表了這個類所包含的變量,是各個類之間溝通的橋梁,也稱類的接口。類的方法(函數(shù))代表了這個類能進(jìn)行的操作,即類的功能函數(shù)。方法和屬性構(gòu)成了一個類[3],本軟件中幾個核心類的方法和屬性如圖5 所示。
STL 文件中每個頂點(diǎn)坐標(biāo)之前都有一個vertex 關(guān)鍵詞,根據(jù)該特點(diǎn)可以逐行檢測STL 數(shù)據(jù),取vertex 關(guān)鍵詞之后的3 個數(shù)為一個頂點(diǎn),構(gòu)成QVertex 對象,每3 個QVertex 對象構(gòu)成一個QTriangle 對象,直至文件結(jié)束。此時QTriangle 對象存在了QVertex 對象中,而QVertex 對象又存在了QBody 對象中,層層關(guān)聯(lián),在模型顯示時則做相反的操作,以body->triangle_all[triangle_count]->vertex[vertex_count]的方法取得所有頂點(diǎn)坐標(biāo)。顯示部分是利用Qt 支持的OpenGL 圖形庫設(shè)計的,投影模式設(shè)置為正射投影,原點(diǎn)在屏幕中央。
分層過程是將一個三維模型轉(zhuǎn)化為二維平面圖形的過程,關(guān)鍵在于求出每個分層面與三角面片的交點(diǎn),從而由這些交點(diǎn)組成輪廓。如圖6 所示,以z 向分層為例,按用戶設(shè)定的厚度,從起點(diǎn)到終點(diǎn)確定出每個分層面的z 值,只有三角形三個頂點(diǎn)的z 值的最大、最小值滿足條件:Zmin<z <Zmax時,才會有交點(diǎn),利用這個特點(diǎn),首先找出所有本層符合該條件的三角面片再求交點(diǎn)可以提高效率,利用式(1)求出交點(diǎn)的坐標(biāo)值[1]。
式中xp,yp,zp(zp=zvalue)為所求交點(diǎn)坐標(biāo),z1即上文提到的Zmin,z2為Zmax,x、y 與z 類似。為保證所求交點(diǎn)都是按相鄰順序存儲在輪廓對象中,每求一個交點(diǎn)就要尋找與之相鄰三角面片。根據(jù)STL 數(shù)據(jù)中的共頂點(diǎn)規(guī)則[4],查找具有相同頂點(diǎn)的面片,并根據(jù)找到的面片的3 個頂點(diǎn)的z 值替換Zmin和Zmax,代入式(1),直至所有符合條件的面片都遍歷一遍。有些模型不止一個輪廓,此時求出一個完整輪廓后發(fā)現(xiàn)還有面片沒有求交,需要繼續(xù)以上過程。分層過程總結(jié)如下:
(1)按指定厚度和范圍確定每層的zvalue;
(2)建立一個新輪廓,取一個面片,找出各個坐標(biāo)最值,利用式(1)求出一個交點(diǎn);
(3)找相鄰面片,重新找到各個坐標(biāo)最值,利用式(1)求出一個交點(diǎn),直至相鄰面片遍歷完畢;
(4)若符合條件的面片遍歷完畢,但還有其它面片未求交,轉(zhuǎn)(2);
(5)若所有面片遍歷完畢,結(jié)束分層。
輪廓填充是快速成型的核心算法之一,其方法有:平行填充、環(huán)形填充、光柵填充等。輪廓的分區(qū)復(fù)合填充是一種結(jié)合了前兩者的方法,有效地減小了應(yīng)力造成的零件變形,同時因為避免了環(huán)形填充帶來的輪廓偏置產(chǎn)生的自相交等問題所以算法簡單,易于實現(xiàn)。具體思路是:將所有輪廓劃分成許多個單連通區(qū)域,在此區(qū)域內(nèi)將所有內(nèi)外輪廓偏置4~6 次,然后再進(jìn)行平行填充,為避免頻繁跨越內(nèi)腔,再將填充線分區(qū),如圖7 所示。其中粗實線表示內(nèi)外輪廓,細(xì)實線表示填充線,內(nèi)外輪廓均偏置3 次(第三次偏置只做求交運(yùn)算以確定平行填充線端點(diǎn)),然后分成上、中左、中右、下4 個區(qū)填充。這就涉及到了內(nèi)外環(huán)的判別及分組算法、輪廓偏置算法以及最后分區(qū)之后的路徑優(yōu)化算法。下面是這幾個算法的說明。
2.2.1 輪廓分組
在許多個輪廓中劃分出單連通區(qū)域是分區(qū)復(fù)合填充的基礎(chǔ),算法步驟如下:
(1)計算每個輪廓被其他輪廓包含的次數(shù);
(2)根據(jù)被包含奇數(shù)次為內(nèi)輪廓,偶數(shù)次為外輪廓的原理,判別每個輪廓是內(nèi)輪廓還是外輪廓;
(3)一個輪廓組只有一個外環(huán),所以對于一個外輪廓,如果其被包含次數(shù)為N 次,而一個內(nèi)輪廓的被包含次數(shù)為N-1 次,那么這兩個輪廓為一組;
(4)按步(3)繼續(xù)找出本外環(huán)下所有內(nèi)輪廓,成為一個完整的輪廓組。
文獻(xiàn)[5]給出了上述算法,但沒有給出該算法的基礎(chǔ):輪廓包含關(guān)系判斷方法。因為輪廓與輪廓之間不會有交點(diǎn),所以取輪廓上一點(diǎn)判斷是否在另一個外輪廓內(nèi)即可判定輪廓包含關(guān)系。利用射線法可以判斷一點(diǎn)是否在多邊形內(nèi),即做射線與多邊形輪廓求交,統(tǒng)計交點(diǎn)個數(shù),如果是偶數(shù)則在多邊形外,奇數(shù)則在多邊形內(nèi)。關(guān)于頂點(diǎn)法的實現(xiàn)代碼很多,效率也有很大差異。本文中用的代碼如下:
2.2.2 輪廓偏置及填充線分區(qū)
輪廓偏置算法是數(shù)控加工領(lǐng)域常用的而又復(fù)雜的基本算法,因為涉及到復(fù)雜凹多邊形以及輪廓偏置以后的自相交去除問題,很多文獻(xiàn)提出的算法不適用于一般情況。本文首先用求取偏置法向量的方法得到偏置輪廓,其次根據(jù)文獻(xiàn)[6]提出的算法去除自相交環(huán)。如圖8 所示,先約定在y 軸向上的坐標(biāo)系中,多邊形輪廓如果是外環(huán)就按逆時針存儲,內(nèi)環(huán)相反。是原輪廓內(nèi)環(huán),是偏置以后的輪廓,向量en是偏置法向量,其正方向按右手定則約定:按逆時針旋轉(zhuǎn)90°與en重合,那么en即為正向。依此法向量的正向,沿輪廓邊向量方向行走時,輪廓區(qū)域總是在法向量的正向,可知其滿足不等式(2)。設(shè)直線方程由式(3)給出,則en的方程由(4)給出,并且有式(5)成立。
以P1(x1,y1),P2(x2,y2)代入式(3),結(jié)合式(2)、(4)可以求出a 和b。此時的直線方程由式(6)給出,其中,dist 為偏置距離。同理可求出'的方程,如式(7)。直線'的交點(diǎn)即為P2 的偏置點(diǎn)P2',其坐標(biāo)由式(8)給出,其中l(wèi)1=
對每一個輪廓邊由式(8)求出所有偏置線段,只要外環(huán)是按逆時針存儲,那么必然向內(nèi)偏置,內(nèi)環(huán)如果是按順時針存儲,必然是向外偏置。但在偏置后不可避免地產(chǎn)生自相交輪廓,此時必須去除無效環(huán)。文獻(xiàn)[6]給出了一種有效的方法。
得到偏置輪廓后,按填充間距求出均勻分布在外輪廓內(nèi)的掃描線,然后對所有掃描線段進(jìn)行分組,如圖7 中分為4 組填充,軟件中不同的區(qū)域填充線顯示不同的顏色,以便區(qū)分。文獻(xiàn)[7]提出了基于交點(diǎn)掃描線與輪廓交點(diǎn)數(shù)目的分組方法,總結(jié)如下:
(1)求所有掃描線與輪廓交點(diǎn);
(2)由上往下(或由下往上)依次檢測每個掃描線的交點(diǎn)數(shù)目,假設(shè)第N 條掃描線有m 個交點(diǎn),第N +1條掃描線也有m 個交點(diǎn),那么屬于同組,第N+2 條掃描線有n(n≠m)個交點(diǎn),那么重新建立一個組,依次類推。如圖7 中由上到下分3 組;
(3)對一組有m(m >4)個交點(diǎn)的掃描線,第1、2個交點(diǎn)為一組填充線,第3、4 個為另外一組填充線,直至第m-1 和m 個最后一組填充線。
2.2.3 基于距離判定法的路徑優(yōu)化
填充線分組后要進(jìn)行路徑優(yōu)化,在上文圖7 中,平行填充時分了4 個區(qū),實際加工時必須先確定這4 個區(qū)的填充順序,稱為路徑優(yōu)化問題。文獻(xiàn)[8]提出了一種基于距離判定的路徑優(yōu)化方法,思路如下:
(1)確定每個填充區(qū)域的首末填充線段的4 個端點(diǎn),如圖7 中標(biāo)號A 到P 共16 個點(diǎn)放入集合NotUsed;
(2)開始填充時先取一個端點(diǎn),將其放入集合Used,同時從NotUsed 刪除;
(3)填充到一組填充線最后一點(diǎn),取當(dāng)前所在點(diǎn)(必在NotUsed 中),求其與NotUsed 集合中剩余所有點(diǎn)的距離,最短者為下一填充區(qū)起點(diǎn);
(4)每走過一個端點(diǎn)就將其放入集合Used,同時從NotUsed 刪除;
(5)若NotUsed 集合變成空集時表明所有區(qū)域填充完畢,否則轉(zhuǎn)(3)。
實際在軟件中實現(xiàn)時還要解決每個填充區(qū)域4 個端點(diǎn)如何連接的問題,如在圖7 中,先按A-B -C -D的順序填充了最上面一個區(qū)的4 個點(diǎn),那么下一個要填充的區(qū)的最近點(diǎn)為J,此時要按J -I -K -L 的順序填充。為解決此問題,給每個區(qū)域的4 個端點(diǎn)從左到右,從上到下建立如圖9 所示4 個對象。在最極端的情況下,如果某個組只有一條填充線,也就是說只有兩個端點(diǎn)無法建立4 個對象。為解決此種情形,預(yù)先假設(shè)有4 個端點(diǎn),但其isused 屬性預(yù)置為真(true),然后分別求端點(diǎn),再將isused 屬性置為假(false),這樣使得只有兩個端點(diǎn)的填充組雖然有4 個對象,但不參與填充??偨Y(jié)起來可分為4 種情況:
(1)若以FirstPoint 為起點(diǎn),則往下填充,奇數(shù)行時調(diào)換首末兩個端點(diǎn)。
(2)若以SecondPoint 為起點(diǎn),則往下填充,偶數(shù)行時調(diào)換首末兩個端點(diǎn)。
(3)若以ThirdPoint 為起點(diǎn),則往上填充,奇數(shù)行時調(diào)換首末兩個端點(diǎn)。
(4)若以FourthPoint 為起點(diǎn),則往上填充,偶數(shù)行時調(diào)換首末兩個端點(diǎn)。
本文所設(shè)計的軟件讀取一個具有1620 個面片的齒輪泵箱體零件的模型,其尺寸為長× 寬× 高:100 mm×110 mm×90 mm,按0.8 mm 的厚度分為113 層,在2G CPU 和2G 內(nèi)存條件的計算機(jī)上用時6 s。填充時輪廓偏置3 次,間距為0.3 mm,并進(jìn)行路徑優(yōu)化,在同一計算機(jī)上用時4 s。執(zhí)行效率比較高,可以滿足快速成型的要求。再分層查看界面,可進(jìn)行仿真,實際觀察加工軌跡,如圖10 所示,本層面積為3096.4 mm2,共分24 組填充,路徑規(guī)劃完全符合距離最短原則。
添加支撐體也是快速成型的關(guān)鍵問題。本文取“BOX”型支撐方式,此種支撐算法簡單但是材料利用率低下。文獻(xiàn)[10 -11]提出了一種基于特征的向下添加支撐的方法,但實現(xiàn)起來比較復(fù)雜,文獻(xiàn)[12 -13]提出了自動生成支撐的思想。如果按零件的形狀,采用不同的填充方式,而非固定的一種,會極大地提高成型質(zhì)量。采用環(huán)形填充葉,為了避免算法過于復(fù)雜,可借助已經(jīng)成熟的第三方的算法庫來實現(xiàn),也不失為一種有效的解決途徑。
[1]劉偉軍.快速成型技術(shù)及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2005:39 -43.
[2]朱林泉,白培康,朱江淼.快速成型與快速制造技術(shù)[M].北京:國防工業(yè)出版社,2003:59 -66.
[3]錢能.C++程序設(shè)計教程[M].北京:清華大學(xué)出版社,2004:232-257.
[4]趙吉賓,劉偉軍,王越超,等?;赟TL 文件的實體分割算法研究[J].機(jī)械科學(xué)與技術(shù),2005,24(2):131 -134.
[5]蔡道生,史玉升,黃樹槐,等.快速成形技術(shù)中輪廓環(huán)的分組算法及其應(yīng)用[J].華中科技大學(xué)學(xué)報:自然科學(xué)版,2004,32(1):7 -9.
[6]Xiaorui Chen,Sara McMains.Polygon Offsetting by Computing Winding Numbers[C].//2005 ASME International Design Engineering Technical Conferences &Computers and Information in Engineering Conference (IDETC/CIE2005),vol.1.2005:6009 -6019
[7]史玉升,鐘慶,陳學(xué)彬,等.選擇性激光燒結(jié)新型掃描方式的研究及實現(xiàn)[J].機(jī)械工程學(xué)報,2002,38(2):35 -39.
[8]李偉.熔絲沉積成形填充路徑優(yōu)化及其軟件研究[D].武漢:華中科技大學(xué),2005.
[9]程艷階.選擇性激光燒結(jié)激光掃描路徑的研究與開發(fā)[D].武漢:華中科技大學(xué),2004.
[10]洪軍,李滌塵,唐一平,等.快速成型中的支撐結(jié)構(gòu)設(shè)計策略研究[J]。西安交通大學(xué)學(xué)報,2000,34(9):58 -61,76.
[11]董未名,嚴(yán)冬明,周登文,等.基于CAD 模型的直接快速成型軟件[J].計算機(jī)輔助設(shè)計與圖形學(xué)學(xué)報,2004,16(3):360 -367.
[12]史曉楠.CLI 文件正確性檢驗與支撐設(shè)計系統(tǒng)研究[D].西安:西安科技大學(xué),2006.
[13]紀(jì)良波,周天瑞,溍海鵬,等.熔融沉積快速成型軟件系統(tǒng)的開發(fā)[J].塑性工程學(xué)報,2009,16(3):192 -197.