2. 标定数学模型:AX=XB 问题的数学推导,旋转矩阵与平移向量的解耦
好,咱们进入正题。手眼标定的核心,说白了就是一个数学问题——AX = XB。
我第一次看到这个方程时,心里想的是:“就这?一个方程能搞定机器人视觉?” 后来踩了不少坑才明白,这个方程背后藏着旋转和平移的解耦逻辑,搞不懂它,标定精度就无从谈起。
2.1 从物理场景到数学方程
先回顾一下我们的设定。机器人带着相机移动,从位置 A 到位置 B。我们记录下两次移动:
- A:机器人末端(法兰盘)从位姿 1 到位姿 2 的变换矩阵
- B:相机从位姿 1 到位姿 2 的变换矩阵
- X:我们要求的——相机到机器人末端的固定变换(手眼矩阵)
它们满足:A · X = X · B
为什么是这个形式?我习惯用一个简单的比喻:
核心逻辑:机器人末端移动了多少,相机就必须跟着移动多少(通过 X 这个“刚性连接”传递)。方程的本质是“闭环约束”——从机器人基座出发,经过末端、相机、再到目标点,最后回到基座,路径必须闭合。
2.2 旋转矩阵与平移向量的解耦
AX=XB 是一个 4×4 齐次矩阵方程。直接解它很麻烦。我建议的做法是——先解旋转,再解平移。
把矩阵拆开:
A = [Ra ta] B = [Rb tb] X = [Rx tx]
[0 1 ] [0 1 ] [0 1 ]
代入 AX = XB,得到两个方程:
- 旋转部分: Ra · Rx = Rx · Rb
- 平移部分: Ra · tx + ta = Rx · tb + tx
看到了吗?旋转方程里没有平移项。这意味着我们可以先单独求解 Rx,再代入平移方程求 tx。
我的经验: 在实际项目中,我见过有人试图同时求解旋转和平移,结果误差互相耦合,标定结果一塌糊涂。先解旋转,再解平移,这是铁律。
2.3 旋转矩阵的求解:从李群到李代数
Ra · Rx = Rx · Rb 这个方程,在数学上称为 相似变换。直接解矩阵方程并不容易,因为旋转矩阵有正交约束(R·Rᵀ = I, det(R)=1)。
我常用的方法是转到李代数 so(3) 上求解。简单说:
- 把旋转矩阵 R 映射到旋转向量 r(轴角表示)
- 方程变成:ra + rx = rx + rb → ra - rb = 0? 不对,这里要注意。
实际上,在 so(3) 上,方程变为:
[ra]× · rx = rx · [rb]×
其中 [·]× 是反对称矩阵。整理后得到:
( [ra]× + [rb]× ) · rx = 0
这是一个线性方程!用最小二乘法就能解出 rx。
注意: 当 ra 和 rb 接近 0 时(机器人几乎没动),方程会退化。我曾经因为这个原因,标定结果完全不对。所以采集数据时,一定要让机器人做大幅度的旋转运动。
2.4 平移向量的求解:线性最小二乘
旋转矩阵 Rx 解出来后,平移方程就简单了:
Ra · tx + ta = Rx · tb + tx
→ (Ra - I) · tx = Rx · tb - ta
这是一个关于 tx 的线性方程。多组数据联立,用最小二乘法求解:
[ Ra1 - I ] [ Rx · tb1 - ta1 ]
[ Ra2 - I ] · tx = [ Rx · tb2 - ta2 ]
[ ... ] [ ... ]
关键点: 平移求解的精度完全依赖于旋转矩阵 Rx 的精度。如果旋转解错了,平移一定错。所以我说,旋转是手眼标定的“牛鼻子”。
2.5 知识结构总览
下面这张图总结了 AX=XB 的完整求解流程:
2.6 常见方法对比
市面上求解 AX=XB 的方法很多,我整理了一个对比表:
| 方法 | 核心思路 | 优点 | 缺点 |
|---|---|---|---|
| Tsai 两步法 | 先解旋转,再解平移 | 计算简单,稳定 | 需要至少两组非平行运动 |
| 李代数法 | 转到 so(3) 线性求解 | 可处理多组数据,精度高 | 需要理解李群概念 |
| 四元数法 | 用四元数表示旋转 | 避免万向锁 | 四元数约束处理稍复杂 |
| 同时求解法 | 非线性优化同时解 R,t | 理论上最优 | 容易陷入局部最优,慢 |
我的建议: 工程上首选 Tsai 两步法或李代数法。同时求解法虽然理论完美,但我在项目中试过几次,收敛不稳定,调试成本高。除非你有充足的时间调参,否则别碰。
2.7 避坑指南
最后,分享几个我踩过的坑:
- 数据质量比算法更重要——再好的算法,输入垃圾数据,输出也是垃圾。我见过有人用 3 组数据就跑标定,结果误差 5 毫米。
- 运动幅度要足够大——旋转角度至少 30° 以上,平移距离至少 100mm。小幅度运动会导致方程病态。
- 多组数据要分散——不要只在同一个区域采集,让机器人走到工作空间的不同位置。
- 验证环节不能省——标定完成后,用一组独立数据验证,看重投影误差是否在容忍范围内。
我曾经犯过的错: 有一次为了赶项目,只采集了 5 组数据,而且机器人运动范围很小。标定结果看起来不错,但实际抓取时偏差很大。后来重新采集了 20 组数据,覆盖整个工作空间,问题才解决。记住:数据量不是越多越好,但太少一定不行。