【MachineVision】Hand-Eye-Calibration

1. 眼在手上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3x0NGxY-1627030706044)(机器人手眼标定.assets/image-20210722104049527.png)]

标定过程

标定板放置在固定位置,机器人变换不同的姿态,相机获取不同姿态下标定板图像
目标
上图中描述了闭环的坐标系空间关系,包含以下部分:

  • 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=toolHbasebaseHcalcalHcam

机器人每移动一个位姿,就能得到一个上述的闭环关系,又由于

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=toolHbase1toolHcamcalHcam1=baseHtooltoolHcamcamHcal
相邻两次对

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

baseHtool0toolHcam0camHcal0=baseHtool1toolHcam1camHcal1
由于

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

baseHtool0toolHcamcamHcal0=baseHtool1toolHcamcamHcal1

等式两边分别左乘

b

a

s

e

H

t

o

o

l

1

1

{^{base}H_{tool}^1}^{-1}

baseHtool11与右乘

c

a

m

H

c

a

l

0

1

{^{cam}H_{cal}^0}^{-1}

camHcal01

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}

baseHtool11baseHtool0toolHcam=toolHcamcamHcal1camHcal01
转换成

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=baseHtool11baseHtool0=camHcal1camHcal01=toolHcam

2. 眼在手外

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVTOoPLu-1627030706046)(机器人手眼标定.assets/image-20210722113841958.png)]

标定过程

相机安装在机械手外的固定位置标定板安装在机器人末端位置,标定过程中机器人变换不同的位姿,相机分别拍摄在不同位姿下的标定板图像
目标
在下图中描述了闭环的坐标系空间关系,包含以下部分:

  • 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=baseHtooltoolHcalcalHcam

由于$ ^{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=baseHtool1baseHcamcalHcam1
等价于

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=toolHbasebaseHcamcamHcal
相邻两次消除

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

toolHbase0baseHcam0camHcal0=toolHbase1baseHcam1camHcal1

等价于

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

toolHbase0baseHcamcamHcal0=toolHbase1baseHcamcamHcal1
等价于

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}

toolHbase11toolHbase0baseHcam=baseHcamcamHcal1camHcal01
等价于

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=toolHbase11toolHbase0=camHcal1camHcal01=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}

baseHtool11baseHtool0toolHcam=toolHcamcamHcal1camHcal01

  • 眼在手外

    这种情况下,算子参数名称的描述与真实输入有所不同

    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}

toolHbase11toolHbase0baseHcam=baseHcamcamHcal1camHcal01


版权声明:本文为zhy29563原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>