Halcon标定系列(1):实现机械手手眼标定项目介绍、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机器视觉

### Halcon 手眼标定教程与示例代码 #### 使用 `calibrate_hand_eye` 进行手眼标定HALCON 中,手眼标定的主要目的是建立机器人基座坐标系和相机坐标系之间的变换关系。对于不同版本的HALCON,使用的函数有所不同,在较新的版本中推荐使用 `calibrate_hand_eye` 函数来完成这一过程[^1]。 ```cpp // 定义存储位姿向量的元组列表用于保存每次拍摄时机械臂末端执行器的位置姿态以及对应的图像中标定位置的姿态 create_tuple_array (NumPoses, 'empty', Poses_Robot_Base) create_tuple_array (NumPoses, 'empty', Poses_Cam_World) for Index := 0 to NumPoses-1 by 1 // 获取当前机械臂末端执行器相对于基座坐标的位姿 get_robot_pose(Pose_Robot_Base, Index) // 将获取到的位姿加入到之前创建好的数组当中去 tuple.concat(Poses_Robot_Base, Pose_Robot_Base, Poses_Robot_Base_Out) Poses_Robot_Base = Poses_Robot_Base_Out // 读入对应序号下的模板图片并计算其中心的世界坐标得到相机看到的目标物体相对世界坐标系的位置信息即为poses_cam_world中的元素之一 read_image(Image, 'image_' + Index) find_calib_object_model_domain(ModelDomain, Image, CalibObjectID) determine_calib_object_pose(CalibObjectID, ModelDomain, Image, CamParam, Pose_Cam_World) // 同样地把这一次求得的结果也追加进去形成完整的数据集以便后续调用手眼标定算法处理 tuple.concat(Poses_Cam_World, Pose_Cam_World, Poses_Cam_World_Out) Poses_Cam_World = Poses_Cam_World_Out endfor // 调用 calibrate_hand_eye 来获得最终的手眼矩阵 T_c_e (eye-on-hand模式下) calibrate_hand_eye ('eye_on_hand', Poses_Robot_Base, Poses_Cam_World, [], CalibrationData, HandEyePose) ``` 此段伪代码展示了如何通过多次移动机器人的末端执行器至不同的已知位置,并在同一时刻记录下此时由视觉系统观测所得目标物的空间位置信息;之后再利用这些成对的数据作为输入参数传递给 `calibrate_hand_eye()` 函数从而实现手眼几何关系的有效估计[^2]。 #### 坐标转换的理解 当提到手眼标定时,不可避免会遇到各种各样的坐标系及其相互间的转换问题。例如,“眼在手上”的情况下,需要考虑的是摄像机相对于工具中心(TCP)的关系;而在“眼在外”情形,则要关注整个传感器模块是如何被安装于外部固定结构上的。无论哪种情况,核心都是为了能够准确描述出任意一在整个工作空间内的确切方位[^3]。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值