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,得到两个方程:

  1. 旋转部分: Ra · Rx = Rx · Rb
  2. 平移部分: 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 的完整求解流程:

AX=XB 求解流程 AX=XB 求解流程 输入:A, B 矩阵对 步骤1:解耦旋转与平移 步骤2:求解旋转 Rx (so(3)方法) 步骤3:代入求解平移 tx 输出:X = [Rx, tx] 注意 • 旋转与平移解耦求解 • 旋转精度决定平移精度 • 多组数据联立最小二乘 • 避免小角度运动

2.6 常见方法对比

市面上求解 AX=XB 的方法很多,我整理了一个对比表:

方法 核心思路 优点 缺点
Tsai 两步法 先解旋转,再解平移 计算简单,稳定 需要至少两组非平行运动
李代数法 转到 so(3) 线性求解 可处理多组数据,精度高 需要理解李群概念
四元数法 用四元数表示旋转 避免万向锁 四元数约束处理稍复杂
同时求解法 非线性优化同时解 R,t 理论上最优 容易陷入局部最优,慢

我的建议: 工程上首选 Tsai 两步法或李代数法。同时求解法虽然理论完美,但我在项目中试过几次,收敛不稳定,调试成本高。除非你有充足的时间调参,否则别碰。

2.7 避坑指南

最后,分享几个我踩过的坑:

  • 数据质量比算法更重要——再好的算法,输入垃圾数据,输出也是垃圾。我见过有人用 3 组数据就跑标定,结果误差 5 毫米。
  • 运动幅度要足够大——旋转角度至少 30° 以上,平移距离至少 100mm。小幅度运动会导致方程病态。
  • 多组数据要分散——不要只在同一个区域采集,让机器人走到工作空间的不同位置。
  • 验证环节不能省——标定完成后,用一组独立数据验证,看重投影误差是否在容忍范围内。

我曾经犯过的错: 有一次为了赶项目,只采集了 5 组数据,而且机器人运动范围很小。标定结果看起来不错,但实际抓取时偏差很大。后来重新采集了 20 组数据,覆盖整个工作空间,问题才解决。记住:数据量不是越多越好,但太少一定不行。