机器人手眼标定(Hand-Eye Calibration)
一句话:手眼标定就是算出 "机器人的手(末端执行器)" 和 "机器人的眼(相机)" 之间的坐标变换关系,让机器人知道 "相机看到的物体,在机器人坐标系里的什么位置"。
一、什么是手眼标定
通俗理解
机器人有一个机械臂(手),上面或旁边装了一个相机(眼)。相机看到一个物体,知道它在 "相机画面里的坐标",但机器人要去抓它,需要知道它在 "机器人底座坐标系里的坐标"。
手眼标定就是求这两个坐标系之间的转换矩阵。
plaintext
相机看到物体 → 物体在相机坐标系的位置
↓ 手眼标定矩阵 X
物体在机器人坐标系的位置
↓
机器人运动过去抓取
没有手眼标定,相机和机器人就是 "各说各话"—— 相机说 "物体在我左边 10cm",机器人不知道 "你的左边" 对应 "我的哪个方向"。
二、背景:为什么需要手眼标定
问题的由来
-
相机和机器人是两个独立的设备
- 相机有自己的坐标系(以相机光心为原点);
- 机器人有自己的坐标系(以底座为原点);
- 两者出厂时没有绑定,不知道彼此的相对位置。
-
安装存在误差
- 相机装在机械臂上,螺丝孔有公差、安装有倾斜;
- 你以为相机 "正对着" 末端,实际上偏了几度、偏了几毫米;
- 这些误差如果不标定,抓取就会偏。
-
视觉伺服的前提
- 机器人要根据相机看到的物体位置来运动(视觉伺服);
- 必须知道相机和末端的精确关系,否则控制会出错。
一个直观的例子
你戴了一副偏了的眼镜,看到的东西都偏左 10 度。你伸手去拿杯子,手会伸到杯子左边 —— 因为你的 "眼睛(相机)" 和 "手(机器人)" 之间的关系不对。
手眼标定就是 "测出眼镜偏了多少,然后补偿回来"。
三、两种安装方式
手眼标定分两种,标定方法不同:
1. Eye-in-Hand(眼在手上)
- 相机装在机器人末端,跟着手臂一起动;
- 标定的是:末端坐标系 → 相机坐标系的变换;
- 特点:相机随手臂运动,视野随手臂变化;
- 典型场景:机械臂抓取、装配、视觉伺服。
plaintext
机器人底座
│
└── 机械臂
└── 末端法兰
└── 相机(跟着手臂动)
2. Eye-to-Hand(眼在手外)
- 相机固定在工作空间旁边,不跟着手臂动;
- 标定的是:机器人底座坐标系 → 相机坐标系的变换;
- 特点:相机视野固定,看整个工作区域;
- 典型场景:传送带分拣、固定工位抓取。
plaintext
相机(固定不动,俯瞰工作区)
│
▼
工作区
│
└── 机械臂
亚博小车如果装了摄像头做视觉跟随,属于类似 eye-to-hand 的思路(相机和底盘固定,标定相机和底盘的关系)。
四、核心数学原理:AX = XB
手眼标定的核心方程是:
\(AX = XB\)
其中:
- A:机器人末端的运动(从位姿 1 到位姿 2 的变换);
- B:相机的运动(从位姿 1 到位姿 2 的变换,通过标定板算出);
- X:手眼变换矩阵(我们要求的未知量);
- 方程含义:机器人动了多少 = 相机动了多少,中间通过 X 联系起来。
通俗理解
- 让机器人带着相机动几次(eye-in-hand),或者让相机看机器人末端动几次(eye-to-hand);
- 每动一次,记录:
- 机器人末端的位姿变化 A(从机器人控制器读取);
- 相机的位姿变化 B(通过标定板在相机中的位置变化算出);
- 多组 (A, B) 数据,解方程 AX = XB,求出 X。
为什么要动多次?因为一次运动数据不够,方程有无穷多解。通常需要 10~20 组不同姿态的数据,才能稳定求解。
常用求解算法
表格
| 算法 | 特点 |
|---|---|
| Tsai-Lenz | 经典方法,旋转和平移分步求解,最常用 |
| Park-Martin | 另一种经典方法,类似思路 |
| Horaud | 对偶四元数法,数值稳定性好 |
| 迭代优化 | 用多组数据做非线性优化,精度更高 |
五、标定流程(实操步骤)
以 eye-in-hand 为例:
准备工作
- 相机内参标定:先标定相机的焦距、主点、畸变(用棋盘格 / 标定板);
手眼标定是 "外参" 标定,前提是相机内参已知。
- 准备标定板:棋盘格、AprilTag、ArUco 标记都可以;
- 固定标定板:把标定板放在工作空间里,固定不动。
标定步骤
plaintext
第1步:机器人移动到姿态1 → 记录末端位姿 T1 → 相机拍标定板 → 算出相机位姿 C1
第2步:机器人移动到姿态2 → 记录末端位姿 T2 → 相机拍标定板 → 算出相机位姿 C2
第3步:机器人移动到姿态3 → ...
...
第N步:收集10~20组 (Ti, Ci)
数据处理
- 计算相邻位姿之间的运动:A = T2 × T1⁻¹,B = C2 × C1⁻¹;
- 得到多组 (A, B);
- 代入 AX = XB,用 Tsai-Lenz 等算法求解 X;
- 得到手眼变换矩阵 X(4×4 齐次变换矩阵,包含旋转和平移)。
验证
- 把标定结果代入,用相机看一个已知位置的物体,算出机器人坐标;
- 让机器人去抓,看误差多大;
- 误差大就重新标定,或者增加标定姿态数量。
六、ROS2 中的常用工具
表格
| 工具 | 用途 |
|---|---|
| easy_handeye | 最常用的手眼标定包,支持 eye-in-hand 和 eye-to-hand,图形界面,集成了 Tsai-Lenz 算法 |
| visp_hand2eye_calibration | 基于 ViSP 库的标定工具 |
| camera_calibration | 相机内参标定(手眼标定的前置步骤) |
| MoveIt Calibration | MoveIt 集成的标定工具 |
easy_handeye 是 ROS/ROS2 社区最主流的方案,有 rqt 面板,操作直观。
七、标定的关键技巧(影响精度)
-
姿态要分散:不要只在一个小范围动,要让机器人末端在不同位置、不同角度都有采样;
- 旋转角度要大(至少覆盖 ±30°);
- 平移范围要广;
- 姿态之间差异越大,求解越稳定。
-
标定板要清晰:
- 标定板占画面 1/3 ~ 1/2;
- 不要过曝、不要模糊;
- 标定板要固定,不能动。
-
重复精度:
- 同一姿态多拍几次,看结果是否一致;
- 机器人重复定位精度差(如步进电机臂),标定精度也会差。
-
载荷一致性:
- 标定时末端装什么,工作时就装什么(装了相机和工具的重量会让机械臂变形);
- 重力导致的变形会影响标定精度。
八、常见问题
表格
| 问题 | 原因 | 解决 |
|---|---|---|
| 标定结果每次都不一样 | 姿态太少或太集中 | 增加到 15~20 组,姿态分散 |
| 抓取偏差大 | 相机内参不准 | 先重新标定相机内参 |
| 旋转误差大 | 姿态中旋转量不足 | 增加不同角度的姿态 |
| eye-to-hand 标定失败 | 机器人末端没有标记物 | 在末端贴 AprilTag / 标定板 |
| 标定后用一段时间又不准 | 机械臂松动 / 相机移位 | 重新标定,检查安装紧固 |
九、和之前知识的联系
- 相机内参标定:解决 "相机自己的参数"(焦距、畸变),是手眼标定的前提;
- 三角测距 / 双目:解决 "相机看到的物体有多远",是 3D 感知;
- 手眼标定:解决 "相机看到的物体,在机器人坐标系里在哪",是视觉和机器人的桥梁;
- 激光雷达标定(外参):类似手眼标定,求激光雷达和机器人底盘的坐标变换,只是把 "相机" 换成 "激光雷达"。
本质上,所有多传感器系统都需要 "外参标定"—— 手眼标定是相机 + 机械臂的外参标定,激光雷达 + 底盘也是外参标定,原理相通,都是求两个坐标系之间的变换矩阵。
十、一句话总结
手眼标定就是求 "机器人的手" 和 "相机的眼" 之间的坐标变换矩阵,让相机看到的物体位置能转换成机器人能执行的运动指令。核心方程是 AX=XB,通过让机器人动多次、记录末端和相机的位姿变化来求解。它是视觉伺服、机械臂抓取、视觉引导的基础前提 —— 没有它,相机和机器人就是 "鸡同鸭讲"。
12万+

被折叠的 条评论
为什么被折叠?



