4. 眼在手外(Eye-to-Hand)标定实战:固定相机安装要求、标定步骤、奇异值分解(SVD)求解、重投影误差分析

眼在手外标定,说白了就是把相机固定在场景中某个位置,让它看着机器人干活。我最早接触这个配置时,总觉得比眼在手上简单——相机不动嘛,少了很多运动学耦合。但实际做下来才发现,安装位置选不好,后面标定精度直接崩掉。

这一章我们聚焦四个核心问题:相机怎么装、标定流程怎么走、SVD怎么解、误差怎么看。每个点我都会结合项目里的真实踩坑经历来讲。

4.1 固定相机的安装要求

相机装在哪,不是随便找个架子一放就完事。我见过太多人把相机装在机器人正上方,结果标定完一抓取,末端稍微偏一点就出视野。嗯,这里有几个硬性要求,你最好记下来。

要求项 具体说明 我踩过的坑
视野覆盖 相机视野必须覆盖整个抓取工作区,且留出20%余量 有一次视野刚好卡边界,机器人一运动标定板就出框,重拍了十几次
安装刚性 支架必须刚性固定,不能有振动或松动 用铝型材搭的架子,工人碰了一下,重投影误差从0.3飙到2.1像素
光照稳定 避免环境光剧烈变化,最好加遮光罩或补光灯 车间窗户下午西晒,标定板反光导致角点检测全偏
标定板可达 机器人末端必须能带着标定板到达视野内多个位姿 相机装太低,机器人姿态受限,标定结果奇异性严重
⚠️ 特别注意: 安装完成后,用记号笔在支架和地面做标记。一旦被移动,必须重新标定。我曾经因为清洁工挪了支架没告诉我,浪费了整整一个下午排查误差来源。

4.2 标定步骤:从数据采集到矩阵求解

眼在手外标定的核心方程是:

𝐓camerabase · 𝐓boardcamera = 𝐓flangebase · 𝐓boardflange

说白了,就是相机坐标系下的标定板位姿,和机器人基坐标系下的法兰盘位姿,通过一个固定变换关联起来。我们要求的就是 𝐓camerabase。

具体步骤我分成五步走:

  1. 准备标定板——棋盘格或圆点阵,尺寸要精确测量。我习惯用7×9棋盘格,角点多,鲁棒性好。
  2. 采集多组位姿——让机器人带着标定板在视野内移动,至少拍15-20组。注意:姿态要分散,不要全在一个平面。
  3. 提取角点——用OpenCV的findChessboardCorners,亚像素细化。
  4. 计算标定板位姿——用PnP求解每张图的𝐓boardcamera。
  5. 求解手眼矩阵——用SVD分解求解𝐀𝐗 = 𝐗𝐁形式的方程。
💡 我的习惯: 采集时让机器人末端在视野的四个角落和中心各拍几组,再做一些绕X/Y/Z轴的旋转。这样能保证旋转分量充分激励,避免退化配置。

4.3 奇异值分解(SVD)求解

眼在手外标定最终归结为求解 𝐀𝐗 = 𝐗𝐁 形式的矩阵方程。这里 𝐀 是机器人末端位姿变换,𝐁 是标定板位姿变换,𝐗 就是我们要求的 𝐓camerabase。

求解分两步:先解旋转,再解平移。

旋转部分:

对每组数据构造 𝐑A · 𝐑X = 𝐑X · 𝐑B,整理后得到:

𝐑A · 𝐑X - 𝐑X · 𝐑B = 0
→ (𝐑A ⊗ 𝐈 - 𝐈 ⊗ 𝐑BT) · vec(𝐑X) = 0

然后对系数矩阵做SVD:

[U, S, V] = svd(M);
R_X = reshape(V(:, end), 3, 3);
// 确保行列式为+1(旋转矩阵性质)
if det(R_X) < 0
    R_X = -R_X;
end

平移部分:

旋转解出来后,平移就简单了:

(𝐑A - 𝐈) · 𝐭X = 𝐑X · 𝐭B - 𝐭A
→ 用最小二乘求解超定方程组
🔑 关键点: SVD解出来的旋转矩阵可能不严格正交,需要用 R = U * V' 投影到SO(3)流形上。我早期没做这步,结果平移误差直接翻倍。

4.4 重投影误差分析

标定完不能直接拿去用,你得先验证精度。我最常用的指标就是重投影误差。

做法很简单:用标定结果把标定板角点从3D投影到2D图像,然后算投影点和实际检测点之间的像素距离。

// 伪代码
for each pose i:
    // 标定板角点在标定板坐标系下的3D坐标
    P_board = [X, Y, 0, 1]'
    
    // 转换到相机坐标系
    P_cam = inv(T_camera_base) * T_flange_base * T_board_flange * P_board
    
    // 投影到图像
    p_proj = K * [R_cam | t_cam] * P_cam
    
    // 计算误差
    error = norm(p_proj - p_detected)

我一般看两个指标:

  • 平均重投影误差:小于0.5像素算优秀,0.5-1.0像素可接受,超过1.5像素就要排查问题了。
  • 最大重投影误差:如果某个位姿的误差特别大,往往是那个位姿的角点检测有问题,或者机器人运动学参数有偏差。
⚠️ 避坑指南: 我曾经遇到平均误差0.3像素但实际抓取偏差很大的情况。后来发现是标定板平面度有问题——便宜的亚克力板在中间区域有0.5mm的变形。所以,标定板本身的质量也很关键。

4.5 本章知识结构

下面这张图把眼在手外标定的核心逻辑串起来了。你可以把它当作操作检查清单:

眼在手外标定知识结构图 安装要求 视野覆盖 + 20%余量 刚性固定 + 光照稳定 标定板可达多姿态 标定步骤 ① 准备标定板 ② 采集15-20组位姿 ③ 提取角点 → PnP SVD求解 先解旋转:SVD(M) 再解平移:最小二乘 投影到SO(3)流形 重投影误差分析 3D角点 → 投影到2D 平均误差 < 0.5px 优秀 最大误差排查异常位姿 常见问题 标定板平面度不足 机器人运动学偏差 光照变化导致角点偏移 验证闭环 重投影误差合格? → 是:投入使用 → 否:返回检查安装/数据 💡 核心逻辑:安装决定数据质量 → SVD求解精度 → 重投影验证闭环 任何一个环节出问题,最终抓取精度都会崩

4.6 实战建议总结

最后给你几个我反复验证过的建议:

  • 数据质量比算法重要——20组高质量数据用简单SVD解出来的结果,比10组噪声数据用各种优化算法解出来的强得多。
  • 标定板别省钱——陶瓷或玻璃基底的标定板,平面度能到0.01mm,亚克力板可能到0.5mm。对于高精度抓取,这个差距是致命的。
  • 每次标定完做一次验证——让机器人末端走几个已知位姿,看相机检测到的位置和实际位置偏差多少。这个偏差就是你的系统精度上限。
  • 记录标定日志——我习惯把每次标定的重投影误差、采集位姿数量、标定板型号都记下来。出问题时翻日志,往往能快速定位原因。

眼在手外标定,说白了就是让相机和机器人「对齐坐标系」。安装扎实、数据充分、SVD解对、误差验证,这四个环节走通了,你的抓取系统就有了一个可靠的起点。