)
文章目录0.函数原型1.眼在手上2.眼在手外0.函数原型本文提到的3d相机指的是RGBD相机因为必须需要用RGB来拍摄标定板目前我们使用RGBD相机来测试。3d线扫相机可能得用其他方式,也有可能用这个因为这个函数需要你传入的是变换矩阵RGBD相机和线扫相机得各自采用自己的方式得到变换矩阵。在opencv中有一个函数calibrateHandEye,他是用来进行眼在手上相机在机械臂上的标定。voidcalibrateHandEye(InputArrayOfArrays R_gripper2base,InputArrayOfArrays t_gripper2base,InputArrayOfArrays R_target2cam,InputArrayOfArrays t_target2cam,OutputArray R_cam2gripper,OutputArray t_cam2gripper,HandEyeCalibrationMethod methodCALIB_HAND_EYE_TSAI);其中各个形参的意义为注意前面四个参数都是InputArrayOfArrays的形式这是因为我们要传入机械在多组姿态数据而姿态数据本身又是一个矩阵、arrays所以这个就是一个array of arrays的形式。参数意义R_gripper2base机械臂末端法兰初始工具坐标系到机械臂基坐标系的旋转变换t_gripper2base机械臂末端法兰初始工具坐标系到机械臂基坐标系的平移变换R_target2cam标定板坐标系到相机坐标系的旋转变换t_target2cam标定板坐标系到相机坐标系的平移变换R_cam2gripper得到的相机坐标系到法兰初始工具坐标系的旋转变换t_cam2gripper得到的相机坐标系到法兰初始工具坐标系的平移变换CALIB_HAND_EYE_TSAI求解AXXB的算法opncv官方提供这个函数的本意是只支持眼在手上这种方式的标定但是其实我们只要稍微修改一下输入的矩阵就可以实现眼在手外的标定。推导过程如下1.眼在手上因为眼在手上时相机到法兰的坐标图中的B变换是固定的也是我们要求解的因此我们让X就为相机到法兰的变换矩阵也就是X g T c X ^gT{_c}XgTc那么机械臂在两个不同的姿态i和j下存在这么一个等式calibrateHandEye就是按照这个等式来求解的b T g i X c T t i b T g j X c T t j ^bT_{g_i} X ^cT_{t_i} ^bT_{g_j} X ^cT_{t_j}bTgiXcTtibTgjXcTtj代入X后也就是b T g i g i T c c T t i b T g j g j T c c T t j ^bT_{g_i} ^{g_i}T{_c} ^cT_{t_i} ^bT_{g_j} ^{g_j}T{_c} ^cT_{t_j}bTgigiTccTtibTgjgjTccTtj也就是物理链是这样的标定板--》相机--》法兰--》到基座也就是标定板到基座的变换。这是一个固定值这个值我们不用求他只是用来构建等式我们真正要求的是X。上面的X求出来后我们在使用时也就是将3d相机得到的点云P此时是相机坐标系下的经过变换矩阵变换到机械臂的基坐标系下也就是P b b T g g T c P c P_{b} ^bT_{g} ^gT_{c} P_{c}PbbTggTcPc其中b T g ^bT_{g}bTg是可以实时从机械臂中读取的2.眼在手外我们让X为相机到基坐标的变换也就是X b T c X ^bT{_c}XbTc然后将原本形参中的gripper2base改成 base2gripper, 代入calibrateHandEye中的求解等式就可以得到这么一条等式g i T b X c T t i g j T b X c T t j ^{g_i}T_{b} X ^cT_{t_i} ^{g_j}T_{b} X ^cT_{t_j}giTbXcTtigjTbXcTtj把X代入可以等到g i T b b T c c T t i g j T b b T c c T t j ^{g_i}T_{b} ^bT{_c} ^cT_{t_i} ^{g_j}T_{b} ^bT{_c} ^cT_{t_j}giTbbTccTtigjTbbTccTtj即标定板--》相机--》基座--》法兰也就是标定板到法兰的变换,因为标定板是固定在法兰上的显然这个是个定值也就是说上述等式是成立的。完美只需要将 gripper2base求个逆就可以利用calibrateHandEye实现眼在手外的标定。参考【3D 视觉之手眼标定】