3. 手眼标定基础:数学本质与两种经典构型
手眼标定,说白了就是让机器人知道它的「手」和「眼睛」之间到底是个什么关系。你想想看,相机看到了一个零件,机器人要去抓它,但相机看到的坐标和机器人自己的坐标是两套系统。怎么把这两套坐标对齐?这就是手眼标定要解决的问题。
我刚开始做这个的时候,也觉得不就是个坐标变换嘛,有什么难的?后来在产线上调试,发现标定结果总是飘,才意识到这里面的门道比想象中深得多。嗯,咱们今天就把这个基础打扎实。
3.1 数学本质:AX = XB
先看这个方程:AX = XB。它看起来简单,但背后是整个手眼标定的核心逻辑。
这里的 A、B、X 都是 4×4 的齐次变换矩阵,包含旋转和平移。具体来说:
- A:机器人末端(手)从位置1移动到位置2的变换矩阵
- B:相机(眼)从位置1移动到位置2的变换矩阵
- X:我们要求解的、相机与机器人末端之间的固定变换关系
为什么是 AX = XB?我画个图你就明白了。
核心思想:机器人末端移动时,相机也随着移动(或场景变化)。但相机与末端的相对位姿是固定的。这个「固定关系」就是 X。
你想想看,机器人末端移动了,相机看到的标定板位置也变了。但不管怎么动,相机装在机器人上的那个「姿势」是不变的。这个不变的东西,就是 X。
求解 AX = XB 的方法有很多,常见的有:
- 两步法:先解旋转部分(用四元数或罗德里格斯公式),再解平移部分
- 同时法:把旋转和平移放在一起优化,精度更高但计算量大
- 非线性优化:用李代数做迭代求解,适合噪声大的场景
我的经验:在实际项目中,我建议先用两步法快速得到一个初始解,再用非线性优化做精调。这样既快又稳。我曾经在一个项目里直接上非线性优化,结果迭代了半小时还没收敛……后来发现是初始值给得太离谱。
3.2 眼在手外(Eye-to-Hand)
眼在手外,就是相机固定在机器人外面,比如装在支架上、天花板上。相机看着机器人和工作台,机器人去抓东西。
这种构型下,X 表示的是 相机坐标系到机器人基坐标系 的变换。
| 项目 | 说明 |
|---|---|
| 相机位置 | 固定在工作空间外,不随机器人移动 |
| 标定对象 | 标定板固定在机器人末端 |
| 求解目标 | 相机 → 机器人基座的变换矩阵 |
| 优点 | 视野大,相机不受机器人运动干扰 |
| 缺点 | 容易被遮挡,标定板需要装在末端 |
眼在手外的标定流程大概是这样的:
- 把标定板固定在机器人末端法兰上
- 控制机器人走到 N 个不同的位姿(我一般取 15-20 个)
- 在每个位姿记录:机器人末端位姿(从控制器读)和标定板在相机下的位姿(从图像算)
- 构造 AX = XB 方程,求解 X
注意:标定板一定要固定牢!我曾经有一次标定板没拧紧,机器人一动标定板就晃,结果标定出来的 X 误差大得离谱。排查了两天才发现是螺丝松了……
3.3 眼在手上(Eye-in-Hand)
眼在手上,就是相机装在机器人末端上,跟着机器人一起动。这种构型在抓取场景里非常常见,因为相机可以凑近看零件,精度高。
这种构型下,X 表示的是 相机坐标系到机器人末端坐标系 的变换。
| 项目 | 说明 |
|---|---|
| 相机位置 | 固定在机器人末端法兰上 |
| 标定对象 | 标定板固定在工作台上(不动) |
| 求解目标 | 相机 → 机器人末端的变换矩阵 |
| 优点 | 灵活,可以近距离观察,遮挡少 |
| 缺点 | 视野随机器人移动变化,需要频繁标定 |
眼在手上的标定流程:
- 把标定板固定在工作台上(不动)
- 控制机器人走到 N 个不同的位姿
- 在每个位姿记录:机器人末端位姿和标定板在相机下的位姿
- 同样构造 AX = XB,但这里的 A 和 B 含义与眼在手外不同
关键区别:眼在手外时,标定板动、相机不动;眼在手上时,相机动、标定板不动。两种构型的 AX = XB 方程形式一样,但变量含义不同,千万别搞混。
3.4 两种构型的对比
我整理了一个对比表,方便你快速查阅:
| 对比项 | 眼在手外(Eye-to-Hand) | 眼在手上(Eye-in-Hand) |
|---|---|---|
| 相机安装位置 | 固定支架/天花板 | 机器人末端法兰 |
| 标定板位置 | 机器人末端 | 固定工作台 |
| 求解的 X | 相机 → 机器人基座 | 相机 → 机器人末端 |
| 视野稳定性 | 固定视野 | 随机器人移动 |
| 遮挡问题 | 容易遮挡 | 较少遮挡 |
| 标定精度 | 中等 | 较高(可近距离观察) |
| 适用场景 | 大范围抓取、多机器人协同 | 精密抓取、小零件、装配 |
我的建议:如果你做的是无序抓取,零件散乱堆在料框里,我推荐用眼在手上。相机可以凑到料框口去看,视野好、精度高。眼在手外更适合那种工作台面固定、机器人活动范围大的场景。
3.5 避坑指南
做手眼标定这些年,我踩过的坑不少。挑几个典型的说说:
- 标定板不要太小:我曾经用了一个 A4 纸大小的标定板,结果相机离远了根本看不清角点。后来换成 A3 大小,问题解决。
- 位姿要多样化:别只在一个小范围内移动。要让机器人走大角度、大位移,这样方程才解得好。
- 数据要筛选:有些位姿下标定板成像模糊,或者被遮挡,这些数据要剔除。我一般会写个脚本自动检查重投影误差,超过 0.5 像素的就扔掉。
- 标定板要平整:别用那种软趴趴的纸板,贴在铝板或玻璃板上最好。
曾经有一次,我在现场标定了一整天,结果 X 怎么算都不对。最后发现是机器人控制器的位姿输出格式和我的代码里假设的不一致——一个是 ZYX 欧拉角,一个是四元数。嗯,从那以后我每次都会先打印一个位姿出来,手动验证一下格式。
好了,手眼标定的数学本质和两种构型就讲到这里。记住 AX = XB 这个核心方程,理解相机和机器人之间的坐标关系,后面的实操就好办了。