机器人要抓取一个由相机看到的物体,必须先把相机坐标系里的位置变换到机械臂坐标系。这个变换就是手眼外参。它经常被当作一次性的“标定步骤”处理:跑一段程序,得到一组参数,写进配置,然后当作已知量使用。
问题在于,外参是一个带有误差和适用范围的估计值,不是一个精确常数。它的正确性依赖于采集时的构型、运动范围和标定板的可见性。如果只报告一个最终残差,就无法判断这组参数在真正的工作空间里是否可靠。
先区分两种安装方式
手眼标定有两种典型配置,它们约束的关系不同,容易在沟通中被混为一谈。
Eye-in-Hand:相机装在机械臂末端。随着机械臂运动,相机也在动。标定求解的是相机坐标系到末端法兰坐标系的关系。它适合近距离观察和随动抓取,但容易受末端线缆、遮挡和运动模糊影响。
Eye-to-Hand:相机固定在外部支架上。标定求解的是相机坐标系到机器人基座坐标系的关系。它视角稳定,但工作空间受视场限制,且标定时要保证机械臂本体不会挡住标定板。
两者都常被写成同一个 AX = XB 形式,但哪个量是已知、哪个量是待求不同。把两种配置的公式和参数混用,是标定结果看起来“差不多但抓不准”的常见原因之一。
约束从哪来
核心思路是:机械臂在两个位姿之间移动,相机对标定板的观测也随之变化。同一段物理运动,从机器人侧和从相机侧分别描述,应当互相一致。这个一致性就写成矩阵方程。
单个位姿差给不出完整解,因为旋转和平移的自由度耦合在一起。因此需要多组运动,且这些运动的旋转轴要尽量分散。如果所有采集位姿都围绕同一个轴小角度转动,关于其他方向的约束就很弱,求解结果会对噪声非常敏感。
采集时的几个具体建议:让标定板在多个位姿下都完整可见;覆盖工作空间内实际会用到的区域;避免极端姿态导致关节接近奇异;记录每组的机器人关节值与图像,便于事后复算而不是重新采集。
旋转和平移要分开处理
一个工程上反复出现的坑是:直接把旋转和平移塞进同一个最小二乘里。旋转量和长度量纲不同,旋转误差会主导残差,使平移部分被压缩到不合理的值。
常见做法是先由旋转部分求解旋转,再带回求解平移。历史上有多类解法在处理这个问题,不同解法对噪声的敏感度不同。无论用哪种实现,都建议保留中间量:如果旋转解本身就发散,后面的平移几乎不可能可靠。
求解完成后,至少要检查两件事:每组的重投影误差分布,以及外参在不同子集上的稳定性。把数据随机分成两组分别求解,如果得到的外参差异很大,说明采集构型不足或数据里有明显异常点。
用任务指标验证,而不只用方程残差
方程残差下降不等于任务可用。一个更贴近使用的检查方式是:用标定得到的外参,把相机检测到的目标位置变换到机器人坐标系,再与机器人实际到达位置比较。这个误差才和抓取或对接的成败直接相关。
可以用一个不依赖具体标定库的流程做验证:
1 | # 1. 记录验证点的关节值与对应图像 |
验证点应当分布在标定覆盖范围之内和边缘。如果只在标定中心附近验证,误差看起来会很小,但实际任务往往发生在工作空间边界。
失效条件必须写清楚
外参不是永久有效的。机械臂受到碰撞、末端工具更换、相机支架松动、镜头重新装调或温度变化明显时,外参都可能改变。工程上应记录标定时间、使用的构型集合、残差指标,以及触发重新标定的条件。
还要记录未验证的范围。只做过静态标定,不能推出运动中标定同样准确;只在一个工作子区域验证过,不能推广到整个工作空间;只用仿真和虚拟标定板,也不能替代真实相机与标定板的结果。
参考资料
- ROS 2 camera_calibration 包文档
- ROS 2 相机标定教程
- MoveIt 手眼标定教程
- ROS 2 TF2 概念:坐标系与变换
- Tsai-Lenz 手眼标定经典方法(IEEE)
证据边界
本文讨论标定的约束结构、求解注意事项与验证方式,不包含任何具体机器人、相机或标定板上的实测精度数据。文中给出的误差量和适用范围都需在实际系统上单独测量;仿真、虚拟标定板与静态采集不能替代真实任务中的验证结论。