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 知识结构总览
下面这张图把整个手眼标定的知识体系串起来了:
4.6 避坑指南
最后分享几个我踩过的坑,希望能帮你省点时间:
- 运动幅度要够大——旋转角度至少30度以上,平移距离至少100mm。小幅度运动会导致方程病态。
- 数据要覆盖工作空间——别只在一个小区域里采集。我习惯让机械臂走一个“米”字形路径,覆盖9个点。
- 标定板要清晰——反光、模糊、遮挡都会直接影响外参精度。用亚克力背光标定板效果最好。
- 验证环节不能省——标定完成后,让机械臂走几个验证点,计算重投影误差。误差超过0.5像素就要重新标。
一个小技巧:标定完成后,把计算出的手眼矩阵保存下来。下次换相机或换机械臂时,直接复用标定流程脚本,只需要改一下相机内参和机器人型号参数就行。我现在的项目里,标定脚本基本是通用的。