【具身智能基础】手眼标定
手眼标定是机器人视觉引导的核心技术,用于建立机器人坐标系与相机坐标系之间的转换关系。主要分为眼在手外(相机固定)和眼在手上(相机随机械臂移动)两种构型。标定前需完成相机内参标定以消除畸变。标定过程包括数据采集(记录机械臂位姿与标定板图像)、预处理、求解AX=XB方程及精度验证。最终得到4×4齐次变换矩阵,使机器人能准确执行视觉引导的操作任务。
系列文章目录
目录
前言
提示:该博客仅为个人学习记录,若有错误,还请指正
参考:手眼标定详述(坐标系介绍,二维、三维的手眼标定方法@九点法、AX=XB)
机械臂 手眼标定 手眼矩阵 eye-in-hand 原理、实践及代码
手眼标定是机器人与视觉系统协同工作的核心技术,其本质是建立机器人坐标系与相机坐标系之间的齐次变换关系,让机器人能够将视觉系统感知到的目标位置(视觉系统观察到的目标坐标)转换为自身可执行的运动指令(机器人坐标),最终实现 视觉引导机器人操作,如抓取、装配、检测。
一、为什么需要手眼标定?
机器人和相机是两个独立的系统,各自有一套 坐标语言
- 机器人:以基坐标系为基准,通过运动学计算末端执行器,如夹爪的位姿(末端坐标系);
- 相机:以相机坐标系为基准,将图像中的像素点(图像坐标系)转换为三维空间点,需先通过相机内参标定矫正畸变、确定焦距等参数。
若两者无转换桥梁,机器人无法理解相机看到的目标在哪里。手眼标定的核心就是构建这座桥梁:求解一个4×4 齐次变换矩阵(包含旋转和平移),实现两个坐标系的精准映射。
二、手眼标定的两种典型构型
1.眼在手外(EYE TO HEAD)
如下图所示,眼在手外是将相机放在固定位置;标定板固定在机械臂末端。由于眼在手外标定时,Base坐标系和Cam坐标系的位置是固定的,因此眼在手外主要是求这两个坐标系的关系。适用于固定目标抓取、高精度检测

2.眼在手上(EYE IN HEAD)
如下图所示,眼在手上是将相机固定在机械臂末端;标定板固定在目标平面。眼在手上时,相机坐标系和工具坐标系的位置是相对不变的。因此,标定的就是相机坐标系和工具坐标系的关系。适用于抓取移动目标,大视野场景。

三、手眼标定的前提:相机内参标定
手眼标定的核心是外部坐标映射,但需先完成相机内参标定(Intrinsic Calibration)—— 这是视觉系统的基础校准,目的是确定相机自身的参数,只有通过内参标定矫正畸变后,才能将图像的 “像素坐标” 准确转换为 “相机坐标系下的三维坐标”,为手眼标定提供可靠数据。
- 内参矩阵:焦距(fx, fy)、主点坐标(cx, cy,图像中光学中心对应的像素点);
- 畸变系数:径向畸变(镜头光学缺陷导致的 “桶形 / 枕形畸变”)、切向畸变(镜头安装偏差导致)。
在实际应用上,镜头并非理想的透视成像,带有不同程度的畸变。理论上镜头的畸变包括径向畸变和切向畸变,切向畸变影响较小,通常只考虑径向畸变。径向畸变主要由镜头径向曲率产生(光线在远离透镜中心的地方比靠近中心的地方更加弯曲)。导致真实成像点向内或向外偏离理想成像点。其中畸变像点相对于理想像点沿径向向外偏移,远离中心的,称为枕形畸变;径向畸点相对于理想点沿径向向中心靠拢,称为桶状畸变。

用数学公式表示:
x ~ K[R|t]X
其中,x为相机中的像素坐标;X为相机坐标系下的三维坐标;K为内参矩阵,包含了焦距和光心坐标;[R|t]为外参矩阵,R和t分别为世界坐标系到相机坐标系的旋和平移。然后我们利用opencv-python中的cameraCalibration方法,将棋盘格上的真实世界坐标与我们假设出来的坐标对应,就可以得到该相机在该焦距下的内参矩阵、外参矩阵,以及相机的畸变系数。
常用工具:OpenCV 的calibrateCamera函数、MATLAB 的 Camera Calibrator 工具、ROS 的camera_calibration包。
四、坐标系及旋转矩阵
坐标系简称
| Base | 基坐标系 |
|---|---|
| Tool | 工具坐标系(机械臂末端坐标系) |
| Cam | 相机坐标系 |
| Cal | 标定板坐标系 |
参考前述章节
基坐标系到工具坐标系的齐次变换阵组成表示为:

五、手眼标定中AX=XB推理求解过程
1.眼在手外
眼在手外的标定,得到的是基坐标系到相机坐标系的变换 (对于opencv的handeyecalibrate函数,将其输入的机械臂姿态改为base->tool,则得到的输出是相机到基坐标系,与本文这里的示例相反,需要注意!!!) ,表示为 :


将Tool>>Cal的变换阵写成:

对于拍摄的多张图像,用M1、M2…Mn来表示不同图像的变换阵,联立两次变换方程,(消掉Tool>>Cal的变换阵)得到下式:

通过下表将整个变换总结为AX=XB的形式:

即

2.眼在手上
眼在手上,期望的转化阵为工具坐标系(机械臂末端坐标系)到相机坐标系,表示为:
![]()

将Cal>>Base的变换阵写成:

同理,基于眼在手外的原理,标定板坐标系到基坐标系的变换矩阵不变,将眼在手上的变换阵求解表示为:

3.求解
首先将A,B,X表示为齐次阵的形式:

即可将 AX=XB 拆解为:

关于上式具体的求解(本人还未实际做过推算):
- 可以基于
优化方法的思想(高斯牛顿的方法),移到一边后求取误差项,然后通过非线性最优化的方法,将误差最小化,直接拟合出 R 和 T。 - (常用) 也可以基于
两步法的思想,先求R再求T,具体可以参考Navy_HandEye或Tsai_HandEye等方法。
六、AX=XB方法手眼标定完整流程
以 “棋盘格标定板”(最常用,成本低、精度高)为例,手眼标定通常分为 6 个步骤:
1. 准备工作
- 硬件:机械臂(需能精确记录末端位姿)、相机(已完成内参标定)、棋盘格标定板(精度需匹配应用场景,如工业级选 0.1mm 精度);
- 固定:
- 眼在手上:确保相机与末端执行器刚性连接(无松动,否则会引入误差);
- 眼在手外:确保相机和标定板(标定板固定在机械臂末端)位置稳定;
2. 数据采集
核心是采集 “机械臂末端位姿” 与 “相机观察到的标定板位姿” 的对应组(通常需 10~20 组,姿态差异越大,标定精度越高):
- 控制机械臂移动,每次停在一个不同姿态(避免姿态冗余,如不要只平移、不旋转);
- 每次姿态下,记录:
- 机械臂端:末端执行器在基坐标系下的位姿(T_robot,4×4 齐次矩阵,由机器人控制器输出);
- 相机端:拍摄棋盘格图像,通过内参计算标定板在相机坐标系下的位姿(T_camera,4×4 齐次矩阵,可由 OpenCV 的
solvePnP函数求解)。
3. 数据预处理
- 剔除异常值:若某组数据的标定板角点提取成功率低(如模糊、遮挡),或机器人位姿波动大,需删除该组数据;
- 统一坐标格式:确保机器人位姿和相机位姿的齐次矩阵格式一致(如旋转矩阵的顺序、平移向量的单位)。
4. 求解手眼变换矩阵(X)
根据构型选择对应的算法,求解核心方程(AX=XB )。
这里可以参考:https://blog.csdn.net/wanggao_1990/article/details/81435660
-
常用算法对比:
算法 优点 缺点 适用场景 Tsai-Lenz 计算速度快、鲁棒性强 对噪声敏感(需多组数据) 大多数工业场景(如抓取) Park 精度高、抗噪声能力强 计算复杂度较高 高精度装配、检测 Horn 基于四元数,避免奇异性 对初始值敏感 机器人运动范围大的场景 -
工具实现:OpenCV 的
calibrateHandEye函数、MATLAB Robotics Toolbox 的handeye函数、ROS 的handeye_calibration包。
5. 精度验证
标定结果需通过实际测试验证,常用方法:
- 重投影误差:将机器人坐标下的标定板角点,通过 X 转换为相机坐标,再投影到图像上,计算与实际像素点的偏差(通常要求 < 1 像素);
- 实物测试:让机器人根据视觉引导抓取目标(如标定板上的标记点),测量实际抓取位置与理论位置的偏差(工业场景通常要求 < 0.1~1mm,取决于机器人精度)。
6. 结果保存与应用
若精度达标,保存手眼变换矩阵 X,集成到视觉引导系统中。实时应用时,相机拍摄目标→通过内参得到目标在相机坐标系的位姿→通过 X 转换为机器人坐标系位姿→机器人根据该位姿运动。
总结
手眼标定是机器人操作中视觉系统与末端执行器联动的重要一环。
更多推荐


所有评论(0)