3、手眼标定基础:从问题定义到方程推导
手眼标定,说白了就是让机器人知道自己的眼睛(相机)和手(末端执行器)之间到底是什么关系。我刚开始接触这个课题时,觉得不就是两个坐标系之间的变换嘛,有什么难的?直到第一次在现场调试,相机装好了,机器人也动了,但抓取就是偏那么几毫米……嗯,从那以后我才真正重视起这个看似简单、实则坑不少的基础问题。
3.1 手眼标定问题定义:AX = XB
我们先从数学上把这个问题说清楚。手眼标定要解决的,本质上是一个矩阵方程:
AX = XB
这里:
- A:相机从位置1到位置2的变换矩阵(由相机外参得到)
- B:机器人末端从位置1到位置2的变换矩阵(由机器人正运动学得到)
- X:我们要求的、相机与机器人末端之间的固定变换矩阵
你想想看,这个方程为什么成立?因为无论机器人怎么动,相机和末端的相对位姿是不变的。我习惯把这个关系叫做“闭环约束”——相机看到的棋盘格变化,必须和机器人实际运动一致,唯一的未知量就是X。
核心思想:通过多组不同位姿下的观测数据,求解一个不变的变换矩阵X。至少需要2组非平行的运动才能解出唯一解。
3.2 眼在手外(Eye-to-Hand)与眼在手上(Eye-in-Hand)的区别
这两种配置,我在项目里都踩过坑。先看一张对比图:
这两种配置,标定方程的形式完全不同。我整理了一个对比表:
| 对比项 | 眼在手外(Eye-to-Hand) | 眼在手上(Eye-in-Hand) |
|---|---|---|
| 相机安装位置 | 固定在工作台上方或侧面 | 装在机器人末端法兰上 |
| 标定板位置 | 装在机器人末端 | 固定在工作台上 |
| 标定方程 | AX = XB(A:相机运动,B:机器人运动) | AX = XB(A:相机运动,B:机器人运动) |
| 求解目标X | 相机坐标系 → 机器人基坐标系 | 相机坐标系 → 机器人末端坐标系 |
| 典型应用 | 视觉引导抓取、定位 | 焊缝跟踪、精密装配 |
| 我的经验 | 标定板容易遮挡,需要规划好路径 | 相机视野随末端移动,标定板要足够大 |
个人建议:如果项目对精度要求高(比如0.1mm以内),优先选眼在手上。因为相机离目标近,误差传递小。但要注意,末端负载增加了,机器人运动学参数可能受影响。
3.3 标定方程推导
好,我们来看看这个AX=XB到底怎么来的。我习惯用“坐标系链”的思路来推,这样不容易乱。
3.3.1 眼在手外推导
先定义几个坐标系:
- B:机器人基坐标系
- E:机器人末端坐标系
- C:相机坐标系
- P:标定板坐标系
当机器人运动到两个不同位姿时,我们分别记录:
位姿1:B→E1(机器人正运动学),C→P1(相机外参)
位姿2:B→E2(机器人正运动学),C→P2(相机外参)
注意,标定板固定在末端,所以P相对于E是固定的。我们设这个固定变换为XEP。那么:
P1 = X_EP * E1
P2 = X_EP * E2
同时,相机观测到的标定板位姿:
P1 = X_CB * C1
P2 = X_CB * C2
其中XCB是相机到基座的变换(我们要求的X)。联立两式,消去P:
X_CB * C1 = X_EP * E1
X_CB * C2 = X_EP * E2
两式相减(或者说,用位姿2的逆乘位姿1),得到:
X_CB * (C2 * C1⁻¹) = (X_EP * E2) * (X_EP * E1)⁻¹
X_CB * A = B * X_CB
这里A = C2 * C1⁻¹(相机运动),B = E2 * E1⁻¹(机器人运动)。
关键点:A和B都是齐次变换矩阵(4×4),包含旋转和平移。求解X时,通常先解旋转部分(用罗德里格斯公式或四元数),再解平移部分。
3.3.2 眼在手上推导
眼在手上的推导思路类似,但坐标系链不同。这次标定板固定在工作台上,相机装在末端。设:
- X:相机到末端的变换(我们要求的)
- P:标定板到基座的变换(固定但未知)
在位姿1和位姿2下,分别有:
P = E1 * X * C1⁻¹
P = E2 * X * C2⁻¹
两式相等:
E1 * X * C1⁻¹ = E2 * X * C2⁻¹
整理后同样得到:
AX = XB
只不过A和B的定义不同了。我当年第一次推导时,被这个“同一个方程、不同含义”绕晕过。后来我总结了一个口诀:“A是相机看到的运动,B是机器人自己动的运动,X是它们之间的桥梁”。
我曾经踩过的坑:推导时忘记把齐次矩阵的逆写对。记住,变换矩阵的逆不是简单的转置,旋转部分转置,平移部分要乘上旋转的转置再取负。这个细节错了,标定结果全废。
3.4 求解方法概览
AX=XB的求解方法,我按使用频率排了个序:
- 两步法:先解旋转(用四元数或罗德里格斯公式),再解平移。最常用,稳定。
- 同时法:用李代数把旋转和平移一起优化。精度高,但初值敏感。
- 解析法:Tsai-Lenz方法,经典但需要至少2组非平行运动。
- 非线性优化:用Levenberg-Marquardt等算法。适合数据噪声大的场景。
我个人习惯先用两步法快速得到一个初值,再用非线性优化微调。这样既快又准。
避坑指南:采集数据时,让机器人做大幅度的旋转运动(至少30°以上),平移也要有。如果只做小范围运动,旋转部分解出来误差会很大。我曾经有一次偷懒,只让机器人动了10°,结果标定误差直接飙到5mm……
3.5 本章小结
手眼标定的核心就三件事:
- 理解AX=XB的物理含义
- 区分眼在手外和眼在手上的配置差异
- 掌握方程推导的坐标系链思路