【MachineVision】Hand-Eye-Calibration
1. 眼在手上
标定过程
标定板
放置在固定位置
,机器人变换不同的姿态,相机获取不同姿态下
的标定板图像
目标
上图中描述了闭环的坐标系空间关系
,包含以下部分:
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
2. 眼在手外
标定过程
相机
安装在机械手外的固定位置
,标定板
安装在机器人末端位置
,标定过程中机器人变换不同的位姿,相机分别拍摄在不同位姿下的标定板图像
目标
在下图中描述了闭环的坐标系空间关系
,包含以下部分:
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
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)
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