4. 眼在手外(Eye-to-Hand)标定实战:固定相机安装要求、标定步骤、奇异值分解(SVD)求解、重投影误差分析
眼在手外标定,说白了就是把相机固定在场景中某个位置,让它看着机器人干活。我最早接触这个配置时,总觉得比眼在手上简单——相机不动嘛,少了很多运动学耦合。但实际做下来才发现,安装位置选不好,后面标定精度直接崩掉。
这一章我们聚焦四个核心问题:相机怎么装、标定流程怎么走、SVD怎么解、误差怎么看。每个点我都会结合项目里的真实踩坑经历来讲。
4.1 固定相机的安装要求
相机装在哪,不是随便找个架子一放就完事。我见过太多人把相机装在机器人正上方,结果标定完一抓取,末端稍微偏一点就出视野。嗯,这里有几个硬性要求,你最好记下来。
| 要求项 | 具体说明 | 我踩过的坑 |
|---|---|---|
| 视野覆盖 | 相机视野必须覆盖整个抓取工作区,且留出20%余量 | 有一次视野刚好卡边界,机器人一运动标定板就出框,重拍了十几次 |
| 安装刚性 | 支架必须刚性固定,不能有振动或松动 | 用铝型材搭的架子,工人碰了一下,重投影误差从0.3飙到2.1像素 |
| 光照稳定 | 避免环境光剧烈变化,最好加遮光罩或补光灯 | 车间窗户下午西晒,标定板反光导致角点检测全偏 |
| 标定板可达 | 机器人末端必须能带着标定板到达视野内多个位姿 | 相机装太低,机器人姿态受限,标定结果奇异性严重 |
4.2 标定步骤:从数据采集到矩阵求解
眼在手外标定的核心方程是:
𝐓camerabase · 𝐓boardcamera = 𝐓flangebase · 𝐓boardflange
说白了,就是相机坐标系下的标定板位姿,和机器人基坐标系下的法兰盘位姿,通过一个固定变换关联起来。我们要求的就是 𝐓camerabase。
具体步骤我分成五步走:
- 准备标定板——棋盘格或圆点阵,尺寸要精确测量。我习惯用7×9棋盘格,角点多,鲁棒性好。
- 采集多组位姿——让机器人带着标定板在视野内移动,至少拍15-20组。注意:姿态要分散,不要全在一个平面。
- 提取角点——用OpenCV的
findChessboardCorners,亚像素细化。 - 计算标定板位姿——用PnP求解每张图的
𝐓boardcamera。 - 求解手眼矩阵——用SVD分解求解
𝐀𝐗 = 𝐗𝐁形式的方程。
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
→ 用最小二乘求解超定方程组
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像素就要排查问题了。
- 最大重投影误差:如果某个位姿的误差特别大,往往是那个位姿的角点检测有问题,或者机器人运动学参数有偏差。
4.5 本章知识结构
下面这张图把眼在手外标定的核心逻辑串起来了。你可以把它当作操作检查清单:
4.6 实战建议总结
最后给你几个我反复验证过的建议:
- 数据质量比算法重要——20组高质量数据用简单SVD解出来的结果,比10组噪声数据用各种优化算法解出来的强得多。
- 标定板别省钱——陶瓷或玻璃基底的标定板,平面度能到0.01mm,亚克力板可能到0.5mm。对于高精度抓取,这个差距是致命的。
- 每次标定完做一次验证——让机器人末端走几个已知位姿,看相机检测到的位置和实际位置偏差多少。这个偏差就是你的系统精度上限。
- 记录标定日志——我习惯把每次标定的重投影误差、采集位姿数量、标定板型号都记下来。出问题时翻日志,往往能快速定位原因。
眼在手外标定,说白了就是让相机和机器人「对齐坐标系」。安装扎实、数据充分、SVD解对、误差验证,这四个环节走通了,你的抓取系统就有了一个可靠的起点。