3. 手眼标定问题建模
好,咱们进入正题。手眼标定,说白了就是搞清楚相机和机器人手臂之间的“相对位置关系”。你想想看,机器人要抓一个杯子,相机看到了杯子在图像里的坐标,但机器人得知道这个坐标对应自己手臂的哪个位置才行。这个“坐标转换”就是手眼标定要解决的问题。
我个人习惯把这个问题拆成两步:先搞清楚相机装在哪,再解那个经典的 AX=XB 方程。咱们一步步来。
3.1 两种配置:Eye-in-Hand 与 Eye-to-Hand
相机装在哪,直接决定了你的标定流程和数学模型。就两种主流装法:
| 配置 | 相机安装位置 | 核心关系 | 标定目标 |
|---|---|---|---|
| Eye-in-Hand (EiH) | 固定在机器人末端(法兰盘)上 | 相机跟着手臂一起动 | 求相机坐标系 → 末端坐标系 的变换 |
| Eye-to-Hand (EtH) | 固定在工作空间外(如天花板、三脚架) | 相机不动,手臂在视野里动 | 求相机坐标系 → 机器人基坐标系 的变换 |
Eye-in-Hand 的好处是灵活,相机可以近距离观察目标,精度高。但坏处是每次手臂姿态变化,相机视野也跟着变,容易丢目标。我在做焊接机器人项目时遇到过这个问题——相机装在焊枪上,焊枪一转,标定板就出画了,折腾了好久才找到合适的标定板放置位置。
Eye-to-Hand 正好相反,相机视野固定,适合大范围作业。但标定精度受限于相机安装距离,远了误差就大。而且标定板得固定在机器人末端,操作起来有点麻烦。
核心结论: 两种配置的数学模型本质相同,都是解 AX=XB,只是 X 代表的物理意义不同。EiH 的 X 是 camT_ee,EtH 的 X 是 camT_base。
下面这张图帮你理清两种配置的坐标系关系:
3.2 AX=XB 问题推导
不管你用哪种配置,最终都会落到同一个数学问题上:解 AX=XB。
这个方程怎么来的?我拿 Eye-in-Hand 举个例子。你让机器人从姿态 A 运动到姿态 B,记录两组数据:
- A:机器人末端在两次运动之间的相对变换(从机器人控制器读取)
- B:相机在两次运动之间看到的标定板相对变换(从图像计算)
那么,未知的 X 就是相机到末端的固定变换。它们满足:
A * X = X * B
为什么?因为标定板在世界坐标系中的位置是不变的。你绕一圈,末端和相机的相对关系必须自洽。这个约束就导出了 AX=XB。
小技巧: 实际标定时,我建议至少采集 15-20 组不同姿态的数据。姿态差异要大,旋转角度最好覆盖 30° 以上。如果所有姿态都差不多,方程会病态,解出来误差很大。我曾经吃过这个亏,第一次标定只拍了 5 组数据,结果误差 5mm,根本不能用。
AX=XB 的解法通常分两步:先解旋转部分,再解平移部分。因为旋转矩阵是正交的,可以单独分离出来:
R_A * R_X = R_X * R_B
R_A * t_X + t_A = R_X * t_B + t_X
旋转部分可以用四元数或李代数求解,平移部分就是个线性方程组了。
3.3 手眼标定方程的最小二乘解
实际数据总有噪声,AX=XB 不可能精确成立。所以我们求的是最小二乘解——让误差最小的那个 X。
常用的方法有几种:
| 方法 | 核心思路 | 优点 | 缺点 |
|---|---|---|---|
| Tsai-Lenz 法 | 用四元数或旋转向量分离旋转和平移 | 速度快,实现简单 | 对噪声敏感,需要好数据 |
| 非线性优化 | 把旋转和平移一起优化,最小化重投影误差 | 精度高,鲁棒性好 | 需要初值,计算慢 |
| 李代数方法 | 用 se(3) 表示变换,线性化求解 | 数学优雅,适合多组数据 | 需要李代数基础 |
我个人最常用的是 Tsai-Lenz 法 + 非线性优化精化 的组合。先用 Tsai-Lenz 算个初值,再用 Levenberg-Marquardt 优化一下,效果很稳。
避坑指南: 我曾经在标定过程中忽略了机器人运动学误差。机器人控制器返回的末端位姿本身就有误差(尤其是关节零点漂移),这会导致 AX=XB 的 A 矩阵不准。建议标定前先做一次机器人运动学标定,或者用激光跟踪仪验证末端位姿。
下面是最小二乘解的核心步骤伪代码:
输入:N 组数据 (A_i, B_i),i=1..N
输出:X = (R_X, t_X)
1. 对每组数据,提取旋转矩阵 R_A_i, R_B_i
2. 构造旋转方程:R_A_i * R_X = R_X * R_B_i
3. 用四元数或旋转向量线性化,求解 R_X(最小二乘)
4. 固定 R_X,构造平移方程:
(R_A_i - I) * t_X = R_X * t_B_i - t_A_i
5. 堆叠所有方程,求解 t_X(最小二乘)
6. (可选)以 (R_X, t_X) 为初值,做非线性优化
关键点: 步骤 3 中,旋转方程可以转化为 kron(R_B_i^T, I) - kron(I, R_A_i) 的零空间问题。实际编程时用 SVD 分解就能解。平移部分就是个超定线性方程组,用伪逆搞定。
嗯,到这里,手眼标定的数学模型就搭好了。你有了方程,有了解法,下一步就是动手写代码、采集数据、跑通整个流程。记住,理论再漂亮,最终还得看实际标定出来的精度——我一般用标定板角点重投影误差来评估,小于 0.5 像素才算合格。