基于Halcon的2D手眼标定(九点标定+旋转中心)

摘要

  9点标定是一种用于手眼标定的常见方法,通过在不同位置采集图像,计算相机和机械臂之间的变换关系。其主要作用是实现机器人视觉系统的精确对接,使得机器人可以准确地识别和操作目标物体,提高自动化任务的精度和效率。

误区

  很多博客讲到手眼标定都会给出以下的原理,以下两个公式本身没有问题,如果在2D的手眼标定中,以下原理不适用,公式中的数学符号表示的是姿态,所以在3D手眼标定中遵循如下的原理,有时间会补上3D手眼标定。
  眼在手上 eye_in_hand
在这里插入图片描述
  眼在手外 eye_to_hand
在这里插入图片描述

9点标定

原理说明:

  9点标定利用已知的标定板上的9个点的位置,通过这些点的图像数据计算出相机坐标系与机械臂坐标系之间的变换矩阵。通常,标定板被放置在不同的姿态和位置,以获取多组数据。这些数据用于建立相机和机械臂之间的关系模型。
  注意:9点标定不一定是9个点,不共线3个点就行,更准确的说是N点标定,N≥3。

流程:

1.方法1:顶针戳点,一般使用棋盘格,缺点是比较费眼睛;
在这里插入图片描述
提取9个像素坐标,记录戳点时的9个机器人坐标;

2.方法2:自动标定,标定板任意,标定板越简单越好;
眼在手上,标定板不动,机械手带着相机拍9-15次;
眼在手外,相机不动,机械手带着标定板拍9-15次;

在这里插入图片描述
提取9个圆心像素坐标,记录运动时的9个机器人坐标;

*1 平移(变换矩阵)
Xpix:=[	1223,623	,1212	,2022,	2053,	2083,	1224,	833.5	,721.5]
Ypix:=[1024	,483,	454	,414,	1033,	1645,	1688,	1706.5,	1125.5]
*填写实际的九点坐标
Xrob:=[	246.233,250.179	,246.11,240.529,240.529,240.529	,   246.453,249.146	,249.714]
Yrob:=[-280.599,-284.524,-284.524,-284.524,-280.255,-276.034,-276.034,-276.034,	-280.075]
vector_to_hom_mat2d (Xpix, Ypix, Xrob, Yrob, Tuple)

旋转中心标定

原理说明:

  机器人带着相机(眼在手上)或机器人带着标定板(眼在手外),进行旋转拍摄,将获取的边缘点进行拟合圆,圆心就是旋转中心;一般是抓手中心和法兰中心不一致时标定旋转中心;

流程:

  机器人带着相机(眼在手上)或机器人带着标定板(眼在手外),进行旋转拍摄,拍摄九组图像;
在这里插入图片描述
提取9个标定板图像的中心点,再进行拟合圆

Xcir:=[319.8294614,	293.2020447,	271.2902719,	260.1183161,	262.6026804,	278.110902,	302.4164673,	329.1498582,	350.9447014,362.1605348,	359.6639239]
Ycir:=[-277.9826673,	-280.4546827,	-295.9846625,	-320.311339,	-346.9660108,	-368.8431011,	-380.0074627,	-3.78E+02,	-362.0663171,	-337.7097767,	-311.0174864]
gen_contour_polygon_xld (Contour, Ycir, Xcir)
dev_display (Contour)
fit_circle_contour_xld (Contour, 'geometric', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)

旋转后坐标

在这里插入图片描述

使用算子hom_mat2d_rotate

当机器人可旋转角度很小时,参考kavmi的博客

(x1 - cx) * sin(theta) - (y1 - cy) * cos(theta) = (x2 - cx) * sin(theta) - (y2 - cy) * cos(theta)
(x1 - cx) * cos(theta) + (y1 - cy) * sin(theta) = (x2 - cx) * cos(theta) + (y2 - cy) * sin(theta)

其中,(x1, y1)和(x2, y2)是两个不同点的坐标,cx和cy是旋转中心的坐标,theta是旋转角度。通过解这个方程组,可以求解cx和cy的值,从而确定旋转中心的位置。

需要注意的是,如果机器人的旋转角度较大,则这种方法可能不太准确,因为机器人不再是一个刚体,而是可能会发生形变。在这种情况下,可能需要使用更复杂的方法来确定旋转中心。

更多详情了解:https://blog.csdn.net/qq_32015315/article/details/141663063

以下是一个简单的手眼标定Halcon 代码示例: ```hcl read_cam_par('calibration_data/camera_parameters.cam', CameraParam) read_pose('calibration_data/robot_poses.pose', PoseWorldToRobot) NumImages := 10 for I := 1 to NumImages read_image(Image, 'calibration_data/image_' + I + '.png') find_markers(Image, Markers2D) find_pose(Markers2D, CameraParam, PoseCamToTarget) PoseWorldToTarget := PoseWorldToRobot * PoseRobotToCam * PoseCamToTarget append_pose('calibration_data/target_poses.pose', PoseWorldToTarget) endfor calibrate_hand_eye('calibration_data/target_poses.pose', 'calibration_data/robot_poses.pose', 'calibration_data/hand_eye.calib', CalibrationMethod) ``` 上述代码假设您已经使用其他工具(如 OpenCV)对相机和机器人进行了标定,并将结果保存在 `calibration_data` 目录中。代码读取每个图像,找到其中的手眼标记(可能是一组 AR 标记或其他类型的标记),并估计相机与标记之间的变换。然后,它使用先前标定的相机和机器人参数,将相机与机器人之间的变换计算出来,并将结果附加到 `target_poses.pose` 文件中。最后,它使用已知的标记和机器人位置数据,计算手眼标定,并将结果保存在 `hand_eye.calib` 文件中。 请注意,上述代码仅提供了一个基本的框架,需要根据实际情况进行修改和调整。您需要根据您的具体应用程序和硬件设置调整相机和机器人的参数,并修改代码以使用适当的手眼标记和计算方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值