Halcon标定系列(3):“眼在手外“和“眼在手上”

心得笔记

字面意思,眼代表眼睛,这里指的是我们的工业相机;
手,指的是我们的运动部分,比如机械手或者运动控制系统;
眼在手上,就是相机按照在运动轴上面,跟随运动的某个轴一起运动,这种标定就是图像和机械点一一运动去做标定。
眼在手外,就是相机固定一个位置拍照,机械手或者运动部分不会带动相机,这个时候标定就要一次性拍全视野,然后机械部分再一一针对图像的上点做好对应关系,然后标定。

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

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

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

眼在外:相机放置一个固定的位置,与机器人基坐标系相对位置不变
眼在手:相机和机器手绑定在一个位置,机器手移动,相机也跟着移动

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

 

九点标定法的实现流程

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

Halcon标定系列(3):“眼在手外“和“眼在手上”_第1张图片
STEP 3:控制机器人TCP工具末端按顺序(走Z字型)移动到每个圆心,并记录下9组机器人位置坐标数据。

Halcon标定系列(3):“眼在手外“和“眼在手上”_第2张图片
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

 

你可能感兴趣的:(Halcon)