4. 手眼标定基础:眼在手上与眼在手外的数学模型

手眼标定,说白了就是让机器人知道“我的眼睛到底长在哪”。

我刚入行那会儿,总觉得这玩意儿就是个矩阵乘法,套个公式就完事了。直到第一次在现场调机,机械臂抓了三次零件,三次都偏了2毫米……后来才发现,我连相机装在哪儿都没算对。嗯,从那以后,我再也不敢小看这一步了。

今天咱们就把两种最常见的安装方式——眼在手上(Eye-in-Hand)和眼在手外(Eye-to-Hand)——的数学模型彻底捋一遍。

4.1 两种安装方式,到底有啥区别?

先看一张对比表,心里有个底:

对比项 眼在手上(Eye-in-Hand) 眼在手外(Eye-to-Hand)
相机位置 固定在机械臂末端(法兰盘上) 固定在工作台上方或侧面
相机视野 随机械臂移动,视野变化 固定视野,覆盖工作区域
标定目标 求相机与机械臂末端的变换矩阵 求相机与机器人基座的变换矩阵
典型场景 抓取、装配、焊缝跟踪 视觉引导定位、码垛、检测
标定板放置 标定板固定不动 标定板固定在机械臂末端

你想想看,这两种方式本质上都是在解一个 AX = XB 的方程。但具体怎么列方程,区别就大了。

4.2 眼在手上(Eye-in-Hand)的数学模型

我个人习惯先画坐标系,再列方程。眼在手上的坐标系关系是这样的:

核心思路:相机跟着机械臂走,标定板放在固定位置不动。我们通过移动机械臂到多个姿态,建立相机与机械臂末端之间的固定变换关系。

先定义几个坐标系:

  • Base:机器人基座坐标系
  • End:机械臂末端(法兰盘)坐标系
  • Cam:相机坐标系
  • Obj:标定板(目标物)坐标系

关键变换矩阵:

  • Tbase→end:机器人正运动学给出的末端位姿(已知)
  • Tcam→obj:相机拍摄标定板得到的外参(已知)
  • Tend→cam:我们要求的——手眼矩阵(固定值)
  • Tbase→obj:标定板在基座坐标系下的位姿(固定值)

从基座到标定板,有两条路径:

路径1:Base → End → Cam → Obj
路径2:Base → Obj(直接固定)

写成矩阵链:
T_base→obj = T_base→end × T_end→cam × T_cam→obj

因为标定板固定,所以 Tbase→obj 是常量。我们移动机械臂到两个不同姿态,得到两个方程:

姿态1:T_base→obj = T_base→end1 × X × T_cam→obj1
姿态2:T_base→obj = T_base→end2 × X × T_cam→obj2

两式相减(消去 T_base→obj):
T_base→end1 × X × T_cam→obj1 = T_base→end2 × X × T_cam→obj2

整理成标准形式:
(T_base→end2⁻¹ × T_base→end1) × X = X × (T_cam→obj2 × T_cam→obj1⁻¹)

即:A × X = X × B

这就是经典的 AX = XB 方程。A 是机械臂末端两次运动的变换,B 是相机两次观测的变换。

我的经验:解这个方程至少需要3组非平行的运动。我一般会采集8-12组数据,覆盖机械臂工作空间的不同区域。运动幅度太小,解算容易退化。

4.3 眼在手外(Eye-to-Hand)的数学模型

眼在手外的情况,相机固定,标定板装在机械臂末端。坐标系关系变成这样:

  • Base:机器人基座坐标系
  • End:机械臂末端坐标系
  • Cam:相机坐标系(固定)
  • Obj:标定板坐标系(装在末端)

关键变换矩阵:

  • Tbase→end:机器人正运动学(已知)
  • Tcam→obj:相机拍摄标定板得到的外参(已知)
  • Tcam→base:我们要求的——相机到基座的变换(固定值)
  • Tend→obj:标定板在末端上的安装位置(固定值)

从相机到标定板,两条路径:

路径1:Cam → Base → End → Obj
路径2:Cam → Obj(直接观测)

写成矩阵链:
T_cam→obj = T_cam→base × T_base→end × T_end→obj

同样,移动机械臂到两个姿态,消去固定量 Tend→obj,得到:

(T_cam→obj2 × T_cam→obj1⁻¹) × X = X × (T_base→end2 × T_base→end1⁻¹)

还是:A × X = X × B

你看,两种方式最终都归结到同一个数学形式上。区别只在于 A 和 B 的构造方式不同。

我曾经踩过的坑:眼在手外标定时,标定板一定要装牢。有一次我用双面胶临时固定,机械臂一运动标定板就歪了,解出来的矩阵误差大得离谱。后来我改用螺纹孔固定,一次就过了。

4.4 AX = XB 的求解方法

方程 AX = XB 的解法,业内主流有两种:

方法 原理 优点 缺点
Tsai两步法 先解旋转,再解平移 速度快,适合实时 对噪声敏感
非线性优化 最小化重投影误差 精度高,鲁棒性好 需要初值,速度慢

我个人习惯先用Tsai法算个初值,再用非线性优化精调。这样既快又准。

关键公式(Tsai法旋转部分):

skew(P_A + P_B) × P_X = P_B - P_A

其中:
P_A = 旋转矩阵 A 的旋转向量
P_B = 旋转矩阵 B 的旋转向量
P_X = 待求的旋转向量

4.5 知识结构总览

下面这张图把整个手眼标定的知识体系串起来了:

手眼标定知识体系 手眼标定 眼在手上 (Eye-in-Hand) 眼在手外 (Eye-to-Hand) 相机固定在末端 标定板固定不动 相机固定在工作台 标定板装在末端 核心方程:AX = XB Tsai两步法(快速初值) 非线性优化(高精度) 至少3组非平行运动,建议8-12组数据覆盖工作空间 先Tsai初值 + 再优化精调 = 最佳实践

4.6 避坑指南

最后分享几个我踩过的坑,希望能帮你省点时间:

  1. 运动幅度要够大——旋转角度至少30度以上,平移距离至少100mm。小幅度运动会导致方程病态。
  2. 数据要覆盖工作空间——别只在一个小区域里采集。我习惯让机械臂走一个“米”字形路径,覆盖9个点。
  3. 标定板要清晰——反光、模糊、遮挡都会直接影响外参精度。用亚克力背光标定板效果最好。
  4. 验证环节不能省——标定完成后,让机械臂走几个验证点,计算重投影误差。误差超过0.5像素就要重新标。

一个小技巧:标定完成后,把计算出的手眼矩阵保存下来。下次换相机或换机械臂时,直接复用标定流程脚本,只需要改一下相机内参和机器人型号参数就行。我现在的项目里,标定脚本基本是通用的。