4. 手眼标定与坐标系变换
在机器人视觉引导系统中,相机给出的目标位置通常位于图像坐标系或相机坐标系,而机器人运动指令需要的是基坐标系下的位姿。要让“看到”与“抓取”对齐,必须建立相机坐标系、机器人基坐标系与工具坐标系之间的定量关系,这一过程就是手眼标定。HALCON 将标定问题抽象为“已知标定板在相机中的位姿,同时记录机器人末端位姿,求解固定变换”,核心算子为 calibrate_hand_eye。
两种安装构型与标定方程
按相机安装位置不同,手眼系统分为 Eye-to-Hand 与 Eye-in-Hand。Eye-to-Hand 中相机固定在支架上,不随机器人运动,标定目标是求相机坐标系到机器人基坐标系的固定变换 H_cam_base;Eye-in-Hand 中相机安装在末端法兰上,随机器人一起运动,标定目标是求相机坐标系到工具坐标系的固定变换 H_cam_tool。两者数学本质相同,都是求解 AX = XB 形式的手眼方程,但已知量与未知量的归属不同。
以 Eye-to-Hand 为例,设机器人末端在基坐标系下的位姿为 H_base_tool,标定板在相机坐标系下的位姿为 H_cam_cal,标定板在基坐标系下固定不动,记为 H_base_cal。则存在关系:
H_base_tool · H_tool_cal = H_base_cal
H_cam_cal = H_cam_base · H_base_cal
消去 H_base_cal 后,对任意两次不同位姿 i、j 可构造相对运动方程,最终解出 H_cam_base。Eye-in-Hand 则把 H_cam_base 换成 H_cam_tool,标定板固定在基座或工作台上,方程形式对偶。理解这一点,就能明白为什么两种构型可以共用同一个 HALCON 算子,只是输入位姿的语义不同。
HALCON 标定算子与数据准备
HALCON 手眼标定依赖两类输入:一是标定板在相机中的位姿,二是机器人末端在基坐标系中的位姿。标定板位姿通过 find_calib_object 或 find_calib_object 配合 get_calib_data_observ_pose 获得;机器人位姿由控制器读取,通常以 (x, y, z, rx, ry, rz) 形式给出,需用 create_pose 或 pose_to_hom_mat3d 转为齐次矩阵。关键算子调用形式如下:
* 创建标定数据模型
create_calib_data ('hand_eye_moving_cam', 1, 1, CalibDataID)
* 设置相机内参(由相机标定获得)
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', CamParam)
* 设置标定板描述文件
set_calib_data_calib_object (CalibDataID, 0, 'calplate_80mm.descr')
* 对每个位姿:设置机器人末端位姿
set_calib_data (CalibDataID, 'tool', 0, 'tool_in_base_pose', ToolInBasePose)
* 观测标定板并提取位姿
find_calib_object (Image, CalibDataID, 0, 0, 0, [], [])
get_calib_data_observ_pose (CalibDataID, 0, 0, 0, ObjInCamPose)
* 求解手眼变换
calibrate_hand_eye (CalibDataID, Errors)
get_calib_data (CalibDataID, 'camera', 0, 'tool_in_cam_pose', CamInToolPose)
其中 'hand_eye_moving_cam' 对应 Eye-in-Hand,'hand_eye_stationary_cam' 对应 Eye-to-Hand。标定板类型需与描述文件一致,常用 7×7 圆点阵列或棋盘格。相机内参必须提前用 calibrate_cameras 标定,否则手眼结果会因畸变未校正而偏差明显。
标定操作流程与姿态采集
实际操作中,标定质量高度依赖姿态样本的丰富程度。建议采集 12~20 组位姿,覆盖机器人工作空间的不同位置和不同姿态角,避免所有样本集中在同一平面或同一朝向。每组样本需满足:标定板完整出现在图像中、圆点/角点提取成功、机器人位姿与图像采集时刻严格同步。若使用 Eye-in-Hand,机器人每移动到一个新位姿,先稳定等待,再触发相机采集,然后读取当前末端位姿,二者时间戳应对齐。
采集完成后调用 calibrate_hand_eye,该算子返回平均重投影误差 Errors。误差单位通常为像素或毫米,取决于标定板描述。若误差明显偏大,优先检查:标定板描述文件与实际板尺寸是否一致、机器人位姿单位是毫米还是米、旋转角顺序是 ZYX 还是 XYZ、相机内参是否匹配当前镜头。HALCON 默认位姿旋转顺序为 ZYX,若控制器输出顺序不同,需先转换再传入。
坐标系变换与验证方法
标定完成后,需要验证变换是否正确。验证思路是:用标定得到的 H_cam_base(或 H_cam_tool)把相机检测到的目标点变换到机器人基坐标系,再让机器人运动到该点,观察实际末端是否到达目标附近。具体计算为:
* 相机检测目标,得到目标在相机坐标系下的位姿
* 变换到基坐标系
pose_to_hom_mat3d (ObjInCamPose, H_cam_obj)
hom_mat3d_compose (H_cam_base, H_cam_obj, H_base_obj)
hom_mat3d_to_pose (H_base_obj, ObjInBasePose)
* 再结合工具变换,得到机器人应到达的末端位姿
hom_mat3d_compose (H_base_obj, H_tool_obj, H_base_tool_target)
验证时建议选取 3~5 个不同位置的目标点,分别计算理论位姿并实际运动,记录末端实际到达位置与理论位置的偏差。若偏差在 1~2 mm 以内,通常可满足抓取引导需求;若偏差随距离增大而线性增大,说明旋转部分存在小角度误差;若偏差恒定,说明平移分量有偏置。此时可回到标定数据,检查是否存在某组样本的标定板位姿提取失败或机器人位姿记录错误。
- 标定板描述文件尺寸与实际打印尺寸一致,打印后测量对角线复核。
- 相机内参已单独标定,畸变系数已启用。
- 机器人位姿单位统一为毫米和度,旋转顺序与 HALCON 约定一致。
- 每组样本的标定板在图像中完整、清晰、不倾斜过度。
- 样本数量不少于 12 组,姿态覆盖不同方向。
- 标定误差
Errors在合理范围,且验证点偏差满足抓取精度。
需要特别注意的是,Eye-to-Hand 与 Eye-in-Hand 的验证方式略有差异。Eye-to-Hand 中相机固定,验证时机器人运动不影响相机观测,可直接用同一目标点反复验证;Eye-in-Hand 中相机随动,验证时需让机器人先运动到观测位姿,再计算目标在基坐标系下的位置,然后运动到抓取位姿。两种构型都要求标定板或目标在标定与验证阶段保持同一物理位置,否则变换关系会引入额外误差。
最后,手眼标定结果应保存为文件或参数,供后续视觉引导程序加载。HALCON 可用 write_calib_data 保存标定数据,也可单独提取 H_cam_base 或 H_cam_tool 矩阵写入配置文件。每次更换相机、镜头、安装支架或机器人工具后,都应重新标定,不能沿用旧参数。