Halocn 手眼标定和应用

手眼标定和应用

手眼标定的作用是机器人视觉中非常重要的一步,帮助机器人获取识别到的视觉信息,从而完成后续的控制工作,例如视觉抓取等等

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

手眼标定就是获取机械手坐标系和相机坐标系之间转换矩阵(或称为转换关系),通过这个矩阵把图像坐标映射到机器人坐标。比如已知几个点分别在机器手坐标系的坐标和相机坐标系的坐标,求出两者间的转换矩阵。

一、相机标定

  1. 标定相机 即计算相机内参。
    1.1准备标定数据
    制作标定板
    拍摄图像

    1.2创建标定模型
    1.3设置相机初始参数
    1.4设置标定板描述文件
    1.5标定
  2. 保存相机内参

二、机器手标定

手眼标定分两种。eye-to-handeye-in-hand

由4个坐标系组成:

  • 机器人基坐标系base
  • 法兰上的工具坐标系tool
  • 相机坐标系camera
  • 标定板坐标系cal

1. eye-to-hand 相机安装在机器手外,相机固定。

在这里插入图片描述
标定物在相机中位姿 可获得(Cal相对于Camera的转换矩阵),由相机内外参构成。
基坐标系在工具坐标系中位姿 可获得(Tool相对于Base的转换矩阵),从机械手读出。
通过以上两个已知位姿:

  • 计算基坐标系在相机坐标系的转换矩阵
  • 计算标定物在工具坐标系的转换矩阵。利用固定不变的特性,不用求出具体值。

2. eye-in-hand 相机安装在机器手上,相机随机器人移动。

在这里插入图片描述
标定物在相机中位姿可获得,由相机内外参构成。
基坐标系在工具坐标系中位姿可获得,从机械手读出。
通过以上两个已知位姿:

  • 计算工具在相机坐标系的关系
  • 计算标定物在基坐标系的关系

手眼标定

1、准备数据

制作标定板,拍摄合格图像,记录对应图像下的机器人姿态。
记录机器人姿态参考下面例程。

hand_eye_create_robot_poses.hdev

常见机械手的pose转换方式
ABB四元数表示法X、Y、Z、Q1、Q2、Q3、Q4
create_pose(X, Y, Z, 0, 0, 0, ‘Rp+T’, ‘gba’, ‘point’, Pose0)
quat_to_pose([Q1,Q2,Q3,Q4], Pose1)
pose_compose(Pose0, Pose1, Pose)

KUKA
欧拉角表示法X、Y、Z、A、B、
Ccreate_pose(X, Y, Z, C, B, A, ‘Rp+T’, ‘abg’, ‘point’, Pose)

FANUC
欧拉角表示法X、Y、Z、W、P、R
create_pose(X, Y, Z, W, P, R, ‘Rp+T’, ‘abg’, ‘point’, Pose)

创建标定模型
create_calib_data( : : CalibSetup, NumCameras, NumCalibObjects : CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, [], StartCamParam)//设置相机初始参数
set_calib_data_calib_object (CalibDataID, 0, CalTabFile)//设置标定板初始参数。

CalibSetup:标定类型,如下形式

固定相机(eye-to-hand)+多关节机器人:hand_eye_stationary_cam
移动相机(eye-in-hand)+多关节机器人:hand_eye_moving_cam
固定相机(eye-to-hand)+ SCARA型机器人:hand_eye_scara_stationary_cam
移动相机(eye-in-hand)+ SCARA型机器人:hand_eye_scara_moving_cam

指定优化模型
set_calib_data (CalibDataID, 'model', 'general', 'optimization_method', 'nonlinear')

优化方式有线性优化和非线性优化,一般采用非线性作为标定姿态的优化方法,因为它的精度要大大优于线性标定方法。

指定标定对象姿态
find_calib_object (Image, CalibDataID, 0, 0, I, [], [])//获取标定板姿态,提取轮廓和圆点。
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
get_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, Index, CalObjInCamPose)
指定工具姿态
read_pose (DataNameStart + 'robot_pose_' + I$'02d' + '.dat', ToolInBasePose)
set_calib_data (CalibDataID, 'tool', I, 'tool_in_base_pose', ToolInBasePose)

2、执行手眼标定

calibrate_hand_eye (CalibDataID, Errors)

3、检查标定

//获取标定误差
get_calib_data (CalibDataID, 'model', 'general', 'camera_calib_error', CamCalibError)
//获取标定相机内参
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
//获得姿态
get_calib_data (CalibDataID, 'camera', 0, 'base_in_cam_pose', BaseInCamPose)
get_calib_data (CalibDataID, 'calib_obj', 0, 'obj_in_tool_pose', ObjInToolPose)
–
固定相机(eye-to-hand):
–
get_calib_data(CalibDataID,‘camera‘, 0,’base_in_cam_pose‘,BaseInCamPose)
–
get_calib_data(CalibDataID,‘calib_obj’, 0,‘obj_in_tool_pose‘,ObjInToolPose)
–
移动相机(eye-in-hand):
–
get_calib_data(CalibDataID, 'camera', 0, 'tool_in_cam_pose', ToolInCamPose)get_calib_data(CalibDataID, 'calib_obj', 0, 'obj_in_base_pose', CalObjInBasePose)

4、保存标定结果

write_calib_data (Operator)

注意保存范围,其中没有相机标定后的内参。
initial camera parameters(初始相机参数)
calibration object descriptions(标定板描述)
observation data(观测的数据)
generic and specific optimization parameters for both cameras and calibration object poses.(相机和标定板姿态的参数)

相机参数(内参)保存
//保存相机内参
 write_cam_par (CamParam, DataNameStart + 'final_campar.dat')
 
姿态保存

Eye In Hand 主要保存标定板在相机的姿态。获取‘ToolInCamPose’并保存,获取‘CalObjInBasePose’并保存。

Eye to Hand 主要保存相机在机器手基坐标的姿态。

//保存标定姿态
write_pose (BaseInCamPose, DataNameStart + 'final_pose_cam_base.dat')
write_pose (ObjInToolPose, DataNameStart + 'final_pose_tool_calplate.dat')

应用

5、应用

读相机内参
read_cam_par ('start_campar.dat', StartCamParam)
读姿态
//固定相机(eye-to-hand)
read_pose ('BaseInCamPose.dat', BaseInCamPose)
read_pose ('ObjInToolPose.dat', ObjInToolPose)

//移动相机(eye-in-hand)
read_pose ('BaseInCamPose.dat', ToolInCamPose)
read_pose ('ObjInToolPose.dat', CalObjInBasePose)
pose_to_hom_mat3d (BaseInCamPose, cam_H_base)
pose_to_hom_mat3d (ObjInToolPose, tool_H_calplate)

注意夹爪在工具坐标系的转换关系

read_pose (DataNameStart + 'pose_tool_gripper.dat', GripperInToolPose)
pose_to_hom_mat3d (GripperInToolPose, tool_H_gripper)
//获取机器人基准姿态(或读取或计算)
read_pose ('BaseInCamPose.dat', PoseRef)
pose_to_hom_mat3d (PoseRef, cam_H_ref)

图像坐标系到机器人基坐标系转换

image_points_to_world_plane (CamParam, PoseRef, CornersRow, CornersCol, 'm', CornersX_ref, CornersY_ref)

将相机获取的位姿转换到机器人基坐标系,用来生成对应的工作命令

固定相机(eye-to-hand):
在这里插入图片描述

pose_invert(BaseInCamPose, CamInBasePose)
pose_compose(CamInBasePose, ObjInCamPose, ObjInBasePose)

移动相机(eye-in-hand)
在这里插入图片描述

pose_invert(ToolInCamPose, CamInToolPose)
pose_compose(ToolInBasePose, CamInToolPose, CamInBasePose)
pose_compose(CamInBasePose, ObjInCamPose, ObjInBasePose)

注意手眼标定完成后,夹爪是否在工具坐标系内,不在要进行转换。

另外姿态和矩阵转换

hom_mat3d_to_pose (Operator)
pose_to_hom_mat3d (Operator)

以下为Halcon参考例程。

calibrate_cameras_monocular.hdev //相机标定。
calibrate_cameras_precision.hdev //相机标定。
hand_eye_create_robot_poses.hdev //记录姿态和创建姿态文件。
check_hand_eye_calibration_input_poses.hdev //最简手眼标定。
calibrate_hand_eye_scara_moving_cam.hdev //4轴机器手 Eye In Hand 标定
calibrate_hand_eye_scara_stationary_cam.hdev //4轴机器手 Eye To Hand 标定
hand_eye_movingcam_calibration.hdev // 机器手Eye In Hand 标定
hand_eye_stationarycam_calibration.hdev //机器手 Eye To Hand 标定
hand_eye_stationarycam_grasp_nut.hdev // 应用例程

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ImageHu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值