手眼标定之基本原理


原文首发于微信公众号【3D视觉工坊】。

一 前言

机器人的视觉系统分为固定场景视觉系统和运动的「手-眼」视觉系统。摄像机与机器人的手部末端,构成手眼视觉系统。根据摄像机与机器人相互位置的不同,手眼视觉系统分为Eye-in-Hand系统和Eye-to-Hand系统。Eye-in-Hand系统的摄像机安装在机器人手部末端(end-effector),在机器人工作过程中随机器人一起运动。Eye-to-Hand系统的摄像机安装在机器人本体外的固定位置,在机器人工作工程中不随机器人一起运动。

Eye-in-Hand系统的在工业机器人中应用比较广泛,随着机械手逐渐接近目标,摄像机与目标的距离越来越小,被测物体位置参数的绝对误差会随之降低。在Eye-in-Hand系统中,采用基于图像的视觉控制、基于位置的视觉控制以及结合两者的混合视觉控制,可以快速有效地标定被测物体的坐标。

手眼标定方法通常分为3类:标准手眼标定、基于旋转运动的手眼标定以及在线手眼标定。以上方法是将摄像机标定与手眼标定分开进行,也有的论文采用的是联合标定法。

本文重点讲解Eye-in-Hand的一般方法,重在阐述其基本原理。

二 Eye-in-Hand

2.1 基础知识准备

在研究相机标定时,已较为熟悉,在本公众号「视觉IMAX」里已有几篇文章做过总结,如:
a) 一分钟详解OpenCV之相机标定函数calibrateCamera()
b) 一分钟详解「本质矩阵」推导过程
c) 计算机视觉基本原理——RANSAC
d) 再谈「相机标定」

此处就不详细展开叙述了。

2.2 Eye-in-Hand基本原理

对目标点的空间三维坐标进行变换的过程中,首先遇到的问题是机器人末端关节坐标系与摄像机坐标系之间的位置变换关系,也就是机器人的手眼位置关系,该关系用符号X表示,具体可以用方程AX=XB求解。其中A表示相邻两次运动时机器人末端关节的变换关系;B表示相邻两次运动时摄像机坐标的相对运动。

下面,简单介绍一下本问题模型中为何会引入AX=XB模型。
如图1所示,为眼在手上,也即eye-in-hand。(本篇文章重点讨论的是双目,所以此处仅是为了演示效果图,而非真实的实验场景)。相机固定在机械臂末端,会随着机械臂的运动而运动。

图1 眼在手上

图1 眼在手上

我们会得到一堆坐标系和坐标变换关系:

  • A:机器人末端在机械臂坐标系下的位姿,这其实就是机器人运动学正解的问题。(已知)。

  • B:相机在机器人末端坐标系下的位姿,这个变换是固定的,只要知道这个变换,我们就可以随时计算相机的实际位置,所以这就是我们想求的东西。(未知,待求)

  • C:相机在标定板坐标系下的位姿,这个其实就是求解相机的外参(已知)。

  • D:相机在机器人基坐标系下的位姿。实际使用过程中标定板并不存在,所以这个变换关系我们不关心。

所以,只要我们能计算得到B变换,那么相机在机器人坐标系下的位姿D也就自然得到了。

如图2所示,我们让机械臂运动两个位置,保证这两个位置下都可以看到标定板,然后构建空间变换回路:
图2 机械臂运动到两个位置,构建变换回路

在这里插入图片描述

图3 谷歌学术搜索

在谷歌学术用关键词「AX=XB」搜索便可以得到各种求解办法,见图3所示。

以上图中的几篇论文,都很详细地给出了推导过程,按照它们写程序基本没问题。

这样,我们便有了A、B和C,就能直接求解得到我们想要的手眼标定结果D了。

前面主要是为了理清思路,对于每个部分的细节都给省略掉了,接下来进行详细说明。

1)变换A: 它是机械臂末端在机器人基座坐标系下的位姿,其实就是机器人学里面最基础的运动学正解。如图4所示。
图4 机器人运动学正解模型
用DH矩阵等方法来计算机器人运动学正解。可以参看熊有伦主编的《机器人技术基础》这本书。在实际操作中,根据机器人的示教器读出欧拉角,即可换算出机械手爪坐标系到机械臂基座的转换矩阵。

2)变换C: 它是相机在标定板坐标系下的位姿。其实就是相机的外参。如图5所示,其中的R,T 即为相机在标定板下的位姿。
图5 相机在标定板板坐标系下的位姿
在这里插入图片描述
图6 相机模型

相机模型有了,我们要做的就是先确定内参矩阵,然后根据不同时刻拍摄的标定板图片来求取外参矩阵:也即相机在世界坐标系下的变换关系C

目前来说,要解决这个问题,基本上都是采用张正友老师的方法。这个在之前的相机标定过程中,已经实现。

3)求解AX=XB。

关于这个公式的求解,对应着多种不同的解法,此处推荐一篇文章,如下:

  1. Daniilidis, Konstantinos. “Hand-eye calibration using dual quaternions.” The International Journal of Robotics Research 18.3 (1999): 286-298.

注: 在公众号【视觉IMAX】后台回复「解AX=XB」,即可获得下载上述文章的下载链接。

得到X也即手眼关系,最后得到相机坐标系到机器人基座的坐标变换关系:D=A*X。
式中A代表:机器人手抓到机器人基座坐标变换;X表示相机到机器人手抓的坐标变换。
在这里插入图片描述

以上手眼标定流程,大体可以总结如图7所示:
图7 手眼标定流程示意图

手眼标定的基本原理如上所述,至于正确性,仍需由实验进一步验证。

三 跋

在这里插入图片描述

<think>好的,用户想了解双机械臂手眼标定的方法、教程或解决方案。首先,我需要回忆手眼标定的基本概念,然后扩展到双机械臂的情况。手眼标定通常涉及确定机械臂末端执行器与摄像头(眼)之间的坐标变换关系,这在单机械臂中已经很常见,比如Eye-in-Hand和Eye-to-Hand两种模式。但双机械臂的情况会更复杂,因为涉及到两个机械臂之间的协同标定,可能需要同时考虑两个摄像头或两个末端执行器的坐标系转换。 首先,我应该确定双机械臂手眼标定的主要方法。可能包括传统的手眼标定算法扩展,比如使用AX=XB的方程,这在单臂中常见,但双臂可能需要解AX=YB这样的方程。这里,A和B可能是两个机械臂的运动变换,X和Y是需要求解的标定参数。需要查阅相关文献,确认是否存在这样的方法,或者是否有其他策略,如利用标定板同时被两个摄像头观测到,从而建立共同的参考系。 接下来,步骤可能需要分阶段。首先标定每个机械臂单独的手眼关系,然后标定两个机械臂之间的相对位姿。或者,可能需要同时标定所有参数。需要思考哪种方法更常见或更有效。此外,标定过程中可能需要特定的标定物,如棋盘格或ArUco码,以及如何在不同位置移动机械臂以收集足够的数据。 然后,教程或解决方案方面,可能需要参考一些研究论文或开源项目,比如ROS中的相关包是否有支持双机械臂标定的工具。例如,OpenCV中的相机标定功能可能适用于单个摄像头,但双臂可能需要自定义解决方案。此外,标定过程中需要考虑的误差来源,如机械臂运动误差、相机畸变校正等,也需要在步骤中提到。 用户可能需要具体的操作步骤,所以需要将流程分解为几个阶段:准备工作、数据采集、方程求解、验证。每个阶段需要详细说明,例如在数据采集阶段,双臂需要移动到多个不同位姿,同时记录各自的关节数据和相机图像,提取标定板的位姿信息。然后,利用这些数据构建方程组,通过最小二乘法或其他优化方法求解标定参数。 还需要注意双机械臂的协同工作环境,比如它们是否共享工作空间,标定板是否需要固定在一个机械臂末端,或者固定在环境中。不同的配置可能需要不同的标定策略。例如,若标定板固定在环境中,双臂的摄像头分别观测同一标定板,这样可以建立两者的坐标关系。而如果标定板安装在一个机械臂上,另一个机械臂的摄像头观测,则可能需要不同的数学处理。 可能的问题包括标定精度如何提高,如何处理噪声数据,是否需要多次标定取平均,或者使用更鲁棒的优化算法。此外,双臂之间的时间同步问题,数据采集的同步性也很关键,可能需要硬件触发或其他同步机制。 最后,相关问题的生成需要考虑用户可能的后续疑问,比如标定后的验证方法、常见问题及解决方案、标定工具的选择等。需要确保回答涵盖这些方面,并提供足够的信息供用户进一步探索。</think>### 双机械臂手眼标定方法 双机械臂手眼标定是机器人协同作业中的关键技术,需通过坐标系变换建立两个机械臂末端执行器与视觉传感器(如相机)之间的几何关系。核心问题可表述为求解方程: $$ AX = YB $$ 其中,$A$ 和 $B$ 分别为两个机械臂运动变换矩阵,$X$ 和 $Y$ 为待求的手眼矩阵和臂间坐标变换矩阵[^1]。 #### 标定步骤 1. **硬件准备** - 安装双目相机或两个独立相机(分别固定于机械臂末端或环境中) - 使用高精度标定板(如棋盘格、ArUco码) 2. **数据采集** - 控制双机械臂以不同位姿运动,同步记录: - 机械臂关节角度(转换为末端位姿矩阵) - 相机拍摄的标定板图像(通过图像处理提取标定板位姿) 3. **方程构建** - 每个运动位姿对应方程:$A_i X = Y B_i$ - 通过至少3组非共面位姿数据构建超定方程组 4. **矩阵求解** - 使用SVD分解或李代数优化方法求解$X$和$Y$ - 验证标定精度(重投影误差或末端执行器对齐测试) #### 开源工具推荐 - **ROS**:`easy_handeye`扩展支持多机械臂标定[^2] - **MATLAB**:`Computer Vision Toolbox`提供多相机标定接口 - **OpenCV**:`calibrateHandEye()`函数可实现基础手眼标定 ```python # 示例代码:使用OpenCV进行手眼标定 import cv2 import numpy as np # 机械臂末端位姿列表(4x4齐次变换矩阵) gripper_poses = [pose1, pose2, ..., poseN] # 标定板位姿列表(4x4齐次变换矩阵) target_poses = [t_pose1, t_pose2, ..., t_poseN] # 手眼标定计算 X = cv2.calibrateHandEye( gripper_poses, target_poses, method=cv2.CALIB_HAND_EYE_TSAI ) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3D视觉工坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值