手眼标定和应用
手眼标定的作用是机器人视觉中非常重要的一步,帮助机器人获取识别到的视觉信息,从而完成后续的控制工作,例如视觉抓取等等提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
手眼标定就是获取机械手坐标系和相机坐标系之间转换矩阵(或称为转换关系),通过这个矩阵把图像坐标映射到机器人坐标。比如已知几个点分别在机器手坐标系的坐标和相机坐标系的坐标,求出两者间的转换矩阵。
一、相机标定
- 标定相机 即计算相机内参。
1.1准备标定数据
制作标定板
拍摄图像
1.2创建标定模型
1.3设置相机初始参数
1.4设置标定板描述文件
1.5标定 - 保存相机内参
二、机器手标定
手眼标定分两种。eye-to-hand 和 eye-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 // 应用例程