勇哥的视觉实验:眼在手上(eye in hand)的标定实验。相机挂在x,y平台上,全部九点标定特征在相机视野内可见

实验平台是一个x,y,z滑台, 如下:

相机挂在了这个平台的Z轴上面.  

勇哥打印了一张halcon的120mm标定板, 圆心距离已经知道了, 是12mm

九点标定时就抓取圆心做为标志点. 

标定纸比相机的视野稍大一些.

image.png

这是在原点的时候相机看到视野:

image.png

下面开始九点标定

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)

用上面的代码挑选了九个点完成了标定.

至于机械坐标, 勇哥就简单人眼看着笔尖对圆心而来,  本实验只讨论原理, 暂不考虑精度.

image.png


当我们的相机位于标定时候的机械位置, 这个时候使用下面的算子, 像素坐标系转机械坐标系直接应用是没有任何问题的.

affine_trans_point_2d(HomMat2D1, 503, 1775, Qy, Qx)


问题出在相机不在标定位置的时候.

例如我们移动相机到P点, 刷新一下视野图像:

image.png

由下图可见这个位置约是P点的原心点位置.

image.png

我们取右下角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点的中心位置.

image.png


基于上述的实验, 对于eye in hand的标定, 我们有了初步的推论:


  • 设定好一个标定位置, 在这个位置上用简单的九点标定取得标定矩阵. 

  • 相机在标定位置视野范围内拍到的点, 都可以用矩阵转换出机械坐标, 直接应用.

  • 对于不在标定位置的其它位置拍到的点, 用矩阵转换出机械坐标后要加上当前的机械位置. 



未完待续......



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864