1. 误差来源分析

大家好,我是你们的老朋友。咱们这门课叫《手眼标定的误差补偿》,开篇第一件事,我得先带你把“敌人”看清楚——到底哪些误差在捣乱?

你想想看,手眼标定说白了就是求一个变换矩阵,把相机看到的东西告诉机器人手爪。但实际做下来,你会发现标定结果总差那么一点点。为什么?

我做了这么多年机器人,踩过的坑不少。今天就把最常见的四个误差来源,一个一个掰开揉碎了讲给你听。

核心观点:误差不是单一来源,而是多个环节的“叠加效应”。你忽略任何一个,最终精度都会打折扣。

手眼标定误差来源全景图 手眼标定总误差 标定板角点检测误差 亚像素定位不准 机器人运动学参数误差 DH参数/连杆变形 相机内参标定残差 畸变/焦距误差 数据采集噪声 光照/抖动/量化 这四类误差相互耦合,单独补偿某一项往往效果有限,需要系统级处理

1.1 标定板角点检测误差

这是最直观的误差源。你拍一张棋盘格照片,程序去找角点,但像素坐标真的准吗?

我习惯用OpenCV的 findChessboardCorners,它返回的是亚像素级坐标。但实际项目中,我遇到过几次“看起来对,实际偏了0.3个像素”的情况。为什么会这样?

  • 光照不均匀:棋盘格一半亮一半暗,角点会往亮区偏移。
  • 镜头畸变:边缘区域的角点,畸变校正不彻底,位置就偏了。
  • 标定板不平整:纸板贴在玻璃上,有气泡或褶皱,角点物理位置就不对。

我的经验:标定板最好用陶瓷或玻璃基板,厚度3mm以上。别省这个钱,纸板标定板在温度变化时变形很厉害。

角点检测误差会直接传递到后续的PnP求解中。你想想看,一个像素偏差,在远距离时可能对应几毫米的空间误差。所以,这一步必须较真。

1.2 机器人运动学参数误差

这个坑,我当年在汽车产线上栽过。机器人告诉你它末端在(100, 200, 300),但实际位置可能差了1-2mm。

为什么?因为机器人运动学模型是理想化的。实际中存在:

误差类型 典型量级 影响
DH参数偏差 0.1~0.5 mm 连杆长度/角度不准确
关节零点偏移 0.01~0.05° 末端位置漂移
连杆柔性变形 0.2~1.0 mm 负载不同时变形不同
齿轮回差 0.005~0.02° 正反向运动不一致

说白了,机器人读到的关节角度和实际角度之间,存在一个“系统偏差”。这个偏差在标定过程中会被“吸收”到手眼矩阵里,导致你标出来的结果不准。

注意:如果你用同一台机器人做标定和后续作业,运动学误差会被部分抵消。但如果你把标定结果移植到另一台机器人上,精度会急剧下降。我吃过这个亏。

1.3 相机内参标定残差

相机内参标定,大家都会做。但你真的检查过重投影误差吗?

我记得有一次,我用张正友标定法,重投影误差0.15像素,觉得挺好了。结果手眼标定完,实际抓取偏差0.8mm。查来查去,发现是相机内参的畸变参数在图像边缘区域误差较大。

内参残差主要来自:

  • 畸变模型不匹配:普通径向切向模型,对广角镜头或鱼眼镜头不够用。
  • 标定图像数量不足:少于15张,或者姿态变化不够大,内参解不稳定。
  • 标定板平面度:和角点检测一样,内参标定也依赖标定板精度。

我建议你标定完内参后,一定要做一件事:可视化重投影误差分布图。如果误差在图像中心小、边缘大,说明畸变模型没拟合好。

关键指标:内参标定的重投影误差应控制在0.1像素以内。超过0.2像素,手眼标定结果基本不可靠。

1.4 数据采集噪声

这个最容易被忽略。你辛辛苦苦拍了20组数据,结果一半是“脏数据”。

数据采集噪声包括:

  1. 图像噪声:传感器热噪声、暗电流,在低光照下尤其明显。
  2. 机器人抖动:停止后未完全稳定就采集,末端有微振动。
  3. 量化误差:图像分辨率有限,角点坐标是整数像素的近似。
  4. 时间不同步:相机触发和机器人读取位姿的时刻不一致。

我曾经在一个项目中,发现标定结果每天都不一样。排查到最后,是相机和机器人之间的触发信号有20ms的延迟。机器人已经到位了,相机还没拍,拍到的其实是运动中的图像。

避坑指南:采集数据时,让机器人运动到目标位姿后,等待500ms再触发相机。同时,多采集几组数据,用RANSAC或LMedS方法剔除异常值。

小结:误差的“叠加效应”

这四类误差不是孤立的。它们会相互放大:

  • 角点检测误差 → 影响PnP求解 → 得到错误的相机位姿
  • 运动学误差 → 机器人位姿不准 → 手眼方程两边都不对
  • 内参残差 → 空间点投影偏差 → 标定结果系统性偏移
  • 数据噪声 → 随机扰动 → 标定结果方差大

所以,后面几章我们会针对每一类误差,讲具体的补偿方法。但今天你先把这些“敌人”认清楚。知己知彼,才能百战不殆。

嗯,这一章就到这里。记住,误差分析是标定的第一步,也是最关键的一步。你花多少时间在分析上,后面就省多少时间在调试上。