惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
Webroot Blog
Webroot Blog
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
H
Heimdal Security Blog
H
Help Net Security
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
F
Full Disclosure
小众软件
小众软件
S
Securelist
罗磊的独立博客
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
S
Schneier on Security
D
DataBreaches.Net
M
MIT News - Artificial intelligence
V
Vulnerabilities – Threatpost
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
F
Fortinet All Blogs
T
Tenable Blog
The Register - Security
The Register - Security
C
Check Point Blog
AWS News Blog
AWS News Blog
Cloudbric
Cloudbric
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google Online Security Blog
Google Online Security Blog
博客园 - 叶小钗
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 司徒正美

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误 Ubuntu 使用 Clash For Linux 客户端
手眼标定
Yiwei Zhang · 2025-05-13 · via 又见苍岚

在机器人学和数学中,手眼标定问题(也成为“机器人-传感器”或“机器人-世界”标定问题)是确定机器人末端执行器与传感器(相机或激光扫描仪)之间或机器人底座与世界坐标系之间的转换的问题。

简介

手眼标定是确定视觉传感器(如相机、3D扫描仪)坐标系与机器人坐标系之间空间转换关系的过程,核心目标是实现视觉数据与机械臂操作的精准关联35。根据传感器安装位置分为两类:

  • ‌**Eye-in-Hand(眼在手上)**‌:相机固定于机械臂末端,随臂运动38;
  • ‌**Eye-to-Hand(眼固定)**‌:相机独立安装于环境中,观测机械臂运动56。

核心目的

通过标定矩阵(旋转矩阵与平移向量)实现:

  1. 将相机捕获的点云数据映射至机器人坐标系,指导机械臂执行抓取、装配等任务46;
  2. 减少因视觉误差导致的机械臂定位偏差,提升工业自动化精度17。

关键技术方法

  1. 传统标定算法
    • 基于 ‌AX=XB‌ 方程求解变换矩阵,需结合机械臂末端位姿(TEndBase)与标定板位姿(TCalTargetCam)构建方程组38;
    • 通过多次运动采集多组数据,利用最小二乘法或奇异值分解(SVD)优化解算35。
  2. 现代优化方法
    • 动态环境感知‌:引入振动补偿与闭环重投影误差优化,降低环境干扰导致的标定失败率2;
    • 路径规划增强‌:采用螺旋/网格运动路径,提升标定数据采集的效率和覆盖范围

方法说明: https://campar.in.tum.de/Chair/HandEyeCalibration

眼在手上 (Eye In Hand)

相机(眼睛)安装在机器人夹具末端(手),估计末端坐标系到相机坐标系的变换 $^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$ 的公式求解。

眼在手外 (Eye To Hand)

眼在手外的手眼标定, 通过固定相机和机械臂基坐, 用相机拍摄机械臂末端, 末端粘贴标定板, 此时记录机械臂夹爪位姿, 相机通过 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$ 的公式求解。

求解AX=XB

按照实现原理可以将所有方法分为三类:

  • 独立闭式解 (seperable closed-form solutions): 与位移分量分开求解旋转分量。

缺点: 旋转分量Rx的计算误差会被带入位移分量tx的计算中。

  • 同时闭式解 (simultaneous closed-form solutions): 同时求解位移分量和旋转分量

缺点: 由于噪声的影响,旋转分量Rx的求解可能不一定是正交矩阵。因此,必须对旋转分量采取正交化步骤。然而,相应的位移分量没有被重新计算,这会导致求解错误。

  • 迭代方法 (iterative solutions): 使用优化技术迭代求解旋转分量和平移分量。

缺点: 这种方式计算量可能很大,因为这些方法通常包含复杂的优化程序。此外,随着方程数量(n)变大,迭代解与封闭式解之间的差异通常会变小。因此,使用此方法前必须决定迭代解决方案的准确性是否值得计算成本。

OpenCV 实现

OpenCV 中的 calibrateHandEye 方法实现了手眼标定的功能.

1
R_cam2gripper, t_cam2gripper = cv.calibrateHandEye(R_gripper2base, t_gripper2base, R_target2cam,t_target2cam, method) 
  • 参数说明:

    参数 说明
    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_gripper2baseR_target2cam 是否为合法旋转矩阵(正交且行列式为 1)。

参考资料

文章链接:
https://www.zywvvd.com/notes/3d/opencv/cali-hand-eye-cv-intr/cali-hand-eye-cv-intr/