在工业领域常常会遇到将相机安装在机器手中,由相机快速引导机器手进行工作的方式。其中9点标定的作用是将图像的坐标转化为机器手的坐标。
不同标定文件的区别:不同标定的区别在于:图像坐标系与机器人坐标系是否匹配,单像素精度是否匹配。影响单像素精度是,相机与被测物体的高度差,如果相机与被测物体的高度差不变时,则可以不改变标定文件。
9点标定的作用意义:
标定视野范围,标定视野范围应大于相机视野的2/3以上,以保证相机出现畸变时可以及时发现。
1.计算像素当量,通过9点标定后的计算,可以得出一个由像素值转化为机器手的移动值的一个变化量。当我们标定完后即可得到一个像素当量的固定值。
2.将图像坐标系转化为机器手的同向坐标系。
为什么叫做同向坐标系?
我们标定的时候,需要将图像坐标与对应的机器手的坐标进行一一对应。图像坐标系通常会默认左上角的视野临界点为图像的起始原点即为(0,0)【图像坐标系】。图像往东为X轴的正方向,图像往南为Y轴的正方向。当然我们的机器手由于各种问题往往所体现出来的坐标系是混乱不固定的,且实际的工作单位为机器手,我们相机需要为机器手进行引导,所以即使在机器手坐标系不一的情况下,可以使用9点标定实现将机器手坐标系与图像坐标系联系在一起并计算为坐标系同向的状态。
我们的标定步骤:
1.在安装好设备后开始进行手眼标定
2.确定工作计算的坐标系,在实际生产中视觉计算的坐标系往往是多样化的,根据实际情况进行选择工作坐标系,同时示教时也需要在工作坐标系下。我直接采取机器手的Base0坐标系。原因在于:Base0坐标系时机器手的固定坐标系,此坐标系的原点在机器人的底座上,坐标系的变化只与机器人的安装误差有关系。
3.将机器手移动至方案选定的拍照高度,随后调节相机的焦距,和将光圈调到最大,在相机控制软件调节相机曝光时长,使得物体在视野内清晰可见,同时干扰源尽可能的少。
4.以库卡机器人为例子。将机器人选择为全局坐标系下,即为Base0坐标系(底座坐标系)。移动机器手,使得相机的中心对准被检测物体(或者标定物体的中心),记录当前的机器人坐标X,Y,Z,A等其他数值。
5.设定机器手的移动距离,根据实际情况设置机器手的移动距离,通常将9个点均在画面当中,9个点相连接占用的面积约为视野范围的2/3即可。这里我以20mm作为偏移值。则将视野中心点设置为4号点,机器坐标为(0,0)。则对应的坐标为
例如0号点的机械坐标设定为(-20,-20),则我们在机器手中将X轴移动-20,Y轴移动-20,其他均不改变 。同理我们的其他坐标也是如此。
6.然后生成标定文件进行验证即可
参考Halcon程序
*已知A坐标系的9个点
Ax:=[-20,-20,-20,0,0,0,20,20,20]
Ay:=[-20,0,20,20,0,-20,-20,0,20]
*待识别的B坐标点,和上面的A坐标系点一一对应
Bx:=[]
By:=[]
dev_get_window (WindowHandle)
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('E:/762halcon/标定', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
* Image Acquisition 01: Do something
dev_display (Image)
* 以下过程为在B坐标系找A中的9个点
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
threshold (ImageReduced, Regions, 0, 211)
*找到了B坐标系的点(Row,Column)
area_center (Regions, Area, Row, Column)
Bx:=[Bx,Column]
By:=[By,Row]
endfor
*得到目标变换矩阵HomMat2D
vector_to_hom_mat2d (Bx, By, Ax, Ay, HomMat2D)
*保存变换矩阵
serialize_hom_mat2d (HomMat2D, SerializedItemHandle)
open_file ('my_vector.mat', 'output_binary', FileHandle)
fwrite_serialized_item (FileHandle, SerializedItemHandle)
close_file (FileHandle)
stop ()
*读取变换矩阵,测试
open_file ('my_vector.mat', 'input_binary', FileHandle)
fread_serialized_item (FileHandle, SerializedItemHandle)
deserialize_hom_mat2d (SerializedItemHandle, HomMat2D_9p)
close_file (FileHandle)
tx:=20
ty:=30
affine_trans_point_2d (HomMat2D_9p, tx, ty, Qx, Qy)
7.同时标定坐标系需要与程序的实际情况相对应,如果程序中的是当前坐标-示教坐标,那么我们标定出来的坐标系需要与机器人的坐标系方向正负相反。
库卡机器人参考标定文件程序:
lin_rel{x -15}
lin_rel{y-15} //第一个点
lin_rel{x 15}
lin_rel{x 15}
lin_rel{y 15}
lin_rel{x -15}
lin_rel{x -15}
lin_rel{y 15}
lin_rel{x 15}
lin_rel{x15} //最后一个点
lin_rel{x-15}
lin_rel{y -15} (回到原点)
标定后,图像坐标系与机器人坐标系相反,适用于当前坐标-示教坐标程序。
标定问题:
1.按照机器人移动的照片是斜的。
只要是根据机器人的坐标系移动,无论图像的连线是否是斜的都不影响精度。
2.标定结果有误差。
标定的坐标系问题,如果你在Base0下进行标定,结果出现误差是机器人安装错误,推荐重新正确的安装机器人底座;如果是在其他机器人坐标系下标定,结果出现误差是因为机器人的Z轴发生了变换,但是在当前坐标系下没有变化,实际在Base0下的Z轴开始变化了,可以将坐标系改为在Base0下进行标定。
3.为什么标定时4号点(视野中心)的机械坐标设置为0?
我们在计算的过程的时候,选择视野中的机械坐标为0的好处是,当我们进行示教时候,可以直接记录视野中心的点即为示教点,那么偏移量就可以直接将坐标映射后的坐标+示教的坐标即可得到基于当前坐标系的坐标了,方便计算。
参考的标定图片