Content area
Full Text
1 引言
21世纪以来,随着机器人技术快速发展,机器人的应用越来越广泛。工业上,工人往往需要完成大量的搬运装配工作,使用机器人可以提高工厂的工作效率,降低工人的劳动强度。机器人能感知到物体的位置,实现抓取物体是完成这些任务的前提,而机器视觉是解决这个问题的有效方法之一,也是目前机器人领域的研究热点之一。
机器人通过机器视觉实现对物体的识别与跟踪,从而完成抓取工作。传统的检测识别跟踪技术有基于二维图像信息的,基于三维点云图像信息的和基于QR-Code等,这些方法已经得到广泛的运用。Collet[1]等人设计了一种基于视觉的感知系统,它能够在杂乱场景中进行物体识别和姿态估计。同时,它还可以实时检测多个物体已经相对应的六自由度姿态。Munoz[2]等人针对无纹理的物体识别定位,提出RAPID-HOG算法。该方法运用线性预测的方式估计出物体的3D姿态,利用方向梯度直方图(histogram of oriented gradient,HOG)特征增加系统的鲁棒性,具有位姿计算速度快、稳定性强等特点,很好地实现了无纹理物体的定位。Zhu[3]等人提出了一种基于三维物体的图形信息来检测定位三维物体的方法,通过匹配模型边界的轮廓和超像素,对图像中的物体进行分割与定位,在室内室外都具有良好的识别效果。Lai[4]等人提出一种多层内核描述子算法,对RGB-D数据库中的图像提取出图像特征并匹配识别,得到了较好的识别效果。Rusu[5]等人提出一种基于随机采样一致性的配准算法,运用FPFH特征描述子进行配准,对物体的识别定位具有良好的效果。Braun[6]等人提出了一个Pose-RCNN模型,将3D数据用于区域卷积神经网络中,估计出物体的位姿并具有良好的识别定位效果。Pavlakos[7]等人将语义关键点与具有变形物体模型的卷积神经网络结合,可以估计出物体的位姿,同时该方法对有纹理和无纹理的物体都适用,对变形或者遮挡的物体也具有良好的识别估计物体位姿的效果。
但现有的研究方法中大多数的图像信息来源单一,基本来源于一种类型的图像,随着场景的复杂化,传统的方法存在图像信息不全、识别误差大、准确率低等缺点。为解决这一问题,融合多个信息来对物体进行识别定位势在必行。
物体的位姿(pose)由位置(position)和方向(orientation)组成,位置表达物体距离参考坐标系的偏移量,方向代表物体相对参考坐标系的偏转角度。本文提出一种基于多模态信息的视觉识别与定位算法,结合二维图像定位识别与三维点云图像定位识别的方法,完成了对物体的识别与抓取,从而验证了融合多个信息对物体进行识别定位是可行的。算法的整体设计框架如图 1所示,主要包括二维图像识别跟踪和三维图像旋转估计。
[Image omitted: See PDF]
2 二维与三维图像识别跟踪算法 2.1 二维图像识别跟踪
二维图像识别跟踪是本算法的主要组成部分之一,包括物体识别与物体跟踪两部分,主要完成对物体的位置定位。
2.1.1 物体识别
在二维图像处理中,通过轮廓来识别物体是常用的方法之一。本文采用匹配二维图像中的物体轮廓与3D模型的轮廓,实现物体的识别。
首先使用彩色相机采集二维图像,然后再用Canny算子[8]进行边缘检测处理。由于处理后的图像中包含许多轮廓线,轮廓线存在直线与弧线,因此本算法使用最短路径搜索法[9]搜索相距最近的直线与弧线,形成闭合的轮廓线,相邻的闭合轮廓线形成简单的图形[10]。例如立方体可以认为是三个矩形的组合,圆柱体可以认为是两个圆与两条平行线的组合。图形轮廓形成的流程如图 2所示。
[Image omitted: See PDF]
在进行Canny算子边缘检测时,假设f(x, y)代表输入图像,G(x, y)代表高斯函数,则:
\( G(x, y) = \exp \left( {\frac{{{x^2} + {y^2}}}{{2{\sigma ^2}}}} \right)。\)(1)
然后对G和f做卷积运算,得到平滑度较好的图像fs:
\( {f_{\rm{s}}} = G(x, y) * f(x, y), \)(2)
使用一阶有限差分法计算偏导数,得到矩阵P和Q:
\( \begin{array}{l} \mathit{\boldsymbol{P}}[x, y] \approx \frac{{{f_{\rm{s}}}(x, y + 1) - {f_{\rm{s}}}(x, y)}}{2}\\ \;\;\;\;\;\;\;\;\;\;\;\; + \frac{{{f_{\rm{s}}}(x + 1, y + 1) - {f_{\rm{s}}}(x + 1, y)}}{2}, \end{array} \)(3) \( \begin{array}{l} \mathit{\boldsymbol{Q}}[x, y] \approx \frac{{{f_{\rm{s}}}(x, y) - {f_{\rm{s}}}(x + 1, y)}}{2}\\ \;\;\;\;\;\;\;\;\;\;\;\; + \frac{{{f_{\rm{s}}}(x, y + 1) - {f_{\rm{s}}}(x + 1, y + 1)}}{2}。\end{array} \)(4)
计算P与Q的幅值和方位角:
\( M(x, y) = \sqrt {\mathit{\boldsymbol{P}}{{[x, y]}^2} + \mathit{\boldsymbol{Q}}{{[x, y]}^2}} , \)(5) \( \theta (x, y) = \arctan \left( {\frac{{\mathit{\boldsymbol{Q}}[x, y]}}{{\mathit{\boldsymbol{P}}[x, y]}}} \right)。\)(6)
通过设定阈值θ的大小,获取不同尺度要求下的图像边缘轮廓。
2.1.2 物体跟踪
物体的跟踪主要分为边缘轮廓跟踪与表面纹理跟踪。本文采用边缘轮廓跟踪与表面纹理跟踪相结合的方式,具体实现过程如下:
1) 建立投影关系:首先,按2.1.1小节中所述方法,获取简单图形的轮廓。然后获取简单图形内的图像,称之为正投影。再将简单图形的轮廓与3D模型轮廓做匹配处理,获取与3D模型相对应的简单图形。最终,将对应的简单图形的图像再投影到与之相对应的3D模型面上,建立一种投影关系,其过程如图 3所示。在不同的视角下,重复上述方法,直到3D模型每个面都与图像建立投影关系,最终将得到一个含有图像的3D模型[11]。
[Image omitted: See PDF]
2) 边缘轮廓跟踪:先通过彩色相机采集含有待测物体的二维图像,再使用2.1.1中的方法来匹配待测物体的轮廓,进而得到轮廓跟踪的结果。
3) 表面纹理跟踪:首先提取含有待测物体图像与3D模型图像的SIFT特征,再进行匹配以得到表面纹理跟踪的结果。
4) 轮廓与纹理跟踪融合:将轮廓跟踪和纹理的结果相融合,取两者的加权平均值作为最终的跟踪结果。
在SIFT特征点检测时,会检测到错误的特征点,这些点会影响之后的匹配精度。为了排除错误的SIFT特征点,提高物体的定位精度,定义了一个阈值ρ,如式(7)所示:
\( \rho (O|m, {f_t}) = \frac{{{n_{{\rm{inlier}}}}}}{{{n_{{\rm{det}}}}}}, \)(7)
其中:Q代表待测物体,m代表待测物体的模型,ft代表当前帧的图像。在待测物体的图像像素内的所有SIFT点用ndet表示,而符合匹配条件的SIFT点数用ninlier表示,两者的比值用ρ表示。比值ρ越大,待测物体的定位可信度越高,反之则可信度越低。实验中,给ρ设定一个值,当超过该值时表示定位可信;当低于该值时,略过该帧图像,进入下一帧图像重新定位待测物体。通过轮廓匹配与SIFT特征匹配,获取位姿信息。本算法取其中的位置信息用于最终识别定位,从而引导机械臂到达待测物体的相应位置,略去获得的方向信息。
2.2 三维图像识别跟踪
三维图像跟踪识别是算法的另一个主要组成部分,包括点云图像获取、聚类分割、计算VFH视点特征直方图、生成特征列表和实时识别,主要完成对物体的旋转方向估计。
2.2.1 获取点云图像
在进行三维图像识别跟踪时,首先需获取包含待识别物体的点云图像,本文采用RGB-D相机获取当前实验环境中的点云图像信息。由于是通过三维点云的方式处理图像,所以可以不考虑物体的形状与颜色,但必须将物体置于一个平面台上。
一幅点云数据除了包含待测物体的点云聚类,还包括其他物体的点云聚类、背景聚类、噪点等。原始点云数据较大,会影响之后的计算,所以需要对点云数据进行预处理。原始点云中存在着大量的噪点,会影响待测物体的点云聚类分割,通过统计学滤波方法可以进行降噪处理。此外,通过直通滤波器可以除去原始点云中的背景点云,降低分割待测物体点云的难度。
运用RGB-D相机采集到的点云数量在几十万个,一些精度高的相机获取的点云可高达几百万个[12]。虽然经过前期的去噪滤波处理已经降低了点云的数量,但是剩余的点云数量依然很庞大,会影响后期分割的速度,需要进行下采样处理,减小点云数量,提高后期的分割速度。将点云分为边长为L的立方体栅格,该栅格内的点都用该栅格内点集的重心来表示,这样就可以大大减小点云的数量。图 4(a)为RGB-D相机获取的原始点云图像,图 4(b)为预处理后的点云图像。
[Image omitted: See PDF]
2.2.2 聚类分割
在PCL(point cloud library)[13]中有欧式聚类分割,基于随机采样一致性分割,区域生长分割,最小分割与基于颜色和法线的分割等。由于本实验是在平台上实现抓取,所以采用欧式聚类分割就可以达到很好的效果。本文进行欧式聚类分割算法的基本流程如下:
1) 对输入的场景点云P建立三维的KD树,并建立一个空的聚类{Oi}和点队列Q。
2) 对于每个点pi∈P,执行下面的步骤:
a.将点pi放到当前查询队列Q中。
b.对每个点pi∈Q,搜索点pi的邻近点集pik,使其满足:
\( {\rm{||}}p_i^k - {p_i}|| \le d\;, \;p_i^k \in P_i^k。\)(8)
如果每个邻近点pik没有被处理过,就将邻近点pik添加到队列Q中。循环处理该过程直到队列Q中的所有内点被处理过。
c.把队列Q作为聚类Oi推入到聚类列表{Oi}中,并清空队列Q。
3) 不断重复步骤2),直至输入点云P中的所有内点被处理。
将预处理后的点云经欧式聚类分割,可以移除平台平面,得到单个物体的点云,结果如图 5所示。
[Image omitted: See PDF]
2.2.3 计算VFH视点特征直方图
在聚类分割处理后,需要计算视点特征直方图(viewpoint feature histogram,VFH)。VFH视点特征直方图是基于FPFH[14]的一种特征描述子。假设有一个点云集{O},Pk代表点云集中某一点p的k个邻域内的点集,Pa和Pb为其中两点,na和nb为这两个点的法线,为了计算他们的偏差,在其中一个点上定义一个固定的局部坐标系uvw,其中:
\( u = {\mathit{\boldsymbol{n}}_a}, \)(9) \( v = u \times \frac{{{P_b} - {P_a}}}{{||{P_b} - {P_a}|{|_2}}}, \)(10)