龔雨晨,趙圓圓,張 帆,譚躍剛
(武漢理工大學(xué)機(jī)電工程學(xué)院,武漢430070)
3D打印技術(shù)是一種始于20世紀(jì) 80年代中期的增材制造技術(shù)[1]。利用3D打印技術(shù)實現(xiàn)三維模型的立體成型主要有上層切片和底層控制兩個環(huán)節(jié),但是傳統(tǒng)切片控制的實現(xiàn)需借助兩種不同的軟件,操作復(fù)雜且切片控制數(shù)據(jù)不互通,實現(xiàn)3D打印切片控制一體化,不僅可以消除從上層切片規(guī)劃環(huán)節(jié)到底層控制打印環(huán)節(jié)之間的數(shù)據(jù)壁壘,打通數(shù)據(jù)的交互流程,還可以讓從模型導(dǎo)入到執(zhí)行打印的操作環(huán)節(jié)更加透明,簡化用戶操作。
針對切片和控制問題,國內(nèi)外學(xué)者進(jìn)行了許多相關(guān)研究。在切片的路徑優(yōu)化方面,F(xiàn)ok等使用Christofides算法對打印路徑進(jìn)行優(yōu)化,通過縮短路徑長度的方式實現(xiàn)路徑優(yōu)化[2]。尚雯等把偏置填充路徑進(jìn)行螺旋化處理,得到具有較少跳轉(zhuǎn)點的螺旋偏置填充路徑,極大提高了打印效率[3]。在固件控制方面,國外研發(fā)團(tuán)隊推出了目前主流的Marlin固件系統(tǒng),有大量的工程人員進(jìn)行維護(hù),持續(xù)更新,廣泛應(yīng)用于直角坐標(biāo)系的3D打印機(jī)上[4]。RepRap固件是早期支持32位板的固件之一,高度模塊化,具有很好的借鑒意義,為后續(xù)不同用途3D打印機(jī)的控制系統(tǒng)研究提供了基礎(chǔ)[5]。國內(nèi)外學(xué)者雖然在切片控制領(lǐng)域取得了大量的研究成果,但是對于切片控制的一體化集成以及一體化流程中的數(shù)據(jù)傳輸方式,目前研究成果較少,傳統(tǒng)的立體模型切片過程需在電腦上完成,對用戶的操作提出了較高要求。
因此,有必要提出一種切片控制一體化集成策略,基于此策略設(shè)計切片控制一體化系統(tǒng),并脫離電腦基于安卓屏設(shè)計出一套友好的交互界面,使得3D打印在滿足個性化需求的前提下,進(jìn)一步降低成本,簡化用戶操作,提高打印樂趣。
三維立體模型雖然是3D打印的基礎(chǔ),但不是3D打印的直接輸入文件,在進(jìn)行3D打印前,需要切片引擎對模型進(jìn)行切片處理生成路徑規(guī)劃指令,路徑規(guī)劃算法是完成3D打印成型的必要步驟,算法的合理性與模型的成型效率、質(zhì)量以及性能等重要指標(biāo)密切相關(guān)[6],3D打印切片的流程如圖1所示。
圖1 切片引擎工作流程
切片引擎首先獲取STL模型并將其解析為三角形面片信息,根據(jù)層高對三維模型進(jìn)行分層處理,從面片信息找到頂點的z坐標(biāo)最小值,以這個點建立一個垂直于z軸的平面,將這個平面逐漸往上平移一個等同于層高的值,這些平面與三角形面片相交達(dá)到分層效果。
分層結(jié)束后,三角形面片被分為若干層,每一層形成獨有的二維輪廓,二維輪廓本質(zhì)上是點的集合。接著,切片引擎根據(jù)用戶設(shè)置的填充方式以及填充密度對二維輪廓進(jìn)行進(jìn)一步劃分,將二維輪廓的點根據(jù)運算法則分為內(nèi)外墻、填充、上下表面以及支撐六部分之一并將對應(yīng)的點信息保存至不同組件的數(shù)據(jù)結(jié)構(gòu)。
劃分組件完畢后,切片引擎會對不同組件數(shù)據(jù)結(jié)構(gòu)中的點信息按照對應(yīng)的路徑規(guī)劃算法實現(xiàn)層面路徑規(guī)劃,即將每個二維輪廓中無序的點集合轉(zhuǎn)化為有序的點序列,常見的路徑規(guī)劃算法有平行線填充、網(wǎng)格填充以及偏置填充,如圖2所示。
圖2 常見路徑規(guī)劃算法
最后,切片引擎會將每一層的點序列進(jìn)行匯總并按照分層順序進(jìn)行排列,將所有點序列封裝成gcode格式,根據(jù)用戶提供的文件輸出路徑實現(xiàn)gcode文件的輸出。
3D打印的路徑規(guī)劃由切片引擎完成,但包含打印軌跡的gcode文件本身卻無法進(jìn)行3D打印設(shè)備的驅(qū)動,進(jìn)一步解析G代碼并控制3D打印設(shè)備運動的工作由固件系統(tǒng)完成,以RepRap固件為例,其控制流程如圖3所示。
圖3 RepRap固件控制流程
固件首先需要獲取G代碼并解析其中的信息,具體包括固件系統(tǒng)的初始化、G代碼循環(huán)監(jiān)聽以及G代碼的解析與運動信息的存儲,主函數(shù)會調(diào)用幾個初始化相關(guān)類的子函數(shù)完成整個環(huán)境配置以及初始化工作,除主函數(shù)外,固件系統(tǒng)由不同類組成,每個類負(fù)責(zé)不同的功能,G代碼的接收主要通過Gcodes類實現(xiàn),Gcodes類有一個Spin()函數(shù)用來實現(xiàn)對G代碼的不斷接收,主函數(shù)建立無限循環(huán)并在循環(huán)部分調(diào)用Gcodes類的Spin()函數(shù)從而實現(xiàn)G代碼的循環(huán)監(jiān)聽。G代碼的解析與儲存主要由Gcode類的GCodeBuffer::Seen(charc)和 GCodeBuffer::GetIValue()兩個函數(shù)完成,這兩個函數(shù)在完成G代碼解析的基礎(chǔ)上會把解析出的運動信息儲存至數(shù)組緩沖區(qū)moveBuffer[]中,為G代碼的下一步傳遞奠定基礎(chǔ)。
固件在完成G代碼解析并保存后,會根據(jù)G代碼關(guān)鍵字的不同將信息傳遞到與之對應(yīng)的控制引腳,具體包括運動信息的讀取以及運動信息往引腳的傳遞。運動信息的讀取與進(jìn)一步傳遞在Move類中完成,在Move類中通過調(diào)用Gcodes類中的Read-Move()函數(shù)獲得 moveBuffer[]中運動信息,得到的運動信息經(jīng)過Move類中的雙向循環(huán)鏈表處理會被傳遞到對應(yīng)的引腳處。
當(dāng)運動信息傳遞到對應(yīng)控制引腳后,固件系統(tǒng)會完成最后的工作,即實現(xiàn)運動信息的響應(yīng),響應(yīng)工作在Platform類中完成,通過調(diào)用Ardunio庫中的digitalWriteNonDue()底層驅(qū)動函數(shù)完成對電機(jī)引腳的直接控制,并基于函數(shù)內(nèi)規(guī)定的中斷響應(yīng)方法實現(xiàn)對電機(jī)的控制,其控制算法。
3D打印切片控制一體化的重點是切片引擎的路徑規(guī)劃以及固件系統(tǒng)的控制驅(qū)動,但是一體化的整個流程是從用戶導(dǎo)入立體模型開始,一直到打印機(jī)執(zhí)行打印,除了切片控制這些關(guān)鍵環(huán)節(jié),還涉及到用戶對引擎的調(diào)用以及切片控制交互,切片控制一體化整體流程如圖4所示。
圖4 切片控制一體化整體流程
切片控制一體化流程中的數(shù)據(jù)傳輸主要體現(xiàn)在用戶設(shè)置參數(shù)并調(diào)用切片引擎。用戶調(diào)用引擎時,完整的參數(shù)傳遞包含切片參數(shù)設(shè)置、打印機(jī)參數(shù)設(shè)置、選用的立體模型以及輸出的Gcode文件名四部分,系統(tǒng)會調(diào)用切片引擎預(yù)留的接口實現(xiàn)引擎的調(diào)用和參數(shù)的傳遞,引擎首先根據(jù)立體模型的路徑找到對應(yīng)STL文件并將其解析為三角形面片信息,接著根據(jù)切片參數(shù)順利完成路徑規(guī)劃過程,利用噴頭直徑等打印機(jī)參數(shù)確保路徑規(guī)劃算法與打印設(shè)備的匹配度,最后利用用戶預(yù)設(shè)的Gcode文件名實現(xiàn)輸出路徑的拼接,確保Gcode文件的順利生成。
切片控制一體化流程中的數(shù)據(jù)交互主要指切片控制之間的數(shù)據(jù)交互過程,上層切片中預(yù)留的G代碼傳輸接口,負(fù)責(zé)實現(xiàn)上層切片往底層固件中進(jìn)行G代碼文件的傳輸。在切片引擎將所有的點序列封裝成Gcode格式的文件后,會基于用戶預(yù)設(shè)的輸出文件名,調(diào)用相關(guān)函數(shù)完成Gcode文件完整輸出路徑的拼接,這個Gcode路徑會調(diào)用上層切片中預(yù)留的G代碼傳輸接口,從而順利根據(jù)路徑將對應(yīng)的Gcode文件進(jìn)行數(shù)據(jù)流的轉(zhuǎn)換并通過串口傳至底層固件中,再由固件完成解析和驅(qū)動工作。
底層固件系統(tǒng)中預(yù)留的接口,使切片控制一體化系統(tǒng)可以利用打印數(shù)據(jù)對切片規(guī)劃進(jìn)行調(diào)整,在固件系統(tǒng)與傳感器交互,獲取到打印噴頭的溫度以及三軸的位置等實時數(shù)據(jù)后,會調(diào)用底層預(yù)留的數(shù)據(jù)反饋接口將這些實時數(shù)據(jù)傳至上層切片引擎中,為溫度實時監(jiān)控以及打印狀態(tài)預(yù)覽功能的實現(xiàn)奠定基礎(chǔ)。
基于切片控制一體化集成策略,分別從軟硬件兩方面完成切片控制一體化系統(tǒng)設(shè)計,并對此系統(tǒng)進(jìn)行功能測試。
大型工業(yè)級設(shè)備通常使用PLC、CNC或者是兩者的結(jié)合作為其控制系統(tǒng)[7],這對于小型打印機(jī)系統(tǒng)并不適用的。對于3D打印系統(tǒng),常用的系統(tǒng)處理器主要有單芯片微處理器、DSP以及ARM[8],單片機(jī)處理器的性能較差,無法支持切片控制一體化系統(tǒng)的集成,而DSP主要應(yīng)用于數(shù)字信號的處理,對于本項目并不適合,因此本次設(shè)計使用基于4核Cortex-A7 ARM的HW33-070安卓屏,硬件結(jié)構(gòu)如圖5所示。架構(gòu)與主流android手機(jī)相同,所以切片控制一體化系統(tǒng)可以直接安裝在HW33-070使用。
圖5 HW33-070安卓屏結(jié)構(gòu)圖
系統(tǒng)前端開發(fā)基于.xml文件實現(xiàn),主要負(fù)責(zé)控件的聲明與id的定義,用戶點擊控件即可根據(jù)id觸發(fā)相應(yīng)的后臺業(yè)務(wù)。系統(tǒng)的后臺開發(fā)基于java,由于切片引擎是基于C++完成的,需要進(jìn)行交叉編譯,因此引入JNI技術(shù)完成切片引擎的調(diào)用。切片過程完成后生成的gcode文件并不能直接驅(qū)動打印設(shè)備運動,只有將G代碼發(fā)送至打印機(jī)主板中的固件系統(tǒng)中進(jìn)行二次解析才能實現(xiàn)設(shè)備驅(qū)動,因此需要將gcode文件解析為數(shù)據(jù)流的形式并通過串口傳輸,此功能引入Serial_Port庫實現(xiàn)。為進(jìn)一步提升用戶的交互體驗,本系統(tǒng)支持三維模型的預(yù)覽,此功能使用OpenGL庫實現(xiàn),軟件總體框架如圖6所示。
圖6 切片控制一體化系統(tǒng)軟件總體框架
利用2.1所述的安卓屏硬件接口完成測試平臺搭建,經(jīng)測試,系統(tǒng)的前端界面可以正常顯示,同時用戶可以通過此交互界面完成從模型導(dǎo)入到控制打印機(jī)的一體化流程。模型庫前端界面如圖7所示。
圖7 模型庫界面
當(dāng)用戶點擊上圖中的圖片即可完成對應(yīng)模型的切片,經(jīng)測試,使用此系統(tǒng)進(jìn)行切片在參數(shù)相同的情況下生成的gcode文件與使用Cura等傳統(tǒng)切片軟件幾乎一致,證明了此系統(tǒng)的功能可行性,gcode對比如圖8所示。
圖8 gcode對比圖
在分析了傳統(tǒng)3D打印的切片控制實現(xiàn)方法后,提出了切片控制一體化集成策略?;诖瞬呗酝瓿上到y(tǒng)設(shè)計,利用平板設(shè)計友好交互界面,使切片控制過程擺脫對電腦的依賴,簡化用戶操作。并利用串口傳輸打破了切片控制之間的數(shù)據(jù)壁壘,在同一系統(tǒng)下完成切片數(shù)據(jù)到打印過程的傳輸,同時可以利用打印數(shù)據(jù)對切片規(guī)劃進(jìn)行調(diào)整。對切片控制一體化系統(tǒng)進(jìn)行功能測試,發(fā)現(xiàn)使用此系統(tǒng)不僅操作簡單,還能實現(xiàn)從模型導(dǎo)入到驅(qū)動打印設(shè)備的一體化流程,這為3D打印技術(shù)的普及提供了基礎(chǔ)。