书接上回
上一篇9点标定,在计算像素的机械坐标与实际机械坐标是由一个固定偏差的。下面就介绍12点标定来解决这问题
经过12点标定后,像素可对应到真实机械坐标。
1.什么是旋转中心,它在哪里?
网上太多人有说这个旋转中心,初学者刚开始看似乎懂了,但是再多看多思考发现似乎又没看懂。主要给这个旋转中心概念给绕
晕了。为什么旋转中心这么容易让人迷糊,因为旋转中心似乎看不见摸不着,这就让人难以理解。
为什么看不见呢,因为我们标定流程决定,标定出的旋转中心是是在像素空间中点。像素空间中的一个点。
你说他是旋转中心,其实感官上难以理解。在像素空间咋旋转呀?如果我们能看的见摸得着这个旋转中心,也许我们就没那么迷糊。
现在我想大家换一种思路,先忘却忘却以前旋转中心的概念。新的观念就是 在机械坐标系(本系列文章就涉及图像和机械2个坐标系)中旋转中心就一个,
就是末端旋转轴的中心(末端法兰盘中心,后面统称法兰盘中心为旋转中心),其他的都是我们臆想的中心,
他们并不真实存在。这是我个人的定义,不一定正确,但是理解起来没问题。如果大家有别的理解,欢迎一起探讨。
旋转中心示意图
2.什么是旋转标定
上面说了法兰盘中心 就是旋转中心,他不就在那里吗,为什么要标定它?
那我们旋转标定标定的出的中心和法兰中心 又有什么关系。
先看看旋转标定的过程:机构到固定位置:X,Y 轴稳住不动,只动旋转轴,相机拍照3次,取三个点,三点计算圆心P1.
法兰盘中心坐标O1
这个圆心P1 经过上一篇的9点标定的标定数据转换后的W1点,这个点与法兰盘中心的坐标是否重合呢。很抱歉,很难重合(请自行思考),
有个固定偏移D。这个固定偏移产生原因上篇文章已经有说明,这里再说一下。说的直白一点就是,9点标定的时候,像素对应的机械坐标,不是此像素在机械坐标系中的
真实坐标,而是法兰盘中心的机械坐标。如下图,标定时候,像素点2的机械坐标应该是点2出的机械坐标,但是缺取的是点1 的机械坐标。二者存在一定偏移。所以像素
坐标经过标定数据转换后的机械坐标与实际坐标有一定偏移
如何获得9点标定像素坐标对应的真实机械坐标呢?现在这个问题转换为如何得到点2和点1的机械坐标偏差D。
将偏差补偿到第一次9点标定的机械坐标里,重新计算一下下标定数据就行了。
这个偏移就是D
D=W1-O1 就是标定后的旋转中心(经过标定转换)和法兰中心的偏移。9点标定变换是个线性变换,这个公式应该不难理解。
重新计算标定数据即可。
下面代码完整的反应了这个过程,非完整代码,完整代码请到gitee 上获取
*3点旋转 标定起点 旋转3此 rotate3Point:=[20,0,-20] arc_row:=[] arc_col:=[] for Index1 := 0 to 2 by 1 hom_mat2d_identity(HomMat2DIdentity) *标定起点 选择 hom_mat2d_rotate(HomMat2DIdentity, rad(rotate3Point[Index1]), arm_center_row, arm_center_col, HomMat2DRotate) *模拟移动机械臂 affine_trans_region(Tool_ARM, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor') *计算移动后机械臂的坐标,这里(Row[2],Column[2]),刚好是吸盘(小圆圈)的坐标, area_center(RegionAffineTrans, Area, Row, Column) *模拟取吸盘的像素坐标 tuple_concat(arc_row, Row[2]-(cam_origin_row), arc_row) tuple_concat(arc_col,Column[2]-(cam_origin_col), arc_col) dev_set_color ('turquoise') dev_display(RegionAffineTrans) endfor *通过上面的3点 计算圆心 gen_contour_polygon_xld(Contour, arc_row, arc_col) get_part(WindowHandle, Row11, Column11, Row2, Column2) fit_circle_contour_xld(Contour, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius, StartPhi, EndPhi, PointOrder) *Row1,Column1 就是圆心的像素坐标,当前值(-1000,1000), gen_cross_contour_xld(Cross, Row1,Column1, 100, 0) set_system ('clip_region', 'false') dev_set_color ('red') dev_display(Cross) affine_trans_point_2d(HomMat2D, Row1, Column1, Qx, Qy) dev_set_color ('blue') gen_cross_contour_xld(Cross1, Qx,Qy, 200, 0) *显示旋转标定中心坐标 dev_display(Cross1) *计算偏移 Dx:=arm_center_row-Qx Dy:=arm_center_col-Qy *修正9点标定的机械坐标 xwolrd1:=xwolrd+Dx ywolrd1:=yworld+Dy *重新计算标定矩阵 vector_to_hom_mat2d(row_pixel, col_pixel, xwolrd1, ywolrd1, HomMat2D1) *重新验算标定的旋转中心是否与法兰中心重合 *arm_center_row:=3000 arm_center_col:=5000 Qx1 = 3000,Qy1=5000 表示完全重合 affine_trans_point_2d(HomMat2D1, Row1, Column1, Qx1, Qy1)
重新标定以后得到新的系数矩阵HomMat2D1,以后像素坐标通过新的标定数据可以获得当前像素在机械坐标系下的真实机械坐标。
相信此时你能感受到HomMat2D1 和 上篇 HomMat2D的区别。
3.旋转中心的用处是什么。
通俗点理解,就是物体绕着不同点旋转一定角度,位置不一样。只有知道物体是在哪一点旋转的,才能知道旋转后位置,才能
算出X,Y轴偏移数据,后面引导定位的文章会有详细说明
4.旋转中心 赠送 福利
超大视野,多相机联合定位,通过上面的方法可以巧妙的将所以相机的像素坐标都统一到同一个机械坐标系之中。
这样就可以少了相机之间坐标系计算的步骤。
5.旋转中心标定注意事项
视野范围内,旋转的角度越大越好。旋转角度小了,计算出的 旋转中心误差比较大。建议旋转角度最小正负10°。
但是现场很多机构受限,只能旋转很小角度,对于这个问题,后面再开一贴专门讨论吧
6.12 点标定完整流程
9单标定–>计算9点标定数据HomMat2D–>机构回到9点标定初始位置—>X,Y保持不变,旋转旋转轴3点,拍照计算 3点圆心—>
圆心坐标通过HomMat2D转换机械坐标—>计算旋转中心偏差–>修正9点标定的机械坐标–>重新计算9点标定数据。
详细逻辑请看代码
原文链接:http://www.sy9527.com/2024/05/14/2dcamcali12point/
系列文章
个人原创:未经授权 不得转载
联系我:加群(277957302)交流
暂无评论