1.Opencv3手眼标定接口介绍
一些基础知识:
手眼标定分为两种:眼在手上和眼在手外。文章数据采集的是眼在手上。
坐标系:
base:机械臂基坐标系,一般在机械臂底座,一般是机械臂的默认坐标系。
gripper:机械臂工具坐标系(实际中机械臂都需要携带工具),例子中使用机械臂法兰中心的数据,未使用工具。
cam:相机坐标系
target:标定板坐标系
对于眼在手上,标定求解的是相机坐标系相对于机械臂末端坐标系的变换矩阵(旋转和平移)。
官方接口说明链接:https://docs.opencv.org/3.4.18/d9/d0c/group__calib3d.html#gad10a5ef12ee3499a0774c7904a801b99
#include <opencv2/calib3d.hpp>
void calibrateHandEye( InputArrayOfArrays R_gripper2base,
InputArrayOfArrays t_gripper2base,
InputArrayOfArrays R_target2cam,
InputArrayOfArrays t_target2cam,
OutputArray R_cam2gripper,
OutputArray t_cam2gripper,
HandEyeCalibrationMethod method=CALIB_HAND_EYE_TSAI );
矩阵输入参数类型都为std::vector
输入:
R_gripper2base:机械臂末端坐标系相对于机械臂基坐标系的旋转矩阵
t_gripper2base:机械臂末端坐标系相对于机械臂基坐标系的平移矩阵
R_target2cam:世界坐标系相对于相机坐标系的旋转矩阵
t_target2cam: 世界坐标系相对于相机坐标系的平移矩阵
method:使用默认的CALIB_HAND_EYE_TSAI.
输出:
R_cam2gripper:相机坐标系 相对于机械臂末端坐标系的旋转矩阵
t_cam2gripper:相机坐标系 相对于机械臂末端坐标系的平移矩阵
R_gripper2base和t_gripper2base可直接从机械臂获取(可使用机械臂sdk),一般是位置和姿态。姿态需要知道转轴顺序,然后转成3*3旋转矩阵,这块比较好搞。
R_target2cam和t_target2cam,我给的参数是从calibrateCamera()获取的,很不幸,调用calibrateHandEye()接口得出的结果不对。这两个参数是标定板相对于相机的姿态和平移矩阵,这块是没啥疑问的。
2.一些注意点
手眼标定过程让标定板不动,改变机械手位置采集图片。Opencv官方提示:至少需要两个具有非平行旋转轴的运动。因此,至少需要 3 个不同的姿势,但强烈建议使用更多的姿势。
我的标定结果:
R_cam2gripper -->>
[1, 2.837564140486833e-18, -1.667254890538158e-17;
-2.837564140486834e-18, 1, -1.09711802430982e-16;
1.667254890538158e-17, 1.09711802430982e-16, 1]
t_cam2gripper mm -->>
[14.78953261453616;
76.66217762784608;
35.42786758861097]
剩余的验证排查工作:
①图像上的像素点转为机械臂坐标系下的点
转载请注明出处。
欢迎关注,记录学习过程。