手眼标定

前言

手眼标定是将相机坐标系下的物体坐标转换到机械臂坐标系下(比如机器人基座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 下的表示):

TEBTCE=TPBTCPT^{B}_{E}\,T^{E}_{C}=T^{B}_{P}\,T^{P}_{C}

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

TE,iBTCETP,iC=TE,jBTCETP,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,jETE,iBTCETP,iC=TCETP,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,jETE,iBTCE=TCETP,jCTC,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,jETE,iB,X=TCE,Bij=TP,jCTC,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 之间的转换。标定时有一些区别:相机固定在某个位置,比如人形机器人的头部位置;标定板固定在手上,然后运动机械臂,使相机能从不同视角拍摄到标定板。每拍摄图像时,同时记录当时机械臂末端的位姿(用工具或者法兰表示都可以)。

不难发现如下关系:

TEBTPE=TCBTPCT^{B}_{E}\,T^{E}_{P}=T^{B}_{C}\,T^{C}_{P}

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

TB,iETCBTP,iC=TB,jETCBTP,jCT^{E}_{B,i}\,T^{B}_{C}\,T^{C}_{P,i} = T^{E}_{B,j}\,T^{B}_{C}\,T^{C}_{P,j}

同样的操作,有:

TE,jBTB,iETCB=TCBTP,jCTC,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,jBTB,iE,X=TCB,Bij=TP,jCTC,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] 【一文弄懂】张正友标定法-完整学习笔记-从原理到实战

3d打印 ai辅助设计 algorithm algorithms anymal apriltag ardupilot axis-angle bang-bang blender bode cadquery calibration camera calibration chrome cmake cmakelists cnn colcon conan control cpp cpu d435i dagger data_struct db design-pattern dots economics eigen factory-pattern fcpx fiducial marker figure finance forge fov freecad gazebo gdb git gnu hardware ibus imu interest isaac gym isaac lab isaaclab kdl latent variable latex launch learning-notes legged locomotion legged robotics legged-robot life linux linux-kernel mac math matlab matrix memory mlp money motion-control motor moveit mpc mujoco network ocs2 ode openscad operator optimal algorithm optimal-control perf performance personal-finance pixhawk pixhawk 6c policy distillation ppo privileged learning profiling px4 python qgroundcontrol qos quadrotor realsense reinforcement learning representation learning reward tuning rnn robot robotics ros ros2 rtb security shell sim-to-real simulation socket stairs stl stm32 tcp-ip teacher policy teacher-student temporal convolution thread tools twist ubuntu uml unitree urdf vae valgrind vcxsrv velocity vim web wifi wiring work wsl 中文输入 交叉编译 依赖管理 分支管理 四旋翼 四足机器人 实验诊断 强化学习 机器人 机器人控制 机器人视觉 构建系统 深度学习 深度相机 点云 版本控制 神经网络 自主回充 航模 视觉定位 训练曲线 输入法 配置类 采购记录 飞控
知识共享许可协议