成奇龙,郭 锐
(1.中国科学院a.沈阳自动化研究所;b.机器人与智能制造创新研究院,沈阳 110069;2.中国科学院大学计算机科学与技术学院,北京 100049;3.辽宁省智能检测与装配技术重点研究室,沈阳 110179)
随着点云技术的发展,越来越多的领域,如自动驾驶、医学影像、城市规划、地理测绘等都可以利用点云去解决实际问题,同时点云也可应用于重建、定位、检测、测量,本文主要利用点云数据实现测量弹簧参数的功能,弹簧是机械生产中重要的零部件,其结构特点以中心轴成螺旋对称,从侧面各个方向投影后的形状基本一致,螺旋弹簧的检测参数主要是长度、直径、垂直度及节距,通常对于长度、直径的测量利用游标卡尺等测量工具,测量精度为20 μm,对于垂直度测量通常利用1级精度直角尺或专用量具测量,在无载荷状态下,弹簧绕宽座角尺自转一周后检查另一端(端头至1/2圈处考核相邻第二圈)外圆素线与直角尺之间的最大距离来衡量垂直度[1-9],至于节距,由于节距间隙狭小,不便于采用工具测量方法,一般通过公式ρ=l-d*n/(n-1)计算,其中l为弹簧总长;d为弹簧钢丝直径;n为弹簧圈数,因而节距的测量存在误差叠加,对于弹簧的传统测量方法需要人工介入,并且测量耗时耗力,现阶段对于小型零部件的测量方法大多利用二维图像技术,梁严、尤中桐等[10-15]利用图像处理技术测量丝杠的螺距,实现了丝杠节距测量的自动化;但二维图像只能获取弹簧平面结构,并且需要多次多角度拍摄,才能得出具有统计意义的结果,如张玉纲等[14]设计了基于视觉测量原理的弹簧同心度垂直度在线测量系统,该系统从多旋转位置拍摄弹簧图像,通过二维图像提取垂直度信息,而垂直度作为一种三维信息,而空间性是点云固有的性质,所以通过点云获取垂直度是具有研究性的,因此基于PCL点云处理,本文提出一种自动测量弹簧参数的算法,通过样件对该方法的可行性进行了试验,并对结果精度进行了评价。
需要测量的弹簧参数有长度、直径、垂直度及节距,以下将分步描述各参数的测量方法。
采用线结构激光传感器获取弹簧点云数据,如图1所示,本实验采用米铱线结构激光传感器,其工作原理为直接三角法[3],原理如图2所示,相机坐标系O-XYZ的Y轴垂直纸面向内,向待测物面表面某点P方向投射光线,投射角可以通过外参数标定获取,像点位置p在图像上提取,结合相机的内参数标定结果,即可交会获得P在相机坐标系下的三维坐标。通过该设备获取的弹簧侧面点云及端面点云如图3和图4所示。
图1 试验台 图2 三角法原理示意图
图3 通过试验台获取 的弹簧端面点云 图4 通过试验台获取 的弹簧侧面点云
首先,通过试验台扫描得到的点云数据存在无关点及噪声点,所以第一步需要进行滤波处理,条件滤波将满足给定条件的数据保留,不满足条件的数据剔除,通过该滤波方式可以剔除支撑样件的平台点云,获得样件的独立点云;统计滤波对每一个点的邻域进行一个统计分析,计算它到所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状是由均值和标准差决定,那么平均距离在标准范围(由全局距离平均值和方差定义)之外的点,可以被定义为离群点并从数据中去除,因而统计滤波可以去除离群点得到较为纯净的样件点云如图5和图6所示。滤波预处理结束后,可进行4大参数的测量。
图5 经滤波后纯净 的弹簧端面点云 图6 经滤波后纯净 的弹簧侧面点云
1.2.1 半径的测量
利用端点云获取半径参数,点云形态如图5所示。算法步骤为:
步骤1:通过ransac算法[1]提取出端点云中的端平面点云P;
步骤2:对端平面点云,用ransac算法先拟合出端面的初始3d圆;
步骤3:计算点到通过圆心且与圆法向量平行的直线的距离d,如式(1)所示,若d大于半径则作为“圆外点”加入圆外点集C中;
步骤4:对圆外点集通过ransac算法拟合出3d圆,重复步骤3;
步骤5:直至圆外点集的个数少于设定值m,迭代结束。
(1)
式中,o为3d圆心;pi为圆外一点;n为过圆心的法向量,示意图如图7所示。算法流程图如图8所示。
图7 圆外点判断示意图
图8 半径测量算法流程图
通过该方法相较于直接提取边缘,拟合3d圆,获取半径更具有统计意义,避免端面边缘凸点或凹点的影响,拟合结果可视化如图9所示。
图9 拟合结果可视化
图中,点集(浅灰色)表示经滤波后的端点云,点集(深灰色)表示经RANSAC算法分割得到的端平面点云,点集(黑色)表示最终用于拟合3D圆的点云。
1.2.2 自由长度的测量
自由长度利用侧点云获取,点云形态如图6所示。
螺旋弹簧的外形结构可能有如图10所示的几种形态,为了避免不同形态下垂直度对长度的影响,在获取侧点云时,使螺旋弹簧的端面与试验台的YOZ面平行,才能使AABB包围盒底面与弹簧的端面平行。
图10 螺旋弹簧可能的外形结构 图11 侧点云的AABB包围盒
图11中,深灰色向量为包围盒底面法向量,深灰点与浅灰点为包围盒上下底面点集。
算法步骤为:
步骤1:AABB包围盒算法[6]获得侧点云的轴对称包围盒,提取包围盒的6个关键点;
步骤2:分别将位于某一侧的点组合成某一个点集,可获得两个各具有3个点的点集,用于确定包围盒的上下底面的面参数,在此标记为底面1与底面2;
步骤3:分别计算所有点分别到底面1与底面2的距离,与底面1距离小于设定值dmin1的点纳入一个点集1,与底面2距离小于设定值dmin2的点纳入一个点集2;
步骤4:查询点集1中点的数量,若小于阈值m,则以L的步长放宽距离设定值,重复步骤3,点集2进行同样的操作,直至满足点数阈值,迭代结束;
步骤5:点集1、2分别利用RANSAC拟合平面,计算面间距离为弹簧长度。
面间距离的计算公式:
(2)
式中,n1、n2分别为点集1与点集2中的点的个数;P1、P2分别为点集1与点集2最终拟合的平面模型;dist(p,P)为点p到平面P的距离。
算法流程图如图12所示。
图12 自由长度测量算法流程图
1.2.3 垂直度的测量
依据垂直度的定义,方向公差中控制被测要素与基准要素夹角为90°的公差要求,这里以包围盒的底面法向量为基准,主成分分析法分析法获得侧面的轴向主方向,计算二者之间的夹角衡量垂直度。
数据集N中有n个点,pi∈N,pi=(xi,yi,zi),标准化:
(3)
(4)
(5)
计算相关系数矩阵:
计算主方向:
计算R的特征值λ1、λ2、λ3与特征向量μ1、μ2、μ3,若λ1>λ2>λ3则λ1对应的特征向量μ1为轴向主方向,λ3对应的特征向量μ3为径向主方向,包围盒的底面法向量为n,则垂直度夹角:
(6)
1.2.4 节距的测量
螺旋弹簧节距的定义为弹簧相邻两圈对应点在中径上的轴向距离。
通过侧点云数据可估计出每个点的法线特征,查询其法向量与轴向主方向的夹角在90°及其±Δ范围内的点加入点集C命名为节距点集,将C中的点向径向主方向投影,获得新的点集M,M内的点用于拟合节距线,M点集是由多个节距点簇组成,故利用DBSCAN算法[2,13]分离出各个点簇,对每一团点簇利用RANSAC算法进行直线拟合,计算相邻线间的距离取平均作为节距值。相邻线间的距离采用取样法求取,即在其中一条直线上取若干点求到另一条直线的距离,求平均。
图13 侧点云的轴向主方向与径向主方向 图14 节距线点簇
本文在Windows平台上采用C++编程语言结合PCL[12]实现了弹簧参数测量算法,对样件的测量结果如表1所示,运行时间为17.032 s。
表1 手动测量方法与本文算法测量结果对比
本文针对半径的测量,提出了一种外径测量算法,该算法不仅可用于弹簧外径的预测,同时对于管状工件的外径测量均适用,另外,就节距测量点簇聚类,发现基于密度的DBSCAN算法较K-Means聚类算法,更能剔除噪声点,使节距点簇更纯洁,节距计算精度更高,相对于传统的人工测量结果,通过本文算法获得的各参数精度均在3%以内,达到了工业生产要求,提高了自动化生产水平,减少了人力物力的投入。