4. 手眼标定的数学模型

好,咱们进入正题。手眼标定,说白了就是解一个方程:AX = XB。

我第一次看到这个方程时,心里想:就这?四个矩阵摆在那,看着挺整齐。但真上手做项目才发现,这个“X”才是真正的硬骨头。你想想看,A 和 B 都是已知的,但 X 既要满足旋转约束,又要满足平移约束,稍有不慎就解出一堆废数据。

这一章,我就带你把这个方程彻底吃透。咱们分两种模式讲:眼在手外(Eye-to-Hand)和眼在手上(Eye-in-Hand)。别看名字绕口,数学本质其实是一样的。

4.1 核心方程:AX = XB 的物理含义

先别急着推导。咱们得先搞清楚,这个方程到底在说什么。

假设你有两个坐标系之间的变换关系:

  • A:机器人末端(法兰盘)相对于机器人基座的位姿变换。这个通常从机器人控制器直接读出来。
  • B:相机观测到的标定板相对于相机坐标系的位姿变换。这个由视觉算法算出来。
  • X:相机相对于机器人末端的位姿变换。这就是我们要求的“手眼关系”。

方程 AX = XB 的意思是:从机器人基座到标定板的路径,走两条路应该到达同一个点。

一条路是:基座 → 末端(A)→ 相机(X)→ 标定板(B⁻¹?等等,这里要小心)。

嗯,我换个更直观的说法。你站在机器人基座的位置,先走到末端(A),再从末端走到相机(X),最后从相机看到标定板(B)。另一条路是直接从基座走到标定板。这两条路的结果必须一致。

关键点:AX = XB 中的 A 和 B 必须是同一时刻采集的。机器人动一下,拍一张图,记录一组 (A, B)。至少需要两组不同姿态的数据才能解出 X。

4.2 眼在手外(Eye-to-Hand)模式

先讲眼在手外。这种模式下,相机固定安装,看着机器人运动。标定板贴在机器人末端。

我习惯用这种模式做大型工作站的标定。相机不动,视野稳定,精度容易保证。

4.2.1 坐标系定义

咱们定义几个符号:

  • B:机器人基座坐标系(Base)
  • E:机器人末端坐标系(End-effector)
  • C:相机坐标系(Camera)
  • P:标定板坐标系(Pattern/Calibration board)

在眼在手外模式下,标定板固定在末端上。所以标定板相对于末端的变换是固定的,记作 TP←E。相机相对于基座的变换是固定的,记作 TC←B。这两个都是未知的常数矩阵。

4.2.2 数学推导

从标定板到相机,有一条闭环路径:

标定板 → 末端 → 基座 → 相机

写成矩阵形式:

T<sub>C←P</sub> = T<sub>C←B</sub> · T<sub>B←E</sub> · T<sub>E←P</sub>

其中:

  • TC←P:相机看到的标定板位姿(已知,由视觉算出)
  • TB←E:机器人末端相对于基座的位姿(已知,从控制器读出)
  • TC←B:相机相对于基座的变换(未知)
  • TE←P:标定板相对于末端的变换(未知)

取两个不同的机器人姿态(i 和 j),做差消去未知量:

T<sub>C←P,i</sub> = T<sub>C←B</sub> · T<sub>B←E,i</sub> · T<sub>E←P</sub>
T<sub>C←P,j</sub> = T<sub>C←B</sub> · T<sub>B←E,j</sub> · T<sub>E←P</sub>

两式相减(实际上是矩阵除法):

T<sub>C←P,j</sub> · T<sub>P←C,i</sub> = T<sub>C←B</sub> · T<sub>B←E,j</sub> · T<sub>E←P</sub> · T<sub>P←E,i</sub> · T<sub>E←B,i</sub> · T<sub>B←C</sub>

化简后得到:

A · X = X · B

其中:

  • A = TB←E,j · TE←B,i (机器人末端从姿态 i 到姿态 j 的相对运动)
  • B = TC←P,j · TP←C,i (标定板从姿态 i 到姿态 j 的相对运动,在相机视野中)
  • X = TE←B,i · TB←C · TC←P,i · TP←E,i (实际上就是相机相对于末端的变换,但被中间项消掉了)

我的经验:实际编程时,我通常直接构造 A 和 B 矩阵,然后调用现成的求解器。自己手写求解器容易踩坑,尤其是旋转矩阵的奇异性问题。OpenCV 的 calibrateHandEye() 函数就挺好用,但要注意参数顺序。

4.3 眼在手上(Eye-in-Hand)模式

眼在手上,就是相机装在机器人末端上,跟着机器人一起动。标定板固定放在工作台上。

这种模式我用的更多。因为相机跟着机器人走,视野灵活,可以拍到大工件的各个角落。但缺点也很明显——运动模糊和振动问题比较头疼。

4.3.1 坐标系定义

符号基本一样,但关系变了:

  • B:机器人基座坐标系
  • E:机器人末端坐标系
  • C:相机坐标系(固定在末端上)
  • P:标定板坐标系(固定在工作台上)

现在,相机相对于末端的变换 TC←E 是未知常数。标定板相对于基座的变换 TP←B 也是未知常数。

4.3.2 数学推导

闭环路径变成:

标定板 → 基座 → 末端 → 相机

矩阵形式:

T<sub>C←P</sub> = T<sub>C←E</sub> · T<sub>E←B</sub> · T<sub>B←P</sub>

同样取两个姿态 i 和 j:

T<sub>C←P,i</sub> = T<sub>C←E</sub> · T<sub>E←B,i</sub> · T<sub>B←P</sub>
T<sub>C←P,j</sub> = T<sub>C←E</sub> · T<sub>E←B,j</sub> · T<sub>B←P</sub>

做差消去:

T<sub>C←P,j</sub> · T<sub>P←C,i</sub> = T<sub>C←E</sub> · T<sub>E←B,j</sub> · T<sub>B←P</sub> · T<sub>P←B</sub> · T<sub>B←E,i</sub> · T<sub>E←C</sub>

化简后,又得到:

A · X = X · B

这次:

  • A = TE←B,j · TB←E,i (机器人末端从姿态 i 到 j 的相对运动,和眼在手外一样)
  • B = TC←P,j · TP←C,i (相机看到的标定板相对运动,也和眼在手外一样)
  • X = TC←E (相机相对于末端的变换,这就是我们想要的!)

注意:虽然两种模式最终都归结为 AX = XB,但 X 的物理含义不同。眼在手外模式下,X 是相机相对于基座的变换(或者经过中间变换后得到的关系);眼在手上模式下,X 直接就是相机相对于末端的变换。千万别搞混了。

4.4 两种模式的对比

对比项 眼在手外(Eye-to-Hand) 眼在手上(Eye-in-Hand)
相机安装位置 固定在工作空间外 固定在机器人末端
标定板位置 贴在机器人末端 固定在工作台上
X 的含义 相机相对于基座的变换 相机相对于末端的变换
视野特点 固定视野,适合全局观测 随动视野,适合局部精细操作
运动模糊风险 低(相机不动) 高(相机跟着动)
标定数据采集 机器人带动标定板运动 机器人带动相机运动

4.5 求解 AX = XB 的基本思路

方程 AX = XB 看起来简单,但直接解并不容易。因为 X 是一个 4×4 的齐次变换矩阵,包含旋转和平移两部分。

我一般分两步走:

  1. 先解旋转部分:从 A 和 B 的旋转矩阵中提取旋转轴和旋转角,构造方程 RA · RX = RX · RB。常用的方法有 Tsai 法、Park 法等。
  2. 再解平移部分:旋转解出来后,代入原方程解平移向量 tX。这一步是线性的,直接用最小二乘就行。

避坑指南:我曾经在解旋转时用了不稳定的数值方法,结果标定出来的 X 在某个姿态下误差特别大。后来改用四元数插值法,稳定性好多了。建议你至少准备两种求解算法做交叉验证。

4.6 知识结构图

下面这张图总结了本章的核心逻辑:

手眼标定数学模型:AX = XB 眼在手外(Eye-to-Hand) 眼在手上(Eye-in-Hand) 相机固定,标定板在末端 X = 相机相对于基座的变换 相机在末端,标定板固定 X = 相机相对于末端的变换 AX = XB 求解方法:Tsai法 / Park法 / 四元数法 / 李代数法 关键:至少需要两组不同姿态的数据,且姿态差异要足够大

4.7 小结

这一章我们做了三件事:

  • 把两种手眼标定模式统一到了同一个数学框架下——AX = XB
  • 推导了各自的闭环路径和矩阵方程
  • 对比了两种模式的特点和适用场景

说实话,数学推导看着有点枯燥,但这是后面所有优化工作的基础。你想想看,如果连方程都列错了,后面再怎么调参数也是白搭。