























在机器人学和数学中,手眼标定问题(也成为“机器人-传感器”或“机器人-世界”标定问题)是确定机器人末端执行器与传感器(相机或激光扫描仪)之间或机器人底座与世界坐标系之间的转换的问题。
手眼标定是确定视觉传感器(如相机、3D扫描仪)坐标系与机器人坐标系之间空间转换关系的过程,核心目标是实现视觉数据与机械臂操作的精准关联35。根据传感器安装位置分为两类:
通过标定矩阵(旋转矩阵与平移向量)实现:
方法说明: https://campar.in.tum.de/Chair/HandEyeCalibration
相机(眼睛)安装在机器人夹具末端(手),估计末端坐标系到相机坐标系的变换 $^gT_c$ 称为“眼在手上”的标定.

公式符号与意义

$^bT_g$ 指的是机械臂末端坐标系在机械臂基座坐标系下的变换关系,可以使用机械臂的正运动学得到:
$$ \begin{bmatrix}X_b\\Y_b\\Z_b\\1\end{bmatrix}=\begin{bmatrix}{}^bR_g&{}^bt_g\\0_{1\times3}&1\end{bmatrix}\begin{bmatrix}X_g\\Y_g\\Z_g\\1\end{bmatrix} $$
$^cT_t$ 指的是标定板目标坐标系在相机坐标系下的变换关系,可以使用PNP方法估计得到 :
$$ \begin{bmatrix}X_{c}\\Y_{c}\\Z_{c}\\1\end{bmatrix}=\begin{bmatrix}{}^{c}R_{t}&{}^{c}t_{t}\\0_{1\times3}&1\end{bmatrix}\begin{bmatrix}X_{t}\\Y_{t}\\Z_{t}\\1\end{bmatrix} $$ 而 $^bT_t$ 和 $^gT_c$ 是常量, 可以列出等式: $$ \begin{aligned}^bT_t = &^bT_g^{(1)}\times^gT_c\times^cT_t^{(1)}=^bT_g^{(2)}\times^gT_c\times^cT_t^{(2)}\end{aligned} $$ 调整后得到: $$ \\&(^bT_g^{(2)})^{-1}\times^bT_g^{(1)}\times^gT_c=^gT_c\times^cT_t^{(2)}\times(^cT_t^{(1)})^{-1} $$ 问题就转换为 $AX=XB$ 的公式求解。
眼在手外的手眼标定, 通过固定相机和机械臂基坐, 用相机拍摄机械臂末端, 末端粘贴标定板, 此时记录机械臂夹爪位姿, 相机通过 PnP 解算出标定板位姿, 利用标定板与夹爪之间的转换矩阵是常量来建立约束, 求解相机与基坐之间的位姿关系, 估计相机坐标系在机器人基座坐标系下的变换关系 $^bT_c$ ,这个过程称为“眼在手外”的标定。

每次移动时, $^bT_c$ 和 $^gT_t$ 是保持不动的。
$$
^gT_t = gT_b{(1)}\timesbT_c\timescT_t{(1)}=gT_b{(2)}\timesbT_c\timescT_t{(2)}
$$
调整后得到:
$$
(gT_b{(2)}){-1}\timesgT_b{(1)}\timesbT_c=bT_c\timescT_t{(2)}\times(cT_t{(1)}){-1}
$$
再次转换为 $AX=XB$ 的公式求解。
按照实现原理可以将所有方法分为三类:
缺点: 旋转分量Rx的计算误差会被带入位移分量tx的计算中。
缺点: 由于噪声的影响,旋转分量Rx的求解可能不一定是正交矩阵。因此,必须对旋转分量采取正交化步骤。然而,相应的位移分量没有被重新计算,这会导致求解错误。
缺点: 这种方式计算量可能很大,因为这些方法通常包含复杂的优化程序。此外,随着方程数量(n)变大,迭代解与封闭式解之间的差异通常会变小。因此,使用此方法前必须决定迭代解决方案的准确性是否值得计算成本。
OpenCV 中的 calibrateHandEye 方法实现了手眼标定的功能.
1 | |
参数说明:
| 参数 | 说明 |
|---|---|
| R_gripper2base | 夹爪到机械臂基坐的旋转矩阵 |
| t_gripper2base | 夹爪到机械臂基坐的平移向量 |
| R_target2cam | 标定板到相机的旋转矩阵 |
| t_target2cam | 标定板到相机的平移向量 |
| method | 可选算法 |
可选方法:
官方文档: https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#gad10a5ef12ee3499a0774c7904a801b99
| 参数 | 说明 | |
|---|---|---|
| CALIB_HAND_EYE_TSAI Python: cv.CALIB_HAND_EYE_TSAI | A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibration [275]. | |
| CALIB_HAND_EYE_PARK Python: cv.CALIB_HAND_EYE_PARK | Robot Sensor Calibration: Solving AX = XB on the Euclidean Group [214]. | |
| CALIB_HAND_EYE_HORAUD Python: cv.CALIB_HAND_EYE_HORAUD | Hand-eye Calibration [127]. | |
| CALIB_HAND_EYE_ANDREFF Python: cv.CALIB_HAND_EYE_ANDREFF | On-line Hand-Eye Calibration [12]. | |
| CALIB_HAND_EYE_DANIILIDIS Python: cv.CALIB_HAND_EYE_DANIILIDIS | Hand-Eye Calibration Using Dual Quaternions [65]. |
其中默认方法为TSAI独立闭式解方法,PARK,HORAUD也是独立解方法,ANDREFF,DANIILIDIS等是同时闭式解,(从同一组数据实验中得到结论,认为独立解中TSAI方法求得解的误差较大)。
这里有必要为刚刚使用该函数的同学澄清一下, 这个函数的本质为求解以下方程 (其中 $a, b,c,d $ 为一般坐标系变量, 没有特指的物理意义) :
$$ ^dT_a = ^dT_c\times^cT_b\times^bT_a $$
当 $^dT_a$ 和 $^cT_b$ 为常量时, 向函数分别输入 $^dT_c$ 和 $^bT_a$, 函数就会输出一个计算好的 $^cT_b$ .
我们套用函数的原始命名名称:
$$
^bT_t = ^bT_g \times ^gT_c \times ^cT_t
$$
输入 $^bT_g $ 和 $^cT_t$, 输出 $ ^gT_c $
这个流程就是函数中的变量名称所表示的含义, 但是该功能也可以解决眼在手外的情形.
$$ ^gT_t = ^gT_b\times^bT_c\times^cT_t $$ 输入 $^gT_b $ 和 $^cT_t$, 输出 $ ^bT_c $
这种使用方法的输入和输出的物理含义就与函数变量名不一致了,弄清原理, 放心使用, 认清本质, 变量名的物理含义不重要.
错误 :标定结果不稳定或误差大
原因: 数据噪声大或运动不足(如仅平移无旋转)。
解决: 增加数据量,确保机械臂运动覆盖 6 自由度。
错误: 输出的旋转矩阵非正交
原因: 输入数据存在坐标系方向错误 (小心 xyz 和 zyx 旋转定义)。
解决: 检查 R_gripper2base 和 R_target2cam 是否为合法旋转矩阵(正交且行列式为 1)。
文章链接:
https://www.zywvvd.com/notes/3d/opencv/cali-hand-eye-cv-intr/cali-hand-eye-cv-intr/
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。