QQ登录

只需一步,快速开始

工业视觉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从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)


  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  



回复

使用道具 举报

快速回复 返回列表 客服中心 搜索