手眼标定(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()函数,支持多种算法。
- 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)
手眼标定误差通常通过重投影误差或变换误差来评估,具体方法如下:
重投影误差计算 将标定板上的已知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°。实际误差需结合具体应用场景评估可接受范围。





