标定过程
标定板
放置在固定位置
,机器人变换不同的姿态,相机获取不同姿态下
的标定板图像
目标
上图中描述了闭环的坐标系空间关系
,包含以下部分:
- b a s e H t o o l ^{base}H_{tool} baseHtool 机器人末端的
工具坐标系
到机器人基坐标系
的变换矩阵。
可变量- c a m H t o o l ^{cam}H_{tool} camHtool 机器人末端的
工具坐标系
到相机坐标系
的变换矩阵。
不变量- c a m H c a l ^{cam}H_{cal} camHcal
标定板坐标系
到相机坐标系
的变换矩阵。
可变量- b a s e H c a l ^{base}H_{cal} baseHcal
标定板坐标系
到机器人基坐标系
的变换矩阵。
不变量闭环关系
t o o l H c a m = t o o l H b a s e ∗ b a s e H c a l ∗ c a l H c a m \large \begin{aligned} ^{tool}H_{cam} = ^{tool}H_{base} * ^{base}H_{cal} * ^{cal}H_{cam} \end{aligned} toolHcam=toolHbase∗baseHcal∗calHcam
机器人每移动一个位姿,就能得到一个上述的闭环关系
,又由于 b a s e H c a l ^{base}H_{cal} baseHcal是不变量,可在多个姿态下得到的关系中任选两个将其消除。这里选择相邻的两次。
b a s e H c a l = t o o l H b a s e − 1 ∗ t o o l H c a m ∗ c a l H c a m − 1 = b a s e H t o o l ∗ t o o l H c a m ∗ c a m H c a l \large \begin{aligned} ^{base}H_{cal} &= ^{tool}H_{base}^{-1} * ^{tool}H_{cam} * ^{cal}H_{cam}^{-1}\\ &= ^{base}H_{tool}* ^{tool}H_{cam} * ^{cam}H_{cal} \end{aligned} baseHcal=toolHbase−1∗toolHcam∗calHcam−1=baseHtool∗toolHcam∗camHcal
相邻两次对 b a s e H c a l ^{base}H_{cal} baseHcal进行消除:
b a s e H t o o l 0 ∗ t o o l H c a m 0 ∗ c a m H c a l 0 = b a s e H t o o l 1 ∗ t o o l H c a m 1 ∗ c a m H c a l 1 \large ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}^0} * ^{cam}H_{cal}^0 = ^{base}H_{tool}^1* {\color{Red}^{tool}H_{cam}^1} * ^{cam}H_{cal}^1 baseHtool0∗toolHcam0∗camHcal0=baseHtool1∗toolHcam1∗camHcal1
由于 t o o l H c a m ^{tool}H_{cam} toolHcam是不变的
t o o l H c a m 0 = t o o l H c a m 1 = t o o l H c a m \large ^{tool}H_{cam}^0 =^{tool}H_{cam}^1=^{tool}H_{cam} toolHcam0=toolHcam1=toolHcam
b a s e H t o o l 0 ∗ t o o l H c a m ∗ c a m H c a l 0 = b a s e H t o o l 1 ∗ t o o l H c a m ∗ c a m H c a l 1 \large ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^0 = ^{base}H_{tool}^1* {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^1 baseHtool0∗toolHcam∗camHcal0=baseHtool1∗toolHcam∗camHcal1
等式两边分别左乘 b a s e H t o o l 1 − 1 {^{base}H_{tool}^1}^{-1} baseHtool1−1与右乘 c a m H c a l 0 − 1 {^{cam}H_{cal}^0}^{-1} camHcal0−1
b a s e H t o o l 1 − 1 ∗ b a s e H t o o l 0 ∗ t o o l H c a m = t o o l H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{base}H_{tool}^1}^{-1} * ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}} = {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} baseHtool1−1∗baseHtool0∗toolHcam=toolHcam∗camHcal1∗camHcal0−1
转换成
A X = X B \large AX=XB AX=XB
其中:
A = b a s e H t o o l 1 − 1 ∗ b a s e H t o o l 0 B = c a m H c a l 1 ∗ c a m H c a l 0 − 1 X = t o o l H c a m \large \begin{aligned} A&={^{base}H_{tool}^1}^{-1} * ^{base}H_{tool}^0\\ B&=^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1}\\ X&=^{tool}H_{cam} \end{aligned} ABX=baseHtool1−1∗baseHtool0=camHcal1∗camHcal0−1=toolHcam
标定过程
相机
安装在机械手外的固定位置
,标定板
安装在机器人末端位置
,标定过程中机器人变换不同的位姿,相机分别拍摄在不同位姿下的标定板图像
目标
在下图中描述了闭环的坐标系空间关系
,包含以下部分:
- b a s e H t o o l ^{base}H_{tool} baseHtool 机器人末端的
工具坐标系
到机器人基坐标系
的变换矩阵。
可变量- t o o l H c a l ^{tool}H_{cal} toolHcal 标定板坐标系到机器人末端的工具坐标系的变换矩阵。
不变量- c a l H c a m ^{cal}H_{cam} calHcam 相机坐标系到标定板坐标系的变换矩阵。
可变量- c a m H b a s e ^{cam}H_{base} camHbase 机器人基坐标系到相机坐标系的变换矩阵。
不变量闭环关系
b a s e H c a m = b a s e H t o o l ∗ t o o l H c a l ∗ c a l H c a m \large ^{base}H_{cam} = ^{base}H_{tool} * ^{tool}H_{cal} * ^{cal}H_{cam} baseHcam=baseHtool∗toolHcal∗calHcam
由于$ ^{tool}H_{cal}$是不变量,可通过前后两次姿态的结果对其进行消除。
t o o l H c a l = b a s e H t o o l − 1 ∗ b a s e H c a m ∗ c a l H c a m − 1 \large ^{tool}H_{cal} = ^{base}H_{tool}^{-1} * ^{base}H_{cam} * ^{cal}H_{cam}^{-1} toolHcal=baseHtool−1∗baseHcam∗calHcam−1
等价于
t o o l H c a l = t o o l H b a s e ∗ b a s e H c a m ∗ c a m H c a l \large ^{tool}H_{cal} = ^{tool}H_{base} * ^{base}H_{cam} * ^{cam}H_{cal} toolHcal=toolHbase∗baseHcam∗camHcal
相邻两次消除 t o o l H c a l ^{tool}H_{cal} toolHcal
t o o l H b a s e 0 ∗ b a s e H c a m 0 ∗ c a m H c a l 0 = t o o l H b a s e 1 ∗ b a s e H c a m 1 ∗ c a m H c a l 1 \large ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}^0} * ^{cam}H_{cal}^0 = ^{tool}H_{base}^1 * {\color{red}^{base}H_{cam}^1} * ^{cam}H_{cal}^1 toolHbase0∗baseHcam0∗camHcal0=toolHbase1∗baseHcam1∗camHcal1
等价于
t o o l H b a s e 0 ∗ b a s e H c a m ∗ c a m H c a l 0 = t o o l H b a s e 1 ∗ b a s e H c a m ∗ c a m H c a l 1 \large ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^0 = ^{tool}H_{base}^1 * {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^1 toolHbase0∗baseHcam∗camHcal0=toolHbase1∗baseHcam∗camHcal1
等价于
t o o l H b a s e 1 − 1 ∗ t o o l H b a s e 0 ∗ b a s e H c a m = b a s e H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{tool}H_{base}^1}^{-1} * ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}} = {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} toolHbase1−1∗toolHbase0∗baseHcam=baseHcam∗camHcal1∗camHcal0−1
等价于
A X = X B \large AX = XB AX=XB
其中
A = t o o l H b a s e 1 − 1 ∗ t o o l H b a s e 0 B = c a m H c a l 1 ∗ c a m H c a l 0 − 1 X = b a s e H c a m \large \begin{aligned} A&={^{tool}H_{base}^1}^{-1} * ^{tool}H_{base}^0\\ B&=^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1}\\ X&=^{base}H_{cam} \end{aligned} ABX=toolHbase1−1∗toolHbase0=camHcal1∗camHcal0−1=baseHcam
根据以上分析,无论是眼在手上还是眼在手外,都最终转换成对方程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)
b a s e H t o o l 1 − 1 ∗ b a s e H t o o l 0 ∗ t o o l H c a m = t o o l H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{base}H_{tool}^1}^{-1} * ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}} = {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} baseHtool1−1∗baseHtool0∗toolHcam=toolHcam∗camHcal1∗camHcal0−1
眼在手外
这种情况下,算子参数名称的描述与真实输入有所不同
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)
t o o l H b a s e 1 − 1 ∗ t o o l H b a s e 0 ∗ b a s e H c a m = b a s e H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{tool}H_{base}^1}^{-1} * ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}} = {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} toolHbase1−1∗toolHbase0∗baseHcam=baseHcam∗camHcal1∗camHcal0−1