Halcon应用:九点标定-手眼标定

提示:若没有查找的算子,可以评论区留言,会尽快更新

前言

本篇博文主要用于记录学习Halcon中算子的应用场景,及其使用代码和图像展示。只讲通俗易懂使用方法,不讲原理,不讲原理,不讲原理,重要的事情说三遍。
九点标定-手眼标定:想象一下,人眼睛看到一个东西的时候要让手去抓取,就会控制手到物体旁边,可是眼睛看到的位置和手的位置所处的不一样,这就需要知道眼镜和手的坐标关系。如果把大脑比作中间人,把眼睛比作A,把手比作C,如果A和中间人的关系知道,中间人和C的关系知道,那么C和A的关系就知道了,也就是手和眼的坐标关系也就清晰了。


提示:以下是本篇文章正文内容,下面案例可供参考,注意参数坐标的使用,能帮助你理解算子

一、Halcon应用?

Halcon 是一个强大的图像处理工具,该工具是为了解决机器视觉项目任务而创建的。

二、应用实战

1、图形理解[eye-to-hand]:

眼在手外:站在相机角度看到的三角形物体,与站在机械臂角度看到的物体可能会有所差异,比如:
在这里插入图片描述
在这里插入图片描述

									视角差异图

大家看到这个脑海中是否会出现之前的一个应用:仿射变换,没错,就是用到仿射变换,将相机视角的图变化到机械臂视角,经过平移和放缩,旋转。

1.1、开始应用

我们可以采用九点标定板进行标定,在相机视角下,通过halcon将每一个点的图像坐标获取到,采用一一对应的方式,获得对应机械臂坐标下的各个点的机械坐标,这样就分别获得两组坐标,分别是相机视角下的坐标[Qx, Qy],一个是机械视角下的坐标[Rx, Ry]。
在这里插入图片描述

*假定已经获得图像坐标下的九点位置
column_img := [50,150,200,50,150,200,50,150,200]
row_img := [20,20,20,70,70,70,120,120,120]
*分别获得机械坐标下的九个点位置
column_robot :=[275,225,170,280,230,180,295,240,190]
row_robot := [55,50,45,5,0,-5,-50,-50,-50]

*利用该算子构建变换矩阵
vector_to_hom_mat2d (row_img, column_img, row_robot, column_robot, HomMat2D)
* 获得需要知道的图像坐标下的某点(Qx, Qy)的机械坐标(Rx, Ry)
affine_trans_point_2d (HomMat2D, Qx, Qy, Rx, Ry)
* 标定完成

2、 图形理解[eye-in-hand]

眼在手中:相机固定在机械手上面,这种情况的标定过程实际上和相机和机械手分离的标定方法是一样的,随着机械臂带着相机移动,相机视野中的三角形区域会发生变化,某些情况下相机只能看到三角形的一个角区域。但是机械视角和相机视角看到的会是一样的。
在这里插入图片描述

2.1、 开始应用

同样,我们还是采用标定板的方式进行标定,但是此相比前面会有点差异,如下:
在这里插入图片描述

思考一下:那么视野中只有一个标定点,如何进行标定呢🤔?
步骤1:将标志位(三角形)放置在相机视野中;
步骤2:记录当前标志位的图像坐标和机械臂的机械坐标
步骤3:移动机械臂带动相机移动,比如位置2,大家可以参考背景上的雷电标志,雷电和三角形之间是相对固定的,也就是说,三角形标志在相机视野中在移动;
步骤4:那么我们可以使用9个位置,要保证三角形始终在相机视野中,分别记录下对应位置的图像坐标(三角形)和相应的机械坐标
至此,我们是不是得到了类似上面的九点标定数据形式

在这里插入图片描述
如果你当前是在做相机装在机械臂末端的九点简化标定,那你就是在用 Eye-in-Hand 模式,但做的是平面仿射标定,不涉及全6自由度位姿变换,属于 简化版手眼标定

* eye in hand
column_img := [869.0,979.07,1090.03,1461.64,1833.96,1724.21,1613.21,1240.49,1351.27]
row_img := [1372.36,1758.86,2145.75,2040.02,1935.01,1546.79,1158.53,1265.07,1652.6]
* column=x row=y
row_robot :=[98.84,109.81,120.62,121.88,123.11,112.23,101.62,100.343,111.08]
column_robot := [320.81,322.27,323.695,313.15,302.45,301.106,299.56,310.75,311.65]
* 现在我们根据图像坐标求到机械坐标的变换矩阵
vector_to_hom_mat2d (row_img, column_img, row_robot, column_robot, HomMat2D1)
* 那从机械转图像一样
vector_to_hom_mat2d (row_robot, column_robot, row_img, column_img, HomMat2D2)
* 问题来了
* 如果让标志位移动到相机中心,机械手坐标是多少?
* 已知条件是:机械手拍照位置(Rx,Ry),和标志位坐标(row, column), 相机size=2448*2048
* 假定拍照位置是Ry=1300,Rx=1000, 在拍照位时图像中标志位是row = 240,col = 542
* 求解坐标, 机械 -> 图像  注意矩阵用的哪个
affine_trans_point_2d (HomMat2D2, Rx, Ry, col, row)
* 那么相机中心是 
row_center := 1024
col_center := 1224
* 距离中心的偏移量
datarow := row_center - row 
detacol := col_center - col
* 计算标志位在图像中心时机械应该的坐标
affine_trans_point_2d (HomMat2D1, col_center, row_center, Qx1, Qy1)

在这里插入图片描述
注意:机械位置仅仅是相机看到的位置,实际并非在机械夹爪下方,需要计算相机和机械夹爪的相对位置,再次移动补偿值,才是最终夹爪可以夹取的位置

### 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]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值