黃至柔,郭帥,傅琳,孫永國(guó),閆旭,于廣濱,
(1.長(zhǎng)春理工大學(xué) 機(jī)電工程學(xué)院,長(zhǎng)春 130000;2.中國(guó)船舶重工集團(tuán) 第七○三研究所,哈爾濱 150078;3.哈爾濱理工大學(xué) 機(jī)械動(dòng)力工程學(xué)院,哈爾濱 150080)
3D打印技術(shù)的出現(xiàn)使得一些復(fù)雜結(jié)構(gòu)的制造成為了可能,然而高昂的材料成本制約了3D打印技術(shù)的發(fā)展。為了節(jié)省打印耗材,降低打印成本,人們對(duì)3D打印模型的輕量化做了不少研究。
Chen等[1]提出一種將設(shè)計(jì)的不同種類(lèi)晶格單元結(jié)構(gòu)在模型內(nèi)部陣列的輕量化方法,并且目前已經(jīng)廣泛應(yīng)用到Magics等專(zhuān)業(yè)3D打印軟件中,然而這種方法需要進(jìn)行大量的布爾運(yùn)算,對(duì)于復(fù)雜模型的處理能力不足。北京工業(yè)大學(xué)的毛羽忻[2]針對(duì)3D打印切片的特點(diǎn),提出一種基于骨骼肌仿真的3D打印模型支撐結(jié)構(gòu),首先使用圖像處理的方法提取骨骼肌紋路,然后將模型分成無(wú)數(shù)切片。令每一層切片與提取的骨骼肌紋路做布爾運(yùn)行,然后再將運(yùn)算后的切片進(jìn)行三維重建。同樣是把三維問(wèn)題轉(zhuǎn)換到二維,浙江大學(xué)的趙斌濤[3]提出一種基于LDNIs的桁架結(jié)構(gòu)生成算法,提高了桁架結(jié)構(gòu)的生成效率。同樣是基于桁架結(jié)構(gòu)的輕量化方法,武漢理工大小的石丹[4]基于STL文件的數(shù)據(jù)結(jié)構(gòu),利于Matlab計(jì)算桁架的節(jié)點(diǎn),并將節(jié)點(diǎn)導(dǎo)入Grasshopper中生成桁架結(jié)構(gòu)。不同于使用桁架結(jié)構(gòu),大連理工大學(xué)的馮紫鑫[5]使用三周期極小曲面結(jié)構(gòu)在模型內(nèi)部陣列,并根據(jù)模型力學(xué)仿真結(jié)果改變極小曲面的參數(shù)以實(shí)現(xiàn)結(jié)構(gòu)力學(xué)性能的改變。本文結(jié)合武漢理工大學(xué)石丹與大連理工大學(xué)馮紫鑫等的研究,提出一種基于桁架結(jié)構(gòu)的模型輕量化方案,并根據(jù)力學(xué)仿真結(jié)果,通過(guò)對(duì)受力較大部位填充的方式實(shí)現(xiàn)結(jié)構(gòu)強(qiáng)度的優(yōu)化。
為了生成輕量化模型的基礎(chǔ)結(jié)構(gòu),首先借助專(zhuān)業(yè)3D打印軟件Magics的外殼和內(nèi)核功能,將初始模型分為外殼、內(nèi)殼與內(nèi)核3個(gè)部分,接著讀取獲得的內(nèi)殼與內(nèi)核兩部分的模型文件數(shù)據(jù)作為桁架結(jié)構(gòu)的節(jié)點(diǎn),再將節(jié)點(diǎn)導(dǎo)入Grasshopper并連接各個(gè)節(jié)點(diǎn),分別獲得內(nèi)殼桁架與內(nèi)核桁架,將內(nèi)殼桁架與內(nèi)核桁架相連即為輕量化模型的內(nèi)部桁架,最終將內(nèi)部桁架與模型外殼做布爾運(yùn)算即生成了輕量化模型的基礎(chǔ)結(jié)構(gòu)。
為了使模型原來(lái)的外表得以保留,需要對(duì)待輕量化的模型進(jìn)行抽殼。本文使用Materialize公司旗下專(zhuān)業(yè)3D打印軟件Magics將模型分為外殼和內(nèi)核(殼厚為a),其中將獲得的外殼作為模型外表,內(nèi)核作為計(jì)算輕量化模型內(nèi)部第一層桁架的基礎(chǔ)。然后,為了提高輕量化模型的強(qiáng)度,避免模型內(nèi)部孔隙過(guò)大,將前一次分離的模型內(nèi)核再進(jìn)行一次分離,成為新的模型內(nèi)殼與模型內(nèi)核(殼厚為b),內(nèi)核作為計(jì)算輕量化模型第二層桁架的基礎(chǔ)。
至此,使用Magics將原本的模型分離成了外殼、內(nèi)殼與內(nèi)核3個(gè)部分,如圖1所示,方便后續(xù)的一系列處理。

圖1 模型抽殼示意

圖2 示例模型三部分
內(nèi)部桁架結(jié)構(gòu)是對(duì)模型鏤空部位起支撐的作用,在3D打印領(lǐng)域中,桁架結(jié)構(gòu)也是常見(jiàn)結(jié)構(gòu)之一。目前,國(guó)內(nèi)外對(duì)于桁架結(jié)構(gòu)的研究主要集中于其設(shè)計(jì),而對(duì)于其生成方面的研究則相對(duì)較少。在本文所提出的輕量化方案之中,內(nèi)部桁架結(jié)構(gòu)分為內(nèi)殼桁架與內(nèi)核桁架兩部分,這兩部分桁架的生成根據(jù)1.1節(jié)中所獲得的內(nèi)殼模型與內(nèi)核模型計(jì)算而出。具體步驟如下:
1)分別讀取內(nèi)殼和內(nèi)核兩部分的STL模型文件數(shù)據(jù);
2)將1)中讀取的數(shù)據(jù)作為節(jié)點(diǎn)導(dǎo)入Grasshopper并連接生成內(nèi)殼初始層桁架與內(nèi)核初始層桁架;
3)根據(jù)1)中讀取的數(shù)據(jù)計(jì)算新的節(jié)點(diǎn)并導(dǎo)入Grasshopper,連接生成內(nèi)殼偏置層桁架與內(nèi)核偏置層桁架;
4)將內(nèi)殼桁架與內(nèi)核桁架相連最終形成輕量化模型的內(nèi)部桁架結(jié)構(gòu)。
1.2.1 STL模型文件的讀取
STL文件格式[6]是由美國(guó)3Dsystem公司推出的3D打印領(lǐng)域通用的模型文件格式,STL格式的模型是用一系列三角形來(lái)描述模型的表面,每一個(gè)三角面片都包括3個(gè)頂點(diǎn)的坐標(biāo)數(shù)據(jù)和法向量信息,通常用戶(hù)需要先將設(shè)計(jì)好的三維模型轉(zhuǎn)換成STL模型,再導(dǎo)入切片軟件進(jìn)行切片以獲取每一層切片的輪廓。STL文件又分為二進(jìn)制格式與ASCII碼格式,本文所使用的STL文件格式為二進(jìn)制,其數(shù)據(jù)存儲(chǔ)格式如表1所示。

表1 二進(jìn)制STL文件數(shù)據(jù)存儲(chǔ)格式
由于STL文件是用三角形來(lái)描述模型表面,故以一個(gè)三角面片為單位存儲(chǔ)模型文件數(shù)據(jù)。首先定義一個(gè)三角面片的類(lèi)Facet,用來(lái)存儲(chǔ)每一個(gè)三角面片,其成員包括3個(gè)頂點(diǎn)vertex子類(lèi)成員以及一個(gè)法向量成員,每一個(gè)vertex子類(lèi)則包括3個(gè)double類(lèi)型的成員變量x、y、z。即:

再使用fopen_s函數(shù)打開(kāi)文件后將數(shù)據(jù)存入分配的內(nèi)存,接著根據(jù)二進(jìn)制格式對(duì)所有的Facet對(duì)象進(jìn)行初始化,最后將初始化后的所有對(duì)象即所有三角面片存入vector
1.2.2 初始層桁架
完成存儲(chǔ)內(nèi)殼模型與內(nèi)核模型的三角面片之后,將每個(gè)面片的3個(gè)頂點(diǎn)的坐標(biāo)數(shù)據(jù)以.txt文本文件輸出:定義輸出文件名與格式,使用迭代器以訪問(wèn)存儲(chǔ)容器中的每一個(gè)元素,再用文件流操作將數(shù)據(jù)寫(xiě)入指定文本文件。即:

然后在Grasshopper中分別讀取寫(xiě)入節(jié)點(diǎn)坐標(biāo)X、Y、Z數(shù)據(jù)的文本文件,建立好節(jié)點(diǎn)并用line電池將節(jié)點(diǎn)按設(shè)定好的規(guī)則相連(如圖3),至此獲得內(nèi)部桁架結(jié)構(gòu)的初始層桁架(如圖4)。

圖3 Grasshopper桁架生成程序設(shè)計(jì)

圖4 初始層桁架結(jié)構(gòu)
1.2.3 偏置層桁架
為了進(jìn)一步提高桁架結(jié)構(gòu)的強(qiáng)度,武漢理工大學(xué)的石丹等將每一個(gè)三角面片的形心向法矢方向偏置,使偏置后的形心作為下一層桁架的節(jié)點(diǎn),然后根據(jù)原有三角面片的拓?fù)潢P(guān)系將偏置后的形心劃分為新的三角面片,然后重復(fù)偏置新的三角面片的形心,以此迭代的方式不斷生成新的偏置層桁架。這種方法的問(wèn)題在于:
1)在將形心朝法矢方向偏置的過(guò)程中會(huì)出現(xiàn)偏置點(diǎn)跑到模型外面的情況,形成干涉點(diǎn)導(dǎo)致建模錯(cuò)誤,如圖5所示。

圖5 偏置點(diǎn)偏置錯(cuò)誤
2)在將形心朝法矢方向偏置完成,將偏置點(diǎn)相連形成桁架結(jié)構(gòu)的過(guò)程中,會(huì)出現(xiàn)桿與桿之間交叉干涉的情況。
3)一般的3D打印模型的面片數(shù)在幾千甚至幾百萬(wàn)不等,在將偏置形心劃分為新的三角面片后,新的三角面片數(shù)量會(huì)遠(yuǎn)大于上一層三角面片,而該方法必須計(jì)算每一層的所有三角面片的偏置形心、法向量,與定義新的拓?fù)潢P(guān)系,故迭代兩次之后產(chǎn)生的新的三角面片會(huì)極大降低算法的時(shí)間、空間效率。
針對(duì)問(wèn)題1),本文提供的輕量化方案的內(nèi)部桁架結(jié)構(gòu)是在1.1節(jié)中所獲得模型內(nèi)殼與模型內(nèi)核基礎(chǔ)上直接計(jì)算而得,避免了從最外層桁架一層層向內(nèi)偏置迭代,故不會(huì)產(chǎn)生偏置點(diǎn)跑到模型外部的情況。
針對(duì)問(wèn)題2),桿與桿交叉干涉一般出現(xiàn)在模型曲率較大的部位,該部位附近的三角面片距離相對(duì)較短,法向量夾角相對(duì)較小,當(dāng)兩個(gè)距離較短且法向量夾角較小的三角面片的形心的偏置距離大于兩個(gè)面片的相對(duì)距離時(shí),就會(huì)出現(xiàn)交叉干涉。由于內(nèi)殼與內(nèi)核處于初始模型內(nèi)部,對(duì)其外表形貌不做要求,且這兩部分模型表面的精細(xì)程度不需要太高,通過(guò)對(duì)內(nèi)核與內(nèi)殼進(jìn)行三角面片簡(jiǎn)化的操作,降低內(nèi)殼、內(nèi)核的模型精度及模型表面的曲率,從而使后續(xù)桁架的結(jié)構(gòu)更加簡(jiǎn)潔,避免了交叉干涉的情況。

圖6 偏置輪廓相交
針對(duì)問(wèn)題3),如同問(wèn)題1)解決方案中提到的一樣,本文所提供的輕量化方案不使用層層迭代的方式,故避免了龐大的三角面片計(jì)算量,且通過(guò)內(nèi)殼與內(nèi)核并行計(jì)算生成結(jié)構(gòu)的方法相比于串行迭代的方式更具有時(shí)間效率。
綜上3點(diǎn),本文使用內(nèi)殼向內(nèi)偏置一次,內(nèi)核向外偏置一次的方式:計(jì)算內(nèi)殼上所有三角面片的形心,朝法向量偏置一定距離D(D應(yīng)小于在1.1節(jié)中對(duì)模型進(jìn)行內(nèi)殼與內(nèi)核分離時(shí)設(shè)置的兩者之間的距離b的1/2),得到內(nèi)殼偏置形心,將每一個(gè)內(nèi)殼偏置形心與其對(duì)應(yīng)的三角面片的3個(gè)頂點(diǎn)相連,形成內(nèi)殼偏置層桁架(圖7中白色部分);同理,對(duì)內(nèi)核上所有三角面片進(jìn)行同樣的計(jì)算與操作之后,將形成的內(nèi)核偏置層桁架與內(nèi)殼偏置層桁架以最近距離的方式匹配相連,最終形成了輕量化模型的內(nèi)部桁架結(jié)構(gòu)。

圖7 輕量化模型內(nèi)部桁架生成流程
由于模型在不同受力條件下各個(gè)部位的應(yīng)力分布不同,通常情況下只用一種結(jié)構(gòu)無(wú)法滿(mǎn)足所有情況下結(jié)構(gòu)的強(qiáng)度要求。為了使模型在不同受力條件下都具有足夠的強(qiáng)度,本文提出一種對(duì)模型應(yīng)力集中部位填充的方法:首先對(duì)模型進(jìn)行有限元分析,將分析結(jié)果以單元節(jié)點(diǎn)為單位輸出,接著對(duì)其進(jìn)行篩選,并以篩選后滿(mǎn)足條件的目標(biāo)節(jié)點(diǎn)的坐標(biāo)為基礎(chǔ),使用OpenSCAD建立實(shí)體,最后將實(shí)體與初始模型做布爾運(yùn)算以實(shí)現(xiàn)對(duì)模型的填充。

圖8 輕量化模型結(jié)構(gòu)強(qiáng)度優(yōu)化流程
有限元分析的目的是為了模擬模型在實(shí)際工況下整體結(jié)構(gòu)所受到的影響。有限元分析的結(jié)果為后續(xù)本文所提供的優(yōu)化方案提供了目標(biāo)與依據(jù)。本文使用ANSYS Workbench 19.0平臺(tái)對(duì)1.1節(jié)中的示例模型進(jìn)行壓縮實(shí)驗(yàn)?zāi)M:材料使用默認(rèn)的結(jié)構(gòu)鋼,材料密度為7850 kg/m3, 抗壓屈服強(qiáng)度為250 MPa,在模型底面施加約束,并在頂端施加一個(gè)80 MPa的垂直方向載荷,計(jì)算得到模型的等效應(yīng)力結(jié)果如圖9所示。

圖9 示例模型的應(yīng)力云圖
通過(guò)分析結(jié)果可知,該示例模型的應(yīng)力較大部位分別在模型尾巴根部、尾巴與頭部連接處,以及腳底受約束部位。在Workbench中將分析結(jié)果以單元節(jié)點(diǎn)為單位輸出到文本文件中,即可獲得每個(gè)單元節(jié)點(diǎn)的x、y、z坐標(biāo)與其對(duì)應(yīng)的應(yīng)力值大小,再對(duì)記錄這些節(jié)點(diǎn)的文本文件進(jìn)行讀取,以大于給定閾值(例如抗壓屈服強(qiáng)度)為條件篩選并導(dǎo)入到Grasshopper中進(jìn)行觀察,得到滿(mǎn)足條件的節(jié)點(diǎn)如圖10所示。

圖10 目標(biāo)節(jié)點(diǎn)集
在獲得了模型應(yīng)力較大部位的節(jié)點(diǎn)坐標(biāo)數(shù)據(jù)之后,本文使用OpenSCAD在每一個(gè)目標(biāo)節(jié)點(diǎn)的位置建立一個(gè)小的實(shí)體,再與初始模型進(jìn)行布爾運(yùn)算以滿(mǎn)足模型的幾何約束,從而獲得輕量化模型的填充實(shí)體模型。
OpenSCAD[7]是一款開(kāi)源免費(fèi)的建模軟件,并且能實(shí)現(xiàn)對(duì)STL文件的輸入與輸出。OpenSCAD使用的是編程腳本進(jìn)行建模,通過(guò)其自帶的庫(kù)函數(shù)實(shí)現(xiàn)常見(jiàn)3D幾何模型的建立與基本建模操作。本文所使用的OpenSCAD 中編程語(yǔ)言函數(shù)如表2所示。

表2 OpenSCAD語(yǔ)言函數(shù)
在2.1 節(jié)中經(jīng)過(guò)篩選后滿(mǎn)足條件的目標(biāo)節(jié)點(diǎn)共有144個(gè),如果要在每一個(gè)目標(biāo)節(jié)點(diǎn)的位置上建立一個(gè)實(shí)體(根據(jù)示例模型的幾何尺寸,本文選用3 mm球形實(shí)體:sphere(3)),則需要調(diào)用144次sphere函數(shù),這種情況下通常采用循環(huán)結(jié)構(gòu)來(lái)實(shí)現(xiàn)函數(shù)的復(fù)數(shù)次使用,但是OpenSCAD本身不具備分支、循環(huán)等常用編程邏輯功能。故需先使用C++中的for循環(huán)功能實(shí)現(xiàn)OpenSCAD腳本的生成(圖11右上),然后將腳本導(dǎo)入OpenSCAD中,過(guò)程如圖11所示。

圖11 目標(biāo)節(jié)點(diǎn)位置實(shí)體建模流程
在OpenSCAD中完成建模之后,為避免部分實(shí)體超出初始模型的表面,需要將這些實(shí)體與初始模型進(jìn)行布爾交運(yùn)算,如圖12所示。

圖12 布爾運(yùn)算獲得填充結(jié)構(gòu)
將本文在第1節(jié)獲得的輕量化模型的基礎(chǔ)結(jié)構(gòu)與第2節(jié)獲得的用以提高結(jié)構(gòu)強(qiáng)度的填充結(jié)構(gòu)相結(jié)合,即為本文所設(shè)計(jì)的3D打印模型輕量化方案的最終結(jié)構(gòu),如圖13所示。

圖13 最終輕量化模型生成
模型輕量化前體積為6970 mm3,輕量化后模型體積為3144 mm3。
圖14及表3所示是本文輕量化方案生成一些其他案例,為了方便展示桁架結(jié)果隱藏了模型外殼。

圖14 本輕量化方案其他算例

表3 算例結(jié)果
本文提出一種3D打印模型輕量化的方案,方案基于3D打印模型專(zhuān)用STL文件,使用部分商業(yè)以及開(kāi)源軟件的功能,再結(jié)合所設(shè)計(jì)的算法實(shí)現(xiàn)降低打印模型的質(zhì)量以及體積,并且根據(jù)力學(xué)仿真結(jié)果優(yōu)化輕量化模型的結(jié)構(gòu)強(qiáng)度。