一、九点标定过程
1.算法原理
9点标定就是通过9个点计算出相机坐标系到机械手坐标系下的一个仿射变换,(实际上空间中的二维平面的仿射变换只需要3个点就足够了)。在实际应用过程中,需要获取像素下特征点的坐标和对应机械手的坐标。联立方程组求解即可得到对应仿射变换的矩阵,实际应用场景主要分为眼在手上和眼在手外,下面具体介绍使用过程:
(1)眼在手外
使用场景如图所示,该场景是一个上相机,9点标定经常是四轴机械臂或者是通过舵机搭建的X,Y两方向的运行机构与相机相互配合使用。无论是眼在手上还是眼在手外,目的都是获取对应像素点的坐标和机械手的坐标,然后通过数学计算,得到转换矩阵。
眼在手外获取机械手坐标的方式主要有两种:
第一种:1.准备一张A4纸,或者标定板也行
,
获取图像中9个圆的圆心的像素位置,存储起来,点的存储顺序是Z字形。
2.在机械手上加装针尖,用针尖按Z字形顺序依次去戳每个圆的圆心,并以此记录每个机械手的坐标。
该种方法标定效果误差较大,因为针尖去戳圆心的过程是肉圆观察得到的,结果并不是很准确的。
第二种:1,机械手吸取物料固定。
在相机视野中能观察提取到Mark(特征)点,对于Mark点是物料上稳定的特征,容易获取,类似交点,圆心等等。
2.机械手带动物料按照右图方式依次运动,获取9个点的机械手坐标和像素坐标。
该标定方法效果准确,但是需要注意的两点,一个是标定视野范围一定大于机械手的工作范围,
其中红色为视野中标定的范围,黑色为机械手的在视野中的工作范围,否在超过标定范围的误差较大,而且难预测。
另外,在标定过程中,实际的工作面高度和标定高度尽量一致,因为除了圆心镜头,我们使用的工业相机会随着高度变化,X,Y的坐标也会有误差。
(2)眼在手上
该种标定方式是机械手和相机不发生相对变化,让物料固定不动,相机依次去拍物料,获取Mark点的特征和对应机械手的坐标,存储起来。
2.代码介绍
*计算仿射变换矩阵 *机械手9点坐标X,Y数组 Rx=[] Ry=[] *像素坐标的x,y数组 px=[] py=[] vector_to_hom_mat2d (px, py, Rx, Ry, HomMat2D) *计算仿射变换矩阵的RMS affine_trans_point_hommat2d(HomMat2D,px,py,Rx_t,Ry_t) 其中Rx_t,Ry_t为仿射变换后对应计算出的机械手坐标。 Rx, Ry为实际标定时机械手的坐标,计算出距离偏差。 distance_pp(Rx,Ry,Rx_t,Ry_t,distance) 其中distance存储9点的坐标偏差 tuple_mult(distance,distance,data1) tuple_sum(data1,data_end) tuple_sqrt(data_end,RMS)
二、五点旋转中心标定过程
1.算法原理
在标定旋转中心之前应该理解为什么要标定旋转中心,通过上文可以对9点标定有个大概的理解,9点标定其实就是点与点的映射关系。当我们的旋转中心,吸嘴,特征点在一致的时候,我们可以想象成各点都是绕着特征点旋转,此时则无需标定旋转中心如下图所示:
但实际应用中,吸嘴和旋转中心并不一致,伴随着旋转中心转动,特征点也会移动,此时机械手的坐标并未发生并未发生变换,如果仍使用点点映射求出对应机械手坐标是错误,正确的方法是先绕旋转中心回正,在计算特征点对应的坐标。
标定旋转中心的方法:
机械手固定物料,在相机下依次转动5个角度,获取5个位置特征点的像素坐标,通过拟合圆心,求出圆心对应的像素坐标,在通过映射关系得到圆心对应机械手的坐标。
2.代码介绍
*将5个点对应像素坐标生成多线条轮廓 gen_contour_polygon_xld *将轮廓进行拟合生成圆,求出对应圆心坐标 fit_circle_contour_xld