4、相机标定:内参标定、外参标定、手眼标定(Eye-in-Hand vs Eye-to-Hand)
相机标定,说白了就是给机器人的眼睛配一副「度数准确的眼镜」。你想想看,如果相机连自己看到的画面和真实世界之间的对应关系都搞不清楚,那机械臂抓东西肯定抓不准。我做了这么多年机器人,见过太多因为标定没做好,导致抓取失败的项目——嗯,这步真的不能省。
4.1 内参标定:搞清楚相机自己的「脾气」
内参标定,就是确定相机内部的光学参数。每个相机都有自己的小脾气——镜头畸变、焦距偏差、主点偏移等等。我习惯用张正友标定法,拿个棋盘格拍几张照片就能搞定。
内参矩阵长这样:
K = [fx 0 cx]
[ 0 fy cy]
[ 0 0 1]
其中:
- fx, fy:焦距参数(单位是像素)
- cx, cy:主点坐标(光轴与成像平面的交点)
畸变参数也很关键。我记得有一次项目,相机拍出来的图像边缘明显弯曲,机械臂抓取时总是偏几毫米。后来一查,是径向畸变没校正。常用的畸变模型包括:
- 径向畸变:k1, k2, k3(桶形或枕形畸变)
- 切向畸变:p1, p2(镜头与成像平面不平行导致)
4.2 外参标定:把相机放到世界坐标系里
内参搞定了,接下来要解决「相机在哪」的问题。外参标定就是确定相机坐标系相对于世界坐标系的旋转和平移关系。
外参矩阵包含:
- 旋转矩阵 R:3×3 矩阵,描述相机朝向
- 平移向量 t:3×1 向量,描述相机位置
世界坐标系下的点 Pw 转换到相机坐标系:
P_c = R * P_w + t
外参标定通常借助已知尺寸的标定板来完成。你想想看,标定板上的角点在世界坐标系中的坐标是已知的,相机拍到的像素坐标也是已知的,通过内参和外参的联合优化,就能解出 R 和 t。
4.3 手眼标定:让眼睛和手「对齐」
手眼标定,是机械臂视觉中最关键的一步。说白了,就是建立相机坐标系和机械臂末端坐标系之间的变换关系。根据相机安装位置不同,分两种方式:
4.3.1 Eye-in-Hand(眼在手上)
相机固定在机械臂末端,跟着机械臂一起动。这种方式的好处是视野灵活,可以近距离观察目标。但问题是——每次机械臂移动,相机看到的画面都在变。
标定公式:
camTgripper * gripperTbase = camTbase
其中:
- camTgripper:相机到机械臂末端的变换(就是我们要标定的)
- gripperTbase:机械臂末端到基座的变换(从机器人控制器读取)
- camTbase:相机到标定板的变换(通过相机拍摄计算)
实际操作时,我习惯让机械臂走多个不同的姿态,每个姿态下记录机械臂位姿和相机拍摄的标定板位姿,然后解 AX = XB 方程。
4.3.2 Eye-to-Hand(眼在手外)
相机固定在外部支架上,不随机械臂移动。这种方式视野固定,适合大范围场景。但标定逻辑刚好反过来——我们需要知道相机到机械臂基座的变换关系。
标定公式:
baseTgripper * gripperTcam = baseTcam
这里 gripperTcam 是我们要标定的,它表示相机在机械臂末端坐标系下的位姿。注意,这个值是固定的,因为相机不动。
两种方式的对比:
| 特性 | Eye-in-Hand | Eye-to-Hand |
|---|---|---|
| 视野范围 | 灵活,可近距离观察 | 固定,适合大范围 |
| 标定复杂度 | 较高,需多姿态 | 相对简单 |
| 精度影响因素 | 机械臂运动误差 | 相机安装稳定性 |
| 典型应用 | 精密装配、小件抓取 | 码垛、大范围分拣 |
4.4 手眼标定的核心流程
下面这张图展示了整个标定的知识体系:
4.5 标定精度验证
标定完了,怎么知道准不准?我一般用重投影误差来评估。说白了,就是把标定板上的3D点通过标定参数投影到图像上,看看和实际检测到的像素点差多少。
重投影误差公式:
error = ||p_detected - p_projected||
经验值:
- 内参标定:重投影误差 < 0.5 像素算合格
- 外参标定:平移误差 < 1mm,旋转误差 < 0.5°
- 手眼标定:末端定位误差 < 2mm(取决于机械臂精度)
嗯,相机标定这块内容确实不少,但每一步都马虎不得。内参是基础,外参是桥梁,手眼标定是最终落地的关键。我见过太多项目因为标定精度不够,导致后续的抓取、装配全白费功夫。所以,花时间把标定做好,后面会省心很多。
可可精品资料库