HALCON——手眼标定¶
本章介绍如何在 Windows 系统下通过梅卡曼德提供的例程进行手眼标定。梅卡曼德提供如下两个例程:
determine_calibration_poses.hdev:用于获取进行手眼标定时的 标定位姿 。
perform_hand_eye_calibration.hdev:用于进行手眼标定。
注解
目前仅适配六轴机器人。
使用 UHP 系列相机进行手眼标定时, 拍摄模式 必须为 Camera1 。
使用前提¶
使用 HALCON 进行手眼标定前,准备工作如下:
确认机器人精度无误,且机器人可正常使用。
准备相机随附的标定板, 安装相机与标定板 。
下载并安装 Mech-Eye SDK 。
确认 2D 图 与深度图的质量 符合要求。
确认 相机内参 符合要求。
下载 HALCON 例程 ,依次单击 即可下载。
修改例程¶
使用 determine_calibration_poses.hdev 获取标定位姿后,需使用 perform_hand_eye_calibration.hdev 进行手眼标定。
两个例程中的以下信息需保持一致:
连接的相机
标定板型号
另外,获取位姿前,需设置 robot_pose.json 文件中的欧拉角类型。
选择同一台相机¶
运行例程前,需修改例程中设置的相机,保证两个例程运行时连接同一台相机。设置步骤如下:
设置标定板型号¶
设置标定板型号的步骤如下:
在 HALCON 中打开例程:运行 HALCON,将例程拖拽至 HALCON 的 程序窗口 中。
设置标定板型号。默认标定板型号为 BDB-5;如使用其他标定板,定位至如下算子,将 BDB-5 替换为对应的 标定板型号 。
set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')
设置欧拉角类型和单位¶
使用 determine_calibration_poses.hdev 获取的标定位姿需输入至 robot_pose.json 文件中, robot_pose.json 文件中默认的欧拉角类型为 sxyz ,默认的欧拉角单位为角度。请执行以下步骤设置欧拉角类型与格式:
打开 robot_pose.json 文件。
设置欧拉角类型。定位至如下命令行,将 sxyz 替换为所用机器人的欧拉角类型。例程已支持的欧拉角类型请参考 机器人欧拉角类型 。
"EulerType":"sxyz"
设置欧拉角单位。如需输入以弧度为单位的欧拉角,定位至如下命令行,将 true 替换为 false。
"FromDegree":true
保存 robot_pose.json 文件。
获取标定位姿¶
流程图¶
步骤¶
进行手眼标定前,需获取至少 15 组的标定位姿。获取标定位姿的步骤如下:
单击工具栏中的 按钮或单击键盘上的 F5 ,运行例程。例程运行到 read_char (WindowHandle, Char, ReCode) 时将暂停运行,需手动输入指令继续运行例程。
提示
如相机连接不成功,需检查相机是否已被 Mech-Eye Viewer 或其他 GenICam 客户端连接。
使用示教器移动机器人至合适位置。
输入 P ,相机采集图像。
如标定板只有部分在视野之内或不在视野之内,请移动机器人,并重新采集图像。
如标定板全部在视野之内,请执行下一步。
输入 T ,相机采集包含特征识别结果的图像。
如相机无法识别标定板上的圆,HALCON 将不返回图像。此时请移动机器人,重新采集原始图像与包含特征识别结果的图像。
如相机可以识别标定板上的圆,HALCON 将显示包含特征识别结果的图像(如下图所示),请执行下一步。
查看机器人示教器,将机器人此时的位姿输入 robot_pose.json 文件中。
提示
请将该位姿存入示教器中。进行手眼标定时,可直接使用示教器中已保存的位姿移动机器人。
重复步骤 2~5,继续获取位姿。
确认获取至少 15 组位姿后,采集数据结束,输入 Q ,退出程序。
设置 robot_pose.json 文件中标定位姿个数。打开 robot_pose.json 文件,定位至如下命令行,将 15 替换为实际获取的标定位姿个数。
"pose_count":15
进行手眼标定¶
获取机器人标定位姿后,运行 perform_hand_eye_calibration.hdev 例程,开始手眼标定。
检查相机安装方式¶
进行手眼标定前需设置相机安装方式。
默认相机安装方式为 Eye in Hand;如相机安装方式为 Eye to Hand,定位至如下算子,将 EyeInHand 替换为 EyeToHand 。
set_framegrabber_param (AcqHandle, 'CalibrationType', 'EyeInHand')
切换坐标系¶
例程中包含切换相机输出点云的坐标系的算子,通过该算子可直接输出机器人坐标系下的点云。
默认设置为不切换坐标系;如需切换至机器人坐标系,请在 captureTranformedPointCloud 函数中,定位至如下算子,并将 false 替换为 true。
set_framegrabber_param (AcqHandle, 'Scan3dCoordinateTransformEnable',false)
步骤¶
手眼标定需执行如下步骤:
将机器人移动至 robot_pose.json 文件中的标定位姿。
提示
请按 robot_pose.json 文件中的位姿顺序移动机器人,否则将导致后续外参计算失败。
采集图像结束后,查看 控制变量 中的 CollectResult 值。
如显示 SUCCESS,请进行下一步;
如发生报错,请根据 错误码 排查问题,再重新获取标定位姿。
界面提示“Move the robot to the next calibration pose”,此时请重复执行步骤 2~3。
提示
机器人到达 robot_pose.json 文件中的所有位置后,再运行例程时,将自动计算外参。
查看 控制变量 中的 CalibResult 值。
如显示 SUCCESS,则手眼标定成功。请在例程所在文件夹内查看外参文件 Extrinsics.txt 与转换坐标系后的点云;
如发生报错,请根据 错误码 排查问题,再重新获取标定位姿。
机器人欧拉角类型¶
标定例程中已支持以下欧拉角类型与四元数的转换。
输入顺序 |
欧拉角类型 |
机器人品牌 |
Z-Y’-Z’’ |
rzyz |
Kawasaki(川崎) |
Z-Y’-X’’ |
rzyx |
ABB |
KUKA(库卡) |
||
X-Y-Z |
sxyz |
FANUC(发那科) |
YASKAWA(安川) |
||
Rokae(珞石) |
||
UR(优傲) |
||
X-Y’-Z’’ |
rxyz |
/ |
Z-X’-Z’’ |
rzxz |
/ |
注解
欧拉角类型相同时,机器人欧拉角显示的顺序可能不同。请按照上表的输入顺序输入欧拉角。
如所用机器人的欧拉角类型不在上表内,需要您自行添加该欧拉角类型与四元数的转换。请在 perform_hand_eye_calibration.hdev 例程的 euler_to_quad 函数中,参照已有代码添加转换。
标定参数说明¶
本节介绍进行手眼标定时使用的参数。
BoardType¶
该参数用于设置使用的标定板型号。
值列表及说明:
值 |
说明 |
BDB-5 |
标定板到相机的推荐距离为 < 0.6m |
BDB-6 |
标定板到相机的推荐距离为 0.6~1.5m |
BDB-7 |
标定板到相机的推荐距离为 > 1.5m |
OCB-005 |
仅用于对精度要求高,且为 Eye to Hand 安装方式的项目 |
OCB-010 |
|
OCB-015 |
|
OCB-020 |
|
CGB-020 |
标定板到相机的推荐距离为 < 0.6m |
CGB-035 |
标定板到相机的推荐距离为 0.6~1.5m |
CGB-050 |
标定板到相机的推荐距离为 > 1.5m |
ExtrinErrCode¶
该只读参数用于确认手眼标定过程中的状态码和错误码。
状态码 |
说明 |
SUCCESS |
执行成功。 |
POSE_INVALID |
位姿格式不正确,请输入四元数。 |
IMAGE2D_EMPTY |
2D 图无效。 |
FIND_CORNERS_FAIL |
2D 图特征识别失败,请调节 2D 图参数调节 以获取符合要求的 2D 图。 |
DEPTH_EMPTY |
深度图无效。 |
CORNERS_3D_INVALID |
深度图特征识别失败,请调节 3D参数 以获取符合要求的深度图。 |
POSES_INSUFFICIENT |
位姿数量不足,请输入至少 15 组位姿。 |