不满意的 Hand-Eye Calibration(手眼标定)结果(多标记 ArUco 目标:平移良好,旋转为 NaN 或极端值)
问题
手眼标定结果不理想,并且您使用的是包含多个 ArUco 标记的自定义目标(例如十字形或网格布局)。结果呈现以下组合:
手眼变换 |
手眼残差 |
投影验证 |
触碰测试 |
|---|---|---|---|
合理 |
差(旋转: |
未执行 |
未执行 |
If you are using a multi-marker ArUco target and see good translation with a NaN or extreme rotation residual, check for duplicate poses and marker occlusion, then repeat the hand-eye calibration (see Potential Solution below).
手眼标定结果不佳的示例
手眼变换矩阵的平移部分看起来合理,但旋转部分则不然。
无论使用多少个标记,平移残差都很好,平均约为 0.3-0.5 mm。
当标定被限制为仅使用 4 个 ArUco 标记中的 1-2 个时,旋转残差为
NaN。当使用 3 个或全部 4 个标记时,旋转残差是有效值,但极端,范围约为 11° 至 177°,而不是该数据集清理后应产生的远低于 1° 的水平。
下表来自一项对照测试:使用同一个 13 位姿数据集,针对每个所示的标记数量(1 个,然后 2 个,然后 3 个,然后 4 个)重新运行一次标定。每一行都是单独一次运行,而不是重复运行。每次运行仅改变限制使用的 4 个 ArUco 标记中的数量。它并未改变每个位姿实际检测到的标记数量,这是下文所示的另一个真实的遮挡现象。
使用的标记数 |
旋转残差 |
平移残差 |
|---|---|---|
1 |
NaN(所有位姿)— 未定义,点数不足 |
0.24-0.82 mm |
2 |
NaN(所有位姿)— 未定义,点数不足 |
0.24-0.84 mm |
3 |
26°-177°(平均 114°)— 已定义,但仍然差 |
0.24-0.74 mm |
4(全部标记) |
11°-153°(平均 74°)— 已定义,但仍然差 |
0.21-0.76 mm |
要点: NaN 与极端值之间的差异纯粹取决于恰好有多少标记可用,而不是两个数据集之间的差异。即使使用全部 4 个标记,残差仍然保持极端,这才指向真正的原因:重复位姿和标记遮挡,详见下文。
与该实验无关,下面两张图像展示了为何在使用未修改的 13 位姿数据集(允许全部 4 个标记 ID)时,有时会检测到少于 4 个标记。
13 个已捕获位姿中的一个,此处仅检测到 4 个标记中的 3 个,原因是一个安装螺钉在该角度下物理阻挡了相机对标记 id 3 的视线,而不是因为标定中排除了某个标记 ID。
另一个已捕获位姿,从安装螺钉未阻挡任何标记的角度观察,因此检测到全部 4 个标记。
关键识别模式: 使用带有多个 ArUco 标记的目标时,平移良好,而旋转较差(NaN 或极端值)。
潜在原因
基于 ArUco 的位姿估计与基于棋盘格的标定表现不同。棋盘格提供大量具有强冗余性的角点观测值。单个 ArUco 标记每个位姿只贡献一个点(其中心),因此每个位姿为旋转残差提供的几何信息要少得多。
旋转残差要具有意义,需要比平移残差更多的点。 如果一个位姿中非共线的标记中心少于 3 个,旋转残差就没有定义,会报告为
NaN。如果有 3 个或更多,它仍可能主要受点噪声支配,而不是反映标定的实际质量,尤其是当所使用的标记彼此靠近或几乎排成一条线时。旋转残差所使用的点与标定本身所使用的并不相同。 它是标定完成后,根据数据集中的标记检测结果计算得出的一项诊断指标。它并不一定能看到标定所使用的每一个位姿或每一个标记。如果由于遮挡导致标记的可见性在各位姿之间发生变化,即使底层标定使用了所有可用信息,旋转残差也可能变得不可靠。
在实践中,这种模式已被追溯到两个可能同时出现的根本原因:
数据集中存在重复或近似重复的机器人位姿。 如果机器人在两次捕获之间几乎没有移动(或完全没有移动),那么这些位姿-图像对不会增加任何新的几何约束。但它们仍会被计为独立位姿。
安装硬件对一个或多个标记的部分遮挡。 螺钉、支架、夹具或线缆可能在特定观察角度下阻挡对特定标记的视线。这不一定会导致硬性失败。标定可能会在未察觉的情况下,仅使用每个位姿中检测到的标记继续进行,从而悄悄减少了实际得到完全约束的位姿数量。
潜在解决方案
逐个位姿检查数据集,而不要仅依赖汇总结果。对于每个位姿,记录检测到了哪些 ArUco 标记 ID,缺失了哪些。为此推荐使用 Hand-Eye GUI 工具,但任何能让您逐位姿查看检测结果的工作流程都可以。
检查是否存在重复或近似重复的机器人位姿。比较所有捕获中的机器人位姿值(不仅仅是图像)。
检查是否存在对任何标记的物理遮挡。查找可能在某些观察角度下阻挡对标记的视线,而在其他角度下不会的安装硬件(螺钉、支架、夹具、线缆)。这很容易被忽略,因为它可能不会引发硬性失败。
首先移除重复或近似重复的位姿,因为无论它们显示多少标记,都不会增加任何新的几何约束。仅有部分标记可见本身是正常且预期的情况,如 Zivid 标定对象 中所述,因此应保留有一个标记被遮挡的位姿,而不是将它们全部舍弃。作为一个经验法则,丢失 4 个标记中的 1 个仍剩余 3 个,这是旋转残差能够被定义所需的最小数量(参见上文"潜在原因")。只有在您专门排查较差或
NaN的旋转残差问题,并且仍有足够的完全可见位姿可以舍弃时,才应进一步精简:在这种情况下,优先保留所有标记均可见的位姿,因为它们能为旋转残差提供最多的点。请确认您仍至少拥有 Hand-Eye GUI 所要求的最少 6 个位姿,并且理想情况下达到 10-20 个干净位姿。如果您有可能低于所需的最少干净位姿数量,请捕获一个新的、更大的数据集,而不要重复使用一个勉强够用的数据集。
使用清理后的数据集重新进行手眼标定。
验证手眼标定结果(变换、残差、投影)。
运行触碰测试(如果手眼标定结果良好)。
重现该问题(多标记 ArUco 目标,平移良好,旋转较差)
设置
在 Zivid 2 M70 上尝试了一次 Eye-to-Hand 手眼标定,使用了安装在机器人法兰上的自定义 4 标记 ArUco 十字形目标,下文展示了全部 13 个已捕获位姿及各自的 ArUco 检测结果。
排除更常见原因的依据
在找到实际根本原因之前,以下各项已被检查并排除:
标记尺寸与工作距离。 M70 具有足够的空间分辨率,可在 400 mm 处检测 25 mm 的标记。请参阅 最小标记尺寸指南,了解适用于您相机型号和工作距离的建议。
标记布局共线性。 已通过使用 ArUco 检测器分析照片进行验证。4 个标记形成十字形图案而非直线,任意 3/4 子集仍能覆盖真实的二维面积。
标记方向一致性。 全部四个标记均以一致的方向安装。
发现的根本原因
重复位姿:13 位姿数据集中有两对位姿完全相同(位姿 1 和 2,以及位姿 4 和 13)。
安装紧固件造成的标记遮挡:两个紧固件将 ArUco 目标固定到机器人上,如上文 示例图像 所示。
根据观察角度不同,这些紧固件在 13 个位姿中的 7 个位姿里阻挡了 4 个标记中某一个的视线(始终保留 4 个标记中的 3 个可见,从未更少)。具体哪个标记被遮挡会随观察角度而变化。
13 个位姿中只有 6 个全部 4 个标记均可见,而这 6 个中的一个(位姿 13)又是另一个(位姿 4)的重复。这样一来,全部 4 个标记均可见的唯一位姿只剩 5 个,低于 Hand-Eye GUI 所要求的最少 6 个位姿。
不良数据集(13 个位姿,请求全部 4 个标记)
手眼变换矩阵看起来合理,并且与粗略手动测量的预期一致。
0.998 |
-0.001 |
0.056 |
558.764 |
-0.027 |
-0.891 |
0.454 |
-707.493 |
0.049 |
-0.454 |
-0.889 |
641.606 |
0 |
0 |
0 |
1 |
标定残差明显大于预期,尤其是旋转部分。
N(位姿数) |
旋转平均值(°) |
旋转最大值(°) |
平移平均值(mm) |
平移最大值(mm) |
|---|---|---|---|---|
13 |
74.16 |
153.43 |
0.455 |
0.755 |
完整残差
位姿 |
旋转 (°) |
平移 (mm) |
|---|---|---|
1 |
11.62 |
0.612 |
2 |
77.95 |
0.547 |
3 |
38.86 |
0.713 |
4 |
52.00 |
0.230 |
5 |
113.56 |
0.432 |
6 |
153.43 |
0.566 |
7 |
13.07 |
0.523 |
8 |
134.97 |
0.247 |
9 |
85.63 |
0.345 |
10 |
30.97 |
0.755 |
11 |
39.78 |
0.210 |
12 |
124.46 |
0.441 |
13 |
88.29 |
0.294 |
鉴于旋转残差如此极端,对该结果尝试触碰测试将是不安全的,因此未执行该测试。
清理后的数据集(7 个位姿,已移除重复项)
移除重复项后保留的 7 个位姿:5 个全部 4 个标记均可见的唯一位姿,加上另外 2 个无重复的位姿(其中一个仍仅检测到 4 个标记中的 3 个)。
手眼变换矩阵与上文不良数据集的结果非常接近。
0.998 |
0.001 |
0.056 |
558.773 |
-0.025 |
-0.891 |
0.453 |
-707.074 |
0.050 |
-0.453 |
-0.890 |
641.879 |
0 |
0 |
0 |
1 |
标定残差在可接受范围内,表明优化已一致收敛。
N(位姿数) |
旋转平均值(°) |
旋转最大值(°) |
平移平均值(mm) |
平移最大值(mm) |
|---|---|---|---|---|
7 |
0.274 |
0.408 |
0.314 |
0.673 |
完整残差
位姿 |
旋转 (°) |
平移 (mm) |
|---|---|---|
1 |
0.202 |
0.673 |
2 |
0.260 |
0.074 |
3 |
0.142 |
0.496 |
4 |
0.299 |
0.472 |
5 |
0.374 |
0.199 |
6 |
0.408 |
0.248 |
7 |
0.239 |
0.036 |
对于该数据集也未尝试进行触碰测试,因为该数据集是为验证残差数值而独立于原始案例重现的,而不是为了重复完整的验证流程。
比较
下表比较了手眼标定矩阵(平移值)与残差之间的结果。
数据集 |
X (mm) |
Y (mm) |
Z (mm) |
|---|---|---|---|
不良(13 个位姿) |
558.764 |
-707.493 |
641.606 |
清理后(7 个位姿) |
558.773 |
-707.074 |
641.879 |
Δ(清理后 - 不良) |
0.009 |
0.419 |
0.272 |
数据集 |
N |
旋转平均值(°) |
旋转最大值(°) |
平移平均值(mm) |
平移最大值(mm) |
|---|---|---|---|---|---|
不良(13 个位姿) |
13 |
74.16 |
153.43 |
0.455 |
0.755 |
清理后(7 个位姿) |
7 |
0.274 |
0.408 |
0.314 |
0.673 |
矩阵的平移部分及其残差在两个数据集之间几乎没有变化,而旋转残差则从极不稳定变为持续保持较低水平。
备注
旋转残差衡量的是各个位姿之间彼此的一致程度,而不是所得变换与真实手眼标定的接近程度。较大或为 NaN 的值是数据集中存在需要修复问题的可靠信号(如本案例所示),但较小的值本身并不能证明该变换是准确的,其具体大小也无法与具有不同标记布局的数据集相比较。在此,两个矩阵(清理前和清理后)仅相互进行了比较,并未与独立的真实值进行比较:鉴于 13 位姿结果的旋转残差如此极端,对其尝试触碰测试或投影验证将是不安全的,因此该矩阵没有可用的独立准确度检查。通过投影或触碰测试进行验证,仍是确认变换本身是否准确的方法。
长期计划是重新设计目标安装结构,以完全避免标记遮挡,并重新捕获一个包含 15 个以上干净位姿的更大数据集,这符合 10-20 个位姿 的一般建议。
自定义多标记 ArUco 目标设计建议
避免将安装硬件放置在可能从某些观察角度遮挡标记的位置。
将标记排列成真正的二维图案,例如十字形或网格,而不是单一直线。
根据 最小标记尺寸指南,针对您的相机型号和工作距离验证标记尺寸。
在数据采集过程中检查每个位姿的残差,而不要仅依赖最终的汇总结果。为此推荐使用 Hand-Eye GUI 工具。
跟踪每个位姿中检测到的 ArUco 标记 ID,并记录哪些位姿编号缺少哪些标记。这样可以使遮挡模式变得可见,而不是将其隐藏在汇总结果中。
每当旋转残差看起来存在异常时,都要检查是否存在重复或近似重复的机器人位姿。
捕获的位姿数量应超过所需的最少数量,以便可以安全地舍弃任何存在问题的样本。
不要仅依靠旋转残差来判断准确度。请通过投影验证或触碰测试确认结果,因为旋转残差仅反映各位姿之间彼此的一致程度。