4. 手眼标定原理:AX=XB问题、Tsai法与Park法

手眼标定,说白了就是让机器人知道它的“眼睛”(相机)和“手”(机械臂末端)之间到底是怎么个相对位置关系。你想想看,相机看到了一个螺丝孔,机械臂要去拧螺丝,如果不知道相机和末端之间的变换矩阵,那手臂伸过去肯定歪了。

我在项目里遇到过好几次这种情况:标定板摆得整整齐齐,算法跑得飞快,结果一实测,误差大得离谱。后来发现,问题就出在手眼关系的求解上。所以这一章,咱们把核心的数学原理掰开揉碎了讲清楚。

4.1 问题本质:AX = XB

先看一个最简单的场景。机械臂从位姿A1移动到A2,相机从位姿B1移动到B2。这两个运动之间有什么关系?

嗯,这里要注意:机械臂末端和相机是刚性连接的。所以它们之间的变换矩阵X是固定的。那么,机械臂的运动A(从A1到A2)和相机的运动B(从B1到B2),就满足一个关系:

A * X = X * B

这就是经典的AX=XB问题。A和B是已知的(通过机械臂正运动学和相机外参标定得到),X是未知的,就是我们要找的手眼矩阵。

我个人习惯把这个问题拆成两步:先解旋转部分,再解平移部分。因为旋转矩阵是正交的,有约束条件,单独解更稳定。

核心要点:

  • A:机械臂末端从位姿1到位姿2的变换矩阵
  • B:相机从位姿1到位姿2的变换矩阵
  • X:固定的手眼变换矩阵(待求)
  • 方程:A·X = X·B

4.2 Tsai法:两步走,先旋转后平移

Tsai法是我最早接触的手眼标定算法,也是工程中最常用的方法之一。它的思路很直接:先把旋转矩阵Rx解出来,再代入求平移向量tx。

具体来说,把AX=XB展开成旋转和平移两部分:

R_A * R_x = R_x * R_B
(R_A - I) * t_x = R_x * t_B - t_A

你看,第一个方程只和旋转有关。用多组数据(至少两组),就可以通过最小二乘或者SVD分解求出Rx。然后代入第二个方程,解线性方程组得到tx。

我曾经在一条汽车产线上用Tsai法做标定,采集了15组数据。结果发现,如果数据质量不好(比如机械臂运动幅度太小),旋转部分的解会非常不稳定。后来我加了一条规则:每次运动的旋转角度至少30度,平移距离至少100mm。效果立竿见影。

实用技巧:

  • 采集数据时,让机械臂做大幅度的旋转和平移运动
  • 至少采集8-10组数据,不要只用理论最小值
  • 用RANSAC剔除异常值,避免单组坏数据毁掉全局解

4.3 Park法:一步到位,李群李代数视角

Park法比Tsai法更优雅一些。它从李群的角度看问题,把旋转矩阵映射到李代数so(3)上,然后用线性最小二乘直接求解。

为什么这样做?因为旋转矩阵在SO(3)流形上不是线性的,但它的李代数so(3)是向量空间。把问题映射到李代数上,就可以用标准的线性代数工具了。

Park法的核心步骤:

  1. 把每组A和B的旋转部分取对数,映射到so(3)向量
  2. 构造一个线性方程组,直接解出旋转向量
  3. 把旋转向量指数映射回旋转矩阵
  4. 用类似Tsai法的方式解平移部分

我记得第一次用Park法时,代码比Tsai法短了一半,而且收敛性更好。但要注意:当旋转角度接近180度时,对数映射会出现奇异性。所以实际应用中,我通常两种方法都跑一遍,对比结果。

避坑指南:

我曾经在标定一个六轴协作机器人时,Park法给出的结果和Tsai法差了5度。排查了半天,发现是有一组数据的旋转角度恰好是179.9度,导致对数映射不稳定。从那以后,我每次都会检查旋转角度是否接近180度,如果接近就剔除那组数据。

4.4 两种方法的对比

对比项 Tsai法 Park法
求解方式 两步法(先旋转后平移) 一步法(李代数线性化)
数学基础 线性代数、SVD 李群、李代数、指数映射
代码复杂度 中等 较低
对数据质量要求 较高(需要大范围运动) 中等(注意180度奇异性)
工程应用频率 最常用 逐渐增多

我个人习惯是:先用Tsai法快速得到一个结果,再用Park法验证。如果两者差异在1度以内,基本可以放心使用。如果差异较大,说明数据有问题,需要重新采集。

4.5 知识体系总览

下面这张图把本章的核心逻辑串起来了。从问题定义到两种解法,再到工程注意事项,一目了然。

手眼标定知识体系 问题定义:AX = XB A: 机械臂运动 B: 相机运动 X: 手眼矩阵 Tsai法(两步法) 1. 解旋转部分:R_A·R_x = R_x·R_B 2. 解平移部分:(R_A - I)·t_x = ... 工具:SVD、最小二乘 Park法(李代数法) 1. 映射到so(3)向量空间 2. 线性最小二乘求解 3. 指数映射回SO(3) 工程注意事项 • 运动幅度要大(旋转≥30°,平移≥100mm) • 避免180°奇异性 • 两种方法交叉验证 • 用RANSAC剔除异常值

嗯,这张图把整个流程串起来了。从问题定义到两种解法,再到工程中的坑,你照着这个思路走,基本不会出大问题。

总结一下:

  • 手眼标定的核心就是解AX=XB方程
  • Tsai法分两步,先旋转后平移,工程最常用
  • Park法用李代数,代码简洁,但要注意180度奇异性
  • 两种方法交叉验证,结果更可靠

可可精品资料库