在halcon手眼 标定中,主要分为相机固定和相机随机械手移动两种标定方式。
在固定 相机时,标定 板固定 在夹具上,机械手带着标定板进行一系列的移动,
在每个位置让相机对标定板拍照,同时记录下机械手的位置信息(信息由机械手系统提供)。
相机运动时,是标定板固定不动,机械手带着相机在不同位置拍照,同时记录拍照时机械手对应的位姿,
最后求得委屈什么坐标系与机械手基础坐标系关系。
这章节演示如何进行SCARA机器人的手眼标定。
相机相对机器人固定。
标定板固定于机器手工具末端上。在代码最后,标定结果及数据会被保存到磁盘文件。
保存的数据可以在后续用于计算要抓取物体的位置。
标定过程是先将相机固定在一个地方,机械手带动标定 板在不同的位置进行拍照,
再进行标定求出摄像机坐标系与机械手基础坐标系转换关系,其实就是平移矢量和放置矩阵。
核心就是要确定 摄像机和机械手基础 坐标系间的关系 ,机械手基础坐标系就是以机械手底座为原点建立的坐标系,
摄像 机坐标系是以摄像 机中心为原点 建立 的坐标系,知道 它们间的关系后就可以计算出要抓取物体可基础 坐标系下的坐标,
从而 可以进行准确抓取.
例程文件使用halcon自带例程pick_and_place_scara_stationary_cam.hdev内使用的文件。
可以将文件放置于下边例程文件同级目录 。
dev_close_window ()
dev_open_window_fit_size (0, 0, 1280, 1024, 640, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
CalibObjDescr := '1.cpd'
CameraParam := ['area_scan_division',0.0165251, -642.277, 4.65521e-006, 4.65e-006, 640, 512, 1280, 1024]
create_calib_data ('hand_eye_scara_stationary_cam', 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, [], CameraParam)
set_calib_data_calib_object (CalibDataID, 0, CalibObjDescr)
for i:= 1 to 10 by 1
file := i$'d'
read_image (Image, file)
read_pose ( i$'d'+'.dat', ToolInBasePose)
set_calib_data (CalibDataID, 'tool', i, 'tool_in_base_pose', ToolInBasePose)
find_calib_object (Image, CalibDataID, 0, 0, i, [], [])
get_calib_data_observ_pose (CalibDataID, 0, 0, i, ObjInCameraPose)
disp_caltab (WindowHandle, CalibObjDescr, CameraParam, ObjInCameraPose, 1)
endfor
stop()
calibrate_hand_eye (CalibDataID, Errors)
*标定的目的就是获取BaseInCamPosePre,ObjInToolPosePre,保存到磁盘供抓取使用。CamParam为相机标定所得。
get_calib_data(CalibDataID, 'camera', 0, 'base_in_cam_pose', BaseInCamPosePre)
get_calib_data(CalibDataID, 'calib_obj', 0, 'obj_in_tool_pose', ObjInToolPosePre)
clear_calib_data (CalibDataID)
*相机固定标定SCARA机械手标定时,ObjInToolPose的Z轴转换不能确定,所以还得额外确定Z轴转换。
*首先解下标定让相机拍照,计算相机坐标系下标定板位姿(保存到ObjInCamPoseRef)
*然后移动机械手夹具到标定板中心(位姿从机械手系统读取,保存到ToolInBasePoseRef)
*最后间接求出Z轴转换
read_image(Image,'ref.png')
create_calib_data('calibration_object', 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, [], CameraParam)
set_calib_data_calib_object (CalibDataID, 0, CalibObjDescr)
find_calib_object (Image, CalibDataID, 0, 0, 0, [], [])
get_calib_data_observ_pose (CalibDataID, 0, 0, 0, ObjInCamPoseRef)
clear_calib_data (CalibDataID)
read_pose ('ref.dat', ToolInBasePoseRef)
pose_invert (BaseInCamPosePre, CamInBasePose)
pose_compose (CamInBasePose, ObjInCamPoseRef, ObjInBasePose)
ZCorrection := ObjInBasePose[2] - ToolInBasePoseRef[2]
set_origin_pose (BaseInCamPosePre, 0, 0, ZCorrection, BaseInCamPose)
*BaseInCamPose就可用于机械手抓取工作:
*我们假设相机对要抓取的物体拍摄一图像,计算得到其位姿保存到变量ObjInCamPose,
*通过此变量ObjInCamPose及前面标定的结果BaseInCamPose,
*机械手抓取物体的位姿ObjInBasePose就可以计算出来。
create_pose (0.0035, -0.0128, 0.7981, 1.345, 356.158, 180.194, 'Rp+T', 'gba', 'point', ObjInCamPose)
pose_invert (BaseInCamPose, CamInBasePose)
pose_compose (CamInBasePose, ObjInCamPose, ObjInBasePose)
*计算测量平面位姿保存标定结果
CalibrationPlateThickness := 0.003
ObjectThickness := 0.001
set_origin_pose (ObjInCamPoseRef, 0, 0, CalibrationPlateThickness - ObjectThickness, MPInCamPose)
write_pose (CamInBasePose, 'CamInBasePose.dat')
write_pose (MPInCamPose, 'MPInCamPose.dat')
例程为下面HALCON视频教程部分内容,
可以下载例程学习观看。
上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例 经历1年的编程与录制点击进入查看
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|