工控编程吧

标题: 工业视觉HALCON手眼标定之机械手与标定板标定 [打印本页]

作者: qq263946146    时间: 2019-11-8 11:13
标题: 工业视觉HALCON手眼标定之机械手与标定板标定
在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视频教程部分内容,
可以下载例程学习观看。
[halcon]1[/halcon]
[MFC408]1[/MFC408]
[weixinlianxi]1[/weixinlianxi]







欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4