一种基于密度聚类的无人艇水上球体检测方法与流程

文档序号:26141449发布日期:2021-08-03 14:26阅读:118来源:国知局
一种基于密度聚类的无人艇水上球体检测方法与流程

本发明属于激光雷达点云处理技术领域,具体涉及一种基于密度聚类的无人艇水上球体检测方法。



背景技术:

无人驾驶船(unmannedsurfacevehicles,usv),简称无人船,是一种集合控制,通讯等多功能设备于一身的动力船体,可自主承担危险或特殊任务[3]。比如军事应用的情报搜索、反水雷、反潜攻击、海域巡逻等;民用上应用广泛,例如环境监测、搜寻救援、水文测绘、海事监管等。未来无人船有望完成远航运输任务,研制大型无人驾驶船舶一直是现代船舶应用的主流方向,例如无人驾驶编队航行的集装箱船舶等。实现船舶无人化不仅能执行很多危险工作减少人员的使用和伤亡,降低成本,同时也能降低船舶发生危险的概率。因为在船舶出现的事故中,90%左右的事故都是由人类自身引起。

在逆向工程中通过测量仪器得到的产品外观表面的点数据集合也称之为点云,通常使用三维坐标测量机所得到的点数量比较少,点与点的间距也比较大,叫稀疏点云;而使用三维激光扫描仪或照相式扫描仪得到的点云,点数量比较大并且比较密集,叫密集点云。

在传统视觉领域,物体检测是一个非常热门的研究方向。受70年代落后的技术条件和有限应用场景的影响,物体检测直到上个世纪90年代才开始逐渐走入正轨。物体检测对于人眼来说并不困难,通过对图片中不同颜色、纹理、边缘模块的感知很容易定位出目标物体,但计算机面对的是rgb像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上物体姿态、光照和复杂背景混杂在一起,使得物体检测更加困难。检测算法里面通常包含三个部分,第一个是检测窗口的选择,第二个是特征的设计,第三个是分类器的设计。随着2001年violajones提出基于adaboost的人脸检测方法以来,物体检测算法经历了传统的人工设计特征加浅层分类器的框架,到基于大数据和深度神经网络的end-to-end的物体检测框架,物体检测一步步变得愈加成熟。

目前水面目标物体检测的方法主要有计算机视觉和激光雷达扫描探测。然而图像检测有测量距离短、易受天气的影响、计算量较大。为了克服这些缺陷,人们开始关注激光雷达在水面目标的识别。三维激光雷达能够更好地表达水面物体的形态、距离,但由于无人船在水面运动易受到波浪和风的干扰而摇晃,从而导致激光雷达点云数据含有大量噪声、分布状况随船的晃动而变化,不便于后期处理。



技术实现要素:

为解决上述问题,本发明公开了一种基于密度聚类的无人艇水上球体检测方法,解决了在风浪条件下无人艇晃动导致激光雷达点云倾斜、含有较多噪声,从而难以提取球体点云、确定球体位置的问题。

上述的目的通过以下的技术方案实现:

一种基于密度聚类的无人艇水上球体检测方法,该方法包括如下步骤:

s1.从激光雷达获得点云数据;

s2.对获得的点云数据进行预处理,所述预处理包括坐标系转换、条件滤波、去除离群点;

s3.用ransac方法分割出水面点云数据;

s4.对剩下的点云进行dbscan密度聚类以区分不同的球体;

s5.对聚类结果进一步处理获得球体位置,在图中标注出来。

所述的基于密度聚类的无人艇水上球体检测方法,步骤s3中所述用ransac方法分割出水面点云数据的具体方法是:随机选取三个点确定一个平面,设置一个阈值,计算其他所有点距该平面的距离,若距离小于阈值的点认为是内点,否则为外点,内点数量最多对应的平面认为是最佳拟合平面,具体地,在同一平面上的点满足如下平面模型参数方程:

ρ:ax+by+cz=d(1)

式中:点(x,y,z)为点云空间坐标;(a,b,c)为平面单位法向量,且a2+b2+c2=1;d为坐标原点到平面的距离,从原始点云数据中分割平面,实则是求不同点云面的平面参数,建立好平面模型参数方程后,判计算点集中p(x,y,z)到平面的距离d为:

d=|ax+by+cz-d|(2)

设定点到平面模型距离阈值为τ,当距离d小于阈值τ时称为局内点,反之为局外点。

所述的基于密度聚类的无人艇水上球体检测方法,还包括对分割出来的点云进行合并的步骤,首先计算两模型平面上点p1、p2的法向量按式(3)计算两平面的夹角,然后按式(4)计算两模型平面的距离,若小于阈值τ1就合并两个平面区域。

具体步骤为:

(1)确定最小抽样数m并进行抽样;

(2)利用式(1)确立平面模型参数;

(3)对每个类中所有点利用式(2)计算距离d并与阈值τ进行比较,进行局内点与局外点判别;

(4)重复步骤(1)-(3),选取分割出局内点数最多的点集确定平面模型最优模型参数;

(5)运用式(3)与式(4)计算面片之间的法向夹角与距离,若小于阈值τ1说明为过度分割,需要将这两个面合并为同一平面。

所述的基于密度聚类的无人艇水上球体检测方法,步骤s4中所述对剩下的点云进行dbscan密度聚类以区分不同的球体的具体方法是:

输入:包含n个对象的数据库,半径e,最少数目minpts;

输出:所有生成的簇,达到密度要求;

(1)repeat;

(2)从数据库中抽出一个未处理的点;

(3)if抽出的点是核心点then找出所有从该点密度可达的对象,形成一个簇;

(4)else抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;

(5)until所有的点都被处理。

所述的基于密度聚类的无人艇水上球体检测方法,由于上述步骤的聚类结果还存在一系列问题,因此需要对聚类结果进行处理。聚类结果存在的问题和步骤s5中所述进一步处理的方法如下:

对于聚类后得到的结果,为了解决离群点被单独分为一类的情况,需要剔除离群点的那一类,首先规定一个点数阈值,点数小于阈值的类别不计;

为了解决残余的水面的点被单独分为一类的情况,需要剔除残余水面的那一类,由于水面点集高度差较小,所以只筛选高度差大于0.8m的类作为结果;

为了解决残余的水面的点和球同时被分为一类的情况,由于水面点集在球体点集下方,所以提取每一类前30%高度的坐标均值为球的坐标,就可以剔除大部分水面点的影响。

本发明的有益效果是:

在实验中证明了该方法能够适应无人艇在风浪干扰下的球体检测,能够很好地剔除倾斜水面点云和噪声对结果的影响,高效地提取球体点云、确定球体位置。

附图说明

图1是dbscan密度可达示意图。

图2是用rviz显示激光雷达点云的界面图。

图3是ransac水平面拟合效果示意图。

图4是检测结果示意图。

具体实施方式

下面结合附图和具体实施方式,进一步阐明本发明,应理解下述具体实施方式仅用于说明本发明而不用于限制本发明的范围。

基于密度聚类的无人艇水上球体检测方法,该方法包括如下步骤:

s1.从激光雷达获得点云数据;

在本实施例中,拟采用hesai公司生产的pandar20b激光雷达,基于ubuntu16.04和python3进行开发。

首先,安装相关驱动,解析从激光雷达获得的原始数据成点云格式,并以ros话题发布。

步骤如下:

(1)按照网站:https://github.com/hesaitechnology/hesailidar_general_ros安装驱动。

(2)编译后,运行代码:

$roscore

$sourceinstall/setup.bash

$roslaunchhesai_lidarhesai_lidar.launchlidar_type:="pandar20b"

项目启动后,将监控来自lidar的udp数据包,解析数据,并将点云帧发布到主题:/pandar下的ros话题中。

(3)运行rostopiclist命令可看到话题/pandar就是激光雷达的点云数据话题。

打开rviz软件订阅该话题,可以观察点云数据分布情况。注意,frame应当设置为“pandar20b”。

s2.对获得的点云数据进行预处理,所述预处理包括坐标系转换、条件滤波、去除离群点;具体地,将点云数据转化到平面直角坐标系下,以xyz形式保存。条件滤波指根据处理要求,根据大概的范围筛选出我们需要的点云(例如激光雷达扫描范围高达200m,而我们只关注100m范围内的点云)。离群点是指偏离正常点范围较大的异常点。在激光扫描时,由于测量误差等原因会产生一些稀疏的离群点。因此需要去除离群点。

在本实施例中,具体方法为:

(1)plointcloud2数据转换成xyz数据

首先初始化一个节点并订阅/pandar话题:

self.sub_points=rospy.subscriber("pandar",pointcloud2,self.callback_fun)

在回调函数中用(point_cloud2.read_points函数转化点云为xyz坐标点:

self.points=np.array(list(point_cloud2.read_points(msg_call,field_names=("x","y","z"))))

(2)剔除远距离建筑物等无关物体的影响

根据xyz范围粗略分割方圆100米内及低于6米的点云作为待处理点云;

ifz<6.0andabs(x)<60andabs(y)<60:points.append([x,y,z])

(3)去除离群点

s3.用ransac方法分割出水面点云数据;

由于无人船在水面运动,激光雷达扫描出的点云中有很大一部分是水面反射的点云,这些数据并不是我们感兴趣的,为了减少处理时间和避免这些点云对后续处理产生影响,我们需要分割出水面点云数据。ransac方法是最常见的点云平面分割方法。其基本思路是随机选取三个点确定一个平面,设置一个阈值,计算其他所有点距该平面的距离。若距离小于阈值的点认为是内点(平面内可能的测量值),否则为外点,内点数量最多对应的平面认为是最佳拟合平面。

在同一平面上的点满足如下平面模型参数方程

ρ:ax+by+cz=d(1)

式中:点(x,y,z)为点云空间坐标;(a,b,c)为平面单位法向量,且a2+b2+c2=1;d为坐标原点到平面的距离。从原始点云数据中分割平面,实则是求不同点云面的平面参数。建立好平面模型参数方程后,判别准则的设计至关重要,这里评定方法为计算点集中p(x,y,z)到平面的距离为:

d=|ax+by+cz-d|(2)

理论上,局内点到平面的距离为零,但是激光雷达点云数据无规则、分布不均匀,并不完全处在同一平面。平面模型是具有一定厚度点云的拟合面片,设定点到平面模型距离阈值为τ,该值应根据风浪情况适当调整(若水面平静,则取较小值0.1-0.5,若风浪较大,则取值较大,可根据多次试验结果进行调整)。当距离d小于阈值τ时称为局内点,反之为局外点。设置合理的阈值对点云平面分割具有重要影响,阈值τ过大会导致平面分割不完全,阈值τ过小会导致过度分割。

阈值的选取需要根据激光扫雷达精度,采集点云数据空间波动情况合理选取。考虑到距离阈值选取会影响分割效果,可能造成位于同一点云面片区域过度分割为多个小区域。为保证表面特征的完整性,需要对分割出来的点云进行合并。首先计算两模型平面上点p1、p2的法向量按式(3)计算两平面的夹角,然后按式(4)计算两模型平面的距离,若小于阈值τ1就合并两个平面区域(τ1取值应比τ小一点,根据水面条件、多次试验进行调整)。

具体步骤为:

(1)确定最小抽样数m并进行抽样;

(2)利用式(1)确立平面模型参数;

(3)对每个类中所有点利用式(2)计算距离d并与阈值τ进行比较,进行局内点与局外点判别;(4)重复步骤(1)-(3),选取分割出局内点数最多的点集确定平面模型最优模型参数;

(5)运用式(3)与式(4)计算面片之间的法向夹角与距离,若小于阈值τ1说明为过度分割,需要将这两个面合并为同一平面。

在本实施例中,具体方法如下:

is_good,points_ball,points_plane=self.ransac(points,sample_size=3,max_iterations=50,

stop_at_goal=true,nihe_threshold=0.01,points_plane_threshold=0.05)

参数介绍:

points待分割的点云数据

sample_size=3随机采样点数

max_iterations=50重复次数

stop_at_goal=true是否内点达到目标就结束(目标设为总点数*0.5,可调)

nihe_threshold=0.01内点判断阈值

points_plane_threshold=0.05水面判断阈值(由于波浪存在,这个值需要比内点判断阈值大一些)

is_good返回值,是否正确拟合水面

points_ball返回值,除了水面之外的点

points_plane返回值,筛选出来的的水面的点

s4.对剩下的点云进行dbscan密度聚类以区分不同的球体;

dbscan(density-basedspatialclusteringofapplicationswithnoise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。dbscan算法的特点是:

1.聚类的时候不需要预先指定簇的个数

2.最终的簇的个数不确定

假设我的样本集是d=(x1,x2,...,xm),minpts为单个簇内的最小点数,则dbscan具体的密度描述定义如下:

∈邻域:对于xj∈d,其∈邻域包含样本集d中与xj的距离不大于∈的子样本集,这个子样本集的个数记为|n∈(xj)|

核心对象:对于任一样本xj∈d,如果其∈邻域对应的n∈(xj)至少包含minpts个样本,即如果|n∈(xj)|≥minpts,则xj是核心对象。

密度直达:如果xi位于xj的∈邻域中,且xj是核心对象,则称xi由xj密度直达。注意反之不一定成立,即此时不能说xj由xi密度直达,除非且xi也是核心对象。

密度可达:对于xi和xj,如果存在样本序列p1,p2,...,pt,满足p1=xi,pt=xj,且pt+1由pt密度直达(t从1到t-1),则称xj由xi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本p1,p2,...,pt-1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。

密度相连:对于xi和xj,如果存在核心对象样本xk,使xi和xj均由xk密度可达,则称xi和xj,密度相连。注意密度相连关系是满足对称性的。

dbscan算法将数据点分为三类:

1.核心点:在半径eps内含有超过minpts数目的点。

2.边界点:在半径eps内点的数量小于minpts,但是落在核心点的邻域内的点。

3.噪音点:既不是核心点也不是边界点的点。

dbscan算法描述:

输入:包含n个对象的数据库,半径e,最少数目minpts;

输出:所有生成的簇,达到密度要求。

(1)repeat

(2)从数据库中抽出一个未处理的点;

(3)if抽出的点是核心点then找出所有从该点密度可达的对象,形成一个簇;

(4)else抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;

(5)until所有的点都被处理。

dbscan对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。

在本实施例中,具体操作如下:

ball_xyzd=dbscan_points(points,num_ball_points=50,eps=2.5,min_samples=10)

参数介绍:

points待聚类的点云数据(上一步去除水面后的点云)

num_ball_points=50聚类后球的类别最少点数

eps=2.5密度可达半径

min_samples=10一类的最小点数

ball_xyzd返回值,球的[x,y,z,d]d为距离

s5.对聚类结果进一步处理获得球体位置,在图中标注出来。

经过聚类的结果不一定是准确的,还存在一系列问题:

(1)残余的水面的点和球同时被分为一类

处理方法:取该类点的前30%高度的坐标均值为球的坐标,这样可以剔除水面点的影响。

(2)残余的水面的点被单独分为一类

处理方法:判断类的高度差,大于0.8m才认为有球。该方法不够严谨。

(3)离群点被单独分为一类

处理方法:不考虑点数较少的类。

在本实施例中,具体的处理方法如下:

(1)挑选个数大于num_ball_points的类别,挑选高度差大于0.8m的类别。

(2)找到该类最高30%的点,求坐标均值作为球的坐标并计算距离

本发明方案所公开的技术手段不仅限于上述实施方式所公开的技术手段,还包括由以上技术特征任意组合所组成的技术方案。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1