手眼标定的基本概念

手眼标定(Eye-to-Hand或Eye-in-Hand Calibration)是机器人视觉系统中的关键技术,用于确定相机坐标系与机器人坐标系之间的转换关系。根据相机安装位置不同,分为两种模式:

  • Eye-to-Hand:相机固定在机器人外部,观察机器人末端执行器。
  • Eye-in-Hand:相机安装在机器人末端,随机器人移动。

标定原理

核心问题是求解方程:

AX = XB

其中:

2. 求解手眼矩阵

常用方法包括:

3. 验证与优化

实现工具

  • ( A ) 为机器人末端执行器的运动变换矩阵(基坐标系到末端坐标系)。
  • ( B ) 为相机观察到的目标运动变换矩阵(相机坐标系到目标坐标系)。
  • ( X ) 为待求的手眼变换矩阵(相机坐标系到机器人基坐标系的转换)。

标定步骤

1. 数据采集

  • 控制机器人末端执行器移动多个不同姿态(至少3个非共面姿态)。

  • 在每个姿态下,通过相机捕获标定板(如棋盘格)图像,记录机器人末端位姿和相机检测到的标定板位姿。

  • Tsai-Lenz算法:基于旋转和平移分离求解,适用于Eye-to-Hand和Eye-in-Hand。

  • Kronecker积法:将方程转化为线性方程组求解。

  • 四元数法:通过四元数表示旋转,优化计算效率。

  • 使用标定结果反投影机器人末端位姿到图像坐标系,检查误差。

  • 通过非线性优化(如Levenberg-Marquardt算法)进一步减小重投影误差。

  • OpenCV :提供cv2.calibrateHandEye()函数,支持多种算法。

cs 复制代码
import cv2
R_target2cam, t_target2cam = ...  # 标定板到相机的旋转和平移
R_base2gripper, t_base2gripper = ...  # 机器人基座到末端的旋转和平移
R_cam2base, t_cam2base = cv2.calibrateHandEye(
    R_gripper2base=R_base2gripper, t_gripper2base=t_base2gripper,
    R_target2cam=R_target2cam, t_target2cam=t_target2cam,
    method=cv2.CALIB_HAND_EYE_TSAI
)

手眼标定误差计算方法

手眼标定误差通常通过重投影误差或变换误差来评估,具体方法如下:

重投影误差计算 将标定板上的已知3D点通过手眼变换矩阵投影到相机坐标系,再与检测到的2D点比较误差。公式为: e_{reproj} = \\frac{1}{N} \\sum_{i=1}\^{N} \| p_i - K \\cdot (R \\cdot P_i + t) \| 其中 ( p_i ) 为检测到的2D点,( P_i ) 为3D点,( K ) 为相机内参,( R ) 和 ( t ) 为手眼变换的外参。

变换误差计算 对于多组手眼数据,计算变换矩阵的稳定性。常用李代数误差: e_{Lie} = \| \\log(T_{estimated} \\cdot T_{groundtruth}\^{-1}) \| 其中 ( T ) 为4×4变换矩阵,( \log ) 将矩阵映射到李代数空间。

误差评估指标

平均绝对误差(MAE) MAE = \\frac{1}{n} \\sum_{i=1}\^{n} \|e_i\|

均方根误差(RMSE) RMSE = \\sqrt{\\frac{1}{n} \\sum_{i=1}\^{n} e_i\^2}

最大误差 记录所有误差中的最大值,反映最坏情况。

实现代码示例(Python)

cs 复制代码
手眼标定误差通常通过重投影误差或变换误差来评估,具体方法如下:

重投影误差计算 将标定板上的已知3D点通过手眼变换矩阵投影到相机坐标系,再与检测到的2D点比较误差。公式为: [ e_{reproj} = \frac{1}{N} \sum_{i=1}^{N} | p_i - K \cdot (R \cdot P_i + t) | ] 其中 ( p_i ) 为检测到的2D点,( P_i ) 为3D点,( K ) 为相机内参,( R ) 和 ( t ) 为手眼变换的外参。

变换误差计算 对于多组手眼数据,计算变换矩阵的稳定性。常用李代数误差: [ e_{Lie} = | \log(T_{estimated} \cdot T_{groundtruth}^{-1}) | ] 其中 ( T ) 为4×4变换矩阵,( \log ) 将矩阵映射到李代数空间。

误差评估指标
平均绝对误差(MAE) [ MAE = \frac{1}{n} \sum_{i=1}^{n} |e_i| ]

均方根误差(RMSE) [ RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} e_i^2} ]

最大误差 记录所有误差中的最大值,反映最坏情况。

实现代码示例(Python)

误差优化建议

  • 增加标定数据量,覆盖机械臂不同位姿
  • 使用高精度标定板和检测算法
  • 采用非线性优化方法(如Levenberg-Marquardt)迭代优化
  • 检查机械臂运动学参数是否准确

典型工业应用要求平移误差小于1mm,旋转误差小于0.1°。实际误差需结合具体应用场景评估可接受范围。