手眼标定

本章介绍如何在Windows系统下通过hand_eye_calibration系列例程进行手眼标定。

请参考HALCON例程使用指南获取例程并确认使用前提。

hand_eye_calibration文件夹中包含以下两个例程:

  • determine_calibration_poses:用于获取进行手眼标定时的标定位姿。

  • perform_hand_eye_calibration:用于进行手眼标定。

  • 目前仅适配六轴机器人。

  • 使用UHP系列相机进行手眼标定时,拍摄模式必须为Camera1

准备工作

使用HALCON例程进行手眼标定前,请做好以下准备工作:

  1. 确认机器人精度无误,且机器人可正常使用。

  2. 准备相机随附的标定板,安装标定板

  3. 确认2D图与深度图的质量符合要求。

  4. 确认相机内参符合要求。

修改例程

使用determine_calibration_poses获取标定位姿后,需使用perform_hand_eye_calibration进行手眼标定。

两个例程中的以下信息需保持一致:

  • 连接的相机

  • 标定板型号

另外,获取位姿前,需设置robot_pose.json文件中的欧拉角类型。

选择同一台相机

运行例程前,需修改例程中设置的相机,保证两个例程运行时连接同一台相机。设置步骤如下:

  1. 在HALCON中打开例程:运行HALCON,将例程拖拽至HALCON的程序窗口中。

  2. 单步运行程序(重复单击工具栏中的step over按钮),直至弹出变量监视:MechEyeCameras窗口。

  3. 该窗口中显示所有可连接的相机。选中需连接的相机并双击,复制unique_name:user_name:后的名称。

    camera name
    user_name为自定义的相机备注。可在Mech-Eye Viewer中设置
  4. 定位至以下命令行,将MechEye替换为复制的unique_nameuser_name

    DeviceInfo := 'MechEye'

设置标定板型号

设置标定板型号的步骤如下:

  1. 在HALCON中打开例程:运行HALCON,将例程拖拽至HALCON的程序窗口中。

  2. 设置标定板型号:默认标定板型号为BDB-5;如使用其他标定板,定位至如下算子,将BDB-5替换为对应的标定板型号

    set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')

设置欧拉角类型和单位

使用determine_calibration_poses获取的标定位姿需输入至robot_pose.json文件中,robot_pose.json文件中默认的欧拉角类型为sxyz,默认的欧拉角单位为角度。请执行以下步骤设置欧拉角类型与格式:

  1. 打开robot_pose.json文件。

  2. 设置欧拉角类型:定位至如下命令行,将sxyz替换为所用机器人的欧拉角类型。例程已支持的欧拉角类型请参考机器人欧拉角类型

    "EulerType":"sxyz"
  3. 设置欧拉角单位:如需输入以弧度为单位的欧拉角,定位至如下命令行,将true替换为false

    "FromDegree":true
  4. 保存robot_pose.json文件。

获取标定位姿

流程图

extri teach flow

步骤

进行手眼标定前,需获取至少15组的标定位姿。获取标定位姿的步骤如下:

  1. 单击工具栏中的run按钮或单击键盘上的F5,运行例程。例程运行到read_char (WindowHandle, Char, ReCode)时将暂停运行,需手动输入指令继续运行例程。

    如相机连接不成功,需检查相机是否已被Mech-Eye Viewer或其他GenICam客户端连接。
  2. 使用示教器移动机器人至合适位置。

    标定位姿需满足一定条件,相关指导可从HALCON参考手册中获取:打开HALCON的帮助  HALCON参考手册,查看Calibration章节。
  3. 输入P,相机采集图像。

    • 如标定板只有部分在视野之内或不在视野之内,请移动机器人,并重新采集图像。

    • 如标定板全部在视野之内,请执行下一步。

  4. 输入T,相机采集包含特征识别结果的图像。

    • 如相机无法识别标定板上的圆,HALCON将不返回图像。此时请移动机器人,重新采集原始图像与包含特征识别结果的图像。

    • 如相机可以识别标定板上的圆,HALCON将显示包含特征识别结果的图像(如下图所示),请执行下一步。

      calib sample
  5. 查看机器人示教器,将机器人此时的位姿输入robot_pose.json文件中。位姿中的平移量应以mm为单位,旋转量(欧拉角)的单位与robot_pose.json文件中的设置保持一致。

    请将该位姿存入示教器中。进行手眼标定时,可直接使用示教器中已保存的位姿移动机器人。
  6. 重复步骤2~5,继续获取位姿。

  7. 确认获取至少15组位姿后,采集数据结束,输入Q,退出程序。

  8. 设置robot_pose.json文件中标定位姿个数:打开robot_pose.json文件,定位至如下命令行,将15替换为实际获取的标定位姿个数。

    "pose_count":15

进行手眼标定

获取机器人标定位姿后,运行perform_hand_eye_calibration例程,开始手眼标定。

流程图

extri calib flow

检查相机安装方式

进行手眼标定前需设置相机安装方式。

默认相机安装方式为Eye in Hand;如相机安装方式为Eye to Hand,定位至如下算子,将EyeInHand替换为EyeToHand

set_framegrabber_param (AcqHandle, 'CalibrationType', 'EyeInHand')

切换坐标系

例程中包含切换相机输出点云的坐标系的算子,通过该算子可使直接输出机器人坐标系下的点云。

默认设置为不切换坐标系;如需切换至机器人坐标系,请在captureTranformedPointCloud函数中,定位至如下算子,并将false替换为true

set_framegrabber_param (AcqHandle,'Scan3dCoordinateTransformEnable',false)

步骤

手眼标定需执行以下步骤:

  1. 单击工具栏中的run按钮或单击键盘上的F5,运行例程。例程运行至stop行后,将暂停运行。

  2. 将机器人移动至robot_pose.json文件中的标定位姿。

    请按robot_pose.json文件中的位姿顺序移动机器人,否则将导致后续外参计算失败。
  3. 单击工具栏中的run按钮或单击键盘上的F5,运行例程,相机采集图像。

  4. 采集图像结束后,查看控制变量中的CollectResult值。

    • 如显示SUCCESS,请进行下一步;

    • 如发生报错,请根据错误码排查问题,再重新获取标定位姿。

  5. 界面提示Move the robot to the next calibration pose,此时请重复执行步骤2~3。

    机器人到达robot_pose.json文件中的所有位置后,再运行例程时,将自动计算外参。
  6. 查看控制变量中的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

/

  • 欧拉角类型相同时,机器人欧拉角显示的顺序可能不同。请按照上表的输入顺序输入欧拉角。

  • 如所用机器人的欧拉角类型不在上表内,需要你自行添加该欧拉角类型与四元数的转换。请在perform_hand_eye_calibration例程的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

深度图特征识别失败,请调节深度图相关参数以获取符合要求的深度图。

POSES_INSUFFICIENT

位姿数量不足,请输入至少15组位姿。