上下双相机定位贴合【全场景的视觉标定讲解和halcon源代码】(4)

第一步,拟合点计算:
*九点标定的矩阵
HomMat2D:=[0.0202215, 3.43298e-005, -27.1543, 3.20314e-005, -0.0202298, 75.8988]
*旋转点集的像素坐标,例如如下
Prx:=[0,1,2,3,4,5,6]
Pry:=[0,1,2,3,4,5,6]

for Index := 0 to |Prx|-1 by 1
*通过矩阵转换一个点到另一点的算子
affine_trans_point_2d (HomMat2D, Prx[Index], Pry[Index], Qx, Qy)
Qrx[Index]:=Qx
Qry[Index]:=Qy
Endfor
最核心的一个算子:affine_trans_point_2d,就是一个矩阵转换点。
就是把一系列的像素点for循环转换为物理坐标点,用来拟合圆,
上面就算已经得到我们的物理的拟合点Qrx, Qry

第二步,拟合圆:
*拟合圆
*先生成轮廓
gen_contour_polygon_xld (Contour, Qrx, Qry)
*轮廓拟合圆,算法要选择’geotukey’,自己看说明文档
fit_circle_contour_xld (Contour, ‘geotukey’, -1, 0, 0, 3, 2, Row_C, Column_C, Radius_C, StartPhi, EndPhi, PointOrder)

拟合圆不细讲,网上都有,得到我们的圆心(Column_C,Row_C)(注意这里X,Y坐标和行、列坐标区别),半径:Radius_C

完了吗?肯定没有啊,我们要明白我们的初衷,求旋转中心坐标和图像的像素坐标的关系:HomMat2D_C1(模型C矩阵),现在还不是呢

第三步,计算偏差:
既然已经知道旋转中心坐标,那我们就可以求出标定中心和旋转中心的偏差:
还记的上面的我们是在P1(x,y)做的定点旋转,同时也是“初始角度”的标定特征中心的坐标
halocn计算偏差:
*定点P1
x:=1
y:=1
Dx_C:=Column_C-x
Dy_C:=Row_C-y

这就是一个固定偏差值,代表是标定点特征中心和旋转中心的偏差;
同时一定要理解,这个偏差也是九点标定的旋转轴的角度姿态计算得到;
如果我们旋转轴的角度发生改变,这个偏差是会变的;

如果项目的补偿每次都有偏差。你查查你的项目,遇到过这种情况吗,补偿不稳定。(因为旋转中心标定不准导致的)

完成了吗?可以说完成,也可以说没有完成。

我们得到了Dx_C , Dy_C,HomMat2D,已经可以用了,你们可以去看看你们的项目,很多都这样就是了,我开始也这样保存到本地就完了,后来我才发现还有优化的空间,让我们的计算更加优雅。

同时如果你们的定位项目中出现sin,cos等待三角函数时,那肯定可以优化,因为标定都是坐标点(x,y)的关系,点到点都可以通过矩阵实现,最主要是halcon已经提供这些库,学会用就行。

至于这样怎么样有优化,为什么这样优化必须放在使用这些矩阵的一章来进行分析了。

固定旋转终于讲完了,从简单到复杂一步步来,搞清楚了吗?没搞过的,搞不清楚拿起笔画一画啊,打开halcon17.12,自己模拟一下特殊点验证一下啊,都是高中的一些平面几何知识,你只需要把设备模型抽象出来,halcon数学的算子都有啊,话都说到这里了,如果不动手自己理解,到时只有项目实战试试也行。

如果现在最简单的旋转你不理解一下,到时下面我们开始旋转相机的时候,你会懵逼掉的。

如果搞清楚了,恭喜你,其实大家说的飞拍的项目的单相机补偿,你可以搞起了;至于怎样使用上面三个参数,我相信你试几次应该就能搞出来。因为飞拍的项目基本都是这种模型。

4.标定模型D:相机移动(可旋转)

在这里插入图片描述

这个模型如上图,黄色部分旋转U轴,上面固定相机,表示相机和我们的夹具一起旋转,为啥会出现这种模式呢,就我个人的遇到的情况,就是因为有Scara机器人安装需求或者限制,导致必须要这样安装如下图:

在这里插入图片描述

模型D和模型B就是相机可以旋转,如果我们拍照的时候,保持旋转轴的角度和标定的一致,其实就相当于相机在我们整个过程中是没有旋转的,等同于模型B;
同时我先要说明,如果这个九点标定的角度和拍照时旋转轴的角度不同,计算有哪些变化,我没有是实现过,如果哪位大神实现过,给点提示;后面如果有时间,我也实际测试一下任意角度拍照的变换,到时更新给大家。
实际项目过程中,保持拍照的旋转轴的角度和标定的一致这个很容易实现,首先先选择一个拍照的角度,然后再按照这个角度进行九点标定即可,后面就按照中模式就行讲解。

1)九点标定

选择一个拍照的姿态,确定旋转轴的角度,然后就开始九点标定,过程和模型B相同。
这里不详解,得到矩阵:HomMat2D

2)旋转标定

如果只是它当做模型B来使用,不进行旋转标定一样可以使用;在模型B的部分讲得比较简单,这里做一些说明。

上相机到底来干什么的?

这里也回顾一下,我们上面讲的模型C的相机也就是下相机的作用,它是来计算用于贴合或者装配产品的抓取的偏差。

而上相机用来确定被贴或者被放置的产品的位置偏差,就是我们的贴合的目标位置每次都是变动的,这也很好理解,就是当前贴合设备在当前产品贴合了,下一个产品进来(皮带轨道传入或者机器手放入),这个产品的位置和上一次都有一些小的偏差,这样就导致了贴合的目标位置每次有变动,这是就需要我们的上相机先计算目标的贴合位置。

如果是高精度的定位模具来放置目标产品,这是不需要上相机来。

同时一定要理解的是:这里移动相机的九点标定得到的结果是相机的物理坐标与目标位置的像素坐标的关系,因为相机移动,目标位置即贴合位置在相机下方不动的,通过图像的像素坐标计算。
但是我们最终要去贴合的时候,是夹具夹取贴合物品放到目标位置,需要是夹具的位置与 目标位置的关系,但是通过模型B和模型D发现,我们的相机和夹具的位置关系是固定不变的,存在一个固定的机械偏差(Mx,My)。
这里说的夹具位置其实就是指旋转中心,不要因为上面的四轴机器人图,以为我标的夹具位置才是它的中心,一定注意这个夹具是不能旋转的,应该说没有必要,我们四轴机器人的末尾都带有一个旋转轴,通过这个轴实现旋转;模型B中的夹具可能自带旋转,但是本质上两种都一样的,结论就是夹具的中心就是旋转中心。

同时也到这里我们也整理出上下相机贴合的第一张核心补偿关系图:

这张图已经包含所有本文章的需要讲解的上下相机定位贴合的标定和补偿的整个思路,非常有利于你理清你的整个思路。突然灵光一闪想到搞这样一张图,花了很多时间的整理这种图。
说明一下本文章图未做说明均为原创,可以免费用于任何用途,请注明作者网名即可,需要图片原稿进行继续创作或修改,可qq加群或直接联系我,免费。

在这里插入图片描述

上面这张图,不说清除睡不着觉,
主要这张图不是上下对称的,上下相机的标定关系完全不同
A、上下相机的输入不同,下相机:用于贴合的产品;上相机:目标产品的位置
B、最后标定中心的关系以不同:下相机:标定特征中心,上相机:移动相机的物理位置
C、上下相机的标定得到的转换关系(就是我们标定的转换矩阵)不同:下相机:贴合物的像素坐标与旋转中心的关系;上相机:目标贴合位置与旋转中心的关系
D、上下相机关系纽带:就是旋转中心。
E、计算目的不同:下相机:求取的贴合物的偏差;上相机:求取的是目标的绝对位置
F、同时也要注意上相机的如果没有旋转,没有旋转标定,这里的其实就是上文提到的:因为相机和夹具的位置关系是固定不变的,存在一个固定的机械偏差(Mx,My),就是这个偏差值。

通过上面的图,你可以站在一个整体或者更高的角度理解,为什么进行标定及其意义在哪里,同时上下相机补偿的时候你也可以按照这个图中的思路去完成,让你思路更清晰,难道不应该点个赞,关注一下,点个喜欢啊啊??

凌晨扛不住。。。

模型B的上相机的与旋转中心的固定偏差(Mx,My),在使用过程中,可以直接使用机械图纸中的测量值,当然安装等等误差不可能等于这个理论值,有微小偏差;但是在我们示教贴合第一个产品时,我们会手动示教出一个固定的偏差,这个示教的偏差已经包含了上面的微小偏差,所以可以不用标定这个偏差;
同时也一直有一个疑惑,不进行第一个点示教,直接标定完,贴合出来就是绝对准确位置能实现吗,分析了一下好像是可行的,没有测试过,不过标定好像要标定几个基准并且标定要准,不知道有没有人帮忙解答一下;
如果项目需要标定这个偏差,做一个专用的标定夹具在旋转中心,标定块向下点一个点或者旋转中心对位一个点,记录下机械点,然后移动上相机让这个点在图像中心,这样就计算出这个固定偏差(Mx,My),这里就不详解。

对于本部分模型而言,因为相机可以旋转,所以可以直接通过旋转标定进行计算出固定偏差(Mx,My)。

如下:
在四轴机器人调整到定点P2(x,y)不变的位置进行旋转,选择一个好的角度和位置,这样选择旋转位置前面也讲过,相机下方放置一个固定标定特征,然后旋转轴每次固定角度旋转拍出,旋转拍照。
计算过程如下:
记录第一个点物理点P2(x,y),提取特征中心的像素为(Prx1,Pry1)
旋转一个小角度,
记录第二个点物理点P2(x,y),提取特征中心的像素为(Prx2,Pry2)

旋转第N个点物理点P2(x,y),提取特征中心的像素为(PrxN,PryN)

现在已知的条件:定点物理点P2(x,y),一系列像素坐标(PrxN,PryN),还是有我们前面九点标定矩阵HomMat2D(不要忘了)。

这些过程都和模型C的旋转一样,只是这个模型的相机在移动。

求取的固定偏差(Mx,My)

Halcon计算如下:
第一步,拟合点计算:
*九点标定的矩阵
HomMat2D:=[0.0202215, 3.43298e-005, -27.1543, 3.20314e-005, -0.0202298, 75.8988]
*旋转点集的像素坐标,例如如下
Prx:=[0,1,2,3,4,5,6]
Pry:=[0,1,2,3,4,5,6]

for Index := 0 to |Prx|-1 by 1
*通过矩阵转换一个点到另一点的算子
affine_trans_point_2d (HomMat2D, Prx[Index], Pry[Index], Qx, Qy)
Qrx[Index]:=Qx
Qry[Index]:=Qy
Endfor
已经得到我们的物理的拟合点Qrx, Qry

第二步,拟合圆:
*拟合圆
*先生成轮廓
gen_contour_polygon_xld (Contour, Qry, Qrx)
*轮廓拟合圆,算法要选择’geotukey’,自己看说明文档
fit_circle_contour_xld (Contour, ‘geotukey’, -1, 0, 0, 3, 2, Row_D, Column_D, Radius_D, StartPhi, EndPhi, PointOrder)

拟合圆不细讲,网上都有,得到我们的圆心(Column_D,Row_D)(注意这里X,Y坐标和行、列坐标区别),半径:Radius_D

Radius_D就是相机到旋转中心距离,拿直尺量一下对比一下,如果相差很离谱那肯定是计算哪里有问题,查找一下问题

同时这里也给大家说一下非常非常宝贵有用的项目经验,我觉得下面两句话就值得10金币,会给大家节约很多验证标定的正确的时间,怎样去验证标定的正确性(后面不再说明了):
验证九点标定是否正确:
计算九点标定后,图像中心的坐标经过矩阵转换得到物理坐标,运动到这个点,计算图像中的标定物体的像素坐标应该是图像中心的坐标,先看看这个是否正确,然后在验证旋转

验证旋转标定是否正确:
图像中心的坐标经过矩阵转换得到物理坐标,然后加上计算的偏差,然后运动到这个点:如果模型C:发现旋转中心在图像中心就是正确的;如果模型D:发现旋转中心在标定特征的正上方就是正确的。

第三步,计算偏差:
既然已经知道旋转中心坐标,那我们就可以求出标定中心和旋转中心的偏差:
还记的上面的我们是在P2(x,y)做的定点旋转
halocn计算偏差:
*定点P2
x:=1
y:=1
Mx:=Column_D-x
My:=Row_D-y

虽然计算和模型C,计算过程相同,但是表示的意义和使用完全不相同,理解就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值