楊洪濤,張夢遙,沈梅,李莉,馬群,胡婷婷,程晶晶
1安徽理工大學機械工程學院;2安徽理工大學環(huán)境友好材料與職業(yè)健康研究院;3安徽理工大學礦山智能裝備與技術(shù)安徽省重點實驗室
傳統(tǒng)關(guān)節(jié)臂坐標測量機存在采用人工手動拖拽、離線測量方式及測量效率低等缺點,無法滿足在線、智能及高精度測量的發(fā)展要求[1]。為實現(xiàn)關(guān)節(jié)臂坐標測量機在線自動測量,需要開發(fā)一款可以實現(xiàn)工件測量點抓取、運動路徑規(guī)劃、關(guān)節(jié)運動控制、測量數(shù)據(jù)記錄、運算和誤差補償?shù)裙δ艿臏y控軟件。
學者們在具有類似結(jié)構(gòu)的串聯(lián)機械臂測控軟件及其仿真測試方面取得了不少成果[2,3]。李哲樸等[4]研發(fā)的SAMMIE軟件被應(yīng)用于機器人離線編程,可以對機器人進行建模仿真及碰撞檢測,但僅能實現(xiàn)人機交互仿真分析,無法將仿真模型與測量機硬件直接連接。目前常用的ADAMS軟件可以用于預(yù)測機械系統(tǒng)性能、可活動范圍及碰撞檢測等,但其仿真不是實時仿真,且無交互功能,仿真速度慢[5]。王帥[6]使用Unity3D軟件開發(fā)了機械臂虛擬交互平臺,可以實現(xiàn)場景虛擬測試,但無法滿足現(xiàn)實環(huán)境的交互需求。張戟等[7]利用SolidWorks軟件進行三維建模,并運用ADAMS、AME Sim和Simulink開展聯(lián)合仿真。方偉[8]結(jié)合OpenGL與QT平臺搭建了虛擬仿真環(huán)境,但僅能滿足示教機器人的使用與操作,兼容性差。
上述國內(nèi)外研究的機械臂控制與仿真軟件無法滿足目前自驅(qū)動關(guān)節(jié)臂測量機的運動控制和測量需求,因此有必要重新開發(fā)一種能滿足測量機運動控制、測量功能以及精度要求的測控軟件。
自驅(qū)動關(guān)節(jié)臂坐標測量機(簡稱測量機)的整體結(jié)構(gòu)見圖1,由上位機、控制系統(tǒng)和測量機本體三大部分組成,通過改造手動關(guān)節(jié)臂坐標測量機結(jié)構(gòu),在關(guān)節(jié)處添加電機、減速器和編碼器等,實現(xiàn)測量機自驅(qū)動定位和測量[9]。
測量機本體由1個基座、3個雙關(guān)節(jié)、1個測頭和3段連桿組成;控制系統(tǒng)分為主測控模塊和3個關(guān)節(jié)測控模塊兩大部分,主測控模塊負責總體運行、各模塊間協(xié)調(diào)及與上位機通信;每個關(guān)節(jié)測控模塊主要負責一個雙關(guān)節(jié)電機閉環(huán)控制、傳感器的數(shù)據(jù)采集與傳輸。工作時,控制系統(tǒng)接到上位機傳輸?shù)闹噶?,轉(zhuǎn)化為電信號驅(qū)動電機轉(zhuǎn)動,使測頭到達指定位置,角度編碼器采集轉(zhuǎn)角值實時傳輸?shù)缴衔粰C。
測量機工作時,將被測工件三維模型導入測控軟件,精確抓取待測點,并對其三維坐標和測量機測頭初始坐標進行路徑規(guī)劃,獲取待測點與測頭初始位置之間的最優(yōu)路徑,實現(xiàn)最佳定位與測量精度。同時利用運動學反解算法,結(jié)合測量機動力學分析結(jié)果,確定測量機6個關(guān)節(jié)的角度變化范圍,傳輸?shù)綔y量機電機控制系統(tǒng),控制組成3個關(guān)節(jié)的6個關(guān)節(jié)模組運動,實現(xiàn)測量機的精確定位與測量。關(guān)節(jié)模組編碼器測量得到的角度值被反饋到上位機測控軟件中,基于D-H模型利用測量機建立測量模型,實時顯示測量機測頭位置,并利用誤差補償算法進行三維坐標誤差補償,最終實現(xiàn)測量精確定位和高精度測量[10]。
圖1 自驅(qū)動關(guān)節(jié)臂坐標測量機結(jié)構(gòu)
由上述測量機的工作原理可知,為了實現(xiàn)測量機路徑規(guī)劃、運動控制、精確定位、誤差補償和精確測量,本文研究的測控軟件需滿足以下功能需求。
(1)自動測量需獲取工件待測點相對于測量機的三維坐標值,因此應(yīng)在上位機軟件中導入待測零件和測量機模型,生成虛擬三維工件,并將加工零件轉(zhuǎn)化到測量機的坐標系中,精確抓取被測工件的空間位置。
(2)測控軟件與MATLAB軟件連接,由抓取得到的坐標點反算出各個關(guān)節(jié)轉(zhuǎn)角值,并利用軌跡規(guī)劃算法得到最優(yōu)路徑。將計算得到的轉(zhuǎn)角通過通信方式傳輸?shù)娇刂葡到y(tǒng)中,完成軟件與硬件的連接達到自驅(qū)動控制的目的。
(3)測控軟件需要配置數(shù)據(jù)庫,將測量系統(tǒng)采集的數(shù)據(jù)實時傳輸?shù)缴衔粰C軟件進行存儲,并利用MATLAB算法對數(shù)據(jù)進行誤差補償,完成自動測量。
對上位機通信系統(tǒng)軟件需求進行深入分析,確定軟件需要具備的功能,完成整體軟件框架設(shè)計和軟件環(huán)境需求配置。使用Visual Studio 2015開發(fā)平臺,并利用MFC與跨平臺API的OpenGL實現(xiàn)對Windows環(huán)境的軟件設(shè)計與開發(fā)。
針對測量機軟件需求,上位機軟件應(yīng)具備登錄頁面、三維模型顯示、軌跡規(guī)劃、定位測量、參數(shù)顯示、誤差補償和通信等七大功能(見圖2)。
為了精確抓取被測工件的三維坐標,三維模型顯示模塊需要將被測工件的三維模型導入上位機建立的測量機三維測量坐標系中,進行模型的重構(gòu)、旋轉(zhuǎn)、縮放和平移等操作,精確抓取零件測量點和路徑規(guī)劃點的三維坐標,并顯示在軟件窗口中。
圖2 功能模塊
為了將抓取到的坐標點通過MATLAB軟件中S型軌跡規(guī)劃算法反算出6個關(guān)節(jié)轉(zhuǎn)角值并顯示在相應(yīng)控件中,軌跡規(guī)劃功能需要與MATLAB算法鏈接。為了實現(xiàn)定位測量,軟件需具備設(shè)置6個關(guān)節(jié)的速度與加速度的功能,并通過通信控制各關(guān)節(jié)的電機轉(zhuǎn)動。
為了能夠驅(qū)動各關(guān)節(jié)電機,上位機通過通信功能將反解算出的關(guān)節(jié)轉(zhuǎn)角和最優(yōu)路徑發(fā)送給控制器,同時接收光柵傳感器實時采集反饋回的6個關(guān)節(jié)轉(zhuǎn)角。執(zhí)行器模塊通過以太網(wǎng)通信,光柵傳感器通過串口通信實現(xiàn)數(shù)據(jù)傳輸。針對常用通信方式及高實時性要求,決定采取串口通信與以太網(wǎng)通信方式。
為獲得當前關(guān)節(jié)轉(zhuǎn)動角度,需要實時顯示采集6個關(guān)節(jié)轉(zhuǎn)角值和測頭三維坐標位置及6個關(guān)節(jié)速度。為實現(xiàn)對被測點坐標數(shù)據(jù)進行誤差實時補償,測量軟件需要具備誤差補償功能。將采集的6個關(guān)節(jié)轉(zhuǎn)角數(shù)據(jù)、速度、加速度和標定得到的桿長、偏置值、扭轉(zhuǎn)角,代入由MATLAB軟件編寫的誤差補償程序,算出點位誤差、標準偏差和平均誤差,從而實現(xiàn)三維坐標的實時補償,并將補償前與補償后的三維坐標數(shù)值同步顯示在軟件界面中,便于后續(xù)誤差補償效果對比。
采用Visual Studio 2015中的MFC單文檔應(yīng)用程序框架和開放端口OpenGL進行測量機測控軟件界面編寫。軟件主體框架分為菜單項、左側(cè)三維圖形顯示部分和右側(cè)參數(shù)輸入與顯示部分(見圖3)。通過CSplitterWnd類拆分窗口,在CMainFrame類中聲明CSplitterWnd類型的對象,重寫框架類的OnCreateClient()函數(shù),并利用界面掛載自定義消息宏完成通過菜單項選擇調(diào)用不同類的Dlg界面,以完成不同功能。
3.3.1 自驅(qū)動關(guān)節(jié)臂坐標測量機模型抓取
本文編寫的用于三維模型導入重構(gòu)和三維模型坐標抓取的顯示模塊,利用Visual Studio 2015和開放端口OpenGL,將MFC的繪制設(shè)備DC與OpenGL的繪制環(huán)境RC連接起來。
圖3 軟件整體界面
具體方法為SolidWorks軟件建模后,存儲為.obj文件,采取glfw+glad的程序框架和Assimp庫讀取.obj模型文件。在OpenGL中定義一個vertex數(shù)據(jù)結(jié)構(gòu),包含位置向量、法向量和紋理坐標,定義一個texture結(jié)構(gòu)體存儲紋理數(shù)據(jù)的id。定義一個mesh類,將所有數(shù)據(jù)賦予網(wǎng)格,最終調(diào)用Draw函數(shù)繪制網(wǎng)格。利用Assimp庫中的Assimp::Importer::ReaderFile()加載模型,并轉(zhuǎn)移至上面創(chuàng)建的Mesh對象中。
采用射線拾取算法獲取測量機三維模型測頭所在坐標點及工件待測點坐標;點擊屏幕二維坐標,經(jīng)過坐標轉(zhuǎn)化得到投影點;以近平面為起點,向遠平面方向發(fā)出一條射線,射線與物體相交得到待測工件坐標點和測頭坐標點。
3.3.2 調(diào)用運動學反解和軌跡規(guī)劃算法
用于調(diào)用MATLAB軟件中編寫好的運動學反解算法的軌跡規(guī)劃模塊,選擇在MFC中調(diào)用MATLAB軟件編譯生成DLL,并在其文件中編寫算法程序,根據(jù)mcc-W cpplib:Test-T link:lib Test命令生成庫文件和頭文件。將生成的庫文件與頭文件添加到項目中,并配置VS的編譯環(huán)境。初始化MATLAB的調(diào)用:
if (!mclInitializeApplication(NULL,0))
{AfxMessageBox(_T("Could not initialize !"));
return;}
if (!addtestInitialize())//文件名+Initialize構(gòu)成
{AfxMessageBox(_T("Could not initialize !"));
return;}
初始化后編寫程序調(diào)用MATLAB軟件已寫好的算法。
3.3.3 存儲編碼器采集的數(shù)據(jù)
選擇SQL server數(shù)據(jù)庫作為測控系統(tǒng)軟件的數(shù)據(jù)管理系統(tǒng),對編碼器采集的數(shù)據(jù)進行存儲和查詢等操作。MFC采用ADO技術(shù)鏈接SQL server數(shù)據(jù)庫。
(1)在SQL server數(shù)據(jù)庫中建立Jointθ數(shù)據(jù)庫,并新建表Table_Joint。
(2)加載ADO庫,將以下代碼加入Stdafx.h中。
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
(3)創(chuàng)建_ConnectionPtr和_RecordsetPtr對象。代碼如下:
_ConnectionPtrm_pConnection; //初始化ADO服務(wù)器
_RecordsetPtrm_pRecordset; //對ADO服務(wù)器操作對象
(4)在MFC單文檔的分割對話框OnInitialUpdata()函數(shù)中鏈接數(shù)據(jù)庫,可以通過SQL語言實現(xiàn)數(shù)據(jù)存儲、查詢、修改和刪除等操作。
通過串口或以太網(wǎng)通信方式解決PC端上位機軟件與坐標測量機下位機系統(tǒng)實時通信的問題,將上位機中設(shè)置的信息傳輸?shù)较挛粰C系統(tǒng),控制坐標測量機運動,達到下位機系統(tǒng)采集到的角度數(shù)據(jù)傳輸?shù)缴衔粰C軟件中進一步處理的目的。
3.4.1 串口通信
本文上位機與關(guān)節(jié)臂的實時通信利用CSerial類進行串口通信的編寫,將CSerial類添加到軟件編寫工程中,定義一個m_SerialPortOpened變量來標志串口打開,對按鈕“打開串口”添加響應(yīng)函數(shù)完成對串口的初始化。在CSerialDlg.h的頭文件中對CSerialPort類賦予一個具體的對象m_SerialPort。通過串口號、波特率和校驗位等打開串口,根據(jù)通信協(xié)議將波特率設(shè)置為921600bps,數(shù)據(jù)位設(shè)置為8位,停止位1位,無校驗位。
實現(xiàn)ASCII文本和十六進制數(shù)據(jù)發(fā)送與顯示。在CSerialDlg中對“發(fā)送”按鈕添加事件響應(yīng)函數(shù)OnBnClickedButtonSend(),檢查串口是否打開,如果沒有打開則直接退出函數(shù),打開則調(diào)用UpdateData()函數(shù)讀取編輯框中的數(shù)據(jù)。再根據(jù)十六進制數(shù)據(jù)和ASCII文本調(diào)用CSerialPort類中的WriteToPort兩種不同發(fā)送函數(shù)發(fā)送數(shù)據(jù)。添加自定義消息WM_COMM_RXCHAR響應(yīng)函數(shù)OnCommunication()接收消息,同樣根據(jù)十六進制和ASCII碼調(diào)用不同的接收函數(shù)SetSel()、ReplaceSel(),并將消息顯示在串口通信界面的接收編輯框中。
3.4.2 以太網(wǎng)通信
上位機作為以太網(wǎng)通信中的客戶端,利用Windows API進行基于TCP的網(wǎng)絡(luò)連接,向下位機服務(wù)器端請求服務(wù)。
(1)用MFC提供的AfxSocketInit()函數(shù)加載套接字庫,在CEthernetDlg類中增加一個SOCKET類型成員變量m_socket,用于創(chuàng)建套接字,并在CEthernetDlg類的“連接”按鈕中添加事件響應(yīng)函數(shù)OnBnClickedConnect(),在此函數(shù)中調(diào)用WSAStartup()函數(shù)加載套接字,加載的網(wǎng)絡(luò)版本為2.2版本。
(2)套接字創(chuàng)建成功后,將其綁定到某個IP地址和端口上,IP地址和端口號通過IP地址編輯控件和端口號編輯控件獲取,完成后向服務(wù)器發(fā)出連接請求,連接成功即可發(fā)送及接收消息。
(3)在CEthernetDlg類的“發(fā)送”按鈕中添加事件響應(yīng)函數(shù)OnBnClickedOk()函數(shù),使用GetDlgItem()和GetWindowText()函數(shù)獲取相應(yīng)的編輯框控件和信息。利用Send()函數(shù)發(fā)送數(shù)據(jù)。
(4)在CEthernetDlg類中自定義靜態(tài)線程函數(shù)Recv_Th(LPVOID p),獲取主線程傳遞的套接字和窗口句柄。
將測量機模型和待測零件導入軟件,獲取測頭和待測點的三維坐標點。同一模型在不同軟件中的顯示效果見圖4。對模型進行平移、縮放和旋轉(zhuǎn)等操作,并拾取模型上三維坐標點測試(見圖5)。
圖4不同軟件顯示效果
圖5模型基本變換操作和三維坐標點拾取
在軟件三維模型中獲取的待測坐標點通過MFC與MATLAB軟件連接,調(diào)用MATLAB軟件中函數(shù)和算法計算出6個關(guān)節(jié)轉(zhuǎn)角,并調(diào)用軌跡規(guī)劃算法。通過菜單中“誤差補償”的子菜單“調(diào)用MATLAB”,可以實現(xiàn)與MATLAB軟件連接。此處通過一個簡單函數(shù)驗證連接,如圖6所示,調(diào)用MATLAB函數(shù)進行簡單的“1+2”計算,生成MATLAB函數(shù)圖形。
圖6 調(diào)用MATLAB函數(shù)測試
利用虛擬串口通信進行測試,可以實現(xiàn)串口連接,并能發(fā)送十六進制和ASCII碼數(shù)據(jù)(見圖7a)。對以太網(wǎng)通信進行測試,可以實現(xiàn)客戶端與服務(wù)器連接并傳輸數(shù)據(jù)(見圖7b)。
圖7 串口通信與以太網(wǎng)通信
測量機角度編碼器采集的數(shù)據(jù)通過通信傳輸?shù)缴衔粰C需實時存儲,并可以調(diào)用存儲數(shù)據(jù)進行后續(xù)誤差補償?shù)忍幚?。如圖8所示,數(shù)據(jù)庫連接成功后彈出窗口,提示數(shù)據(jù)庫連接成功,通過上位機存入數(shù)據(jù)按鈕將采集的數(shù)據(jù)存入數(shù)據(jù)庫中,實現(xiàn)目標任務(wù)。
圖8數(shù)據(jù)庫連接及數(shù)據(jù)存儲
本文研究的上位機軟件可以較好地實現(xiàn)自驅(qū)動關(guān)節(jié)臂的需求,兼容性高,界面設(shè)計符合友好人機交互性。
(1)針對自驅(qū)動關(guān)節(jié)臂坐標測量機在線測控系統(tǒng)進行上位機需求分析,確定上位機需完成的功能模塊,完成整體軟件編譯環(huán)境配置。結(jié)果表明,配置的編譯環(huán)境能夠?qū)⒉杉臄?shù)據(jù)存入數(shù)據(jù)庫,并可以調(diào)用MATLAB算法對數(shù)據(jù)進行處理,從而將MFC友好的界面設(shè)計與MATLAB軟件強大的算法相結(jié)合。
(2)對上位機軟件進行了整體界面設(shè)計,通過串口通信與以太網(wǎng)通信實現(xiàn)軟件與硬件的連接,達到關(guān)節(jié)臂自驅(qū)動的目的。將SolidWorks軟件制作的工件模型和關(guān)節(jié)臂模型導入軟件顯示區(qū)域,并能對模型進行縮放、旋轉(zhuǎn)、平移操作和坐標點抓取等操作。