机械臂手眼标定-calibrateHandEye()

机械臂手眼标定是确定相机与机械臂间位姿关系的关键步骤,本文通过opencv的calibrateHandEye()函数进行讲解。介绍了眼在手上(相机在机械臂末端)和眼在手外(相机固定在世界坐标系)两种情况的标定,以及提供了基于眼在手外的代码实现示例。

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

  机械臂手眼标定主要是为了获取机械臂与相机之间的相对位姿关系。本文主要利用opencv中的calibrateHandEye()函数进行标定。
calibrateHandEye()函数

	#每个输入为多帧图像对应的变换矩阵的list->[array1,array2,...]  
    R_cam2gripper,T_cam2gripper = calibrateHandEye(R_gripper2base,T_gripper2base,R_target2camera,T_target2camera):

注:从机械臂中读取到的机械臂末端位姿即Ts_end_to_base

眼在手上

即相机被固定在机械臂末端,标定需要得到相机坐标系到机械臂末端坐标系的变换矩阵。
在这里插入图片描述
对于眼在手上的情况,calibrateHandEye()的输入输出参数为:

    """
    R_cam2gripper,T_cam2gripper = calibrateHandEye(R_gripper2base,T_gripper2base,R_target2camera,T_target2camera):
        R_gripper2base : R_end_to_base 
        T_gripper2base : T_end_to_base  
        R_target2camera : R_board_to_camera
        T_target2camera : T_board_to_camera
        R_cam2gripper : R_camera_to_end
        T_cam2gripper : T_camera_to_end
    """

眼在手外

即相机被固定在世界坐标系中某个位置,标定需要得到相机坐标系到机械臂基座坐标系的变换矩阵。
在这里插入图片描述
对于眼在手上的情况,calibrateHandEye()的输入输出参数为:

    """
    R_cam2gripper,T_cam2gripper = calibrateHandEye(R_gripper2base,T_gripper2base,R_target2camera,T_target2camera):
        R_gripper2base : R_base_to_hand 
        T_gripper2base : T_base_to_hand 
        R_target2camera : R_board_to_camera
        T_target2camera : T_board_to_camera
        R_cam2gripper : R_camera_to_base
        T_cam2gripper : T_camera_to_base
    """

代码实现(以眼在手外为例)

marker_detect.py
检测标定板特征点像素坐标,生成对应标定板3D坐标,并计算Ts_board_to_camera。

import numpy as np
import time
import cv2
import cv2.aruco as aruco

# 设置相机参数
mtx = np.array([
        [916.28, 0, 650.7],
        [0, 916.088, 352.941],
        [0, 0, 1],
    ])

dist = np.array([0, 0, 0, 0, 0])

# 欧拉角转换为旋转矩阵
def eulerAnglesToRotationMatrix(theta):
    R_x = np.array([[1,0,0],
                    [0,np.cos(theta[0]),-np.sin(theta[0])],
                    [0,np.sin(theta[0]),np.cos(theta[0])]])

    R_y = np.array([[np.cos(theta[1]),0,np.sin(theta[2])],
                    #[0,-1,0],
                    [0, 1, 0],
                    [-np.sin(theta[1]),0,np.cos(theta[1])]])

    R_z = np.array([[np.cos(theta[2]),-np.sin(theta[2]),0],
                    [np.sin(theta[2]),np.cos(theta[2]),0],
                    [0, 0,1]])

    #return np.dot(np.dot(R_z,R_y),R_x)
    # combined rotation matrix
    R = np.dot(R_z, R_y.dot(R_x))
    return R




# 标定板特征点检测 input:image
# 将检测得到的特征点按照maker的id大小排序
def aruco_detect(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    aruco_dict = aruco.Dictionary_get(
### 关于ROS中机械手眼标定 #### 基础概念与准备知识 在讨论具体实现之前,了解一些基本的概念对于理解整个过程至关重要。空间位姿和坐标系转换原理是手眼标定的基础之一[^2]。手眼标定的目标是在已知目标物体相对于摄像头位置的情况下,通过一系列变换矩阵来计算出末端执行器(通常是夹爪)相对基座的位置关系。 #### 实现方法概述 针对不同类型的配置——即“眼在手上”或“眼在外”,有不同的处理方式: - **眼在手上**:当摄像机安装在机械上时,需要先移动机械至多个预设姿态并记录对应的图像数据;之后利用这些信息求解相机到工具中心点之间的刚体运动参数。 - **眼在外面**:如果摄像机固定不动,则只需让机械携带特定标记物经过若干指定地点即可完成同样的任务。 两种情况下均涉及到`OpenCV calibrateHandEye()`函数的应用,该API能够简化上述流程中的核心运算环节。 #### 工具包介绍 为了便于开发人员快速搭建实验环境以及验证算法效果,社区提供了多种辅助资源和支持库。例如,在ROS环境下可以借助`aruco_ros package`轻松检测ArUco码,并将其作为参照物参与后续的定位工作[^1]。此外还有专门用于手眼协调训练的任务框架如`easy_handeye`等可供选用[^3]。 #### 注意事项 在整个过程中需要注意几个方面以确保最终结果的有效性和准确性: - 精确控制每次动作间的间隔距离; - 尽量减少外界干扰因素的影响程度; - 对采集的数据质量严格把关等等。 ```python import cv2 from easy_handeye.hand_eye_calibration import HandEyeCalibration calibrator = HandEyeCalibration() # 进行多次测量... result = calibrator.compute_transformation() print(f"Transform matrix:\n{result}") ```
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值