4. 手眼标定:眼在手上 vs 眼在手外、坐标系变换

说到手眼标定,很多刚入行的朋友第一反应就是「解方程」。其实没那么玄乎。说白了,就是搞清楚相机和机器人手臂之间的「相对位置关系」。你想想看,相机看到了一个零件,机器人要去抓它,这两个家伙的坐标系如果不打通,那抓取点算出来就是错的。

我刚开始做3D视觉那会儿,就吃过这个亏。标定完觉得挺准,一上机器人就偏了2毫米。后来才发现,我用的眼在手外模型,但代码里写的却是眼在手上的变换矩阵。嗯,这种低级错误,犯过一次就再也不会忘了。

4.1 两种经典配置:眼在手上 vs 眼在手外

先搞清楚概念。手眼标定分两种场景,它们的坐标系变换链完全不同。

配置类型 相机安装位置 核心变换关系 典型应用
眼在手上 (Eye-in-Hand) 相机固定在机器人末端 相机 → 末端 → 基座 → 世界 小零件抓取、精密装配
眼在手外 (Eye-to-Hand) 相机固定在工作台上方 相机 → 世界 → 基座 → 末端 大范围定位、流水线检测

眼在手上,相机跟着机器人末端一起动。好处是视野灵活,可以凑近看细节。坏处是每次标定都要考虑末端姿态变化。我在做手机中框抓取项目时用的就是这种,因为零件小,相机得贴得很近才能看清特征。

眼在手外,相机固定不动,看整个工作空间。好处是标定一次管很久,视野稳定。坏处是如果机器人遮挡了相机视线,那就抓瞎了。我记得有个项目,机器人抓取大型钣金件,用的就是眼在手外,因为零件太大,相机必须架高才能看到全貌。

核心区别一句话总结:

  • 眼在手上:相机坐标系随末端运动,标定目标是求 camTcp(相机到末端)
  • 眼在手外:相机坐标系固定,标定目标是求 camBase(相机到基座)

4.2 坐标系变换链:从相机到抓取点

不管哪种配置,最终目的都是把相机看到的点,转换到机器人能理解的坐标系里。这个链条必须完整,少一环都不行。

我习惯用齐次变换矩阵来串联。一个4x4矩阵,包含了旋转和平移,干净利落。

// 眼在手上:从像素坐标到机器人基座坐标
// 链条:像素 → 相机 → 末端 → 基座
P_base = T_base2end * T_end2cam * P_cam

// 眼在手外:从像素坐标到机器人基座坐标
// 链条:像素 → 相机 → 基座
P_base = T_base2cam * P_cam

这里有个坑要注意。眼在手上的链条里,T_base2end 是机器人正运动学算出来的,实时变化。而 T_end2cam 是标定出来的固定值。眼在手外则反过来,T_base2cam 是固定值,一次标定终身使用。

我曾经踩过的坑:

做眼在手上标定时,我直接用机器人示教器读出来的末端位姿,没注意单位是毫米还是米。结果标定出来的矩阵,平移部分差了1000倍。后来我养成了一个习惯:所有数据统一用毫米,机器人返回的位姿先做单位检查。

4.3 手眼标定的数学本质

标定的数学本质,就是解一个 AX = XB 形式的方程。A是机器人末端的运动,B是相机看到的标定板运动,X就是我们要找的手眼矩阵。

为什么是AX=XB?我解释一下:

  • A:机器人从位姿1运动到位姿2,末端的变化量
  • B:相机从位姿1运动到位姿2,标定板的变化量
  • X:相机到末端的固定变换(眼在手上)

这个方程的解,通常需要至少3组非共面的运动数据才能算出来。我一般会采集10-15组,然后做最小二乘优化,把噪声的影响降到最低。

我的实操建议:

采集数据时,让机器人做不同姿态的运动。不要只在一个平面里转,那样解出来的旋转部分会退化。我习惯让末端绕X、Y、Z轴各转30度以上,同时平移距离拉开,这样标定结果更鲁棒。

4.4 标定流程与验证方法

标定不是一次性的活。我每次标定完,都会做一次「闭环验证」。具体做法是:

  1. 在机器人工作空间里放一个固定尖点
  2. 用相机识别这个尖点的位置
  3. 通过标定矩阵转换到机器人坐标系
  4. 让机器人末端去触碰这个尖点
  5. 测量实际触碰位置和理论位置的偏差

偏差在1毫米以内,算合格。0.5毫米以内,算优秀。如果超过2毫米,那就要回头检查标定数据了。

我记得有一次,标定验证总是差3毫米,怎么调都不行。后来发现是标定板本身不平,有个角翘起来了。换了一块陶瓷标定板,问题立刻解决。所以,硬件本身的质量也很重要。

4.5 知识结构图:手眼标定核心逻辑

下面这张图,把整个手眼标定的知识脉络串起来了。你可以把它当作一个快速索引,遇到问题先看自己在哪个环节。

手眼标定核心知识结构 眼在手上 (Eye-in-Hand) 眼在手外 (Eye-to-Hand) 变换链:像素 → 相机 → 末端 → 基座 标定目标:T_end2cam (固定值) 变换链:像素 → 相机 → 基座 标定目标:T_base2cam (固定值) 数学本质:AX = XB A: 机器人运动 | B: 相机观测 | X: 手眼矩阵 标定流程:采集数据 → 求解方程 → 闭环验证 验证:尖点触碰法 | 偏差 < 1mm 合格

4.6 常见问题与避坑指南

最后,我把自己这些年遇到过的坑,整理成了一份清单。你标定的时候,可以对照着检查一下。

  • 标定板不平:用陶瓷或玻璃标定板,别用亚克力板,热胀冷缩会变形
  • 数据采集太少:至少10组,且姿态要多样化,不要都在一个平面
  • 单位不一致:统一用毫米,机器人返回的位姿先做单位检查
  • 忽略畸变校正:标定前先做相机内参标定和畸变校正,不然手眼标定精度上不去
  • 验证方法不对:不要只看重投影误差,要做实际的机器人触碰验证

特别提醒:

如果你用的是眼在手上配置,每次更换相机或末端工具后,都必须重新标定。我见过有人换了夹爪忘了重新标定,结果抓取偏差直接飙到5毫米。嗯,这种问题排查起来特别费时间。