陳 浩,吳裕斌,吳 鑫,曹丹華
(華中科技大學(xué)光學(xué)與電子信息學(xué)院,湖北武漢 430074)
在現(xiàn)代自動(dòng)化生產(chǎn)過(guò)程中,工業(yè)視覺(jué)檢測(cè)系統(tǒng)被廣泛應(yīng)用于成品檢驗(yàn)、質(zhì)量控制等領(lǐng)域[1]。典型的視覺(jué)檢測(cè)系統(tǒng)主要由智能相機(jī)、控制終端、光源3部分組成[2-3],控制終端作為系統(tǒng)的重要組成單元,具有以下2個(gè)特點(diǎn):作為系統(tǒng)的控制核心與眾多設(shè)備進(jìn)行高頻度的數(shù)據(jù)交互;功能需求可能會(huì)動(dòng)態(tài)變化。這就要求控制終端軟件應(yīng)具備低耦合、易擴(kuò)展、強(qiáng)實(shí)時(shí)的特性[4],常規(guī)模塊化的軟件設(shè)計(jì)思路無(wú)法滿足上述要求。
本文介紹了一種面向工業(yè)視覺(jué)檢測(cè)系統(tǒng)的控制終端軟件設(shè)計(jì)方案,該方案以改進(jìn)MVC模式為核心,按照軟件功能邏輯劃分層次,并引入抽象數(shù)據(jù)接口類(lèi)和中間件技術(shù)用于降低軟件內(nèi)部耦合,提高擴(kuò)展能力。針對(duì)實(shí)時(shí)性,實(shí)現(xiàn)了一種基于優(yōu)先級(jí)調(diào)度策略的線程池,并在抑制超時(shí)方面與傳統(tǒng)線程池進(jìn)行了比較。
工業(yè)視覺(jué)檢測(cè)系統(tǒng)控制終端軟件運(yùn)行的硬件平臺(tái)是Cortex-A8內(nèi)核的AM3358型微處理器,主頻為1 GHz,內(nèi)存為512 M字節(jié),液晶屏分辨率為1 024 ×768,通過(guò)以太網(wǎng)與CAN總線分別與智能相機(jī)和光源控制器連接。操作系統(tǒng)選用嵌入式Linux,內(nèi)核版本為3.12,UI界面開(kāi)發(fā)采用Qt5框架。相比于基于x86平臺(tái)的大型控制終端設(shè)備,嵌入式平臺(tái)方案具有高性能、低功耗、易部署的優(yōu)點(diǎn)。
控制終端軟件設(shè)計(jì)以傳統(tǒng)MVC模式[5]架構(gòu)為基礎(chǔ),采用分層模型思想以及中間件技術(shù)對(duì)傳統(tǒng)MVC模式進(jìn)行改進(jìn),整體框架分為視圖層、控制器層、邏輯處理層、數(shù)據(jù)對(duì)象層和數(shù)據(jù)訪問(wèn)層,通過(guò)抽象數(shù)據(jù)接口類(lèi)和中間件進(jìn)行數(shù)據(jù)交互,整體軟件框架如圖1所示。
圖1 工業(yè)視覺(jué)檢測(cè)系統(tǒng)控制終端軟件整體框架
視圖層負(fù)責(zé)控制終端軟件功能模塊UI界面的繪制,可以根據(jù)實(shí)際需求采用不同方式進(jìn)行開(kāi)發(fā),在Qt框架下,通常采用拖拽控件的方式設(shè)計(jì)界面。
控制器層作為視圖層和邏輯控制層之間信息交互的橋梁,一方面接收視圖層傳入的交互數(shù)據(jù)并將其序列化為二進(jìn)制字節(jié)流,完成后傳遞給邏輯控制層。另一方面將邏輯控制層返回的數(shù)據(jù)分發(fā)給視圖層用于顯示。
邏輯控制層負(fù)責(zé)具體業(yè)務(wù)邏輯的處理,如接收檢測(cè)圖像任務(wù)、發(fā)送配置文件任務(wù)、監(jiān)控系統(tǒng)運(yùn)行狀態(tài)任務(wù)等。為提高控制終端響應(yīng)的實(shí)時(shí)性,邏輯控制層采用多線程和線程池方案處理不同任務(wù)。
數(shù)據(jù)對(duì)象層負(fù)責(zé)不同類(lèi)型協(xié)議幀的構(gòu)造與解析??刂平K端與其他設(shè)備之間需要通過(guò)特定類(lèi)型的數(shù)據(jù)進(jìn)行信息交換,一般把這些特定類(lèi)型的數(shù)據(jù)稱(chēng)之為協(xié)議幀,其按不同的功能可以分為請(qǐng)求幀、應(yīng)答幀、控制幀等。為實(shí)現(xiàn)數(shù)據(jù)和邏輯的分離,與協(xié)議幀有關(guān)的操作都經(jīng)由數(shù)據(jù)對(duì)象層處理。
數(shù)據(jù)訪問(wèn)層負(fù)責(zé)協(xié)議幀的發(fā)送與接收,針對(duì)不同的總線格式,通過(guò)預(yù)設(shè)代碼屏蔽差異,對(duì)外提供統(tǒng)一的數(shù)據(jù)傳輸接口,減小與數(shù)據(jù)對(duì)象層之間的數(shù)據(jù)耦合。
為進(jìn)一步降低控制終端軟件的耦合性,提高擴(kuò)展能力,層與層之間僅通過(guò)抽象數(shù)據(jù)接口類(lèi)(以下簡(jiǎn)稱(chēng)接口類(lèi))進(jìn)行數(shù)據(jù)交互,最大程度地降低了層與層之間的耦合性。接口類(lèi)對(duì)外提供統(tǒng)一調(diào)用的方法,功能核心是能夠表示不同類(lèi)型、不同長(zhǎng)度的數(shù)據(jù),在C++語(yǔ)言中通過(guò)虛函數(shù)與類(lèi)模板來(lái)實(shí)現(xiàn)。接口類(lèi)的核心變量與方法如圖2所示。接口類(lèi)采用類(lèi)模板的形式進(jìn)行定義,在實(shí)例化時(shí)根據(jù)不同的T參數(shù)可以表示任意類(lèi)型數(shù)據(jù),同時(shí)定義map類(lèi)型的變量用于存儲(chǔ)具體數(shù)據(jù),并將讀寫(xiě)數(shù)據(jù)的方法定義為虛函數(shù),在默認(rèn)函數(shù)無(wú)法滿足需求的情況下可以通過(guò)重載擴(kuò)充功能。
層與層之間可以通過(guò)接口類(lèi)簡(jiǎn)化調(diào)用關(guān)系,但在軟件運(yùn)行過(guò)程中,視圖層、控制器層、邏輯處理層業(yè)務(wù)代碼可能會(huì)處于不同的線程當(dāng)中,為實(shí)現(xiàn)安全的跨線程消息傳遞,控制終端軟件將層與層之間的信息交互請(qǐng)求當(dāng)做獨(dú)立事件,通過(guò)Qt5中的事件循環(huán)機(jī)制和信號(hào)槽機(jī)制建立事件分發(fā)中間件,專(zhuān)職于跨線程的消息傳遞。
圖2 抽象數(shù)據(jù)接口類(lèi)核心變量與方法UML圖
控制終端啟動(dòng)后,會(huì)自動(dòng)與智能相機(jī)建立網(wǎng)絡(luò)連接,并等待用戶指令。當(dāng)用戶通過(guò)視圖層界面觸發(fā)某項(xiàng)功能后,視圖層首先判斷功能類(lèi)型,然后構(gòu)造抽象數(shù)據(jù)接口類(lèi),最后通過(guò)事件分發(fā)中間件傳遞給控制器層??刂破鲗邮盏浇涌陬?lèi)后進(jìn)行序列化操作,然后通過(guò)中間件分發(fā)給邏輯控制層進(jìn)行業(yè)務(wù)邏輯處理,進(jìn)而完成與智能相機(jī)的交互任務(wù)。
當(dāng)控制終端收到智能相機(jī)發(fā)送的協(xié)議幀后,首先通過(guò)數(shù)據(jù)訪問(wèn)層和數(shù)據(jù)對(duì)象層進(jìn)行解析,然后交由邏輯控制層進(jìn)行業(yè)務(wù)處理,最后通過(guò)控制器層和中間件將數(shù)據(jù)分發(fā)給視圖層,進(jìn)而反饋給用戶。整個(gè)處理流程時(shí)序如圖3所示。
圖3 控制終端軟件處理流程
控制終端軟件中的邏輯控制層采用線程池技術(shù)處理外部設(shè)備的交互請(qǐng)求。目前對(duì)線程池的研究主要集中在如何提高性能的層面上,但對(duì)于實(shí)時(shí)控制系統(tǒng)而言,保證在規(guī)定時(shí)間內(nèi)完成對(duì)設(shè)備交互請(qǐng)求的響應(yīng)才是控制終端軟件線程池設(shè)計(jì)的關(guān)鍵。
根據(jù)交互請(qǐng)求的緊急程度創(chuàng)建不同優(yōu)先級(jí)的線程是提高控制終端軟件響應(yīng)實(shí)時(shí)性的有效方案,但由于交互請(qǐng)求發(fā)生的時(shí)刻不統(tǒng)一,靜態(tài)設(shè)置線程優(yōu)先級(jí)的方案無(wú)法滿足實(shí)際應(yīng)用場(chǎng)景,需要通過(guò)某種策略動(dòng)態(tài)確定線程的優(yōu)先級(jí)。
支持向量回歸機(jī)(support vector regression,SVR)具備容易實(shí)現(xiàn)、學(xué)習(xí)速度快的優(yōu)點(diǎn),廣泛應(yīng)用于各類(lèi)數(shù)據(jù)的估計(jì)和擬合[6]。利用SVR能夠?qū)€程處理交互請(qǐng)求所用時(shí)間進(jìn)行估計(jì),為動(dòng)態(tài)確定線程優(yōu)先級(jí)提供數(shù)據(jù)支持,避免請(qǐng)求超時(shí)現(xiàn)象的發(fā)生。
半同步/半異步(half-sync/half-async)型線程池(簡(jiǎn)稱(chēng)為HSHA線程池)是一種典型的線程池方案,具有簡(jiǎn)單易實(shí)現(xiàn)的優(yōu)點(diǎn)[7]。基于優(yōu)先級(jí)調(diào)度策略的線程池(簡(jiǎn)稱(chēng)為SVR線程池)以HSHA線程池為原型,添加了請(qǐng)求事件監(jiān)測(cè)模塊,整體架構(gòu)如圖4所示,由同步層和異步層2部分組成。其中同步層包括監(jiān)聽(tīng)接口模塊,異步層包括請(qǐng)求列表模塊、請(qǐng)求緩沖區(qū)模塊和線程隊(duì)列模塊。當(dāng)有交互請(qǐng)求輸入時(shí),監(jiān)聽(tīng)接口模塊被激活,將請(qǐng)求的標(biāo)識(shí)、發(fā)出時(shí)間、門(mén)限時(shí)間等信息添加入請(qǐng)求列表模塊中,然后線程池根據(jù)SVR算法進(jìn)行完成時(shí)間估計(jì),進(jìn)而確定線程優(yōu)先級(jí),完成后將交互請(qǐng)求時(shí)間存入緩沖區(qū),并分配線程進(jìn)行邏輯處理。
圖4 基于優(yōu)先級(jí)調(diào)度策略的線程池整體架構(gòu)
對(duì)于某個(gè)固定交互請(qǐng)求,需要在一定時(shí)間范圍內(nèi)得到應(yīng)答,一般稱(chēng)這段時(shí)間為門(mén)限時(shí)間。令Tm為交互請(qǐng)求的門(mén)限時(shí)間,Tw為交互請(qǐng)求的延遲時(shí)間,Tr為交互請(qǐng)求的實(shí)際完成時(shí)間,To為請(qǐng)求的緊急程度,則它們之間的關(guān)系如下:
To=Tm-Tw-Tr
(1)
由于門(mén)限時(shí)間Tm是固定的,請(qǐng)求延遲時(shí)間Tw在正常環(huán)境下可以認(rèn)為是相同的。從式(1)可以看出,交互請(qǐng)求的實(shí)際完成時(shí)間Tr直接影響緊急程度To,To越小說(shuō)明交互請(qǐng)求越緊急,若To為負(fù)數(shù)則說(shuō)明交互請(qǐng)求將超時(shí)完成,利用SVR對(duì)Tr進(jìn)行估計(jì)可以確定To。根據(jù)上述分析,To可以反映出交互請(qǐng)求的優(yōu)先級(jí)別,To越小說(shuō)明交互請(qǐng)求的優(yōu)先級(jí)越高,將優(yōu)先獲得線程池處理。
根據(jù)式(1)中的參數(shù),基于優(yōu)先級(jí)調(diào)度策略線程池架構(gòu)中的請(qǐng)求列表需要記錄交互請(qǐng)求的類(lèi)型編號(hào)、延遲時(shí)間、門(mén)限時(shí)間和完成時(shí)間,這些參數(shù)為動(dòng)態(tài)計(jì)算交互請(qǐng)求的優(yōu)先級(jí)提供了參數(shù)依據(jù)。
SVR算法的本質(zhì)是求解二次規(guī)劃問(wèn)題,求解過(guò)程復(fù)雜,不適合嵌入式系統(tǒng)?;谧钚《嗽淼腟VR算法采用解線性方程組來(lái)替代解二次規(guī)劃問(wèn)題,降低了運(yùn)算難度,在保證學(xué)習(xí)精度的情況下降低了對(duì)處理器資源的消耗,適用于嵌入式系統(tǒng)。
為完成控制終端軟件對(duì)交互請(qǐng)求實(shí)際完成時(shí)間 的估計(jì),需要確定最小二乘SVR算法的輸入樣本。根據(jù)線程池的特點(diǎn),Tr與線程池運(yùn)行線程的總數(shù)量M、請(qǐng)求對(duì)應(yīng)線程執(zhí)行完畢的平均響應(yīng)時(shí)間Ta、請(qǐng)求對(duì)應(yīng)線程運(yùn)行前的平均等待時(shí)間Tw、線程池當(dāng)前線程處于阻塞態(tài)的總次數(shù)N以及總時(shí)間Tb等因素有關(guān),前3個(gè)參數(shù)用于估測(cè)新線程的運(yùn)行時(shí)間,最后2個(gè)參數(shù)用于估測(cè)新線程的阻塞時(shí)間。據(jù)此可以確定最小二乘SVR算法的輸入向量xi和預(yù)測(cè)輸出量yi,如表1所示。
表1 最小二乘SVR算法的輸入向量與預(yù)測(cè)輸出量
控制終端軟件每處理完一次交互請(qǐng)求都會(huì)產(chǎn)生新的樣本,為避免樣本數(shù)膨脹引起估算量增加,規(guī)定估算樣本的數(shù)量為n,每產(chǎn)生一個(gè)新的樣本,就把最舊的樣本丟棄。
控制終端實(shí)際用于缺陷鈕扣的識(shí)別與分揀,實(shí)驗(yàn)系統(tǒng)如圖5所示,控制終端通過(guò)以太網(wǎng)與3臺(tái)智能相機(jī)相連,通過(guò)CAN總線與光源控制器、上料機(jī)、皮帶機(jī)等外部設(shè)備相連。智能相機(jī)通過(guò)機(jī)器視覺(jué)方法對(duì)鈕扣樣本進(jìn)行檢測(cè),并將樣本圖像與檢測(cè)結(jié)果以協(xié)議幀的形式發(fā)送給控制終端,控制終端解析后將圖像與結(jié)果顯示在液晶屏上,實(shí)際界面效果如圖6所示。
圖5 缺陷鈕扣自動(dòng)分選系統(tǒng)拓?fù)浣Y(jié)構(gòu)
圖6 控制終端軟件實(shí)際界面效果
耦合性是影響軟件可擴(kuò)展能力的關(guān)鍵因素之一,可以通過(guò)類(lèi)間耦合CBO值、類(lèi)的響應(yīng)RFC值、消息傳遞耦合MPC值等度量指標(biāo)對(duì)軟件架構(gòu)的耦合性進(jìn)行定量分析[8],測(cè)試方法如下:
采用改進(jìn)MVC模式對(duì)控制終端軟件的核心模塊進(jìn)行設(shè)計(jì),計(jì)算出所有有效類(lèi)的耦合性度量指標(biāo),并與傳統(tǒng)MVC模式進(jìn)行比較。根據(jù)文獻(xiàn)[8]推薦的典型值,統(tǒng)計(jì)CBO≤5的類(lèi)個(gè)數(shù)、RFC≤100的類(lèi)個(gè)數(shù)、MPC≤100的類(lèi)個(gè)數(shù),計(jì)算出各自占類(lèi)總數(shù)的比例,高占比說(shuō)明軟件模塊代碼之間耦合性低,整體擴(kuò)展性較好,測(cè)試結(jié)果如表2所示。
表2 控制終端軟件代碼耦合性測(cè)試結(jié)果
從表2可以看出,在基于改進(jìn)MVC模式設(shè)計(jì)的控制終端軟件核心代碼中,滿足低耦合特性的類(lèi)所占比例均高于傳統(tǒng)MVC模式,軟件耦合性更低,類(lèi)模塊劃分合理,具有良好的可擴(kuò)展性。
工業(yè)視覺(jué)檢測(cè)系統(tǒng)中的3臺(tái)智能相機(jī)會(huì)根據(jù)實(shí)際檢測(cè)情況向控制終端發(fā)送圖像幀,圖像長(zhǎng)寬均為128個(gè)像素,格式為RGB888。為測(cè)定控制終端的響應(yīng)情況,調(diào)節(jié)3臺(tái)相機(jī)使其分別以1、5、10、15幀/s的速度發(fā)送圖像幀,測(cè)定控制終端實(shí)際顯示圖像的幀率,測(cè)試結(jié)果如表3所示。
表3 丟幀率測(cè)試結(jié)果
通過(guò)表3可以分析出,當(dāng)3臺(tái)智能相機(jī)同時(shí)以1、5、10、15 幀/s的速度發(fā)送圖像幀時(shí),控制終端實(shí)際顯示圖像的丟幀率均在1%以下,界面流暢,滿足實(shí)際應(yīng)用需求。
請(qǐng)求超時(shí)發(fā)生率受線程池調(diào)度策略的影響,是衡量控制終端軟件實(shí)時(shí)性的重要指標(biāo)。為評(píng)估控制終端軟件對(duì)外部設(shè)備交互請(qǐng)求的響應(yīng)能力,本文分別實(shí)現(xiàn)了基于SVR線程池架構(gòu)和普通HSHA線程池架構(gòu)的多線程管理模塊,并調(diào)節(jié)3臺(tái)智能相機(jī)使其分別以7、10、15 幀/s的速度各自發(fā)出1 000個(gè)圖像幀傳輸請(qǐng)求。根據(jù)發(fā)送幀率計(jì)算,3臺(tái)相機(jī)圖像幀傳輸請(qǐng)求對(duì)應(yīng)的門(mén)限時(shí)間Tm分別為142.86、100.00、66.67 ms。任意一臺(tái)相機(jī)發(fā)出圖像幀后開(kāi)啟獨(dú)立計(jì)時(shí),控制終端軟件完成圖像幀處理后發(fā)出應(yīng)答信號(hào),相機(jī)收到應(yīng)答信號(hào)后停止計(jì)時(shí),計(jì)時(shí)值即為控制終端軟件對(duì)圖像幀傳輸請(qǐng)求的實(shí)際響應(yīng)時(shí)間Tr。如果Tr大于Tm,則記錄一次超時(shí),通過(guò)測(cè)定超時(shí)次數(shù)以及超時(shí)發(fā)生率進(jìn)而對(duì)線程池性能做出評(píng)價(jià)。
根據(jù)線程池設(shè)計(jì)原理,請(qǐng)求超時(shí)發(fā)生率受線程池線程數(shù)量的影響,可以通過(guò)試探法確定最佳數(shù)量。具體做法如下:設(shè)定控制終端軟件線程池中線程數(shù)量分別為1、2、4、8、16,SVR估算樣本數(shù)量固定為30,核函數(shù)采用徑向基函數(shù)。在控制終端收到3 000個(gè)圖像幀傳輸請(qǐng)求的條件下,SVR和HAHS線程池的請(qǐng)求超時(shí)發(fā)生率結(jié)果如表4所示。
表4 不同線程池下圖像幀傳輸請(qǐng)求超時(shí)發(fā)生率
從表4可以看出:
(1)當(dāng)線程池線程數(shù)量過(guò)少時(shí),SVR線程池和HAHS線程池的請(qǐng)求超時(shí)發(fā)生率都比較高,這是由于過(guò)少的線程數(shù)量導(dǎo)致請(qǐng)求隊(duì)列堆積,控制終端無(wú)法及時(shí)響應(yīng)圖像幀傳輸請(qǐng)求。又因?yàn)镾VR線程池需要通過(guò)計(jì)算確定線程優(yōu)先級(jí),耗費(fèi)了更多的時(shí)間,所以在線程池線程數(shù)量最低時(shí),SVR線程池的請(qǐng)求超時(shí)發(fā)生率高于HAHS線程池。
(2)當(dāng)線程池線程數(shù)量過(guò)多時(shí),雖然圖像幀傳輸請(qǐng)求得到了控制終端軟件的及時(shí)響應(yīng),但過(guò)多的線程增加了切換的時(shí)間開(kāi)銷(xiāo),系統(tǒng)性能降低,SVR線程池的請(qǐng)求超時(shí)發(fā)生率有所上升。
[7] 張海瑞,彭旭鋒,梁庭,等.LC諧振傳感器的信號(hào)檢測(cè)系統(tǒng)研究[J].傳感技術(shù)學(xué)報(bào),2015(4):503-509.
[8] XIONG J,LI Y,HONG Y,et al.Wireless LTCC-based capacitive pressure sensor for harsh environment[J].Sensors & Actuators A Physical,2013,197(8):30-37.
[9] 邱關(guān)源.電路[M].北京:高等教育出版社,1999:252-256.
[10] 康昊,秦麗,譚秋林,等.無(wú)線無(wú)源壓力傳感器前端特征參數(shù)提取方法研究[J].傳感器與微系統(tǒng),2013,32(10):13-15.
[11] 張林,陳大欽.模擬電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2014.
[12] Texas instrument.LMX2571 Data sheet[R/OL].http://www.ti.com.cn/cn/lit/ds/symlink/lmx2571.pdf.2015.
[13] Analog Devices Inc.AD9858 Data sheet[R/OL].http://www.analog.com/media/en/technical-documentation/data-sheets/AD9858.pdf.2003.
[14] Analog Devices Inc.ADL5511 Data Sheet[R/OL].http://www.analog.com/media/en/technical-documentation/data-sheets/ADL5511.pdf.2011.
[15] Analog Devices Inc.AD8009 Data sheet[R/OL].http://www.analog.com/media/cn/technical-documentation/data-sheets/AD8009_cn.pdf.2000.
[16] Analog Devices Inc.AD7667 Data sheet[R/OL].http://www.analog.com/media/en/technical-documentation/data-sheets/AD7667.pdf.2013.
[17] 張海瑞,梁庭,洪應(yīng)平,等.無(wú)線無(wú)源壓力讀取系統(tǒng)中線性掃頻源的設(shè)計(jì)[J].儀表技術(shù)與傳感器,2015(9):23-27.