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(镜头与成像平面不平行导致)
我的经验:标定时棋盘格要占画面不同区域,别老放中间。我一般拍15-20张,覆盖画面四个角和中心区域,这样畸变参数才准。

4.2 外参标定:把相机放到世界坐标系里

内参搞定了,接下来要解决「相机在哪」的问题。外参标定就是确定相机坐标系相对于世界坐标系的旋转和平移关系。

外参矩阵包含:

  • 旋转矩阵 R:3×3 矩阵,描述相机朝向
  • 平移向量 t:3×1 向量,描述相机位置

世界坐标系下的点 Pw 转换到相机坐标系:

P_c = R * P_w + t

外参标定通常借助已知尺寸的标定板来完成。你想想看,标定板上的角点在世界坐标系中的坐标是已知的,相机拍到的像素坐标也是已知的,通过内参和外参的联合优化,就能解出 R 和 t。

注意:外参标定对光照和标定板平整度很敏感。我曾经在光线不均匀的车间里标定,结果 R 矩阵偏差了5度,抓取时直接撞到工件——从那以后我标定前都会先检查环境光。

4.3 手眼标定:让眼睛和手「对齐」

手眼标定,是机械臂视觉中最关键的一步。说白了,就是建立相机坐标系和机械臂末端坐标系之间的变换关系。根据相机安装位置不同,分两种方式:

4.3.1 Eye-in-Hand(眼在手上)

相机固定在机械臂末端,跟着机械臂一起动。这种方式的好处是视野灵活,可以近距离观察目标。但问题是——每次机械臂移动,相机看到的画面都在变。

标定公式:

camTgripper * gripperTbase = camTbase

其中:

  • camTgripper:相机到机械臂末端的变换(就是我们要标定的)
  • gripperTbase:机械臂末端到基座的变换(从机器人控制器读取)
  • camTbase:相机到标定板的变换(通过相机拍摄计算)

实际操作时,我习惯让机械臂走多个不同的姿态,每个姿态下记录机械臂位姿和相机拍摄的标定板位姿,然后解 AX = XB 方程。

避坑指南:我曾经让机械臂只走平移,结果方程解不出来。后来才意识到——手眼标定需要足够的旋转变化,光平移不行。建议至少走10个不同姿态,旋转角度差异要大一些。

4.3.2 Eye-to-Hand(眼在手外)

相机固定在外部支架上,不随机械臂移动。这种方式视野固定,适合大范围场景。但标定逻辑刚好反过来——我们需要知道相机到机械臂基座的变换关系。

标定公式:

baseTgripper * gripperTcam = baseTcam

这里 gripperTcam 是我们要标定的,它表示相机在机械臂末端坐标系下的位姿。注意,这个值是固定的,因为相机不动。

两种方式的对比:

特性 Eye-in-Hand Eye-to-Hand
视野范围 灵活,可近距离观察 固定,适合大范围
标定复杂度 较高,需多姿态 相对简单
精度影响因素 机械臂运动误差 相机安装稳定性
典型应用 精密装配、小件抓取 码垛、大范围分拣

4.4 手眼标定的核心流程

下面这张图展示了整个标定的知识体系:

相机标定知识体系 内参标定 焦距 fx, fy 主点 cx, cy 径向畸变 k1,k2,k3 切向畸变 p1,p2 方法:张正友标定法 外参标定 旋转矩阵 R 平移向量 t 相机→世界坐标 PnP 求解 方法:标定板+优化 手眼标定 Eye-in-Hand Eye-to-Hand AX = XB 求解 多姿态采集 方法:Tsai/Shiu方法 标定流程:采集图像 → 角点检测 → 参数优化 → 精度验证 常见问题与避坑 • 标定板不平整 → 误差大 • 姿态变化不够 → 解不稳定 • 光照不均匀 → 角点检测失败 • 忽略畸变校正 → 抓取偏差

4.5 标定精度验证

标定完了,怎么知道准不准?我一般用重投影误差来评估。说白了,就是把标定板上的3D点通过标定参数投影到图像上,看看和实际检测到的像素点差多少。

重投影误差公式:

error = ||p_detected - p_projected||

经验值:

  • 内参标定:重投影误差 < 0.5 像素算合格
  • 外参标定:平移误差 < 1mm,旋转误差 < 0.5°
  • 手眼标定:末端定位误差 < 2mm(取决于机械臂精度)
我的习惯:标定完成后,我会拿一个已知尺寸的工件,让机械臂去抓取几次。如果每次都能准确抓取,说明标定没问题。如果偏差超过预期,我会重新检查标定数据,特别是看看有没有异常姿态点。

嗯,相机标定这块内容确实不少,但每一步都马虎不得。内参是基础,外参是桥梁,手眼标定是最终落地的关键。我见过太多项目因为标定精度不够,导致后续的抓取、装配全白费功夫。所以,花时间把标定做好,后面会省心很多。

可可精品资料库