实验平台是一个x,y,z滑台, 如下:
相机挂在了这个平台的Z轴上面.
勇哥打印了一张halcon的120mm标定板, 圆心距离已经知道了, 是12mm
九点标定时就抓取圆心做为标志点.
标定纸比相机的视野稍大一些.
这是在原点的时候相机看到视野:
下面开始九点标定
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) threshold (Image, Regions, 0, 35) connection(Regions, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 3150, 12000) gen_empty_obj(EmptyObject) select_obj(SelectedRegions, ObjectSelected, 48) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 30) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 12) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 14) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 32) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 50) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 52) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 34) concat_obj(EmptyObject, ObjectSelected, EmptyObject) select_obj(SelectedRegions, ObjectSelected, 16) concat_obj(EmptyObject, ObjectSelected, EmptyObject) area_center(EmptyObject, Area, pixelRow, pixelColumn) mx:=[15.992,16.385,16.189,-7.881,-8.01,-8.111,-31.899,-32.017,-31.955] my:=[-22.398,-46.079,-70.092,-70.345,-46.31,-22.68,-22.37,-46.349,-70.655] vector_to_hom_mat2d(pixelRow, pixelColumn, my, mx, HomMat2D1) *vector_to_hom_mat2d( my, mx,pixelRow, pixelColumn, HomMat2D2) affine_trans_point_2d(HomMat2D1, 503, 1775, Qy, Qx) close_framegrabber (AcqHandle)
用上面的代码挑选了九个点完成了标定.
至于机械坐标, 勇哥就简单人眼看着笔尖对圆心而来, 本实验只讨论原理, 暂不考虑精度.
当我们的相机位于标定时候的机械位置, 这个时候使用下面的算子, 像素坐标系转机械坐标系直接应用是没有任何问题的.
affine_trans_point_2d(HomMat2D1, 503, 1775, Qy, Qx)
问题出在相机不在标定位置的时候.
例如我们移动相机到P点, 刷新一下视野图像:
由下图可见这个位置约是P点的原心点位置.
我们取右下角K点的圆心像素坐标, 转为机械坐标.
gen_rectangle1 (ROI_0, 593.711, 1038.33, 787.352, 1184.13) reduce_domain(Image, ROI_0, ImageReduced) threshold(ImageReduced, Region, 0, 35) area_center(Region, Area1, Row, Column) read_tuple('d:/HomMat2D1', HomMat2D1) affine_trans_point_2d(HomMat2D1, Row, Column, Qy, Qx)
求出结果为: Qx=0.381175 Qy=-48.0601
这个值如果直接go是不对的, 走不到K点, 只会撞机.
P点的位置(也就是当前机构坐标位置)是: x=-56, y=-58.5114
试试把P点位置加上上面的Qx, Qy
Qx=0.381175+(-56)= -55.618825
Qy=-48.0601+(-58.5114)= -106.5715
把这个结果让平台执行, 可看到刚好走到K点的中心位置.
基于上述的实验, 对于eye in hand的标定, 我们有了初步的推论:
设定好一个标定位置, 在这个位置上用简单的九点标定取得标定矩阵.
相机在标定位置视野范围内拍到的点, 都可以用矩阵转换出机械坐标, 直接应用.
对于不在标定位置的其它位置拍到的点, 用矩阵转换出机械坐标后要加上当前的机械位置.
未完待续......
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

