本文最后更新于:2025年5月13日 晚上

本文记录 Opencv 中的手眼标定方法 calibrateHandEye。

简介

眼在手外的手眼标定, 通过固定相机和机械臂基坐, 用相机拍摄机械臂末端, 末端粘贴标定板, 此时记录机械臂夹爪位姿, 相机通过 PnP 解算出标定板位姿, 利用标定板与夹爪之间的转换矩阵是常量来建立约束, 求解相机与基坐之间的位姿关系.

关键公式与标定原理

手眼标定的核心是求解以下方程:
$$
\begin{align}
% 手眼标定核心方程 (变换矩阵形式)
T_{\text{gripper}\to\text{base}}^{(i)} \cdot T_{\text{cam}\to\text{base}}
&= T_{\text{cam}\to\text{base}} \cdot T_{\text{target}\to\text{cam}}^{(i)}
\label{eq:handeye_main}
\end{align}
$$
展开为旋转和平移分量

  1. 旋转分量方程

    $$ \mathbf{R}_{\text{gripper}\to\text{base}}^{(i)} \cdot \mathbf{R}_{\text{cam}\to\text{base}} = \mathbf{R}_{\text{cam}\to\text{base}} \cdot \mathbf{R}_{\text{target}\to\text{cam}}^{(i)} $$
  2. 平移分量方程

    $$ \mathbf{R}_{\text{gripper}\to\text{base}}^{(i)} \cdot \mathbf{t}_{\text{cam}\to\text{base}} + \mathbf{t}_{\text{gripper}\to\text{base}}^{(i)} = \mathbf{R}_{\text{cam}\to\text{base}} \cdot \mathbf{t}_{\text{target}\to\text{cam}}^{(i)} + \mathbf{t}_{\text{cam}\to\text{base}} $$

calibrateHandEye

1
R_cam2gripper, t_cam2gripper = cv.calibrateHandEye(R_gripper2base, t_gripper2base, R_target2cam,t_target2cam, method) 

在 OpenCV 的手眼标定(Hand-Eye Calibration)中,cv2.calibrateHandEye 的核心目标是‌求解相机坐标系(Cam)与机械臂基座坐标系(Base)之间的刚体变换关系‌,即求解以下变换矩阵:

$$ T_{\text{cam}\to\text{base}}=[\begin{matrix}R_{\text{cam}\to\text{base}}&&t_{\text{cam}\to\text{base}}\\0&&1\end{matrix}] $$

‌**$R_{cam\to base}$**‌ 表示从相机坐标系(Cam)到基座坐标系(Base)的旋转变换.

若一个点在相机坐标系下的坐标为 $P_{cam}$,则该点在基座坐标系下的坐标为:
$$
P_{\mathrm{base}}=R_{\mathrm{cam}\to\mathrm{base}}\cdot P_{\mathrm{cam}}+t_{\mathrm{cam}\to\mathrm{base}}
$$
也可以将基座坐标系下的点变换到相机坐标系:
$$
P_{\mathrm{cam}}=R_{\mathrm{cam}\to\mathrm{base}}^T\cdot(P_{\mathrm{base}}-t_{\mathrm{cam}\to\mathrm{base}})
$$

其中 $R^T$ 是旋转矩阵的转置(即逆矩阵)。

参数详解

1. ‌R_gripper2baset_gripper2base

  • 物理意义‌:
    机械臂末端执行器(夹爪/Gripper)‌**相对于基座坐标系(Base)**‌的旋转和平移。
    这些参数描述了机械臂在不同位姿下,末端执行器在基座坐标系中的位置和姿态。
  • 数据来源‌:
    从机械臂控制器直接读取,或通过运动学正解(Forward Kinematics)计算得到。
  • 数学表示‌:
    • R_gripper2base:3×3 旋转矩阵,表示夹爪坐标系到基座坐标系的旋转变换。
    • t_gripper2base:3×1 平移向量,单位为毫米(mm)或米(m),需与标定板数据单位一致。
  • 注意‌:
    如果机械臂直接给出的是 Base → Gripper 的变换(如 UR 机械臂),需将其转换为 Gripper → Base

$$
R_{\text{gripper}\to\text{base}}=R_{\text{base}\to\text{gripper}}^T,\quad t_{\text{gripper}\to\text{base}}=-R_{\text{base}\to\text{gripper}}^T\cdot t_{\text{base}\to\text{gripper}}
$$

2. ‌R_target2camt_target2cam

  • 物理意义‌:
    标定板(Target,如棋盘格)‌**相对于相机坐标系(Cam)**‌的旋转和平移。
    这些参数描述了标定板在相机视野中的位置和姿态。
  • 数据来源‌:
    通过标定板检测算法(如 cv2.aruco.estimatePoseSingleMarkerscv2.solvePnP)计算得到。
  • 数学表示‌:
    • R_target2cam:3×3 旋转矩阵,表示标定板坐标系到相机坐标系的旋转变换。
    • t_target2cam:3×1 平移向量,单位需与机械臂数据一致。
  • 注意‌:
    如果使用 cv2.solvePnP 得到的旋转向量(Rodrigues 向量),需将其转换为旋转矩阵:
1
R_target2cam, _ = cv2.Rodrigues(rvec)  # rvec 为旋转向量

3. ‌method

  • 物理意义‌:
    标定算法的选择,不同算法对应不同的数学假设和求解方式。常用方法:
    • cv2.CALIB_HAND_EYE_TSAI:基于两步法的快速算法(默认)。
    • cv2.CALIB_HAND_EYE_PARK:利用旋转和平移分离优化的方法。
    • cv2.CALIB_HAND_EYE_HORAUD:适用于噪声较大的场景。
    • 其他方法如 ANDREFFDANIILIDIS
  • 选择建议‌:
    • ‌**默认使用 CALIB_HAND_EYE_TSAI**‌,若结果不稳定再尝试其他方法。

‌4. 输出结果‌

  • R_cam2baset_cam2base‌:
    • 物理意义‌:相机坐标系到机械臂基座坐标系的刚体变换。
    • 用途‌:将相机检测到的物体位置(Cam系)转换为机械臂基座坐标系下的坐标,供机械臂抓取。

数据采集建议

  1. 运动多样性‌:

    • 机械臂需在多个不同位姿下采集数据(平移和旋转均需变化)。
    • 建议至少采集 10 组数据以提高鲁棒性。
  2. 标定板观测‌:

    • 标定板在相机视野中需完整可见,且姿态有明显变化。
  3. 单位一致性‌:

    • 确保机械臂的平移单位(mm/m)与标定板检测结果一致。

常见问题排查

  • 错误‌ :标定结果不稳定或误差大

    原因‌: 数据噪声大或运动不足(如仅平移无旋转)。

    解决:‌ 增加数据量,确保机械臂运动覆盖 6 自由度。

  • 错误‌: 输出的旋转矩阵非正交

    原因:‌ 输入数据存在坐标系方向错误 (小心 xyz 和 zyx 旋转定义)。

    解决:‌ 检查 R_gripper2baseR_target2cam 是否为合法旋转矩阵(正交且行列式为 1)。

参考资料



文章链接:
https://www.zywvvd.com/notes/3d/opencv/cali-hand-eye-cv-intr/cali-hand-eye-cv-intr/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

OpenCV 手眼标定 calibrateHandEye 函数介绍
https://www.zywvvd.com/notes/3d/opencv/cali-hand-eye-cv-intr/cali-hand-eye-cv-intr/
作者
Yiwei Zhang
发布于
2025年5月13日
许可协议