本文最后更新于:2025年5月13日 晚上
本文记录 Opencv 中的手眼标定方法 calibrateHandEye。
简介
眼在手外的手眼标定, 通过固定相机和机械臂基坐, 用相机拍摄机械臂末端, 末端粘贴标定板, 此时记录机械臂夹爪位姿, 相机通过 PnP 解算出标定板位姿, 利用标定板与夹爪之间的转换矩阵是常量来建立约束, 求解相机与基坐之间的位姿关系.
- OpenCV 官方文档: https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gad10a5ef12ee3499a0774c7904a801b99
- 方法说明: https://campar.in.tum.de/Chair/HandEyeCalibration
关键公式与标定原理
手眼标定的核心是求解以下方程:
$$
\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}
$$
展开为旋转和平移分量
-
旋转分量方程
$$ \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)} $$ -
平移分量方程
$$ \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 |
|
在 OpenCV 的手眼标定(Hand-Eye Calibration)中,cv2.calibrateHandEye
的核心目标是求解相机坐标系(Cam)与机械臂基座坐标系(Base)之间的刚体变换关系,即求解以下变换矩阵:
**$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_gripper2base
和 t_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_target2cam
和 t_target2cam
- 物理意义:
标定板(Target,如棋盘格)**相对于相机坐标系(Cam)**的旋转和平移。
这些参数描述了标定板在相机视野中的位置和姿态。 - 数据来源:
通过标定板检测算法(如cv2.aruco.estimatePoseSingleMarkers
或cv2.solvePnP
)计算得到。 - 数学表示:
R_target2cam
:3×3 旋转矩阵,表示标定板坐标系到相机坐标系的旋转变换。t_target2cam
:3×1 平移向量,单位需与机械臂数据一致。
- 注意:
如果使用cv2.solvePnP
得到的旋转向量(Rodrigues 向量),需将其转换为旋转矩阵:
1 |
|
3. method
- 物理意义:
标定算法的选择,不同算法对应不同的数学假设和求解方式。常用方法:cv2.CALIB_HAND_EYE_TSAI
:基于两步法的快速算法(默认)。cv2.CALIB_HAND_EYE_PARK
:利用旋转和平移分离优化的方法。cv2.CALIB_HAND_EYE_HORAUD
:适用于噪声较大的场景。- 其他方法如
ANDREFF
、DANIILIDIS
。
- 选择建议:
- **默认使用
CALIB_HAND_EYE_TSAI
**,若结果不稳定再尝试其他方法。
- **默认使用
4. 输出结果
R_cam2base
和t_cam2base
:- 物理意义:相机坐标系到机械臂基座坐标系的刚体变换。
- 用途:将相机检测到的物体位置(Cam系)转换为机械臂基座坐标系下的坐标,供机械臂抓取。
数据采集建议
-
运动多样性:
- 机械臂需在多个不同位姿下采集数据(平移和旋转均需变化)。
- 建议至少采集 10 组数据以提高鲁棒性。
-
标定板观测:
- 标定板在相机视野中需完整可见,且姿态有明显变化。
-
单位一致性:
- 确保机械臂的平移单位(mm/m)与标定板检测结果一致。
常见问题排查
-
错误 :标定结果不稳定或误差大
原因: 数据噪声大或运动不足(如仅平移无旋转)。
解决: 增加数据量,确保机械臂运动覆盖 6 自由度。
-
错误: 输出的旋转矩阵非正交
原因: 输入数据存在坐标系方向错误 (小心 xyz 和 zyx 旋转定义)。
解决: 检查
R_gripper2base
和R_target2cam
是否为合法旋转矩阵(正交且行列式为 1)。
参考资料
- https://campar.in.tum.de/Chair/HandEyeCalibration
- https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gad10a5ef12ee3499a0774c7904a801b99
文章链接:
https://www.zywvvd.com/notes/3d/opencv/cali-hand-eye-cv-intr/cali-hand-eye-cv-intr/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信支付

支付宝支付