郭小凤,谷亚宁,谢瑞洁
(山西农业大学 信息科学与工程学院,山西 太谷 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)本系统采用两个激光雷达同时进行扫描,通过正反扫描猪只数据并拼接的建模方式,建议以后的工作者,考虑在多雷达多方位进行扫描来进行研究。