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。

下面这张图帮你理清两种配置的坐标系关系:

手眼标定两种配置对比 Eye-in-Hand 配置 机器人基座 手臂 末端 相机 X = camT_ee 标定板 Eye-to-Hand 配置 固定相机 机器人基座 手臂 末端+板 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 像素才算合格。