不满意的 Hand-Eye Calibration(手眼标定)结果(多标记 ArUco 目标:平移良好,旋转为 NaN 或极端值)

问题

手眼标定结果不理想,并且您使用的是包含多个 ArUco 标记的自定义目标(例如十字形或网格布局)。结果呈现以下组合:

手眼变换

手眼残差

投影验证

触碰测试

合理

差(旋转:NaN 或极端值,>>1°)

未执行

未执行

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 标记中的数量。它并未改变每个位姿实际检测到的标记数量,这是下文所示的另一个真实的遮挡现象。

按使用的 ArUco 标记数量划分的旋转残差(同一个 13 位姿数据集,每行一次运行)

使用的标记数

旋转残差

平移残差

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 个标记。

../../_images/aruco-multi-marker-cross-target-marker-occluded.png

13 个已捕获位姿中的一个,此处仅检测到 4 个标记中的 3 个,原因是一个安装螺钉在该角度下物理阻挡了相机对标记 id 3 的视线,而不是因为标定中排除了某个标记 ID。

../../_images/aruco-multi-marker-cross-target-all-4-detected.png

另一个已捕获位姿,从安装螺钉未阻挡任何标记的角度观察,因此检测到全部 4 个标记。

关键识别模式: 使用带有多个 ArUco 标记的目标时,平移良好,而旋转较差(NaN 或极端值)。

潜在原因

基于 ArUco 的位姿估计与基于棋盘格的标定表现不同。棋盘格提供大量具有强冗余性的角点观测值。单个 ArUco 标记每个位姿只贡献一个点(其中心),因此每个位姿为旋转残差提供的几何信息要少得多。

  • 旋转残差要具有意义,需要比平移残差更多的点。 如果一个位姿中非共线的标记中心少于 3 个,旋转残差就没有定义,会报告为 NaN。如果有 3 个或更多,它仍可能主要受点噪声支配,而不是反映标定的实际质量,尤其是当所使用的标记彼此靠近或几乎排成一条线时。

  • 旋转残差所使用的点与标定本身所使用的并不相同。 它是标定完成后,根据数据集中的标记检测结果计算得出的一项诊断指标。它并不一定能看到标定所使用的每一个位姿或每一个标记。如果由于遮挡导致标记的可见性在各位姿之间发生变化,即使底层标定使用了所有可用信息,旋转残差也可能变得不可靠。

在实践中,这种模式已被追溯到两个可能同时出现的根本原因:

  1. 数据集中存在重复或近似重复的机器人位姿。 如果机器人在两次捕获之间几乎没有移动(或完全没有移动),那么这些位姿-图像对不会增加任何新的几何约束。但它们仍会被计为独立位姿。

  2. 安装硬件对一个或多个标记的部分遮挡。 螺钉、支架、夹具或线缆可能在特定观察角度下阻挡对特定标记的视线。这不一定会导致硬性失败。标定可能会在未察觉的情况下,仅使用每个位姿中检测到的标记继续进行,从而悄悄减少了实际得到完全约束的位姿数量。

潜在解决方案

  1. 逐个位姿检查数据集,而不要仅依赖汇总结果。对于每个位姿,记录检测到了哪些 ArUco 标记 ID,缺失了哪些。为此推荐使用 Hand-Eye GUI 工具,但任何能让您逐位姿查看检测结果的工作流程都可以。

  2. 检查是否存在重复或近似重复的机器人位姿。比较所有捕获中的机器人位姿值(不仅仅是图像)。

  3. 检查是否存在对任何标记的物理遮挡。查找可能在某些观察角度下阻挡对标记的视线,而在其他角度下不会的安装硬件(螺钉、支架、夹具、线缆)。这很容易被忽略,因为它可能不会引发硬性失败。

  4. 首先移除重复或近似重复的位姿,因为无论它们显示多少标记,都不会增加任何新的几何约束。仅有部分标记可见本身是正常且预期的情况,如 Zivid 标定对象 中所述,因此应保留有一个标记被遮挡的位姿,而不是将它们全部舍弃。作为一个经验法则,丢失 4 个标记中的 1 个仍剩余 3 个,这是旋转残差能够被定义所需的最小数量(参见上文"潜在原因")。只有在您专门排查较差或 NaN 的旋转残差问题,并且仍有足够的完全可见位姿可以舍弃时,才应进一步精简:在这种情况下,优先保留所有标记均可见的位姿,因为它们能为旋转残差提供最多的点。请确认您仍至少拥有 Hand-Eye GUI 所要求的最少 6 个位姿,并且理想情况下达到 10-20 个干净位姿。

  5. 如果您有可能低于所需的最少干净位姿数量,请捕获一个新的、更大的数据集,而不要重复使用一个勉强够用的数据集。

  6. 使用清理后的数据集重新进行手眼标定。

  7. 验证手眼标定结果(变换、残差、投影)。

  8. 运行触碰测试(如果手眼标定结果良好)。

../../_images/touching-test-result-aruco.jpg
重现该问题(多标记 ArUco 目标,平移良好,旋转较差)

设置

在 Zivid 2 M70 上尝试了一次 Eye-to-Hand 手眼标定,使用了安装在机器人法兰上的自定义 4 标记 ArUco 十字形目标,下文展示了全部 13 个已捕获位姿及各自的 ArUco 检测结果。

../../_images/aruco-multi-marker-full-dataset-13-poses.png

排除更常见原因的依据

在找到实际根本原因之前,以下各项已被检查并排除:

  • 标记尺寸与工作距离。 M70 具有足够的空间分辨率,可在 400 mm 处检测 25 mm 的标记。请参阅 最小标记尺寸指南,了解适用于您相机型号和工作距离的建议。

  • 标记布局共线性。 已通过使用 ArUco 检测器分析照片进行验证。4 个标记形成十字形图案而非直线,任意 3/4 子集仍能覆盖真实的二维面积。

  • 标记方向一致性。 全部四个标记均以一致的方向安装。

发现的根本原因

  1. 重复位姿:13 位姿数据集中有两对位姿完全相同(位姿 1 和 2,以及位姿 4 和 13)。

  2. 安装紧固件造成的标记遮挡:两个紧固件将 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 个位姿,已移除重复项)

../../_images/aruco-multi-marker-cleaned-dataset-7-poses.png

移除重复项后保留的 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,并记录哪些位姿编号缺少哪些标记。这样可以使遮挡模式变得可见,而不是将其隐藏在汇总结果中。

  • 每当旋转残差看起来存在异常时,都要检查是否存在重复或近似重复的机器人位姿。

  • 捕获的位姿数量应超过所需的最少数量,以便可以安全地舍弃任何存在问题的样本。

  • 不要仅依靠旋转残差来判断准确度。请通过投影验证或触碰测试确认结果,因为旋转残差仅反映各位姿之间彼此的一致程度。