手眼标定

前言

前置知识可先看 小孔成像与相机内参:内参把相机方向映射为像素,外参负责坐标系之间的转换。本文后续“内参已知”的假设,也要求内参与实际使用的图像分辨率、裁剪和去畸变状态一致。

手眼标定是将相机坐标系下的物体坐标转换到机械臂坐标系下(比如机器人基座base系,或者自定义的世界系,如人形机械臂参考的固定的世界系等)的常用技术。常见的安装方式主要有如下两种

• In-Hand Camera:相机安装在机械臂的末端,随机械臂一起运动,用于获取更接近操作的视觉信息。

• Fixed Camera:相机固定在某个位置,不随机械臂运动,适用于获取整个工作区域的视觉信息。

In-Hand Camera

In-Hand Camera 的标定是为了求出相机与机械臂末端工具(TOOL)之间的变换关系,一般是一个大小为 4×44\times4 的刚体变换矩阵,在 KDL 可以用 Frame 声明这个变量。这里统一采用 TBAT^{A}_{B} 的记号,表示坐标系 BB 在坐标系 AA 下的位姿变换。比如 TEBT^{B}_{E} 表示机械臂末端(end-effector)或法兰在基座 BASE 下的表示;假设工具参数已提前通过 4 点法或 6 点法标定得到,视作为一个精确的值。

标定时,将一个已知精确大小的标定板(比如棋盘格)固定放置,然后让机械臂运动,以使相机可以从多个不同角度拍摄标定板图像。拍摄图像时要确保棋盘格图像不超出图像边界,并记录对应的机械臂末端位姿。假设相机内参已知,每一张标定板图像都可以算出标定板(P)在相机(C)下的位姿 TPCT^{C}_{P};其逆变换为相机(C)在标定板(P)下的位姿 TCPT^{P}_{C}。这里定义 TCET^{E}_{C} 为相机在末端工具坐标系下的表示,对于每一张图片有如下关系式成立(左右两边均为 TCBT^{B}_{C},即相机在 BASE 下的表示):

TEB TCE=TPB TCPT^{B}_{E}\,T^{E}_{C}=T^{B}_{P}\,T^{P}_{C}

做下一步变换,消除 TPBT^{B}_{P}。由于标定板相对 BASE 固定,所以对于任意一组标定数据,有(下标 ii 表示第 ii 个数据,jj 类似):

TE,iB TCE TP,iC=TE,jB TCE TP,jCT^{B}_{E,i}\,T^{E}_{C}\,T^{C}_{P,i} = T^{B}_{E,j}\,T^{E}_{C}\,T^{C}_{P,j}

两边左乘 TB,jET^{E}_{B,j},有:

TB,jE TE,iB TCE TP,iC=TCE TP,jCT^{E}_{B,j}\,T^{B}_{E,i}\,T^{E}_{C}\,T^{C}_{P,i} = T^{E}_{C}\,T^{C}_{P,j}

再右乘 TC,iPT^{P}_{C,i},有:

TB,jE TE,iB TCE=TCE TP,jC TC,iPT^{E}_{B,j}\,T^{B}_{E,i}\,T^{E}_{C} = T^{E}_{C}\,T^{C}_{P,j}\,T^{P}_{C,i}

其中 TB,jETE,iBT^{E}_{B,j}T^{B}_{E,i} 和 TP,jCTC,iPT^{C}_{P,j}T^{P}_{C,i} 都是已知的,方程就变为典型的 AX=XBAX=XB 形式:

AijX=XBijA_{ij}X=XB_{ij}

其中:

Aij=TB,jE TE,iB,X=TCE,Bij=TP,jC TC,iP\begin{aligned} A_{ij}&=T^{E}_{B,j}\,T^{B}_{E,i},\\ X&=T^{E}_{C},\\ B_{ij}&=T^{C}_{P,j}\,T^{P}_{C,i} \end{aligned}

这类方程有很多解法,比如 Tsai 方法、dual-quaternion 方法以及 Kronecker Product 方法等。将所需参数输入到具体算法中后,即可标定出 TCET^{E}_{C} 的结果,也就是相机在工具系下的表示。这样物体在相机系下的表示就可以转到末端工具系下进行表示了。比如相机识别了焊缝点位信息后,转到工具系下就可以直接做焊接相关的工作。

Fixed Camera

对 Fixed Camera 进行手眼标定时,主要关注相机(C)在 Base frame(B)下的变换,也可以是相机到 World frame(W)之间的变换。在人形机器人中一般会转到世界系下去做表示。这里简单说明从 C 到 B 之间的转换。标定时有一些区别:相机固定在某个位置,比如人形机器人的头部位置;标定板固定在手上,然后运动机械臂,使相机能从不同视角拍摄到标定板。每拍摄图像时,同时记录当时机械臂末端的位姿(用工具或者法兰表示都可以)。

不难发现如下关系:

TEB TPE=TCB TPCT^{B}_{E}\,T^{E}_{P}=T^{B}_{C}\,T^{C}_{P}

用上述同样的方式,有(此时末端工具,比如手与标定板之间的 TPET^{E}_{P} 是不变的):

TB,iE TCB TP,iC=TB,jE TCB TP,jCT^{E}_{B,i}\,T^{B}_{C}\,T^{C}_{P,i} = T^{E}_{B,j}\,T^{B}_{C}\,T^{C}_{P,j}

同样的操作,有:

TE,jB TB,iE TCB=TCB TP,jC TC,iPT^{B}_{E,j}\,T^{E}_{B,i}\,T^{B}_{C} = T^{B}_{C}\,T^{C}_{P,j}\,T^{P}_{C,i}

又变成了 AX=XBAX=XB 的形式:

AijX=XBijA_{ij}X=XB_{ij}

其中:

Aij=TE,jB TB,iE,X=TCB,Bij=TP,jC TC,iP\begin{aligned} A_{ij}&=T^{B}_{E,j}\,T^{E}_{B,i},\\ X&=T^{B}_{C},\\ B_{ij}&=T^{C}_{P,j}\,T^{P}_{C,i} \end{aligned}

同样求解即可得到 TCBT^{B}_{C},即相机在 BASE 下的表示;如果把 BASE 换成 World,则可以得到相机在世界系下的表示。

求解可以直接调用成熟的库如open-cv, 原理还是很简单的,这样对手眼标定这个常用的技术就有了更深入的认识了。若想知道更多的有关相机内外参的标定 可以看看张正友标定法, 就明白为啥要引入棋盘格进行标定了。

参考

[1] 【一文弄懂】张正友标定法-完整学习笔记-从原理到实战

知识共享许可协议