4. 相机标定与手眼标定:相机内参外参、畸变校正、Eye-in-Hand与Eye-to-Hand标定方法及实操
在NVIDIA Jetson平台上构建AI视觉机器人抓取系统时,相机标定与手眼标定是连接“像素坐标”与“机器人世界坐标”的核心桥梁。若跳过或错误执行该环节,即便神经网络模型识别精度再高,机械臂末端也无法准确抓取目标。本章将系统讲解相机内参/外参的物理意义、畸变校正原理,并深入对比Eye-in-Hand与Eye-to-Hand两种手眼标定模式的适用场景、数学求解思路及在Jetson上的实操流程。
4.1 相机内参与外参:从像素到空间的数学映射
核心原理:相机标定的本质是求解一个从三维世界坐标到二维像素坐标的投影模型。该模型由内参(Intrinsic)和外参(Extrinsic)两部分组成。内参描述相机光学中心、焦距和像素传感器特性,其矩阵形式为:
K = [fx 0 cx
0 fy cy
0 0 1 ]
其中fx、fy为归一化焦距(单位:像素),cx、cy为主点坐标(通常接近图像中心)。外参则描述相机坐标系相对于世界坐标系的旋转矩阵R和平移向量T,即[R|t]矩阵。在机器人抓取场景中,世界坐标系通常定义在机械臂基座或标定板平面。
判断方法:判断标定质量的核心指标是重投影误差(Reprojection Error)。OpenCV的calibrateCamera()函数会返回每个角点的重投影误差,通常要求平均误差小于0.1像素。若误差过大,应检查标定板是否平整、图像是否清晰、采集角度是否覆盖全面。
| 参数类别 | 物理含义 | 典型值范围(以Jetson常用IMX219为例) | 标定方法 |
|---|---|---|---|
| fx, fy | 焦距(像素单位) | 500~1500 | 棋盘格/圆点格 |
| cx, cy | 主点坐标 | 图像中心附近 | 同上 |
| k1, k2, k3 | 径向畸变系数 | -0.5 ~ 0.5 | 同上 |
| p1, p2 | 切向畸变系数 | -0.05 ~ 0.05 | 同上 |
| R, T | 外参(相机→世界) | 取决于安装位置 | PnP求解 |
cv2.findChessboardCorners()时,建议使用7×10或9×6的棋盘格,并采集15~20张不同姿态的图像。图像应包含边缘、倾斜和旋转视角,避免所有图像都从正面拍摄。4.2 畸变校正:消除镜头非线性误差
核心原理:镜头畸变主要分为径向畸变(桶形/枕形)和切向畸变(由镜头与传感器不平行引起)。径向畸变数学模型为:
x_distorted = x(1 + k1*r² + k2*r⁴ + k3*r⁶)
y_distorted = y(1 + k1*r² + k2*r⁴ + k3*r⁶)
其中r为像素点到主点的距离。切向畸变则通过p1、p2修正。在Jetson上,畸变校正通常通过cv2.remap()实现,预先计算映射表可大幅提升实时性能。
操作流程:畸变校正的工程实现分为离线与在线两步。离线阶段,使用标定得到的相机矩阵和畸变系数,通过cv2.initUndistortRectifyMap()生成x和y方向的映射表;在线阶段,在Jetson的GPU上调用cv2.remap()对每帧图像进行校正。对于1080p图像,Jetson Nano上该操作耗时约3~5ms,完全满足实时抓取需求。
4.3 Eye-in-Hand与Eye-to-Hand标定方法对比
核心原理:手眼标定解决的是相机坐标系与机器人坐标系之间的变换关系。Eye-in-Hand(眼在手上)将相机安装在机械臂末端,随臂运动;Eye-to-Hand(眼在手外)将相机固定在工作空间上方或侧面。两种模式的数学求解均基于AX=XB方程,其中A为机械臂末端两次运动的齐次变换矩阵,B为相机观测到的标定板两次位姿变换,X为待求的手眼矩阵。
| 对比维度 | Eye-in-Hand | Eye-to-Hand |
|---|---|---|
| 相机安装位置 | 机械臂末端(gripper) | 固定于环境(基座/支架) |
| 标定板位置 | 固定于工作台 | 固定在机械臂末端 |
| 求解目标 | T_cam_to_gripper | T_cam_to_base |
| 优势 | 视野灵活,可近距离观察目标 | 视野稳定,无运动模糊 |
| 劣势 | 机械臂运动可能遮挡视野 | 存在固定盲区 |
| 适用场景 | 小型零件精密抓取 | 大范围分拣、码垛 |
判断方法:选择标定模式时,需评估目标物尺寸、机械臂工作半径和抓取精度要求。若目标物小于5cm且需要近距离识别,优先Eye-in-Hand;若工作范围大于1m且目标物尺寸较大,Eye-to-Hand更合适。在Jetson平台上,两种模式均可用OpenCV的cv2.calibrateHandEye()函数实现,该函数支持Tsai-Lenz、Park-Martin等经典算法。
4.4 Jetson实操:从标定到抓取坐标转换
操作流程:在Jetson上完成手眼标定的完整流程如下:
- 相机标定:采集15~20张棋盘格图像,运行
cv2.calibrateCamera()获取内参和畸变系数。 - 机器人位姿记录:控制机械臂运动到10~15个不同姿态,记录每个姿态下末端执行器的位姿(通常为4×4齐次矩阵)。
- 标定板位姿估计:在每个机械臂位姿下,使用
cv2.solvePnP()估计标定板相对于相机的位姿。 - 手眼标定求解:调用
cv2.calibrateHandEye(),输入机械臂位姿序列和标定板位姿序列,输出手眼矩阵X。 - 坐标链验证:将像素坐标通过内参逆变换到相机坐标,再经手眼矩阵变换到机械臂基座坐标,最后通过机械臂运动学转换到末端执行器坐标。
move_group接口自动记录位姿,并增加标定样本数至20组。重新标定后,抓取偏差降至2mm以内,满足装配精度要求。该案例表明,手眼标定的精度不仅取决于算法,更取决于输入数据的质量。总结复盘:本章从相机成像模型出发,详细阐述了内参、外参和畸变校正的数学原理与工程实现,并对比了Eye-in-Hand与Eye-to-Hand两种手眼标定模式的适用场景。在Jetson平台上,借助OpenCV的成熟函数库,标定流程可高度自动化。但需牢记:标定质量的上限由输入数据决定,而非算法本身。建议在每次抓取任务前,使用已知尺寸的标定物进行端到端精度验证,确保坐标变换链的每个环节都处于可靠状态。