准备一张纸,打印九个十字。
根据勇哥的经验,使用矢量图软件CorelDraw,用喷墨打印机可以得到比较好的效果。
在X,y,Z平台上装了一只笔,让笔尖对着十字的中心,这个例子里勇哥是用眼睛看的方式来让笔尖对到中心。
这样我就取得了九个机械位置p1到p9。
实际项目中,不要用眼睛去看,而是要把流程反过来。先自己计算出要走的九个点位,然后走位扎针,在纸上生成点,再用相机拍照取像素坐标。这样可以准确到像素级。
有了9个机械坐标后,我通过放大视图,鼠标指向十字中心的办法,取得九组像素坐标。
两组坐标都有了后,用下面的程序标定并验证结果。
程序主要用到下面两个算子:
vector_to_hom_mat2d 用来生成像素坐标与机械坐标之间的转换矩阵
affine_trans_point_2d 应用上面的矩阵关系,把像素坐标转为机械坐标
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', '94aab8029638_Microvision_MVEM500M', 0, -1, AcqHandle) grab_image (Image, AcqHandle) close_framegrabber (AcqHandle) //像素坐标 Row1:=[608,624,640,1127,1112,1097,1596,1612,1625] Column1:=[1086,1632,2152,2133,1615,1071,1057,1597,2111] //机械坐标 Row2:=[36.798,69.4,101.097,101.097,70.098,37.603,37.603,70.098,101.299] Column2:=[-67.499,-67.398,-67.134,-96.108,-96.366,-96.597,-127.135,-126.522,-126.538] //标定 vector_to_hom_mat2d (Row1, Column1, Row2, Column2, HomMat2D) //验证结果,找5mm的圆并求出圆心位置 gen_rectangle1 (ROI_0, 1312.63, 1298.8, 1422.68, 1403.03) reduce_domain(Image, ROI_0, ImageReduced) threshold(ImageReduced, Region,0, 50) connection(Region, ConnectedRegions) area_center(ConnectedRegions, Area, Row, Column) //应用标定计算出像素坐标对应的机械坐标 affine_trans_point_2d (HomMat2D, Row, Column, Qx, Qy) *Qx,Qy的结果为: 55.1431 -112.066
下面勇哥放了一张胶片上去,找5mm圆的圆心位置,并把这个位置转为机械坐标。
再把机器开过去,通过观察笔尖的位置以验证结果是否正确。
下面来谈谈九点标定的原理:
九点标定直接建立相机和机械手之间的坐标变换关系。让机械手的末端去走这9个点得到在机器人坐标系中的坐标,同时还要用相机识别9个点得到像素坐标。这样就得到了9组对应的坐标。由下面的式子可知至少需要3个点才能求出标定的矩阵。
结束语
基本的基于x,y轴的九点标定很简单,但千万别轻视标定。
实际上项目中经常有麻烦的情况出现,勇哥举几个例子:
机器人的九点标定,这个要考虑用工具坐标
眼在手上时,相机和Z轴有个固定偏移的位置
带“假肢”的机器人吸嘴的标定,这个时候旋转中心相当于偏置了
……
另外,类似于epson机器人之类的,都有自己的标定函数。而本例子是使用halcon来标定的。
你知道机器人的标定相比halcon的标定谁的结果更好吗?
标定的主题是有技术含量和经验含量的。
招聘视觉工程师时,这个话题是必考项,很多人只会表达那句“把像素坐标转为机械坐标”,肚子里其实没其它的货了。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

