4. 手眼标定问题建模:眼在手上与眼在手外
手眼标定的核心是求解机器人末端执行器(或基座)与相机坐标系之间的空间变换关系。根据相机安装位置的不同,问题被划分为两种经典构型:眼在手上(Eye-in-Hand)和眼在手外(Eye-to-Hand)。本章从数学上严格推导这两种构型的坐标系变换链,并引出经典的 AX = XB 与 AX = YB 矩阵方程。
4.1 眼在手上(Eye-in-Hand)构型
相机固定在机器人末端执行器(法兰盘)上,随机械臂一起运动。标定目标是求解相机坐标系 {C} 相对于末端坐标系 {E} 的变换矩阵 X。
4.1.1 坐标系定义与变换链
| 符号 | 含义 | 已知/未知 |
|---|---|---|
{B} |
机器人基座坐标系 | 固定参考系 |
{E} |
机器人末端(法兰盘)坐标系 | 由机器人正运动学实时给出 |
{C} |
相机坐标系 | 未知(待标定) |
{O} |
标定板(世界点)坐标系 | 由标定板物理尺寸已知 |
在眼在手上构型中,标定板固定不动。对于机械臂的两个不同位姿 i 和 j,存在以下闭环变换关系:
B_T_E(i) · E_T_C · C_T_O(i) = B_T_E(j) · E_T_C · C_T_O(j)
其中:
B_T_E(i):机器人正运动学给出的末端位姿(已知)C_T_O(i):相机外参,即标定板在相机坐标系下的位姿(通过PnP求解,已知)E_T_C = X:待求的手眼变换矩阵
4.1.2 推导 AX = XB
将上式整理,令:
A = inv(B_T_E(j)) · B_T_E(i)—— 机器人末端从位姿 i 到位姿 j 的相对运动B = C_T_O(j) · inv(C_T_O(i))—— 相机观察到的标定板从位姿 i 到位姿 j 的相对运动
代入闭环方程得到:
A · X = X · B
这就是经典的 AX = XB 问题。其中 A 和 B 均为已知的 4×4 齐次变换矩阵,X 为待求的相机-末端变换矩阵。
4.2 眼在手外(Eye-to-Hand)构型
相机固定安装在机器人工作空间之外(如支架上),不随机械臂运动。标定目标是求解相机坐标系 {C} 相对于机器人基座坐标系 {B} 的变换矩阵 Y。
4.2.1 坐标系定义与变换链
| 符号 | 含义 | 已知/未知 |
|---|---|---|
{B} |
机器人基座坐标系 | 固定参考系 |
{E} |
机器人末端坐标系 | 由机器人正运动学给出 |
{C} |
相机坐标系(固定) | 未知(待标定) |
{O} |
标定板坐标系(固定在末端) | 由相机外参给出 |
在眼在手外构型中,标定板固定在机器人末端,随机械臂运动。对于两个不同位姿 i 和 j:
C_T_O(i) · inv(B_T_E(i)) = C_T_O(j) · inv(B_T_E(j))
整理后得到:
C_T_O(j) · inv(C_T_O(i)) = inv(B_T_E(j)) · B_T_E(i)
4.2.2 推导 AX = YB
令:
A = C_T_O(j) · inv(C_T_O(i))—— 相机观察到的标定板相对运动B = B_T_E(j) · inv(B_T_E(i))—— 机器人末端相对运动X = C_T_B—— 相机到基座的变换(待求)Y = E_T_O—— 末端到标定板的变换(待求)
代入闭环方程得到:
A · X = Y · B
这就是 AX = YB 问题。与 AX = XB 不同,这里有两个未知矩阵 X 和 Y,需要至少两组独立运动才能求解。
4.3 两种构型对比总结
| 对比项 | 眼在手上(Eye-in-Hand) | 眼在手外(Eye-to-Hand) |
|---|---|---|
| 相机安装位置 | 固定在机器人末端 | 固定在工作空间外 |
| 标定板位置 | 固定在工作空间 | 固定在机器人末端 |
| 待求变换 | 相机→末端:X | 相机→基座:X;末端→标定板:Y |
| 矩阵方程 | AX = XB | AX = YB |
| 未知矩阵个数 | 1 个 | 2 个 |
| 最小运动组数 | 2 组(两个位姿) | 3 组(三个位姿) |
| 典型求解方法 | Tsai-Lenz, Park, Horaud | Li, Dornaika, 两步法 |
4.4 求解思路概述
无论是 AX = XB 还是 AX = YB,求解通常分为两步:
- 旋转部分求解:利用旋转矩阵的轴角表示或四元数,将方程转化为线性形式或最小二乘问题。
- 平移部分求解:在旋转已知后,平移向量可通过线性方程组直接解出。
OpenCV 提供了 calibrateHandEye() 函数,支持多种经典算法(Tsai-Lenz、Park、Horaud 等),直接求解 AX = XB 问题。Halcon 则通过 hand_eye_calibration 算子族,同时支持两种构型,并内置了鲁棒性优化策略。