,
(天津大學(xué) 精密儀器與光電子工程學(xué)院,天津 300100)
應(yīng)用于現(xiàn)代焊裝過程的激光焊接技術(shù)在線作業(yè)時會頻頻產(chǎn)生熔渣飛濺。飛濺物將會隨機性地粘附在作業(yè)中的激光焊頭保護(hù)鏡片上。由于保護(hù)鏡片上粘有金屬熔濺物,激光光束的傳遞光路極有受阻的可能性,將造成焊體受熱不均勻,產(chǎn)生壞焊的現(xiàn)象[1]。國際上的汽車廠商依靠人工定期更換保護(hù)鏡片完成對保護(hù)鏡片產(chǎn)生缺陷的預(yù)防,一些國內(nèi)汽車廠商嘗試加入氣動噴嘴來預(yù)防飛濺粒子[2],但均無法滿足低成本、高利用率的要求。
鏡面檢測本身難度較大,迄今尚無視覺檢測保護(hù)鏡片的有效方法。針對以上需求,設(shè)計了一種基于嵌入式Linux的激光焊接保護(hù)鏡片的視覺鏡面缺陷檢測系統(tǒng)。由于保護(hù)鏡片上的飛濺粒子體積小、散布隨機,所以需要高分辨率圖像作為視覺樣本;同時出于高效生產(chǎn)考慮,系統(tǒng)不能采用傳統(tǒng)的字符設(shè)備和塊設(shè)備的內(nèi)存管理方式,而是選用高效快捷、高健壯性[3]的V4L2框架。以流的方式連續(xù)將高分辨率圖像映射到Linux的用戶空間并利用核心算法進(jìn)行圖像識別。如果檢測到缺陷,系統(tǒng)通過CAN總線向機器人報警并終止線上作業(yè)。該系統(tǒng)擺脫傳統(tǒng)工業(yè)現(xiàn)場的總機控制,可通過觸摸屏進(jìn)行人機交互功能,具有良好的便攜性。
基于嵌入式Linux的激光焊接保護(hù)鏡片的視覺鏡面缺陷檢測系統(tǒng)的硬件結(jié)構(gòu)框圖如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)框圖
該系統(tǒng)硬件結(jié)構(gòu)以S5PV210微處理器為核心、同時包括電源、DDR2、Flash、UART接口、MT9M031傳感器、AT043TN24液晶顯示觸摸屏、SD卡插槽等。S5PV210微處理器主要負(fù)責(zé)各模塊間的控制和核心算法的運行。MT9M031傳感器通過以太網(wǎng)口將拍攝的圖像映射到Linux的用戶空間,并通過上層應(yīng)用程序儲存進(jìn)DDR2和插入的SD卡中。檢測系統(tǒng)與機器人通過CAN總線連接。
S5PV210是三星公司推出的一款適用于智能手機和平板電腦等多媒體設(shè)備的應(yīng)用處理器,采用ARM CortexTM-A8內(nèi)核,主頻可達(dá)1 GHz并具有豐富的外圍接口。
MT9M031是由Aptina公司推出發(fā)行的一款1/3英寸高清圖像傳感器。激光焊接保護(hù)鏡片的視覺信息通過MT9M031轉(zhuǎn)化為數(shù)字圖像。由于現(xiàn)代芯片的高度集成化,MT9M031的A/D轉(zhuǎn)換器集成在芯片內(nèi)部,其外部電路設(shè)計十分簡單。
AT043TN24為CHIMEI INNOLUX公司推出的一款4.3英寸的液晶觸摸屏,常白顯示,通透式,分辨率為480(RGB)*272。
由于激光焊接的工業(yè)機器人大多使用CAN總線來進(jìn)行通訊,所以該系統(tǒng)配有CAN轉(zhuǎn)UART協(xié)議轉(zhuǎn)換模塊來適應(yīng)現(xiàn)場作業(yè)環(huán)境。該模塊內(nèi)部已經(jīng)集成DeviceNet從站協(xié)議棧代碼,可支持高達(dá)128字節(jié)I/O報文傳輸,適用于各種干擾強、實時性要求高的工業(yè)環(huán)境。
基于以上硬件平臺,應(yīng)用Linux操作系統(tǒng)作為嵌入式開發(fā)環(huán)境。Linux是一款具有高時代性、高移植性的開源操作系統(tǒng),可應(yīng)用于個人PC機、服務(wù)器和嵌入式開發(fā)等[4]。較于其他應(yīng)用于嵌入式開發(fā)的系統(tǒng),如:WinCE、VxWorks,具有內(nèi)核開源、強大的網(wǎng)絡(luò)協(xié)議支持、
廣泛的硬件支持等獨有的特性。
在嵌入式Linux開發(fā)的過程中,用戶需要對其內(nèi)核進(jìn)行修改、編譯,同時增加對應(yīng)硬件的驅(qū)動模塊并在設(shè)備樹中進(jìn)行修改添加。主要操作如下:
1)裁剪和移植內(nèi)核。只保留嵌入式設(shè)備需要的內(nèi)核模塊,節(jié)約空間;
2)移植和修改驅(qū)動模塊。使得系統(tǒng)外設(shè),如MT9MO31傳感器,可被系統(tǒng)識別并訪問;
3)修改和編譯設(shè)備樹。設(shè)備樹文件是描述設(shè)備的屬性和設(shè)置之間的關(guān)系,并且將設(shè)備樹的配置最終通過驅(qū)動作用于實際的設(shè)備。該設(shè)計大大簡化了驅(qū)動的移植與開發(fā),當(dāng)設(shè)備參數(shù)需要修改時,只需編譯設(shè)備樹文件,而不需重新編譯內(nèi)核。
2.2.1 MT9M031傳感器驅(qū)動
MT9M031驅(qū)動主要完成對相機的圖像采集和配置的功能。圖像從傳感器發(fā)出后,通過CMOS控制器的調(diào)用,完成拍照。方案如圖2所示。
圖2 MT9M031傳感器驅(qū)動方案
首先在內(nèi)核的設(shè)備樹文件下添加MT9M031設(shè)備信息:
mt9m031@5d {
compatible = "aptina,mt9m031";
reg = <0x5d>
port {
mt9m031_1: endpoint {
remote-endpoint = <&vpfe0_ep>;
mclk-frequency = <50000000>;
...
i2c的設(shè)備地址為0x5d。compatible屬性的內(nèi)容非常重要,該屬性是和驅(qū)動匹配的唯一依據(jù)," aptina" 代表廠家," mt9m031"代表CMOS傳感器型號。" remote-endpoint"代表和CMOS連接的外設(shè)," mclk-frequency "代表CMOS的輸入時鐘。
然后修改vpfe外設(shè)側(cè)為:
&vpfe0 {
...
port {
vpfe0_ep: endpoint {
remote-endpoint = <&mt9m031_1>;
if_type = <2>;
hdpol = <0>;
vdpol = <0>;
bus_width = <16>;
...
只需要修改VPFE遠(yuǎn)端連接的是MT9M031這款CMOS圖像傳感器即可。其中,if_type代表圖像格式,2代表raw格式。" bus_width "代表總線寬度。" hdpol "代表行同步的極性,0表示高電平有效,下降沿觸發(fā)DMA中斷,1表示低電平有效,上升沿觸發(fā)DMA中斷。" vdpol "代表場同步的極性,0代表高電平有效,1代表低電平有效。
然后是MT9M031驅(qū)動程序的移植。由于Linux內(nèi)核中自帶了OmniVision公司生產(chǎn)的OV2659傳感器的驅(qū)動,通過修改其驅(qū)動文件完成MT9M031傳感器的驅(qū)動移植。關(guān)鍵修改如:寄存器的讀寫函數(shù)、增加分辨率支持等。
首先將OV2659驅(qū)動文件中所有的字符串“ov2659”全部替換為“mt9m031”。由于替換眾多,可以在vim編輯器的控制模式下使用全局命令:%s/ov2659/mt9m031/g來進(jìn)行全文檔范圍內(nèi)的字符串替換。
下一步參照MT9M031的datasheet在該驅(qū)動文件中增加MT9M031的常用寄存器地址以及常量的宏定義,如: define MT9M031_CHIP_ID_REG 0x3000等。
由于ov2659的i2c寄存器是16位地址,8位數(shù)據(jù),而mt9m031的i2c寄存器是8位地址,16位數(shù)據(jù),需要進(jìn)行修改。修改如下:
static int mt9m031_write(struct i2c_client *client, u8 reg, u16 data){
return i2c_smbus_write_word_swapped(client, reg, data);}
static int mt9m031_read(struct i2c_client *client, u8 reg, u16 *val){
u16 *p_val = val;
*p_val = i2c_smbus_read_word_swapped(client, reg);
return 0;}
由于Linux啟動之后,會自動匹配外接設(shè)備和驅(qū)動。一旦設(shè)備匹配成功后,操作系統(tǒng)會自動調(diào)用外設(shè)驅(qū)動中的probe函數(shù)。probe函數(shù)將進(jìn)行設(shè)備號的讀取。如果讀取到的設(shè)備號與CMOS的設(shè)備號(芯片ID)相匹配,系統(tǒng)就會根據(jù)設(shè)備樹中的配置信息對驅(qū)動設(shè)備進(jìn)行初始化配置。配置結(jié)束以后,注冊設(shè)備,驅(qū)動程序獲得外接設(shè)備地址。在mt9m031_probe下的mt9m031_detect_sensor函數(shù)中添加以下內(nèi)容,進(jìn)行復(fù)位CMOS芯片、關(guān)閉輸出、使能CMOS芯片和讀取CMOS芯片的版本號。該代碼段中省略掉了錯誤處理部分:
ret = mt9m031_write(client,MT9M031_RESET,1);
mdelay(5);
ret = mt9m031_write(client,MT9M031_RESET,0);
ret = reg_write(client, MT9M031_OUTPUT_CONTROL, 0);
ret = reg_write(client, MT9M031_CHIP_ENABLE, 1);
ret = mt9m031_read(client,0x00, &ver);
mt9m031->id = ver;
if (mt9m031->id MT9M031_ID)
dev_info(&client->dev, "Found sensor,the version is %04x ",
mt9m031->id);
else{
dev_err(&client->dev, "Sensor detection failed (%04X, %d) ",
mt9m031->id, ret);
ret = -ENODEV;}
由于在前面設(shè)備樹文件下添加MT9M031設(shè)備信息中提到的compatilble屬性是和驅(qū)動匹配的唯一依據(jù),所以在MT9M031驅(qū)動文件中也需要添加和設(shè)備樹中compatilble屬性相同的信息。這樣才可以完成設(shè)備和驅(qū)動的匹配工作。在static const struct of_device_id ar0134_of_match[]中添加語句:{ .compatible = "aptina,mt9m031", }, 。同時在static struct i2c_driver ar0134_i2c_driver中的.driver項段中添加語句:.of_match_table = of_match_ptr(mt9
m031_of_match), 。
由于圖像壞點的面積微小,系統(tǒng)要求采集1024x1280的灰度圖像,為了支持這種格式的采集,需要使用分辨率為1024x640的YUYV圖像格式進(jìn)行替代。而1024x640的分辨率在原有驅(qū)動中并沒有,需要在mt9m031_framesizes結(jié)構(gòu)體中增加對這種分辨率的支持:
static const struct mt9m031_framesize mt9m031_framesizes[] = {
...
{ /* 1024x1280 */
.width = 640,
.height = 1024,
.regs = mt9m031_vga,
... }
由于V4L2框架層與MT9M031驅(qū)動層之間存在著一個CCDC Driver層(VPFE接口),所以此處需要涉及到VPFE接口驅(qū)動的修改。一般的視頻采集涉及到的VPFE接口驅(qū)動是不需要修改的,針對該系統(tǒng)的視覺算法對圖像的要求只需要修改內(nèi)核源路徑下的vpfe.c文件即可。該文件所處路徑如下:
內(nèi)核源路徑/drivers/media/platform/ti-vpfe/vpfe.c
由于Linux內(nèi)核中自帶驅(qū)動的OV2659的像素時鐘是上升沿鎖存數(shù)據(jù),而MT9M031的像素時鐘是下降沿鎖存數(shù)據(jù),需要修改pclk的時鐘極性。注釋掉原有的VPFE配置語句:isif_write(isif, cfg, ISIF_VPFE_CONFIG); ,將參數(shù)cfg改為cfg|0x0001,即將最低位置1表示下降沿鎖存:isif_write(isif, cfg|0x0001, ISIF_VPFE_CONFIG);
由于微處理器SDK中圖像采集默認(rèn)丟棄第一行像素,而MT9M031的第一行像素是有效的,不能丟棄,所以要修改VPFE接口驅(qū)動對采集圖像第一行像素的處理。在frm_fmt ISIF_FRMFMT_INTERLACED判斷條件成立后的if語句段中注釋掉語句vert_start += 1; 。vert_start變量表示VPFE接口采集圖像的行起始標(biāo)志。SDK默認(rèn)第一行像素丟棄,所有vert_start標(biāo)志自加1,從第二行開始實時采集圖像。注釋掉該語句,VPFE接口直接從第一行像素進(jìn)行采集。
以上各個驅(qū)動程序修改完成后,將要進(jìn)行Linux內(nèi)核的重新編譯。當(dāng)在Linux源碼樹的頂層輸入make menuconfig的時候,會出現(xiàn)內(nèi)核編譯的配置界面。該界面最終生成的就是依賴Kconfig文件(.config文件),將編譯的配置選項傳遞給makefile,從而控制內(nèi)核編譯的過程。編輯內(nèi)核源路徑/drivers/media/i2c/Kconfig文件,新增MT9M031的相關(guān)信息:
config VIDEO_MT9M031
tristate "APTINA MT9M031 sensor support"
depends on I2C && VIDEO_V4L2
select VIDEO_V4L2_SUBDEV_API
---help---
This is a V4L2 sensor-level driver for the APTINA
MT9M031 camera sensors.
與此同時接收內(nèi)核編譯配置選項的makefile也需要進(jìn)行一些修改。打開控制驅(qū)動文件mt9m031.c編譯的makefile文件,該文件路徑為:內(nèi)核源路徑/drivers/media/i2c/Makefile。在原ov2659驅(qū)動控制編譯語句下面添加MT9M031的驅(qū)動控制編譯語句:
obj-(CONFIG_VIDEO_MT9M031) += mt9m031.o
最后將剛才修改的MT9M031的驅(qū)動文件的文件名改為mt9m031.c,同時其對應(yīng)的頭文件名改為mt9m031.h。在Linux源碼樹下輸入 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig。選擇Device Drivers->Multimedia support-> Encoders, decoders, sensors and other helper chips -> APTINA MT9M031 sensor support,選擇該編譯選項以后保存退出。然后開始編譯內(nèi)核,即可將MT9M031以上修改的所有驅(qū)動全部編譯移植到新的內(nèi)核鏡像文件zImage文件。將該鏡像文件和設(shè)備樹編譯后的.dtb文件通過sd卡燒進(jìn)核心板,就完成了整個視頻采集系統(tǒng)的內(nèi)核移植和系統(tǒng)搭建工作。
2.2.2 AT043TN24液晶觸摸屏驅(qū)動
對于480x272的電阻屏的驅(qū)動,內(nèi)核已經(jīng)提供,但是刷新方式為橫屏模式。由于圖像的分辨率的關(guān)系,利用豎屏顯示的支持方案效果最佳。只需要在QT編譯的過程中,加入支持旋轉(zhuǎn)的編譯選項,將QT的庫文件更新到文件系統(tǒng)中,然后在系統(tǒng)啟動配置件中增加旋轉(zhuǎn)屏幕的參數(shù)即可。
V4L2框架下可以在程序中直接打開圖像設(shè)備獲取圖像設(shè)備的能力,例如是否支持內(nèi)存映射、設(shè)置圖像格式(YUYV/UYVY)等。向驅(qū)動申請幀緩沖[5],并且映射到用戶空間。將映射到用戶空間緩沖區(qū)入隊列[6],即可啟動采集。啟動采集以后,輪詢是否采集到數(shù)據(jù),當(dāng)采集到以后,將幀緩沖出隊列,對圖像數(shù)據(jù)進(jìn)行圖像處理或者傳輸保存。出隊列的緩沖使用完畢以后,繼續(xù)入隊列,等待下一次采集。當(dāng)采集條件滿足,例如采集到設(shè)定的幀數(shù)以后,停止采集,并且關(guān)閉設(shè)備。圖像采集程序流程圖如圖3所示。
該系統(tǒng)的圖像識別核心算法是基于OpenCV2庫函數(shù)實現(xiàn)的。當(dāng)進(jìn)入圖像處理算法流程后,首先在圖像內(nèi)尋找保護(hù)鏡片。因為同軸光會經(jīng)過透射反射進(jìn)入照相機,所以圖像內(nèi)的鏡片應(yīng)該為亮白色。如果找到則利用霍夫變換[7]來定位鏡面區(qū)域,并判斷是否發(fā)生定位區(qū)域越界。如果發(fā)生越界則提示鏡片不存在,未發(fā)生越界則取定位區(qū)域的外接矩形為感興趣區(qū)域。在外接矩形感興趣區(qū)域內(nèi)首先進(jìn)行保護(hù)鏡片以外、外接矩形以內(nèi)的區(qū)域置白,將隸屬于以上區(qū)域中的像素點的像素值全部設(shè)置為255。之后在保護(hù)鏡片內(nèi)部進(jìn)行閾值設(shè)定和像素值二值化,目的是為了檢索圓形鏡片區(qū)域中的壞點輪廓。最后經(jīng)過計算檢索到的壞點像素面積以及比較其與預(yù)先人工設(shè)定的壞點面積的大小,得到最終的壞點判斷。
圖3 圖像采集程序流程圖
為了驗證該基于嵌入式Linux的激光焊接保護(hù)鏡片的視覺鏡面缺陷檢測系統(tǒng)的設(shè)計有效性,特進(jìn)行了相關(guān)的實驗操作和數(shù)據(jù)分析。實驗共分為兩種:1.實驗室條件下,對帶有熔渣的缺陷保護(hù)鏡片與無缺陷保護(hù)鏡片混合檢測;2.在焊接現(xiàn)場對線上作業(yè)的保護(hù)鏡片進(jìn)行檢測。實驗數(shù)據(jù)如圖4所示。
圖4 不同條件下對帶有缺陷的保護(hù)鏡片和無缺陷的保護(hù)鏡片的混合檢測
該鏡面缺陷檢測系統(tǒng)的實物設(shè)備如圖5所示。由實驗數(shù)據(jù)可知,在實驗室條件下,混合檢測的正檢率一直保持在100%,系統(tǒng)搭建的有效性和核心算法的正確性得以驗證。可是在工業(yè)現(xiàn)場中,熔渣的飛濺導(dǎo)致系統(tǒng)的照相機鏡頭上會粘附熔渣,直接影響到采圖的客觀真實性。因此隨著檢測樣本的增加,正檢率隨意性變化。
基于飛濺物粘附在照相機鏡頭上導(dǎo)致誤檢的問題,擬將一個通氣導(dǎo)管放置在照相機鏡頭旁側(cè)并時刻通氣流斜向吹擊照相機鏡頭。這樣成功消除了飛濺物落附在照相機鏡頭上的可能性。增添通氣除雜環(huán)節(jié)后,經(jīng)核心算法處理后的鏡片圖像如圖6所示。
圖5 鏡面缺陷檢測系統(tǒng)的實物設(shè)備圖
圖6 系統(tǒng)采集到的缺陷保護(hù)鏡片的信息圖像
本設(shè)計是服務(wù)于現(xiàn)汽車生產(chǎn)線上激光焊接保護(hù)鏡片的缺陷檢測。首先采用了S5PV210微處理器,提高運算速度,降低采集能耗;然后選擇MT9M031圖像傳感器并將保護(hù)鏡片圖像通過DMA映射到用戶空間并使用V4L2框架以流的方式進(jìn)行圖像采集,這樣可以快速高效地從相機處獲取高分辨率的圖像信息;設(shè)計CAN轉(zhuǎn)UART協(xié)議轉(zhuǎn)換模塊和液晶觸摸顯示屏AT043TN24,提高該系統(tǒng)的人機交互能力和現(xiàn)場適應(yīng)度;最后基于opencv2函數(shù)庫的核心算法編寫:當(dāng)檢測出壞點時,紅色線標(biāo)記輪廓并報警。實驗證明了本系統(tǒng)設(shè)計的有效性和算法的正確性,補充實驗進(jìn)一步完善了該系統(tǒng)對工業(yè)現(xiàn)場的適應(yīng)性。
參考文獻(xiàn):
[1] 陳 勰. 啟辰白車身激光焊接質(zhì)量影響因素研究[D].長沙:湖南大學(xué),2011.
[2] 唐霞輝, 朱海紅, 朱國富. 激光焊接專用氣動噴嘴的研究[J]. 激光技術(shù), 2000, 24(2): 95-98
[3] Michael H Schimek, Bill Dirks, Hans Verkuli. Video for Linux two API specification [EB/OL]. http://v4l2spec.bytesex.org/ v4l2spec/v4l2.pdf.2008.
[4] 鄒自明,劉曉陽. 基于嵌入式Linux的結(jié)構(gòu)化道路車道線識別系統(tǒng)的研究[J]. 計算機測量與控制,2014,22(4):1260-1263
[5] 史 濤,裴海龍. 基于Linux的嵌入式實時視頻跟蹤系統(tǒng)[J]. 計算機測量與控制,2014,22(5):1523-1526
[6] 徐 家, 陳 奇. 基于V4L2的視頻設(shè)備驅(qū)動開發(fā)[J]. 計算機工程與設(shè)計, 2010, 31(16):3569-3572
[7] A. L. Fisher, P. T. Highnam. Computing the Hough transform on a scan line array processor[J], IEEE Trans. Pattern Anal. Mach. Intel, 1989, 11(3):262-265.