4. 手眼标定的数学模型:AX=XB 问题
好,咱们进入正题。手眼标定,说白了就是解一个方程: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 数学推导
从标定板到相机,有一条闭环路径:
标定板 → 末端 → 基座 → 相机
写成矩阵形式:
TC←P = TC←B · TB←E · TE←P
其中:
- TC←P:相机看到的标定板位姿(已知,由视觉算出)
- TB←E:机器人末端相对于基座的位姿(已知,从控制器读出)
- TC←B:相机相对于基座的变换(未知)
- TE←P:标定板相对于末端的变换(未知)
取两个不同的机器人姿态(i 和 j),做差消去未知量:
TC←P,i = TC←B · TB←E,i · TE←P
TC←P,j = TC←B · TB←E,j · TE←P
两式相减(实际上是矩阵除法):
TC←P,j · TP←C,i = TC←B · TB←E,j · TE←P · TP←E,i · TE←B,i · TB←C
化简后得到:
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 数学推导
闭环路径变成:
标定板 → 基座 → 末端 → 相机
矩阵形式:
TC←P = TC←E · TE←B · TB←P
同样取两个姿态 i 和 j:
TC←P,i = TC←E · TE←B,i · TB←P
TC←P,j = TC←E · TE←B,j · TB←P
做差消去:
TC←P,j · TP←C,i = TC←E · TE←B,j · TB←P · TP←B · TB←E,i · TE←C
化简后,又得到:
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 的齐次变换矩阵,包含旋转和平移两部分。
我一般分两步走:
- 先解旋转部分:从 A 和 B 的旋转矩阵中提取旋转轴和旋转角,构造方程 RA · RX = RX · RB。常用的方法有 Tsai 法、Park 法等。
- 再解平移部分:旋转解出来后,代入原方程解平移向量 tX。这一步是线性的,直接用最小二乘就行。
避坑指南:我曾经在解旋转时用了不稳定的数值方法,结果标定出来的 X 在某个姿态下误差特别大。后来改用四元数插值法,稳定性好多了。建议你至少准备两种求解算法做交叉验证。
4.6 知识结构图
下面这张图总结了本章的核心逻辑:
4.7 小结
这一章我们做了三件事:
- 把两种手眼标定模式统一到了同一个数学框架下——AX = XB
- 推导了各自的闭环路径和矩阵方程
- 对比了两种模式的特点和适用场景
说实话,数学推导看着有点枯燥,但这是后面所有优化工作的基础。你想想看,如果连方程都列错了,后面再怎么调参数也是白搭。