HALCON——手眼标定
本章介绍如何在Windows系统下通过梅卡曼德提供的例程进行手眼标定。梅卡曼德提供如下两个例程:
-
determine_calibration_poses:用于获取进行手眼标定时的标定位姿。
-
perform_hand_eye_calibration:用于进行手眼标定。
|
使用前提
使用HALCON进行手眼标定前,准备工作如下:
-
确认机器人精度无误,且机器人可正常使用。
-
准备相机随附的标定板,安装标定板。
-
下载并安装Mech-Eye SDK。
-
确认2D图与深度图的质量符合要求。
-
确认相机内参符合要求。
-
下载hand_eye_calibration例程,依次单击 即可下载。
修改例程
使用determine_calibration_poses获取标定位姿后,需使用perform_hand_eye_calibration进行手眼标定。
两个例程中的以下信息需保持一致:
-
连接的相机
-
标定板型号
另外,获取位姿前,需设置robot_pose.json文件中的欧拉角类型。
选择同一台相机
运行例程前,需修改例程中设置的相机,保证两个例程运行时连接同一台相机。设置步骤如下:
-
在HALCON中打开例程:运行HALCON,将例程拖拽至HALCON的程序窗口中。
-
选中程序窗口中info_framegrabber算子所在的行,单击工具栏中的按钮或单击键盘上的F6,运行该算子。
-
双击控制变量区域的DeviceInfos,可查看所有可连接的相机。
-
选中相机并双击,复制unique_name:或user_name:的相机名。
user_name为自定义的相机备注。可在Mech-Eye Viewer中设置。 -
定位至如下命令行,将MechEye替换为unique_name或user_name。
DeviceInfo := 'MechEye'
设置标定板型号
设置标定板型号的步骤如下:
-
在HALCON中打开例程:运行HALCON,将例程拖拽至HALCON的程序窗口中。
-
设置标定板型号:默认标定板型号为BDB-5;如使用其他标定板,定位至如下算子,将BDB-5替换为对应的标定板型号。
set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')
设置欧拉角类型和单位
使用determine_calibration_poses获取的标定位姿需输入至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客户端连接。 -
使用示教器移动机器人至合适位置。
标定位姿需满足一定条件,相关指导可从HALCON参考手册中获取:打开HALCON的 ,查看Calibration章节。 -
输入P,相机采集图像。
-
如标定板只有部分在视野之内或不在视野之内,请移动机器人,并重新采集图像。
-
如标定板全部在视野之内,请执行下一步。
-
-
输入T,相机采集包含特征识别结果的图像。
-
如相机无法识别标定板上的圆,HALCON将不返回图像。此时请移动机器人,重新采集原始图像与包含特征识别结果的图像。
-
如相机可以识别标定板上的圆,HALCON将显示包含特征识别结果的图像(如下图所示),请执行下一步。
-
-
查看机器人示教器,将机器人此时的位姿输入robot_pose.json文件中。位姿中的平移量应以mm为单位,旋转量(欧拉角)的单位与robot_pose.json文件中的设置保持一致。
请将该位姿存入示教器中。进行手眼标定时,可直接使用示教器中已保存的位姿移动机器人。 -
重复步骤2~5,继续获取位姿。
-
确认获取至少15组位姿后,采集数据结束,输入Q,退出程序。
-
设置robot_pose.json文件中标定位姿个数:打开robot_pose.json文件,定位至如下命令行,将15替换为实际获取的标定位姿个数。
"pose_count":15
进行手眼标定
获取机器人标定位姿后,运行perform_hand_eye_calibration例程,开始手眼标定。
检查相机安装方式
进行手眼标定前需设置相机安装方式。
默认相机安装方式为Eye in Hand;如相机安装方式为Eye to Hand,定位至如下算子,将EyeInHand替换为EyeToHand。
set_framegrabber_param (AcqHandle, 'CalibrationType', 'EyeInHand')
切换坐标系
例程中包含切换相机输出点云的坐标系的算子,通过该算子可使直接输出机器人坐标系下的点云。
默认设置为不切换坐标系;如需切换至机器人坐标系,请在captureTranformedPointCloud函数中,定位至如下算子,并将false替换为true。
set_framegrabber_param (AcqHandle,'Scan3dCoordinateTransformEnable',false)
步骤
手眼标定需执行以下步骤:
-
单击工具栏中的按钮或单击键盘上的F5,运行例程。例程运行至stop行后,将暂停运行。
-
将机器人移动至robot_pose.json文件中的标定位姿。
请按robot_pose.json文件中的位姿顺序移动机器人,否则将导致后续外参计算失败。 -
单击工具栏中的按钮或单击键盘上的F5,运行例程,相机采集图像。
-
采集图像结束后,查看控制变量中的CollectResult值。
-
如显示SUCCESS,请进行下一步;
-
如发生报错,请根据错误码排查问题,再重新获取标定位姿。
-
-
界面提示Move the robot to the next calibration pose,此时请重复执行步骤2~3。
机器人到达robot_pose.json文件中的所有位置后,再运行例程时,将自动计算外参。 -
查看控制变量中的CalibResult值。
-
如显示SUCCESS,则手眼标定成功。请在例程所在文件夹内查看外参文件Extrinsics.txt与获取的点云;
-
如发生报错,请根据错误码排查问题,再重新获取标定位姿。
-
机器人欧拉角类型
标定例程中已支持以下欧拉角类型与四元数的转换。
常见表示方法 | 欧拉角类型 | 机器人品牌 |
---|---|---|
Z-Y'-Z"/OAT |
rzyz |
Kawasaki(川崎) |
Z-Y'-X"/yaw, pitch, roll |
rzyx |
ABB |
KUKA(库卡) |
||
X-Y-Z/WPR |
sxyz |
FANUC(发那科) |
YASKAWA(安川) |
||
Rokae(珞石) |
||
UR(优傲) |
||
X-Y'-Z" |
rxyz |
/ |
Z-X'-Z" |
rzxz |
/ |
|