Halcon标定系列(3):我个人总结的“眼在手外“和“眼在手上”的心得笔记

尊重作者,支持原创,如需转载,请附上原地址:


https://libaineu2004.blog.csdn.net/article/details/106995624



心得笔记


字面意思,眼代表眼睛,这里指的是我们的工业相机;

手,指的是我们的运动部分,比如机械手或者运动控制系统;

眼在手上,就是相机按照在运动轴上面,跟随运动的某个轴一起运动,这种标定就是图像和机械点一一运动去做标定。

眼在手外,就是相机固定一个位置拍照,机械手或者运动部分不会带动相机,这个时候标定就要一次性拍全视野,然后机械部分再一一针对图像的上点做好对应关系,然后标定。


这两种标定是我们图像和运动部分联合主要的两种标定方法,都可以实现图像转机械运动,就是标定关系不一样而已,结果都是一样的!


眼在手上就是一个点对应一个机械坐标,做九组就好了!


也就是相机一次拍9个点 然后机械手走这九个点得到九个对应的机械坐标进行变换。


眼在外:相机放置一个固定的位置,与机器人基坐标系相对位置不变

眼在手:相机和机器手绑定在一个位置,机器手移动,相机也跟着移动


halcon手眼标定,最少4点就可以,4个像素坐标对应4个机械手坐标就可以算出转换关系



九点标定法的实现流程


STEP 1:准备好一张标定板,里面有3X3的圆。

STEP 2:把标定板水平放置在相机正下方,控制相机拍照得到一张图片,并按顺序(走Z字型)记录图片上9个圆的中心位置。


Halcon标定系列(3):我个人总结的“眼在手外“和“眼在手上”的心得笔记

STEP 3:控制机器人TCP工具末端按顺序(走Z字型)移动到每个圆心,并记录下9组机器人位置坐标数据。

Halcon标定系列(3):我个人总结的“眼在手外“和“眼在手上”的心得笔记


STEP 4: 执行标定,这里使用HALCON标定算子作为演示,利用上面求得的数据。

图像上9个位置

image_x:=[]

image_y:=[]

机器人9个位置

robot_x:=[]

robot_y:=[]

图像与机器人数据结合

vector_to_hom_mat2d (image_x, image_y, robot_x, robot_y, HomMat2D)


矩阵进行保存:write_tuple (HomMat2D, '路径') 。注意:保存的矩阵后缀名是.tup格式的

STEP 5:标定完成后,拍摄一个特征点的,求得像素位置

img_x:=

img_y:=

利用以下算子即可把像素坐标转换成机器人坐标


read_tuple (‘路径’, HomMat2D)

affine_trans_point_2d(HomMat2D,img_x,img_y, Qx, Qy)

到这里标定以及转换过程就完成了。

read_image (Image, 'D:/hellowprld/初学者必用10mm视觉标定板图/9points.jpg')
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
connection (Region, ConnectedRegions)
*筛选出来九个点
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 2000)
shape_trans (SelectedRegions, RegionTrans, 'outer_circle')
*求出九点坐标
area_center (RegionTrans, Area, Row, Column)
disp_message (WindowHandle, 'R:'+Row+'  C:'+Column, 'Image', Row, Column, 'black', 'true')
*把求得的Row和Column赋值
*九点标定行
PxRow:=Row
*九点标定列
PxColunm:=Column
*九点标定行
*PxRow:=[23.5, 23.5, 23.5, 71.5, 71.5, 71.5, 118.5, 118.5, 118.5]
*九点标定列
*PxColunm:=[28.5, 75.5, 122.5, 28.5, 75.5, 122.5, 28.5, 75.5, 122.5]
*机器坐标行
Qx:=[100,50,0,100,50,0,100,50,0]
*机器坐标列
Qy:=[0,0,0,50,50,50,100,100,100]
*拿到机器坐标和像素坐标求出关系矩阵
*                   标定行  标定列  机器X 机器Y 得到矩阵
vector_to_hom_mat2d (PxRow, PxColunm, Qx, Qy, HomMat2D)
*保存矩阵
write_tuple (HomMat2D, '九点标定.tup')
*读取矩阵
read_tuple ('九点标定.tup', HomMat2D)
*利用求出来的物体行列坐标得到机器坐标
affine_trans_point_2d (HomMat2D, Row, Column, Qx1, Qy1)·



官方例程


vector_to_hom_mat2d


calibrate_hand_eye_scara_stationary_cam_approx


hand_eye_stationarycam_calibration


pick_and_place_scara_stationary_cam



参考文献


关于“眼在手外“和“眼在手上”标定求教


https://www.51halcon.com/forum.php?mod=viewthread&tid=4231


【3】机器人手眼标定:固定向下相机


https://www.51halcon.com/forum.php?mod=viewthread&tid=4271


“眼在手中”标定之坐标转换


https://www.51halcon.com/forum.php?mod=viewthread&tid=4265


机器人手眼标定算法源码


http://www.ihalcon.com/read-9533.html


机械手手眼标定/9点标定/4点标定/Halcon标定脚本


http://www.ihalcon.com/read-10022.html


vb.net联合halcon以及运动控制卡做的点胶贴合项目


http://www.ihalcon.com/read-14513.html


手眼标定----眼在手外(eye-to-hand) [魁拔之十万火急]


http://www.ihalcon.com/read-13820.html


手眼标定----眼在手上(eye-in-hand) [魁拔之十万火急]


http://www.ihalcon.com/read-14658.html


http://www.ihalcon.com/read-14687.html


九点标定-眼在外(没有标定板的情况) [魁拔之十万火急]


http://www.ihalcon.com/read-14564.html


手眼标定----眼在手上(eye-in-hand) [tystq]


http://www.ihalcon.com/read-14209.html


枫痕机械手相机9点坐标标定-基于C#+EmguCV


https://www.cnblogs.com/thebreeze/p/10316030.html


相机标定助手代码


http://www.ihalcon.com/read-11647.html


Haclon代码框架c#编程haclon代码学习


http://www.ihalcon.com/read-14257.html


上一篇:【原创】CSS+JavaScript 实现菜单功能--改进版


下一篇:photoshop图层样式制作质感的玻璃字体