Halcon实现机械手手眼标定项目介绍、9点标定

原创: 姚小四  请关注公众号:手把手学习Halcon机器视觉

最近一段时间由于工作的忙碌,导致没有更新文章,在此非常抱歉默默支持小编的兄弟们!!下面,我将围绕机械手手眼标定和9点标定进行讲解,首先,机械手的标定分为两种,分别是手眼标定和9点标定,同时手眼标定中又分为固定相机标定和移动相机标定。

***9点标定:相机拍照获取9点(其实3点就行,但是点越多就越精确)的像素坐标,同时机械手末端去分别走这些点,获得机械坐标,两者结合成一个变换矩阵。其次是用户开始寻找自己感兴趣的区域,利用预处理、特征选择等手法处理,获得物体区域的坐标,和变换矩阵求出相对于机械手的位移量。如下所示:

在这里面,我们要重点把握该算子vector_to_hom_mat2d(),在采用其之前,需要进行排序,如果不进行排序,可能造成的结果是机械手出现碰撞可能。

其次,对感兴趣物体进行手法处理,本次我要处理的物体如下图中的圆垫片:

如上图中,机械手末端红色棍子所指向的垫片,由于是为了给兄弟们演示,装备比较简陋,最好能够采用精密的指针,这里如果是项目,对应的则是夹具。处理过程,如下:

在这里面,我们要掌握图像的处理过程,常用的是预处理,特征选择等,同时掌握affine_trans_point_2d()算子,求出Qx,Qy,这是物体相对于机械手的偏移量,我们通过串口通讯、网口通讯等方式将Qx,Qy发送到我们的机械手,机械手则会运动到该处。本次求出的Qx,Qy结果和实际验证如下:

通过通讯发送数据到机械手后,机械手运动完成后,示教器显示的位姿值如下,因为是XY面,所以只用看xy姿态。

本次所采用的是网口通讯,页面如下:

总结:

上述的9点标定项目,存在误差,因为我机械手的末端在走点的时候,并没有能够实现精确。

一、9点标定,只能用于空间上的平面,如xy面,xz面,yz面。

二、9点标定的时候,建议机械手末端采用相机去识别走点,或者采用激光,这样实现的效果精度会更佳。

三、相机拍照得出的点,为像素坐标;机械手末端去走对应的点,得到的是机械坐标,两者共同得出对应变换矩阵。

四、注意排序,否则结果会出现很大的误差,甚至会导致机械手出现碰撞危险的可能。

五、得到对象的变换矩阵之后,下一步就是求取用户感兴趣的区域。

      处理方式:

                   1:采集图像

                   2:预处理

                   3:特征选择

                   4:求取物体的行列坐标

                   5:通过affine_trans_point_2d( )算子,根据矩阵和行列坐标得到基于机械手的偏移量

                   6:通过网口通讯、串口通讯等方式将求到偏移量发送给机械手,这时机械手就会运动过去。

六、拓展

              预处理中常见的有均值滤波、中值滤波、高斯滤波、灰度变换等

              特征选择中,可以选择方向为:灰度值、区域、XLD轮廓

七、本项目的说明:

              验证1:查看程序中求到的Qx,Qy,通过串口或者网口等发送给机械手,发送过去之后,得到的的结果请查看验证1结果;

              验证2:同理。

下一种方法是手眼标定,这种就不局限于平面,可以实现空间域。由于文章字数限制,在这里我就不详细说了,需要详细介绍的可以私聊!同样是很详细的讲解,对于想了解机器视觉/机械手视觉的朋友们有很大的帮助!

手眼标定的部分截图如下:

如果想了解,可以进行沟通,将结合实战图像进行学习,效果更佳,进步更大!

这里面,项目文件同时据介绍了网口通讯的相关资料!

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

一.机械手类型

关节机器人:3个关节,6个自由度,即3个旋转3个平移;

SCARA机器人:包括沿X,Y,Z方向的平移和绕U轴旋转的4个自由度,它有3个旋转关节,最适用于平面定位;

二.手眼标定方式

1.固定相机拍照

手眼标定做什么:

1.1【已知条件】摄像机坐标系下校正对象的位姿;可以通过校正图像获取;

1.2【已知条件】机器人坐标系下机器人工具的位姿; 

1.3【未知条件】获取工业摄像机坐标系下为机器人坐标系的位姿;

1.4【未知条件】获取机器人工具坐标系下校正对象坐标系的位姿;

求出未知条件,再加已知条件,从而获取机器人坐标系下校正对象的位姿;要抓取一个物体,机器人坐标中的夹具位姿必须与机器人坐标中物体的位姿相同;

2.移动相机拍照

手眼标定做什么:

1.1【已知条件】摄像机坐标系下校正对象的位姿;可以通过校正图像获取;

1.2【已知条件】机器人坐标系下机器人工具的位姿; 

1.3【未知条件】获取工业摄像机坐标系下机器人工具坐标系的位姿;

1.4【未知条件】获取机器人坐标系下校正对象坐标系的位姿;

求出未知条件,再加已知条件,从而获取机器人坐标系下校正对象的位姿;要抓取一个物体,机器人坐标中的夹具位姿必须与机器人坐标中物体的位姿相同;

有夹具和没有夹具区别:

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

完整的9点标定源码:

*   9点标定的详细介绍,首先先采集一个带“点”图像,获取这些点的像素坐标,点越多就越精确
*   获取点的坐标用就预处理、特征选择进行分割、排序
*   机械手末端移动,分别对应各点,记录各点所对应的示教器的值rot
*   机械手的值分别和对应的像素坐标形成矩阵,这个矩阵可以保存

*   第1步      采集图像分割点后排序
*关闭窗口,打开窗口
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*采集图像
read_image (Image, 'C:/Users/yaofeng/Desktop/Halcon实现9点标定讲解/初始拍照标定板.jpg')
*预处理(二值化)
threshold (Image, Regions, 0, 26)
*断开连通域
connection (Regions, ConnectedRegions)
*特征选择
select_shape (ConnectedRegions, SelectedRegions, ['area','column','row'], 'and', [0,524.12,695.41], [78849.7,1173.47,1095.41])
*排序
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
dev_set_color ('red')
dev_display (Image)
dev_display (SortedRegions)
*求到对应的各点的像素坐标
area_center (SortedRegions, Area, Row, Column)
*从示教器上面去读取对应的位姿值
rot_x:=[1147.79,1147.10,1146.49,1122.49,1122.49,1121.79,1098.27,1096.99,1095.65]
rot_y:=[-51.41,-76.88,-103.66,-50.25,-77.01,-101.17,-50.04,-76.16,-101.61]
*像素坐标和姿态构成矩阵
vector_to_hom_mat2d (Row, Column, rot_x, rot_y,HomMat2D)
write_tuple (HomMat2D, 'C:/Users/yaofeng/Desktop/Halcon实现9点标定讲解/HomMat2D')
*    第2步       获取感兴趣物体的坐标,与矩阵构成偏移量

dev_clear_window ()
dev_set_colored (12)
*验证 1
*采集图像
read_image (Image1, 'C:/Users/yaofeng/Desktop/Halcon实现9点标定讲解/验证图像1.jpg')
*二值化
threshold (Image1, Regions1, 0, 22)
*断开连通域
connection (Regions1, ConnectedRegions1)
*验证的点为右下角的的一个点
select_shape (ConnectedRegions1, SelectedRegions1, ['area','row','column'], 'and', [0,1436.7,830.28], [527523,1568.81,1050.46])
dev_display (Image1)
dev_display (SelectedRegions1)
*求物体坐标的行列坐标
area_center (SelectedRegions1, Area1, Row1, Column1)
*通过刚才的矩阵和物体行列坐标,求得这个Qx,Qy偏移量,然后发送给机械手
affine_trans_point_2d (HomMat2D, Row1,Column1, Qx, Qy)

*验证2
dev_clear_window ()
*验证 1
*采集图像
read_image (Image2, 'C:/Users/yaofeng/Desktop/Halcon实现9点标定讲解/验证图像2.jpg')
*二值化
threshold (Image2, Regions2, 0, 26)
*断开连通域
connection (Regions2, ConnectedRegions2)
*特征选择进行分割
select_shape (ConnectedRegions2, SelectedRegions2, ['area','row','column'], 'and', [0,873.84,756.88], [97402.6,962.89,903.67])
*这里不知道为啥,来出现个误差,就是出现两个点,所以我把其联合了
union1 (SelectedRegions2, RegionUnion)
*填充
fill_up (RegionUnion, RegionFillUp)
dev_display (Image2)
dev_display (RegionFillUp)
*求行列坐标
area_center (RegionFillUp, Area2, Row2, Column2)
**通过刚才的矩阵和物体行列坐标,求得这个Qx1,Qy1偏移量,然后发送给机械手
affine_trans_point_2d (HomMat2D,  Row2,Column2, Qx1, Qy1)

---

尊重作者版权,原创: 姚小四  请关注公众号:手把手学习Halcon机器视觉

发布了455 篇原创文章 · 获赞 535 · 访问量 324万+

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/103774857
今日推荐