基于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

<think>好的,用户想了解如何使用Halcon进行2D机器视觉中的12点平移加旋转标定的全过程,以及具体的步骤代码示例。首先,我需要回顾一下Halcon标定的基本概念方法。 根据引用中的信息,Halcon标定通常涉及九点标定旋转中心标定。例如,引用[4]提到九点标定利用已知的标定板上的点来计算相机机械臂之间的变换矩阵,而N点标定只需要至少三个不共线的点。用户的问题是关于12点的标定,可能是在九点的基础上增加了更多的点以提高精度,或者需要处理更复杂的变换,比如平移旋转的组合。 接下来,我需要确定12点标定九点标定的主要区别。九点标定主要用于建立二维的仿射变换,而12点可能用于更复杂的变换,比如相似变换或投影变换,但通常二维标定中仿射变换已经足够。不过,用户提到的是“平移加旋转”,这属于刚体变换,属于仿射变换的一种,所以可能需要使用相似变换模型。Halcon中的create_calib_data算子可以创建标定数据模型,然后设置标定板的参数。 根据引用[5],Halcon可以用简单的代码实现平移旋转,这可能涉及到矩阵运算。不过标定过程需要更详细的步骤,包括数据采集、标定板定义、点对应关系的建立、计算变换矩阵以及验证。 用户可能需要具体的代码示例。例如,引用[2][4]提供了九点标定的C#Halcon代码,可以参考这些结构来编写12点的代码。需要注意Halcon中的标定通常使用create_calib_datafind_calib_object等算子,但如果是手眼标定,可能需要手动计算变换矩阵。 可能的步骤包括:准备标定板,采集12个点的图像坐标对应的机械臂坐标,使用这些点计算变换矩阵。Halcon中的hom_vector_to_pose算子可以将点对转换为变换矩阵,或者使用vector_to_hom_mat2d来生成二维变换矩阵。 需要验证标定的准确性,比如通过计算重投影误差,或者应用变换矩阵到测试点,检查实际坐标与预期是否一致。此外,用户可能关心如何处理标定过程中的误差,以及如何优化标定结果。 最后,根据引用中的信息,确保引用了正确的来源,例如九点标定的基本流程Halcon的算子使用。需要检查步骤是否完整,代码是否正确,并生成相关问题,如标定误差的来源、优化方法、标定板的选择等。</think>### Halcon 12点平移与旋转标定流程 Halcon中12点标定主要用于建立**图像坐标系**与**机械臂坐标系**之间的刚体变换关系(平移+旋转),其核心步骤与九点标定类似,但通过更多点提升标定精度。以下是具体步骤与代码示例: --- #### **1. 准备工作** - **标定板制作**:使用带明确几何特征(如圆形阵列)的标定板,需保证12个标定点在图像中清晰可识别[^1]。 - **坐标系对齐**:标定板需固定在机械臂末端,确保机械臂移动时标定板与相机相对位置不变[^4]。 --- #### **2. 数据采集** - **采集图像**:控制机械臂移动到**12个不同位姿**,每个位姿拍摄一张标定板图像。 - **记录坐标**:记录每个位姿下: - **图像坐标**:通过图像处理提取12个标定点的像素坐标($u_i, v_i$)。 - **机械臂坐标**:对应机械臂末端在基坐标系下的物理坐标($x_i, y_i$)。 ```python * 示例:提取标定板圆心坐标 read_image (Image, &#39;calib_image_01&#39;) threshold (Image, Region, 128, 255) connection (Region, ConnectedRegions) select_shape (ConnectedRegions, Circles, &#39;circularity&#39;, &#39;and&#39;, 0.9, 1.0) area_center (Circles, Area, Row, Column) ``` --- #### **3. 计算变换矩阵** 使用$vector\_to\_hom\_mat2d$算子,通过最小二乘法计算**仿射变换矩阵**$H$,满足: $$ \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix} = H \cdot \begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix} $$ ```python * 输入:12组像素坐标(Rows, Columns)机械坐标(X, Y) Rows := [r1, r2, ..., r12] Columns := [c1, c2, ..., c12] X := [x1, x2, ..., x12] Y := [y1, y2, ..., y12] * 计算变换矩阵H vector_to_hom_mat2d (Rows, Columns, X, Y, HomMat2D) ``` --- #### **4. 验证标定结果** 将图像坐标通过$H$转换后与真实机械坐标对比,计算误差: ```python * 应用变换矩阵 affine_trans_point_2d (HomMat2D, Rows, Columns, TransX, TransY) * 计算平均误差 MeanErrorX := sum(abs(TransX - X)) / 12 MeanErrorY := sum(abs(TransY - Y)) / 12 ``` --- #### **5. 应用标定结果** 将图像中的任意点坐标转换为机械坐标: ```python * 输入图像坐标(u, v) affine_trans_point_2d (HomMat2D, u, v, x, y) ``` --- #### **代码示例(完整流程)** ```python * 1. 初始化 dev_close_window () dev_open_window (0, 0, 800, 600, &#39;black&#39;, WindowHandle) * 2. 采集12组数据(实际需循环拍摄) collect_data (Rows, Columns, X, Y) * 自定义数据采集函数 * 3. 计算变换矩阵 vector_to_hom_mat2d (Rows, Columns, X, Y, HomMat2D) * 4. 验证 affine_trans_point_2d (HomMat2D, Rows, Columns, TransX, TransY) MeanErrorX := sum(abs(TransX - X))/12 MeanErrorY := sum(abs(TransY - Y))/12 disp_message (WindowHandle, &#39;X误差:&#39; + MeanErrorX + &#39; Y误差:&#39; + MeanErrorY, &#39;window&#39;, 12, 12, &#39;black&#39;, &#39;true&#39;) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值