都说“纸上得来终觉浅,绝知此事要躬行”,可惜咱没这条件呀,没项目咱也不能干坐着呀,那咱发挥主观能动性,咱不是学机械的么,还好还记得一点CAD的知识,今天小杨说事,咱就“纸上谈兵”,用CAD结合公司的视觉算法平台VisionMaster来说说相机映射和对位贴合的事,如果有错误的地方,还请各位自动化前辈多多指教,毕竟网上的关于这个知识太少了。
实际的生产过程中,我们常常会碰到这样的情况,机械手从工位一吸着对象到工位二进行贴合,但是工位二我们不方便执行标定,通常的做法是在工位一执行一次标定流程,然后使用两点映射或者四点映射把工位二的相机坐标映射到工位一的相机一中。说起来很轻松,咱没实战过呀,但是咱可以模拟呀,说干就干,咱开始动手吧。
如上图所示,咱们为了验证一般性,把机械手坐标系,工位一的相机1坐标系,工位二的相机2坐标系画的夸张一些,但是在CAD图上我们是通过旋转的方式来改变两个相机的坐标系和机械手坐标系的夹角的,事先是知道相机1坐标系X轴和相机2坐标系X轴和机械手坐标系X轴的夹角分别是10°和45°。当然关于单像素精度,这里是采用一比一的方式,因为现实成像比这个更复杂,为了方便描述而已,不影响咱的用户体验。
现实场景中,咱一般碰到的都是机械手末端吸盘和末端中心不共轴的情况,那这边咱就选用最通用的12点标定来求出这个旋转中心,啥,你不知道什么是不共轴,啥是旋转中心,那你out了,赶紧看看这个博主的博客,人家讲的很详细,地址如下:
https://blog.csdn.net/KayChanGEEK/article/details/73878994
看完了那咱继续,吸盘吸着带MARK点的标定板,在相机视野里面平移9次,旋转3次,当然尽量贴近实际对象所在的平面,移动范围尽量覆盖实际对象可能出现的范围。以X方向每次平移640.3044,Y方向每次平移389.3736,角度每次旋转30°,使用海康的算法平台呢,咱一般使用相对坐标系,尽量不使用绝对坐标系。咱一般是以平移的第5点作为基准哈,所以有了下图的12点的关系以及在CAD里面的坐标数据,机械手的绝对坐标是可以从机械手的示教器读出来的,相对坐标呢,都是相对第5点的坐标哈,至于像素坐标,这里咱取的是标定板上的那个圆Mark点的圆心,这个使用一个模板匹配,位置修正,圆查找工具就完事哈。
由于咱是使用的CAD模拟,那只能使用N点标定工具,手动输入啦,对应着输入就行啦,如下图:
可以看到输完执行之后,像素精度确实是1.0,由于点是完全一一对应的,所以标定平移和旋转误差都是0,实际生产中,这里是有标定误差值的。同时,这边也算出了机械手末端中心在图像中的理论像素坐标(891.371,970.815),咱回到CAD图中,把图纸的坐标系从机械手坐标系切换到相机1坐标系,看看第五点时刻,机械手的旋转中心的像素坐标是多少,没错就是下图粗红色圆圈出来的地方,查看坐标发现是一致的。
好啦,相机1标定完成之后,咱紧接着该对两个相机进行相机映射,制作一个映射板,上面做4个Mark点,这里咱采用4个圆来模拟,同样用机械手吸盘吸着映射板,在相机1视野中进行拍摄,记录当前机械手的位置,这个地方其实是以后对象每次在相机1处的拍照位,就是图中的蓝色直线交点处,然后机械手进行平移,咱这里只进行一个X方向平移,到红色直线的交点处,记录当前的机械手位置,这是以为每次对象到相机2处的,可以叫做贴合的基准位置(但是实际上是不用建立基准的,这里可以理解为以后每次在这里对对象进行偏移贴合就行,明白的人一看就明白了哈)。
注意每次采集4个Mark点的圆心坐标,在CAD里面要切换对应的坐标系,圆心点也需要对应哈,采集的坐标如下:
然后使用相机映射模块,将四和个圆心坐标对应输入进去,注意对象点和目标点的关系即可,生成相机映射文件,其实就是一个坐标系之间的变换矩阵,如下:
当然咱可以使用工具打开这个文件可以看到矩阵的参数,里面包含了坐标系变换的旋转角度信息和平移量信息:
这里咱尝试改变映射板在相机2中的X和Y的位置,发现自始至终旋转矩阵是不变的,变化的只是平移量,可见咱之前要确定机械手的两个位置的重要性,否则平移量发生变化了,要自己修正旋转矩阵的平移量呀。
那为了进一步加深理解这个映射的关系咱来看看这个映射关系表示的是啥呗,既然是把相机2中的4点映射到相机1,那么我们直接把相机2带着4个点移动到相机1处,然后来手动检验一下,如下图:
打开映射文件,看到映射矩阵如下:
CAD切换坐标系到相机1坐标系,查看平移之后的相机2坐标系的原点在相机1中的坐标如下:
关于旋转矩阵,前面我们知道两个相机坐标系分别是逆时针转10°和顺时针转45°,那么它们之间的夹角就是55°,求解余弦值和正弦值如下,和矩阵是一致的:
至此咱所有的准备工作都结束了,那咱就开始验证贴合呗:
下图是机械手吸着实际对象进行贴合过程模拟,咱用一个矩形方便描述,注意此时机械手的吸盘并没有吸到对象的中心,由于咱刚才记住了两个固定的机械手的拍照位置,那么首先要做的是吸着对象到刚才的相机1拍照位进行图像采集,建立模板,贴合点我们模拟的对象的十字线交叉点。然后在相机2的拍照位处,假设有个目标和对象是一样的,注意此时我们只需要确保对象移动到相机2的拍照点时,目标对象的角度是一样的,我们要建立一个角度基准,然后对目标建模版,也是选择矩形的中心作为贴合点,后面做映射的时候,咱就是把这个点的像素坐标映射到相机1,再加上目标的旋转角度就可以算出机械手贴合需要走到的位置。
那咱先看最简单的情况,目标不发生角度旋转,只有平移的情况:
目标位置相对于原始位置Y方向移动了439.85,然后切换坐标系读出,当前的目标矩形中心贴合点的像素坐标为:
对象还是基准状态,切换到相机1读出对象矩形中心点的像素坐标为:
和之前映射验证一样,咱把此时的目标也映射到相机1中,也就是上图中的蓝色矩形的位置,然后搭建如下图的方案,查看使用相机映射文件进行标定转换之后的像素坐标和实际的CAD测量结果进行对比:
切换到相机1坐标系,读出目标映射过来的贴合点的坐标如下:
可见理论计算和实际结果是一致的,然后咱们使用单点对位模块来计算贴合的偏移量,输入对象和目标对应的贴合点标定转换之后的坐标以及角度偏差,计算出来的贴合偏差如下:
发现和之前的假设的偏移量是一致的,那么此时咱可以在相机1的拍照位进行便宜然后再走之前相机映射的时候的固定偏移量去到相机2处进行贴合,也可以先到相机2的拍照位然后再直接走偏移量也能实现贴合。
以上模拟的是一个简单的情况,目标和对象都有角度旋转以及XY方向偏移,这个就当做作业留给各位看官们自己验证吧,反正咱自己是验证了。当然实际生产过程更加复杂,比如相机安装反了导致坐标系之间旋转了180或者90,机械手左右手坐标系的选择,实际贴合点和拍照得到mark点是不一样的等等问题,有兴趣想探讨或者觉得咱说的不对的,可以相互探讨。
好了,今天的小杨说事就到这里,第一次写博客,主要是为了攒积分呀,各位看官记得打赏奥,写的不好请见谅。