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法的核心步骤:
- 把每组A和B的旋转部分取对数,映射到so(3)向量
- 构造一个线性方程组,直接解出旋转向量
- 把旋转向量指数映射回旋转矩阵
- 用类似Tsai法的方式解平移部分
我记得第一次用Park法时,代码比Tsai法短了一半,而且收敛性更好。但要注意:当旋转角度接近180度时,对数映射会出现奇异性。所以实际应用中,我通常两种方法都跑一遍,对比结果。
避坑指南:
我曾经在标定一个六轴协作机器人时,Park法给出的结果和Tsai法差了5度。排查了半天,发现是有一组数据的旋转角度恰好是179.9度,导致对数映射不稳定。从那以后,我每次都会检查旋转角度是否接近180度,如果接近就剔除那组数据。
4.4 两种方法的对比
| 对比项 | Tsai法 | Park法 |
|---|---|---|
| 求解方式 | 两步法(先旋转后平移) | 一步法(李代数线性化) |
| 数学基础 | 线性代数、SVD | 李群、李代数、指数映射 |
| 代码复杂度 | 中等 | 较低 |
| 对数据质量要求 | 较高(需要大范围运动) | 中等(注意180度奇异性) |
| 工程应用频率 | 最常用 | 逐渐增多 |
我个人习惯是:先用Tsai法快速得到一个结果,再用Park法验证。如果两者差异在1度以内,基本可以放心使用。如果差异较大,说明数据有问题,需要重新采集。
4.5 知识体系总览
下面这张图把本章的核心逻辑串起来了。从问题定义到两种解法,再到工程注意事项,一目了然。
嗯,这张图把整个流程串起来了。从问题定义到两种解法,再到工程中的坑,你照着这个思路走,基本不会出大问题。
总结一下:
- 手眼标定的核心就是解AX=XB方程
- Tsai法分两步,先旋转后平移,工程最常用
- Park法用李代数,代码简洁,但要注意180度奇异性
- 两种方法交叉验证,结果更可靠
可可精品资料库