什么是手眼标定

本文详细介绍了手眼标定中的两种方法:Eye-In-Hand和Eye-To-Hand,并通过核心公式AX=XB来求解机械臂与摄像头间的坐标转换关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


为了得到相机坐标系与机器人坐标系之间的位姿关系,包括两种:eye in hand (相机安装在机械臂末端)和eye to hand (相机安装在机械臂外侧)。
手眼标定法的核心公式只有一个,AX=XB,这里的X就是指手(机械臂末端)与眼(摄像头)之间的坐标转换关系。
用Base表示机械臂的底座(可以认为是世界坐标系),用End表示机械臂的末端,用Camera表示摄像头,用Object表示标定板。

Eye-In-Hand

 所谓Eye-In-Hand,是指摄像头被安装在机械臂上。此时要求取的是,End到Camera之间的坐标转换关系,也就是X=T_(E→C)这种情况下,有两个变量是不变的:
摄像头与机械臂末端之间的坐标转换关系不变,也就是说, T_(E→C)始终不变;
标定板与机械臂底座之间的坐标转换关系不变,也就是说, T_(B→O)不变的。

把T_(B→o)按照前后两次运动展开,有
T_(B→E1) T_(E1→C1) T_(C1→O)=T_(B→E2) T_(E2→C2) T_(C2→O)
(T_(B→E2) )^(-1) T_(B→E1) T_(E1→C1)=T_(E2→C2) T_(C2→O) (T_(C1→O) )^(-1)
T_(E2→E1) T_(E1→C1)=T_(E2→C2) T_(C2→C1)
则有
A=T_(E2→E1)=(T_(B→E2) )^(-1) T_(B→E1)
B=T_(C2→C1)=T_(C2→O) (T_(C1→O) )^(-1)
X= T_(E→C)= T_(E1→C1)==T_(E2→C2)

Eye-To-Hand

 所谓Eye-To-Hand,是指摄像头被安装在一个固定不动的位置,而标定板被拿在机械臂手上。此时要求取的是,Base到Camera之间的坐标转换关系,也就是X=T_(B→C)这种情况下,有两个变量是不变的:
摄像头与机械臂底座之间的坐标转换关系不变,即T_(B→C)这始终不变;
标定板与机械臂末端之间的坐标转换关系不变,即T_(B→C)始终不变。

把T_(E→o)按照前后两次运动展开,有
T_(E1→B) T_(B→C) T_(C→O1)=T_(E2→B) T_(B→C) T_(C→O2)
(T_(E2→B) )^(-1) T_(E1→B) T_(B→C)=T_(B→C) T_(C→O2) (T_(C→O1) )^(-1)
则有
A=(T_(E2→B) )^(-1) T_(E1→B)
B=T_(C→O2) (T_(C→O1) )^(-1)
X= T_(B→C)

声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

本文转载于公众号:BFT智能机器人研究

### 手眼标定的概念及其实现方法 #### 什么是手眼标定手眼标定是通过标定算法确定相机坐标系与机械基坐标系或末端关节坐标系之间的空间变换关系。这种标定在工业自动化中至关重要,因为它使得机械能够根据视觉传感器提供的信息准确地定位和抓取目标物体[^1]。 #### 手眼标定的两种主要形式 手眼标定通常分为两种形式:**eye-to-hand** 和 **eye-in-hand**。 - 在 **eye-to-hand** 模式下,相机固定在机械外部,机械末端需要根据相机识别的目标位置进行运动调整[^3]。 - 在 **eye-in-hand** 模式下,相机安装在机械末端,机械需要根据相机实时反馈的位置信息调整自身姿态[^3]。 #### 手眼标定的实现步骤 #### 坐标系定义 手眼标定涉及多个坐标系之间的转换: - **基坐标系**:以机械基座为原点建立的坐标系。 - **末端关节坐标系(法兰末端坐标系)**:通常以机械末端法兰盘为参考点建立的坐标系。 - **工具末端坐标系**:当机械末端搭载工具时,工具自身的坐标系。 - **相机坐标系**:由视觉传感器定义的坐标系[^2]。 #### 数据采集 为了完成标定,需要采集多组数据对。每组数据包括机械末端位姿(通常用齐次变换矩阵表示)和相机观察到的标定点位置。可以通过移动机械并记录其末端位姿以及相机拍摄的图像来完成数据采集[^1]。 #### 标定算法 常用的手眼标定算法包括: - **Tsai-Lenz 方法**:基于张正友棋盘格标定法扩展而来,适合高精度场景。 - **AX=XB 方法**:通过求解齐次方程组得到相机与机械之间的相对位姿关系。 以下是使用 Python 实现 AX=XB 方法的一个简单代码示例: ```python import numpy as np from scipy.linalg import logm, expm # 假设已知的机械末端位姿列表 A_list = [np.array([[...]]), np.array([[...]])] # 替换为实际数据 # 假设已知的相机观测到的目标位姿列表 B_list = [np.array([[...]]), np.array([[...]])] # 替换为实际数据 def hand_eye_calibrate(A_list, B_list): n = len(A_list) L = np.zeros((n*6, 6)) for i in range(n): A_i = A_list[i] B_i = B_list[i] A_inv = np.linalg.inv(A_i) B_inv = np.linalg.inv(B_i) Z = logm(np.dot(A_inv, B_inv)) L[i*6:(i+1)*6, :] = np.vstack([np.real(Z), np.zeros((3, 6))]) _, _, V = np.linalg.svd(L) X_vec = V[-1, :] X_mat = expm(np.array([[X_vec[0], X_vec[1], X_vec[2], X_vec[3]], [X_vec[4], X_vec[5], 0, 0], [X_vec[6], 0, 0, 0], [0, 0, 0, 0]])) return X_mat X_mat = hand_eye_calibrate(A_list, B_list) print("手眼标定结果:", X_mat) ``` #### 标定结果验证 完成标定后,可以通过将机械移动到已知位置并检查相机是否正确识别目标来验证标定结果。如果误差较大,则可能需要重新采集数据或改进标定算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值