Halcon执行手眼标定, 发那科机器人三点法标定

本文详细介绍了手眼标定的过程及原理,包括固定相机和移动相机两种情况的手眼标定方法,并提供了具体实现步骤。

固定相机

原理: ObjInCam = BaseInCam × ToolInBase × ObjInTool

其中 对标定板的多次拍照可以确定CalObjInCam
机器人内部参数可以读取到ToolInBase

然后生成手眼标定参数集合 CalibDataID , CalibDataID中存放了相机内部参数, 标定板描述文件等, 通过手眼标定确定等号右边第一和第三个参数 BaseInCam , ObjInTool

最终要求得ObjInBase
ObjInBase = CamInBase × ObjInCam

手眼标定确定了 BaseInCam, 求出逆矩阵即可
ObjInCam 为照相机拍标定板确定
二者相乘得到ObjInBase

注意:
如果没有夹具, 则直接
ToolInBase = ToolInBase
如果有夹具, 则ToolInBase × GripperInTool = GripperInBase

则ToolInBase = GripperInBase×Inv(GripperInTool)

固定相机:


*关闭程序计数器,变量更新,图像更新窗口
dev_update_off ()
* 校正图像路径
*ImageNameStart := '3d_machine_vision/handeye/stationarycam_calib3cm_'
ImageNameStart:= '3d_machine_vision/calib/' 
ImgPath := '3d_machine_vision/calib/'
*read_image (Image, ImgPath + 'calib_')
*机器人工具坐标系的位姿
*stationarycam_start_campar.dat
DataNameStart := 'handeye/stationarycam_'

*校正图像的数目
NumImages := 17

*读取一张图像
read_image (Image, ImageNameStart+'calib_'+'02')

*获取图像的大小
get_image_size (Image, Width, Height)
* 关闭已经打开的窗口
dev_close_window ()

*打开新窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)

*设置线宽
dev_set_line_width (2)

*设置区域填充方式为margin
dev_set_draw ('margin')

*显示图像
dev_display (Image)

* 设置字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

**************************************************************准备手眼标定的数据**************************************************************************************


* 标定板描述文件
CalTabFile := 'caltab_30mm.descr'

* 读取摄像机内部参数
read_cam_par (DataNameStart + 'start_campar.dat', StartCamParam)

* 创建手眼标定模型

create_calib_data ('hand_eye_stationary_cam', 1, 1, CalibDataID)

* 重要, 将 摄像机内部参数  StartCamParam 写入手眼标定模型CalibDataID中
* 对手眼标定模型设置摄像机内部参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamParam)


* 对手眼标定模型设置标定板描述文件
set_calib_data_calib_object (CalibDataID, 0, CalTabFile)

*采用非线性算法获取精确校准姿态 再次校准 CalibDataID
set_calib_data (CalibDataID, 'model', 'general', 'optimization_method', 'nonlinear')
disp_message (WindowHandle, 'The calibration data model was created', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()




**************************************************************获取标定板MARK点坐标和标定板相对相机的位姿获取ObjInCam**************************************************************************************

for I := 1 to NumImages  by 1
    *读取含标定板的图像
    *read_image (Image, ImageNameStart + I$'02d')
     read_image (Image, ImgPath + 'calib_' + I$'02d')
     dev_display (Image)
    *寻找标定板对象
    find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
    
    *获取标定板轮廓
    get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
    
    *********非常重要 得到第一个已知参数
    *获取标定板MARK点坐标和标定板相对相机的位姿 Mark点: 标定板上的圆
    get_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, Index, CalObjInCamPose)

    
    dev_set_color ('green')
    dev_display (Image)
    dev_display (Caltab)
    dev_set_color ('yellow')
    disp_cross (WindowHandle, RCoord, CCoord, 6, 0)
    dev_set_colored 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潘诺西亚的火山

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

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

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

打赏作者

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

抵扣说明:

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

余额充值