4、手眼标定原理:手眼标定问题建模(AX=XB)、经典求解方法(Tsai、Park)
手眼标定,说白了就是让机器人知道自己“眼睛”长在哪儿。
我刚开始接触这个课题时,觉得不就是个坐标变换嘛。后来在项目里被坑过一次——标定误差导致机械臂抓取偏差了3毫米,零件直接报废。嗯,从那以后我再也不敢小看这一步了。
4.1 问题建模:AX=XB 是怎么来的?
先想一个问题:你的激光雷达装在机械臂末端,机械臂动一下,雷达也跟着动。但雷达坐标系和机械臂末端坐标系之间,有一个固定的变换关系——这就是我们要找的 手眼矩阵 X。
为什么是 AX=XB?
你想想看,机械臂从姿态 A 变到姿态 B,雷达也同时从姿态 A' 变到姿态 B'。这两个变换之间,夹着一个固定的 X。数学上写出来就是:
A * X = X * B
其中:
- A:机械臂末端从位置1到位置2的变换矩阵(已知,从机器人控制器读取)
- B:激光雷达从位置1到位置2的变换矩阵(已知,通过标定板点云配准得到)
- X:手眼矩阵,即雷达坐标系到机械臂末端坐标系的变换(未知,待求解)
我在项目中遇到过一个问题:很多人以为 A 和 B 是同一个运动。其实不是。A 是机械臂的运动,B 是雷达看到的运动。它们描述的是同一个物理运动,但坐标系不同。
核心理解:AX=XB 的本质是“运动一致性约束”。机械臂动了多少,雷达就应该看到多少,只是表达方式不同。
4.2 为什么需要多组数据?
一组 A 和 B 能解出 X 吗?不能。因为未知数太多——旋转有3个自由度,平移有3个自由度,一共6个未知数。一组方程只能提供部分约束。
我个人的习惯是:至少采集 8-10 组不同姿态的数据。为什么?
- 太少:解不稳定,容易陷入局部最优
- 太多:数据冗余,计算量增大,但精度提升有限
- 关键:姿态要多样化,不要只在一个小范围内动
避坑指南:我曾经只采集了4组数据,结果解出来的 X 在某个方向上误差特别大。后来发现是因为那4组运动几乎都是绕同一个轴旋转的——说白了就是信息量不够。
4.3 经典求解方法:Tsai 法
Tsai 法是1989年提出的,算是手眼标定的“老祖宗”了。它的思路很直接:先解旋转,再解平移。
第一步:解旋转
把 AX=XB 拆开,旋转部分写成:
R_A * R_X = R_X * R_B
Tsai 用了一个技巧:把旋转矩阵转成旋转轴-角度表示。然后构造一个线性方程组,用最小二乘法求解。
第二步:解平移
旋转解出来后,平移部分就变成了线性方程:
(R_A - I) * t_X = R_X * t_B - t_A
这里 I 是单位矩阵,t_A、t_B 是平移向量。
我在实际项目中用过 Tsai 法,感觉它最大的优点是:稳定。只要数据质量还行,结果基本靠谱。但缺点也很明显——对噪声敏感,尤其是旋转角度很小的时候。
注意:Tsai 法要求至少两组非平行的旋转轴。如果所有运动都是绕同一个轴转,那旋转部分就解不出来。我见过有人采集数据时只让机械臂做俯仰运动,结果标定失败——嗯,这就是典型的“数据多样性不足”。
4.4 经典求解方法:Park 法
Park 法是1994年提出的,比 Tsai 晚几年。它的核心思想是用 四元数 代替旋转矩阵。
为什么用四元数?因为四元数没有万向锁问题,而且插值更平滑。Park 把 AX=XB 的旋转部分写成四元数形式:
q_A * q_X = q_X * q_B
然后通过奇异值分解(SVD)来求解。具体步骤:
- 把每组 A、B 的旋转部分转成四元数
- 构造一个 4x4 的矩阵 M
- 对 M 做 SVD 分解,最小奇异值对应的右奇异向量就是 q_X
我个人更喜欢 Park 法。为什么?因为它在噪声较大的情况下,表现比 Tsai 法好。我在一个项目里对比过两种方法——同样的数据,Tsai 解出来的旋转误差是 0.8°,Park 只有 0.3°。
对比总结:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Tsai 法 | 实现简单,计算快 | 对噪声敏感,小角度时不稳定 | 数据质量高、运动幅度大 |
| Park 法 | 抗噪性好,数值稳定 | 实现稍复杂 | 噪声较大、运动范围受限 |
4.5 知识体系总览
下面这张图是我自己总结的手眼标定知识结构,你看一眼就能明白整个流程:
4.6 实际应用中的注意事项
讲完理论,说点实际的。我在多个项目里做过手眼标定,踩过不少坑,这里分享几个关键点:
- 数据采集顺序:先让机械臂回零位,再开始采集。我见过有人直接从任意位置开始,结果初始位姿记录错了,整个标定白做。
- 运动幅度:旋转角度最好在 30° 以上。角度太小,Tsai 法容易出问题。
- 标定板位置:放在雷达视野中央,不要偏到边缘。边缘畸变会影响 B 矩阵的精度。
- 验证方法:标定完后,让机械臂走一个已知路径,看雷达点云是否对齐。我习惯用这个做最终验证。
个人经验:我曾经在一个项目里,Tsai 和 Park 两种方法都试了,结果差了 2°。后来发现是标定板反光导致点云配准不准。换了哑光标定板后,两种方法的结果就一致了。所以有时候问题不在算法,在数据质量。
好了,手眼标定的核心内容就这些。说白了就是:建模成 AX=XB,然后用 Tsai 或 Park 去解。选哪个方法?看你的数据质量。数据好就用 Tsai,简单直接;数据噪声大就用 Park,稳一点。