郭小鳳,谷亞寧,謝瑞潔
(山西農業大學 信息科學與工程學院,山西 太谷 030801)
在我國規模化的豬只養殖業中,影響豬只養殖效率最重要的因素是豬只的健康狀況以及出欄豬的體重[1]。對豬只的體重監測,可以有效地了解豬只每日攝入體內的蛋白質和能量,對指導養殖戶進行豬只計劃飼喂量具有重要意義[2]。同時,在豬只養殖過程中,實時監測豬只的體重,可以對豬只養殖業每日營收情況有清晰的了解[3]。養殖業中采用綜合管理系統使養殖者能夠及時發現情況并處理,可以在養殖過程中實現豬場等養殖業閉環控制。
激光雷達是一種不受環境光照變化影響,可以直接獲得目標物的高精度三維點云信息的遙感設備[4],具有掃描頻率快、對運動狀態物體具有精確性、掃描速度快、分辨率高等特點,為豬只體重測量提供了新的途徑。本文將激光雷達應用于豬只體重測量,設計了一個基于激光雷達的豬只體重測量系統。
本試驗以豬只個體為研究對象,立足于豬只健康生長需求,結合豬只生長習性、生理特性以及豬舍現場環境,利用激光雷達在豬舍出欄口處對豬只進行非接觸掃描,構建三維模型,開發設計豬只體重測量系統。該系統主要由硬件和軟件兩部分組成,如圖1所示。硬件包括MDB-21C型號激光雷達、直流電源模塊、路由器、可調節式雷達安裝平臺支架、計算機;軟件是用QT 4.10.0開發軟件、OpenCV和QT3D等函數庫對系統進行開發。軟件部分包括點云數據采集模塊、數據預處理模塊、三維模型構建模塊、體重計算模塊,通信原理為TCP/IP協議[5]。

圖1 豬只體重測量系統組成
本系統核心硬件是MDB-21C型二維激光雷達掃描儀,是一種非接觸式距離測量的光學傳感器,對動態物體測量精準度高,負責采集被測豬只二維點云數據,可單獨使用,也可以多臺雷達連接使用。在本次實驗中,通過使用TCP/IP通信技術實現電腦與設備的聯網參數設置,MDB-21C型激光雷達使用波長為905 nm的紅外激光對被測物體的距離、速度進行測量,并且激光光束肉眼不可見[6]。該激光雷達[7]是由信息處理系統、紅外激光發射器、光學接受機等器件組成。本試驗所用的激光雷達設備如圖2所示。

圖2 二維激光掃描儀實物圖
為了免掃描過程中,豬只的劇烈運動對測量結果造成較大誤差,在出欄口設置一塊約10平米的空間如圖3所示,用于搭建掃描設備,并放置豬只飼料與飲用水,待豬只處于平和安靜的狀態時迅速掃描。

圖3 掃描環境示意圖
由于MDB-21C激光雷達供電電壓范圍在9~28 V,本試驗選取的直流電源模塊,將220 V電壓轉為12 V,電流為1 A。
本系統軟件設計流程圖如圖4所示。豬只體重測量系統軟件部分利用QT creator4.10開發編輯器、C++語言進行開發。通過TCP/IP通信原理連接激光雷達;設置激光雷達掃描范圍、高度等參數;將激光雷達掃描物體獲取的點云數據進行采集與解析;然后將采集回來的數據進行預處理;實現三維點云生成并建立三維模型;最后由三維模型計算體積體重并顯示結果。

圖4 系統軟件流程圖
本文使用兩臺激光雷達同時工作,為了避免兩臺激光雷達的測量相互干擾,在各自特定的掃描角度上產生誤測量數據。因此,通過調整激光雷達的激光掃描面高度或俯仰角度,避免出現測量誤差[8]。本實驗中兩臺激光雷達垂直高度差34 mm。
以水平地面安裝方式為例,MDB-21C激光雷達的底面安裝高度h與有效工作距離的關系為公式(1):

(1)
其中:h0為 MDB-21C 的出光光軸相對于底面的高度,h0=0.081 m;r0為光斑出口直徑,r0=0.008 m;α為光斑發散角,α=0.012 5。
考慮到激光雷達采集角度問題及單只豬平均體高為91.8 cm,體寬為48.7 cm,臀高為93.7 cm,臀寬為50.5 cm,綜上所述,在豬舍出欄口設置安裝雷達高度分別為1.2 m和1.234 m,間隔0.8 m左右,兩臺激光雷達的掃描范圍為60°~110°。該安裝位置保證了在豬舍單通道出欄口一只豬的出入,從而使激光雷達掃描回來的數據減少誤差,提高精度。
此外,設置分辨率0.25°、掃描頻率25 Hz時,可以達到精確掃描豬只,減少干擾數據產生的效果。
3.2.1 數據采集與解析
在豬舍出欄口安裝激光雷達對標定被測物發射激光束掃描被測標定物如圖5所示。

圖5 被測標定物示意圖
該掃描儀的工作頻率為25 Hz,按0.25°分辨率發射出激光光束,掃描得到被測目標物的距離。可實時繪制出二維雷達圖對被測物進行標定[4],同時將激光雷達返回來的數據通過TCP/IP通信協議返回到PC端進行存儲[9]。
激光雷達返回的部分原始數據存儲文件中:
1)a5 96 ec f5為報頭識別碼;00 00 00 01 為報頭版本;09 00 00 00為連接編號;0a 00 00 00報文代碼;
2)a5 96 ec f5 00 00 00 01 01 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 87 96 ec f4為發送心跳包;a5 96 ec f5 00 00 00 01 09 00 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 86 96 ec f4為心跳回復;
3)LMD激光雷達測量距離數據信息:03 85;LMD-RSSI帶反射率的雷達測量數據信息:03 8F;請求LMD:07 6C;停止LMD:07 6E;
根據上述數據,需要對十六進制的原始數據去除報頭報尾處理轉化為十進制整型,然后將需要的點距離數據保存到新建數組。該數組是對掃描得到的距離值會自動保存到根目路徑,每一段分號隔開的數據代表的是激光雷達每幀頻率采集回來的所有點距離值,并且數據之間用逗號隔開的方式進行存儲,分號隔開的是連續掃描點次數。
在QT中使用的是Qthread類進行多線程對數據進行的處理,主要的步驟如下:
1)需要對路徑指定進行保存。
2)使用QT函數庫中的Send方法和Receive方法發送開始進行連續掃描的命令和接受指令接收雷達返回來的數據。
3)使用QThread類對象thread類開啟新的線程。在線程中,僅運行自定義的target方法,其中包含了一個while循環,在該循環內實行解碼。
4)創建thread2線程,繪制二維激光雷達圖。
通過以上步驟可實時對激光雷達掃描繪制二維雷達圖,并且將記錄得到的數據保存到根目錄路徑下。本系統該模塊開發使用了三個線程,在豬只三維建模體重測量系統中主界面使用的是主線程,其余兩個線程用于數據解碼和繪制激光雷達實時二維雷達圖像,并且在該系統中這三個線程穩定性較高,不易出錯。
3.2.2 數據去噪處理
由于X值和Z值的數據是轉換成三維模型視窗的坐標值,所以需要對X軸和Z軸模型上雜亂點云去噪。本系統設計噪點去除算法思路是為丟失的數據再次賦值,以6個物體表面二維點云數據進行去噪處理,其效果如圖6所示。在這里本文結合激光雷達的掃描特點和豬舍真實場景進行設置轉換,具有針對性,因此,該算法只能適用于本套系統三維模型創建部分。

圖6 噪點示意圖
在圖6中,在X軸和Z軸之間分布了6個大小不一樣的距離值,而斜線代表的是被測目標物體,這六點本來應該在斜線附近。在圖中可以看出第3個點和第5個點分別X值和Y值為零,這兩個點我們稱之為噪點,會影響我們后續的三維建模。所以本系統基于平均值的方法,將第3個點重新賦值,該方法的設計思路是將前一個點2和后一個點4的Z軸相應的數據相加,然后取平均值賦值給點3,點4和點6距離數據相加然后取平均值賦值給點5,這種賦值方法可以有效的還原點云數據。同時還能保證三維模型建立的準確性,也保證了系統點云計算效率。
三維視窗模型框架是基于QT軟件中的QT3D框架創建完成,QT3D框架對OpenGL進行了封裝處理,同時支持PLC濾波庫,為構建三維場景提供了一種全新簡潔的方式,開發者可以對已經封裝好的類,在三維視窗的框架上快速增加多種渲染方式,可以方便直觀的呈現出物體的三維模型;然后根據3DMax對Obj文件與QT3D框架交互實現繪制物體三維模型的建立;最后通過左右兩個激光雷達掃描得到的點云拼接形成完整的三維模型。
3.3.1 三維點云的坐標值生成
根據本論文中二維掃描技術的研究,通過掃描物體的三維數據轉化建立豬只三維模型,首先是以激光雷達0.25°分辨率、25 Hz的頻率發射激光束,三維模型中X坐標軸表示為目標物體關于X軸上的點云距離數據。對于X軸物體點數據獲取,是兩臺激光雷達水平距離值(兩臺激光雷達水平距離相差0.8 m)減去到豬只表面的激光束間余弦值的水平分量。而對于Y值的獲取,本系統通過掃描物體的狀態信息獲取其沿Y軸方向的運動狀態數據,因此Y軸運動動態數據表示的是物體在運動完雷達掃描范圍時間內進行位置變化數據。通過激光雷達每一幀掃描獲得100個點,而求取Y軸取決于多長時間內豬只掃描完成時循環了多少幀。對于Z軸物體點數據獲取,通過求得第一條垂直于地面激光束與第二條射到物體表面的激光束之間正弦值的差值,得到物體表面第一個點的Z軸。

(2)
通過得到Y軸的數據值與X軸、Z軸的數據值進行聯合解算,就可以得到目標物體的三維模型數據。
3.3.2 三維模型中干擾點云處理
在三維點云數據采集過程中,由于激光雷達鏡面反射干擾、操作人員的經驗等因素,采集到的原始點云數據中都會存在著一些噪聲點,這類干擾點云通常都會在三維點云模型表面顯示。本文將區別于被測目標物點云模型的其他點云統稱為干擾點云。
干擾點云處理的常用方法是濾波降噪。通過一般的算法分割出目標物體的點云數據,不可避免地會產生一些噪聲點,并且得到的噪點幅度比較大。為了得到構建精準的三維模型,需要對噪聲點進行濾波處理。
在研究了各種去噪濾波器[11]的基礎上,本文系統決定采用統計濾波器對掃描得到的三維模型進行濾波降噪。該算法是通過點云數據中所有點與鄰域點的平均距離滿足高斯分布,可以通過距離的均值和方差確定距離閾值[12]。當獲得的點云數據大于閾值的話,表明這個點為噪點并剔除。本算法分為以下兩步操作:第一,遍歷文檔中所有點云數據,計算每個點和K個鄰域點之間的平均距離。第二,計算所有平均距離的標準差σ與均值μ,得到閾值dth。如公式(3):
dth=μ+α·σ
(3)
σ表示常數,可稱為比例系數(本文α取值0.8~1.0);最后,再次遍歷點云,將與K個鄰居點的平均距離大于dth的表面噪點剔除掉。
4.1.1 輪廓提取
通過計算點云的平均點距,在豬只三維模型中的鄰域點進行搜索和矢量估算,獲得后續處理所需的參數,點云將平面劃分并投影,最終獲得平面點云。在平面點云上,輪廓執行提取可以使用連通性決策和直線擬合獲得所需的直線輪廓[13]。通過對特征點提取進行對三維模型的平面分割獲取豬只外部線性輪廓,方便接下來計算應用。圖7是對被測豬只背部獲取的輪廓圖。

圖7 豬只背部輪廓圖
4.1.2 特征點提取
三維模型中特征點的提取是通過鄰域中該點與其他點的關系特征完成的。Zhang等人根據平面曲率,提出了LOAM算法[14]。通過點云的三維坐標值來區別平面點。提高了特征點的提取效率,同時也保證了正確率。根據LOAM算法中的鄰域點之間形成的局部平面曲率來進行特征點提取。如公式(4):
(4)
特征點的提取是為了進行三維建模中配準校正,而在選取特征點的時候應選取最具有地面、背景等代表性的點云。在點i處曲率c中,Sn為分布在點i周圍的n個連續點的集合。當掃描環境較復雜的場景下,對特征點的選取應根據局部平面曲率特征在鄰域中點大小排序的類型。為了后續簡化計算,將點i周圍的n個連續點的集合和通過反函數求得該點在雷達的俯仰角度ai表示在點i處的曲率ci,如公式(5)所示。
ci= |∑j∈S,j≠i(X(k,j)L-X(k,j)L)|
(5)
在對局部平面曲率點計算時,曲率ci值越小,代表選取的特征點所在的局部平面越平坦。曲率越大,代表選取的特征點所在的局部平面越不平坦,如圖8所示。

圖8 點i的局部曲率計算示意圖
對特征點的提取,應選取最能代表所處環境特征的點。在保證該雷達每一幀掃描豬只獲取點云的同時,將選取的特征點均勻分布在每一個掃描平面中。通過對特征點的計算將索引每一幀掃描平面分為m個子區域,根據特征點曲率[15]將每一個平面中的點按公式(5)大小排序。選取最大值的點作為不平坦點,最小值的點作為平坦點,直到激光雷達完成最后一幀掃描結束。
4.1.3 地面點云剔除
由于上述操作是通過實地去豬場掃描采集到的數據做出的預處理,構建豬只三維模型,發現存在大量的地面點云。如圖9所示激光雷達掃描得到的豬只模型所示。我們需要把被測目標物從三維模型中分離出來,也就是將地面點云剔除。所以接下來的工作將需要從三維視窗構建的豬只三維模型中刪除不必要的背景點云以及地面點云,為了提高系統對點云的運行效率、體重計算精度,因此需要減少數據量。

圖9 豬只點云模型
剔除地面點云[16]主要步驟包括如下。
1)柵格化原始點云:
將原始點云投影到X-Y二維平面上,分別找到X軸和Y軸數據最大值和最小值,分別記為Xmax、Xmin、Ymax、Ymin,該X軸和Y軸的范圍為[Xmin,Xmax],[Ymin,Ymax]。然后初始化單元網格的長度為Xt,Yt,將所測點云分成若干個mn的網格,每個網格用坐標(Di,Dj)表示,如公式(6)、公式(7):

(6)
Di∈[1,m]
Dj∈[1,n]
(7)
2)平均高度計算:
計算Z軸平均距離值大小,找出每個網格中占總數1/4最小距離值的點,計算這些點的平均高度值Zave,根據豬只的現實平均高度設置一個B值,在平均高度值Zave和ZaveB之間的點云求出平均值Zave2。
3)地面點去除:
設置閾值s,前期工作中對人工測量豬只體高的平均值為91.8 cm,在Zave和Zave2區間做差,如果差值小于所設的閾值說明點云在三維模型構建相對穩定。因此在區間[Zave,Zave+B]內的點云就是豬只在進行掃描完成時的地面點云,并去除地面點。
4)迭代優化:
為了提高試驗三維建模的準確度,需要在Zave和Zave2區間內的差值與所設的閾值做對比,該閾值的區間內的數據將縮小點云所在網格的大小,循環以上操作步驟,直至剔除掉地面的點云數據為止。
經過上述預處理,提取出豬只個體的點云數據,地面點云剔除效果如圖10所示。

圖10 地面去除豬只三維模型
點云模型體積計算是對本系統三維視圖模塊并根據Delaunay三角網原理,對所測目標物進行三維建模[17],將該模型進行三角網劃分,可以在三維模型中得到若干三角形網格,三角形網格的面積被記做S△。構成的三角形網格與被測物模型中的點云一一對應,可以得到若干個三棱柱,被測目標物Z軸坐標相鄰三個點平均值被記做三棱柱的高h,如公式(8)所示。
h=1/3*(Zi+Zj+Zk)
(8)
根據底面積和高,可以得到三棱柱的體積,如公式(9)所示。
VΔ=SΔ*h
(9)
根據上述公式可以對被掃描豬只的三維模型分割成若干個三棱柱,本系統通過計算各個三棱柱的體積并累計加和,即可得到所掃描豬只三維模型的體積結果,如公式(10)所示。
V總=∑VΔ
(10)
本節通過對10個大小不同的方形不銹鋼材質的標準物體,掃描并構建的三維模型進行體積計算,對該系統體積計算模塊進行測試分析[18]。其中,當標準物體與激光雷達的距離為0.8 m時,其測量模型體積數據與真實體積值誤差分析,如表1所示。

表1 規則物體測量與真實值誤差
通過對10個不同大小標準物體進行體積計算,該體積測量數據與實際體積對比,得到誤差在±5%以內,并且精度達到了本試驗設計的初期預想。
本次試驗場地采用的是磚塊與鋼材的復合結構構建,場內配有養育室,飼料投放室以及休息室。場內有吊頂,地面使用的是帶有網絡形狀具有漏縫的地板,墻中安裝有保溫層,場內南北方向安置窗戶,墻的北面配置進氣口,南墻順序配置四臺同規格風機。在此場中的每個豬欄長4 m、寬3 m,同時安裝自動喂食裝置以及自來水管。
通過前期對激光雷達部署研究,使用豬只體重測量系統完成對參數的設置,并對豬舍內17頭豬只出入出欄口飲食處,完成掃描并構建豬只三維模型、體積計算,不同豬只的掃描三維模型如圖11所示。

圖11 不同豬只三維點云模型
根據豬只測量體重系統通過現場測量并構建豬只三維模型、體積計算結果如表2所示。根據表2數據繪制散點圖如圖12所示。

表2 測量結果

續表

圖12 豬只體重體積散點圖
由圖12中趨勢線可看出,豬只測量體積與實測體重數據呈線性關系。因此擬合函數可寫成式(11):

(11)
其中:
(12)

(13)
(14)
因此,得出數學模型關系式如式(15)所示:
y=83.389 54x+32.519 33
(15)
該公式中,y值為豬只體重(kg),x值為測量豬只體積(m3)。擬合直線如圖13所示。

圖13 豬只體重體積擬合直線
擬合函數整體擬合度由擬合度進行衡量,R2最大值為1,越接近于1,說明函數的擬合度越好,公式如式(16)所示:
(16)

在豬場中,通過豬只測量體重系統對另一豬舍內20頭豬只進行掃描,并將獲取得到的體積結果代入豬只體重回歸線性方程中得到豬只體重,與豬場給出實測豬舍數據對比分析,如表3所示。

表3 測量豬只體重結果
從表3可知,通過對本系統測量該20頭豬只的體重數據與豬舍管理人員給出人工實測豬只體重數據進行誤差分析,得出誤差在±8%范圍內[20]。整體看來,該豬只體重測量系統可以有效對豬只進行測量,并且精度較高、誤差相對較少,為后續非接觸式測量豬只體重提供理論和實踐依據。
豬只的體重參數直接影響了豬只的健康生長,為提高豬只的養殖福利,減少接觸式測重操作對豬只產生的刺激性行為,本文利用激光雷達測量動態物體的精準特性[21],通過開發設計的豬只體重測量可以獲取到豬只體積和體重等參數內容,對提高動物福利提供實質性幫助。同時由于本文所設計的豬只體重測量系統探索研究還處于初級階段,因此還需繼續研究的工作內容有:
1)在本系統的設計和實現時,本文采用的是C++語言編譯運行,利用分辨率為0.25°,工作頻率為25 Hz的激光雷達進行連續掃描。由于掃描產生的點云數據量較大,可以對數據解碼和存儲做出進一步優化,以滿足更多場景需求。
2)可以結合A超測量技術對活體豬的背膘厚和眼肌厚進行測量,為提高豬只測量體重計算精準度提供幫助。
3)本系統采用兩個激光雷達同時進行掃描,通過正反掃描豬只數據并拼接的建模方式,建議以后的工作者,考慮在多雷達多方位進行掃描來進行研究。