手眼标定

相机固定时(eye-to-hand)

目的是相机到机器人基座坐标系的固定转换矩阵 $T_{cameraToBase}$

image-20210412143500969

实现方法: 1. 把标定板固定在机械臂末端 2. 使用相机拍摄不同机械臂姿态下的标定板图片n张

转换关系: $T_{base}^{camera} = T_{board}^{camera} * T_{end}^{board} * T_{base}^{end}$

​ 即 $T_{end}^{board} = (T_{board}^{camera})^{-1} * T_{base}^{camera} * (T_{base}^{end})^{-1}$

其中,$T_{board}^{camera}$ 可由通过拍摄的标定板图片直接求解;

​ $T_{base}^{end}$ 可由机械臂末端位姿参数求得;

​ $T_{end}^{board}$ 未知量,由于标定板固定在机械臂末端,所以对每组图片,该转换矩阵都相同。

改变机械臂位姿:

由$(T1_{board}^{camera})^{-1}T_{base}^{camera} * (T1_{base}^{end})^{-1} = (T2_{board}^{camera})^{-1}T_{base}^{camera} * (T2_{base}^{end})^{-1}$ 得

$T2_{board}^{camera}(T1_{board}^{camera})^{-1}T_{base}^{camera} = T_{base}^{camera}*(T2_{base}^{end})^{-1}T1_{base}^{end}$

化简为:A *X = X * B , 未知数是矩阵 X = $T_{base}^{camera}$ 。根据上式联立方程可求得X。

相机固定在机器人末端(eye-in-hand)

目的是相机坐标系camera到机械臂末端坐标系end的变换矩阵 $T_{cameraToEnd}$

坐标示例图

转换关系: $T_{end}^{camera} = T_{board}^{camera}T_{base}^{board}T_{end}^{board}$

同理可改变机械臂位姿联立方程求得。

手眼标定坐标系表示:

机械臂基座坐标系: –base

机械臂末端坐标系:–end

相机坐标系: – camera

标定板坐标系:–board

手眼标定执行流程

**创建数据模型
create_calib_data (‘calibration_object’, 1, 1, CalibDataID)​

***设置相机参数

set_calib_data_cam_param (CalibDataID, 0, ‘area_scan_division’, [])

**设置标定板描述文件
set_calib_data_calib_object (CalibDataID, 0, ‘calplate.cpd’)

**循环读取标定板图像
for index := 1 to 10 by 1
read_image (Image, ‘fabrik’)

*读取机械手法兰盘在基础坐标系中的位置姿态
read_pose (‘campose.dat’, Pose)

*将机械手法兰盘在基础坐标系中的位置姿态添加到标定数据模型中
set_calib_data (CalibDataID, ‘model’, ‘general’, ‘reference_camera’, Pose)

**获取标定对象,并添加到数据模型中
find_calib_object (Image, CalibDataID, 0, 0, 0, [], [])
*获得世界坐标系和相机坐标系的相对位置关系
get_calib_data_observ_pose (CalibDataID, 0, 0, 0, ObjInCameraPose)
endfor

calibrate_hand_eye (CalibDataID, Errors)

*获得机械手基础坐标系在摄像机坐标系下的坐标

(eye-to-hand)get_calib_data (CalibDataID, ‘camera’, 0,’base_in_cam_pose’, BaseInCamPosePre)

(eye-in-hand)get_calib_data (CalibDataID, ‘camera’, 0,’tool_in_cam_pose’, ToolInCamPosePre)

求取Z平移

*这时,这求得的Pose的Z轴平移是无非确定的,需要求Z平移。有必要通过在摄像机坐标系中将机器人移动到已知高度的姿态来固定Z中的未知平移.

当eye-to-hand,标定板与机器人分离放置在任意位置,然后手动将机器人的末端移动到标定板的原点。

读取标定图片

read_image(ImageRef, ‘’)

*获取当前标定板相对于相机的位姿

get_calib_plate_pose (ImageRef, CameraParam, CalibObjDescr, ObjInCamPoseRef)

这函数为

1
2
3
4
5
6
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, Pose)
return ()

*读取机器人的末端移动到标定板的原点的位姿

read_pose (‘xx.dat’, ToolInBasePoseRef)

*求Z平移

pose_invert (BaseInCamPosePre, CamInBasePose)

pose_compose (CamInBasePose, ObjInCamPose, ObjInBasePose)

ZCorrection := ObjInBasePose[2] - ToolInBasePose[2]

*最终得到BaseInCamPose转换

set_origin_pose (BaseInCamPosePre, 0, 0, ZCorrection, BaseInCamPose)

**获得摄像机坐标系在机械手基础坐标系下的坐标
pose_invert (BaseInCamPose, CamInBasePose)

*根据摄像机在机械手基础坐标系下的姿态和目标在摄像机坐标系下的姿态,求解目标在摄像机基础坐标系下的姿态
pose_compose (CamInBasePose, ObjInCamPose, ObjInBasePose)