1. 眼在手上
标定过程
标定板
放置在固定位置
,机器人变换不同的姿态,相机获取不同姿态下
的标定板图像
目标
上图中描述了闭环的坐标系空间关系
,包含以下部分:
机器人末端的
工具坐标系
到机器人基坐标系
的变换矩阵。
可变量机器人末端的
工具坐标系
到相机坐标系
的变换矩阵。
不变量![]()
标定板坐标系
到相机坐标系
的变换矩阵。
可变量![]()
标定板坐标系
到机器人基坐标系
的变换矩阵。
不变量闭环关系
机器人每移动一个位姿,就能得到一个上述的闭环关系
,又由于是不变量,可在多个姿态下得到的关系中任选两个将其消除。这里选择相邻的两次。
相邻两次对进行消除:
由于是不变的
等式两边分别左乘与右乘
转换成
其中:
2. 眼在手外
标定过程
相机
安装在机械手外的固定位置
,标定板
安装在机器人末端位置
,标定过程中机器人变换不同的位姿,相机分别拍摄在不同位姿下的标定板图像目标
在下图中描述了闭环的坐标系空间关系
,包含以下部分:
机器人末端的
工具坐标系
到机器人基坐标系
的变换矩阵。
可变量标定板坐标系到机器人末端的工具坐标系的变换矩阵。
不变量相机坐标系到标定板坐标系的变换矩阵。
可变量机器人基坐标系到相机坐标系的变换矩阵。
不变量闭环关系
由于$ ^{tool}H_{cal}$是不变量,可通过前后两次姿态的结果对其进行消除。
等价于
相邻两次消除
等价于
等价于
等价于
其中
3. OpenCV
根据以上分析,无论是眼在手上还是眼在手外,都最终转换成对方程AX=BX
的求解。OpenCV提供了手眼标定求解的算子calibrateHandEye
。
void
cv::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)
- 眼在手上
这种情况下,算子参数名称的描述与真实输入相对应。
void
cv::calibrateHandEye(InputArrayOfArrays R_gripper2base, // <=> R_tool2base
InputArrayOfArrays t_gripper2base, // <=> T_tool2base
InputArrayOfArrays R_target2cam, // <=> R_cal2cam
InputArrayOfArrays t_target2cam, // <=> T_cam2cam
OutputArray R_cam2gripper, // <=> R_cam2tool
OutputArray t_cam2gripper, // <=> T_cam2tool
HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI)
- 眼在手外
这种情况下,算子参数名称的描述与真实输入有所不同
void
cv::calibrateHandEye(InputArrayOfArrays R_gripper2base, // <=> R_base2tool
InputArrayOfArrays t_gripper2base, // <=> T_base2tool
InputArrayOfArrays R_target2cam, // <=> R_cal2cam
InputArrayOfArrays t_target2cam, // <=> T_cam2cam
OutputArray R_cam2gripper, // <=> R_cam2base
OutputArray t_cam2gripper, // <=> T_cam2base
HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI)