手眼标定本质
手眼标定是机器人视觉应用的基石,所有相机看到的物体像素坐标/3D坐标,最终都要转换到机器人基坐标系才能控制机械臂运动。
它的核心任务只有一个:
求解机器人本体坐标系 与 相机光学坐标系之间,唯一固定不变的刚性齐次变换矩阵
X=[Rt01×31],X∈SE(3) \mathbf{X}= \begin{bmatrix} \mathbf{R}&\mathbf{t}\\ \mathbf{0}_{1\times3}&1 \end{bmatrix} ,\quad \mathbf{X}\in SE(3) X=[R01×3t1],X∈SE(3)
关键常识:
- 这个变换矩阵一旦标定完成就是常数,除非相机支架松动、机器人TCP改变,否则终身不变;
- 机械臂运动只是为了构造数学约束解方程,不是因为变换关系会动;
- 手眼标定必须先做相机内参标定,内参错误则外参(手眼结果)完全无效;
- 全世界手眼标定只有两种构型:眼在手上 EiH、眼在手外 EtH,数学模型统一为 AX=XB\mathbf{AX}=\mathbf{XB}AX=XB。
1. 标准坐标系体系与变换规则
工程上手眼标定90%的错误,都来自坐标系定义混乱、变换方向搞反。
本文使用工业机器人通用标准,所有推导基于这套体系。
1.1 四大核心坐标系
(1)基坐标系 {B}\{B\}{B} Base
- 机器人绝对静止的基准坐标系;
- ABB:底座中心,Z轴竖直向上;
- UR:底座法兰中心;
- FANUC:J1轴轴线在地面的投影点;
- 机器人控制器输出的所有末端位姿,均相对于 {B}\{B\}{B}。
(2)末端执行器坐标系 {E}\{E\}{E} End-Effector
- 通常为机器人法兰中心坐标系(默认TCP);
- 若安装夹爪、相机支架、焊枪,需额外做TCP标定修正;
- {E}\{E\}{E} 相对 {B}\{B\}{B} 的位姿由机器人正运动学 DH 模型直接给出。
(3)相机光学坐标系 {C}\{C\}{C} Camera
严格遵循针孔相机模型:
- 原点:相机光心(镜头中心);
- X轴:向右;
- Y轴:向下;
- Z轴:沿光轴向前(指向拍摄场景);
- 相机内参标定完成后,可通过 PnP 求解出靶标在 {C}\{C\}{C} 下的6DOF位姿。
(4)标定靶标坐标系 {T}\{T\}{T} Target
- 载体:棋盘格、AprilTag、ChArUco 板;
- 原点:棋盘格左上角角点 / Tag 中心;
- Z轴:垂直靶标平面向外;
- 约束:要么固连工作台(EiH),要么固连末端(EtH),相对刚体无相对运动。
1.2 齐次变换矩阵严格定义
统一符号规则:
TAB \mathbf{T}_{AB} TAB
表示:将点从坐标系{B}\{B\}{B} 变换到 坐标系{A}\{A\}{A}
数学关系:
PA=TAB⋅PB P_A = \mathbf{T}_{AB} \cdot P_B PA=TAB⋅PB
逆变换规则(工程高频使用)
TAB−1=TBA=[RABT−RABTtAB01] \mathbf{T}{AB}^{-1} = \mathbf{T}{BA}= \begin{bmatrix} \mathbf{R}{AB}^T & -\mathbf{R}{AB}^T \mathbf{t}_{AB}\\ \mathbf{0}&1 \end{bmatrix} TAB−1=TBA=[RABT0−RABTtAB1]
旋转矩阵正交,逆=转置;平移部分做反向映射。
2. 两种手眼构型:物理安装+约束链路
手眼标定只分两类,区别仅在相机装在哪、靶标装在哪,数学最终统一。
2.1 Eye-in-Hand(EiH)眼在手上
安装方式
相机刚性固定在机器人末端执行器上,和法兰/夹爪一起运动,无相对位移。
约束关系
标定板 {T}\{T\}{T} 固定在工作台/地面,与基坐标系 {B}\{B\}{B} 固连:
TBT=Constant \mathbf{T}_{BT} = \text{Constant} TBT=Constant
待求量 X\mathbf{X}X:末端坐标系 → 相机坐标系 的固定变换
X=TEC \mathbf{X}=\mathbf{T}_{EC} X=TEC
完整坐标变换链路
基坐标系到靶标的路径只有一条:
TBT=TBE⋅TEC⋅TCT \mathbf{T}{BT} = \mathbf{T}{BE} \cdot \mathbf{T}{EC} \cdot \mathbf{T}{CT} TBT=TBE⋅TEC⋅TCT
翻译:
基坐标系 → 末端 → 相机 → 靶标
2.2 Eye-to-Hand(EtH)眼在手外
安装方式
相机固定在机器人外部支架,与地面固连,完全不随机械臂运动。
约束关系
标定板 {T}\{T\}{T} 刚性固定在机器人末端 {E}\{E\}{E},随臂运动:
TET=Constant \mathbf{T}_{ET}=\text{Constant} TET=Constant
待求量 X\mathbf{X}X:基坐标系 → 相机坐标系 的固定变换
X=TBC \mathbf{X}=\mathbf{T}_{BC} X=TBC
完整坐标变换链路
靶标位姿有两条等价路径:
TBC⋅TCT=TBE⋅TET \mathbf{T}{BC}\cdot\mathbf{T}{CT} = \mathbf{T}{BE}\cdot\mathbf{T}{ET} TBC⋅TCT=TBE⋅TET
翻译:
基→相机→靶标 = 基→末端→靶标
3. AX=XB\mathbf{AX=XB}AX=XB 方程完整严格推导
手眼标定的数学灵魂就是这个方程,两种构型分别推导,无任何简化。
所有现成的手眼标定求解库(如 OpenCV cv2.calibrateHandEye、ROS easy_handeye、MATLAB handEyeCalibration),输入接口都是标准 AX=XB 形式,要求 A 是末端相对变换、B 是靶标相对变换
3.1 通用变量定义
机械臂运动到两个不同位姿:
- 位姿1:末端位姿 TBE1\mathbf{T}{BE1}TBE1,相机观测靶标 TCT1\mathbf{T}{CT1}TCT1
- 位姿2:末端位姿 TBE2\mathbf{T}{BE2}TBE2,相机观测靶标 TCT2\mathbf{T}{CT2}TCT2
定义相对运动:
机器人末端相对运动矩阵 A\mathbf{A}A
A=TE1E2=TBE2⋅TBE1−1 \mathbf{A}=\mathbf{T}{E1E2}=\mathbf{T}{BE2}\cdot\mathbf{T}_{BE1}^{-1} A=TE1E2=TBE2⋅TBE1−1
描述:机械臂从位姿1运动到位姿2,末端自身的相对变换。
相机观测靶标相对运动矩阵 B\mathbf{B}B
B=TT1T2=TCT2⋅TCT1−1 \mathbf{B}=\mathbf{T}{T1T2}=\mathbf{T}{CT2}\cdot\mathbf{T}_{CT1}^{-1} B=TT1T2=TCT2⋅TCT1−1
描述:相机看到的靶标相对变换。
3.2 EiH 构型推导 AX=XB\mathbf{AX=XB}AX=XB
由 EiH 变换链路,机械臂在两个位姿下均满足坐标约束:
{TBT=TBE1⋅X⋅TCT1(1)TBT=TBE2⋅X⋅TCT2(2) \begin{cases} \mathbf{T}{BT}=\mathbf{T}{BE1}\cdot\mathbf{X}\cdot\mathbf{T}{CT1} \quad (1)\\ \mathbf{T}{BT}=\mathbf{T}{BE2}\cdot\mathbf{X}\cdot\mathbf{T}{CT2} \quad (2) \end{cases} {TBT=TBE1⋅X⋅TCT1(1)TBT=TBE2⋅X⋅TCT2(2)
令式 (1) = 式 (2),消去恒定不变的 TBT\mathbf{T}_{BT}TBT:
TBE1⋅X⋅TCT1\mathbf{T}{BE1}\cdot\mathbf{X}\cdot\mathbf{T}{CT1}TBE1⋅X⋅TCT1 = TBE2⋅X⋅TCT2\mathbf{T}{BE2}\cdot\mathbf{X}\cdot\mathbf{T}{CT2}TBE2⋅X⋅TCT2
等式两侧左乘 TBE2−1\mathbf{T}_{BE2}^{-1}TBE2−1 ,右乘 TCT1−1\mathbf{T}_{CT1}^{-1}TCT1−1,整理可得:
TBE2−1⋅TBE1⋅X\mathbf{T}{BE2}^{-1}\cdot\mathbf{T}{BE1}\cdot\mathbf{X}TBE2−1⋅TBE1⋅X = X⋅TCT2⋅TCT1−1\mathbf{X}\cdot\mathbf{T}{CT2}\cdot\mathbf{T}{CT1}^{-1}X⋅TCT2⋅TCT1−1
将前文定义的相对运动矩阵 A\mathbf{A}A、B\mathbf{B}B 代入:
A−1⋅X=X⋅B \mathbf{A}^{-1}\cdot\mathbf{X}=\mathbf{X}\cdot\mathbf{B} A−1⋅X=X⋅B
最终整理为手眼标定标准方程形式:
AX=XB \mathbf{AX}=\mathbf{XB} AX=XB
共轭关系的核心是「两个刚体变换在不同坐标系下的等价表示」,因此变换的方向(A/A⁻¹、B/B⁻¹)不影响共轭关系的存在性,只是坐标系的观测方向反过来了,因此可以等价转换为标准 AX=XB 形式
3.3 EtH 构型推导 AX=XB\mathbf{AX=XB}AX=XB
由 EtH 变换链路:
{X⋅TCT1=TBE1⋅TET(1)X⋅TCT2=TBE2⋅TET(2) \begin{cases} \mathbf{X}\cdot\mathbf{T}{CT1}=\mathbf{T}{BE1}\cdot\mathbf{T}{ET}\quad(1)\\ \mathbf{X}\cdot\mathbf{T}{CT2}=\mathbf{T}{BE2}\cdot\mathbf{T}{ET}\quad(2) \end{cases} {X⋅TCT1=TBE1⋅TET(1)X⋅TCT2=TBE2⋅TET(2)
(1)、(2) 同时左乘 X−1\mathbf{X}^{-1}X−1:
{TCT1=X−1TBE1TETTCT2=X−1TBE2TET \begin{cases} \mathbf{T}{CT1}=\mathbf{X}^{-1}\mathbf{T}{BE1}\mathbf{T}{ET}\\ \mathbf{T}{CT2}=\mathbf{X}^{-1}\mathbf{T}{BE2}\mathbf{T}{ET} \end{cases} {TCT1=X−1TBE1TETTCT2=X−1TBE2TET
联立消去 TET\mathbf{T}{ET}TET:
TCT2=X−1TBE2TBE1−1XTCT1\mathbf{T}{CT2}=\mathbf{X}^{-1}\mathbf{T}{BE2}\mathbf{T}{BE1}^{-1}\mathbf{X}\mathbf{T}_{CT1}TCT2=X−1TBE2TBE1−1XTCT1
右乘 TCT1−1\mathbf{T}_{CT1}^{-1}TCT1−1:
TCT2TCT1−1=X−1TBE2TBE1−1X\mathbf{T}{CT2}\mathbf{T}{CT1}^{-1}= \mathbf{X}^{-1}\mathbf{T}{BE2}\mathbf{T}{BE1}^{-1}\mathbf{X}TCT2TCT1−1=X−1TBE2TBE1−1X
代入 A\mathbf{A}A、B\mathbf{B}B:
B=X−1AX \mathbf{B}=\mathbf{X}^{-1}\mathbf{A}\mathbf{X} B=X−1AX
最终同样得到:
AX=XB \mathbf{AX=XB} AX=XB
3.4 核心结论
- EiH 和 EtH 数学模型完全一致,都是解 AX=XB\mathbf{AX=XB}AX=XB;
- 区别仅在于:
- EiH:X=TEC\mathbf{X}=\mathbf{T}_{EC}X=TEC
- EtH:X=TBC\mathbf{X}=\mathbf{T}_{BC}X=TBC
- 多组位姿才能构造超定方程,单组位姿有无穷多解。
4. AX=XB\mathbf{AX=XB}AX=XB 求解完整细节(旋移解耦+算法)
AX=XB\mathbf{AX=XB}AX=XB 是李群方程,不能直接线性求解,工业通用流程:
先解旋转 RX\mathbf{R}_XRX → 再代入解平移 tX\mathbf{t}_XtX
4.1 矩阵解耦拆分
将 A、B、X\mathbf{A、B、X}A、B、X 拆分为旋转+平移:
A=[RAtA01],B=[RBtB01],X=[RXtX01] \mathbf{A}= \begin{bmatrix} \mathbf{R}_A&\mathbf{t}_A\\ 0&1 \end{bmatrix},\quad \mathbf{B}= \begin{bmatrix} \mathbf{R}_B&\mathbf{t}_B\\ 0&1 \end{bmatrix},\quad \mathbf{X}= \begin{bmatrix} \mathbf{R}_X&\mathbf{t}_X\\ 0&1 \end{bmatrix} A=[RA0tA1],B=[RB0tB1],X=[RX0tX1]
代入 AX=XB\mathbf{AX=XB}AX=XB 展开,得到两个独立方程:
(1)旋转方程(SO(3))
RARX=RXRB \mathbf{R}_A \mathbf{R}_X = \mathbf{R}_X \mathbf{R}_B RARX=RXRB
(2)平移方程(R3\mathbb{R}^3R3)
RAtX+tA=RXtB+tX \mathbf{R}_A \mathbf{t}_X + \mathbf{t}_A = \mathbf{R}_X \mathbf{t}_B + \mathbf{t}_X RAtX+tA=RXtB+tX
4.2 旋转部分求解
4.2.1 Horn 四元数法(最通用)
- 把旋转矩阵转为单位四元数;
- 构造 4×44\times44×4 线性方程组 Mq=0\mathbf{M}\mathbf{q}=0Mq=0;
- 对 M\mathbf{M}M 做 SVD,最小奇异值对应的右奇异向量为最优四元数;
- 归一化后转回旋转矩阵。
优点:线性求解、无迭代、速度快、精度均衡。
4.2.2 Tsai-Lenz 轴角法(工业控制器常用)
- 用旋转向量(轴角)表示旋转;
- 转化为叉乘线性方程;
- 最小二乘求解旋转向量。
优点:计算量极小,适合嵌入式/实时系统;
缺点:对噪声敏感,小姿态运动精度差。
4.2.3 Daniilidis 对偶四元数法(精度最高)
- 用对偶四元数统一表示 SE(3) 变换;
- 旋移耦合求解,不需要解耦;
- 全局最优,抗噪声能力最强。
工业高精度场景首选(精密抓取、装配)。
4.3 旋转矩阵正交化强制修正
求解出的 RX\mathbf{R}_XRX 受噪声影响,不再满足正交性:
RTR≠I \mathbf{R}^T\mathbf{R}\neq\mathbf{I} RTR=I
必须做 SVD 正交化:
SVD(Rraw)=UΣVTRopt=UVT \text{SVD}(\mathbf{R}{raw})=\mathbf{U}\mathbf{\Sigma}\mathbf{V}^T\\ \mathbf{R}{opt}=\mathbf{U}\mathbf{V}^T SVD(Rraw)=UΣVTRopt=UVT
若 det(Ropt)=−1\det(\mathbf{R}_{opt})=-1det(Ropt)=−1,乘 diag(1,1,−1)\text{diag}(1,1,-1)diag(1,1,−1) 恢复右手系。
这一步不做,平移一定会出现系统性偏差。
4.4 平移部分求解(超定最小二乘)
将已求出的 RX\mathbf{R}_XRX 代入平移方程,整理:
(RA−I)tX=RXtB−tA (\mathbf{R}_A-\mathbf{I})\mathbf{t}_X = \mathbf{R}_X \mathbf{t}_B - \mathbf{t}_A (RA−I)tX=RXtB−tA
- 单组数据:3个方程;
- N组数据:3N个方程,构成超定线性方程组;
- 用 SVD / QR 分解做最小二乘,得到最优 tX\mathbf{t}_XtX。
⚠️ 工程致命注意:
相机单位(米)与机器人单位(毫米)必须统一,否则平移差1000倍。
5. 工业级完整标定流程
5.1 前置标定(缺一不可)
相机内参+畸变标定
张正友标定,采集15~20张不同角度棋盘格,重投影误差<0.3px合格。
机器人TCP标定
保证末端坐标系 {E}\{E\}{E} 精准。
靶标安装
优先 ChArUco,平面度<0.01mm,哑光防反光。
5.2 数据采集(精度决定性步骤)
- 采集组数:20~30组;
- 姿态要求:
- 覆盖工作空间上下左右前后(机械臂六个移动方向都要动一动);
- 禁止纯平移、纯旋转、靶标与光轴垂直(退化);
- 姿态随机无规律,充分激励6自由度;
- 同步要求:机器人到位稳停100ms再采图,避免运动模糊;
- 每组数据:机器人6D位姿 + 相机解算靶标6D位姿。
5.3 数据预处理
- 统一单位(米/毫米);
- 剔除角点检测失败、重投影误差过大的坏点;
- 计算两两相对变换 Ai、Bi\mathbf{A}_i、\mathbf{B}_iAi、Bi。
5.4 求解与验证
- 对偶四元数求解 X\mathbf{X}X;
- 旋转矩阵正交化;
- 平移最小二乘;
- 验证指标:
- 重投影误差<0.5px;
- 独立位姿三维误差<0.2mm;
- 实际抓取成功率>99%。
6. 误差来源全溯源与优化
6.1 主要误差项
- 相机内参/畸变残留误差;
- 角点检测噪声;
- 机器人重复定位误差;
- 采集姿态退化(秩亏,每次没有充分利用六个方向的移动,只动了较少的方向);
- 坐标系/变换方向错误;
- 单位不统一;
- 旋转未正交化。
6.2 工程优化手段
- 用高分辨率工业相机+远心镜头;
- 采集姿态"杂乱无章";
- 多组数据平均,剔除异常值;
- 算法选用对偶四元数;
- 定期复检标定(高温/振动环境)。
7. 视觉定位→机器人控制
7.1 EiH 在线转换
相机观测物体位姿 TCO\mathbf{T}{CO}TCO:
TBO=TBE⋅X⋅TCO \mathbf{T}{BO}=\mathbf{T}{BE}\cdot\mathbf{X}\cdot\mathbf{T}{CO} TBO=TBE⋅X⋅TCO
7.2 EtH 在线转换
相机观测物体位姿 TCO\mathbf{T}{CO}TCO:
TBO=X⋅TCO \mathbf{T}{BO}=\mathbf{X}\cdot\mathbf{T}_{CO} TBO=X⋅TCO
得到 TBO\mathbf{T}_{BO}TBO 后,机器人即可做轨迹规划与抓取。
8. 排错指南
- 变换方向搞反
TAB\mathbf{T}{AB}TAB 与 TBA\mathbf{T}{BA}TBA 混用,坐标完全错位。 - A、B\mathbf{A、B}A、B 顺序写反
求解出镜像矩阵,抓取完全偏。 - 姿态采集退化
纯平移/纯旋转,方程秩亏,求解发散。 - 单位不统一
米/毫米混用,平移差1000倍。 - 未做旋转正交化
平移出现固定偏差。 - 相机Z轴方向搞反
深度为负,定位完全错误。
9. 进阶拓展
- 多相机手眼标定
多相机分别标定 TBC\mathbf{T}_{BC}TBC,融合提升定位精度; - 动态手眼标定
卡尔曼滤波在线更新 X\mathbf{X}X,适应振动、热形变; - 2D 平面手眼标定
平面抓取简化为相似变换,计算量极低; - 无靶标自标定
利用场景物体特征,无需专用标定板; - 手眼+运动学联合标定
同时修正 DH 参数与手眼变换。
总结
- 手眼标定本质:求一组固定不变的 SE(3) 变换 X\mathbf{X}X;
- 只有两种构型,数学统一为 AX=XB\mathbf{AX=XB}AX=XB;
- 求解流程:旋转求解 → 正交化 → 平移最小二乘;
- 工程核心:相机内参 + 规范姿态采集 + 鲁棒算法;
- 所有视觉抓取、装配、分拣,最终都依赖这一个矩阵。
