机械臂进行手眼标定(眼在手上)python代码

这篇具有很好参考价值的文章主要介绍了机械臂进行手眼标定(眼在手上)python代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

执行手眼标定(eye in hand)步骤:

  1. 收集数据:使用相机拍摄多张不同角度的标定板图像,并记录相机和机械臂的位姿数据。

  2. 提取标定板角点:使用OpenCV库中的函数cv2.findChessboardCorners()提取标定板图像中的角点坐标。

  3. 计算相机内参矩阵:使用OpenCV库中的函数cv2.calibrateCamera()计算相机的内参矩阵,包括焦距、主点和畸变系数等。

  4. 计算相机外参矩阵:对于每张标定板图像,使用OpenCV库中的函数cv2.solvePnP()计算相机的外参矩阵,即相机在世界坐标系中的位姿。

  5. 计算机械臂末端在世界坐标系中的位姿:对于每个机械臂的位姿数据,使用机械臂的运动学模型计算机械臂末端在世界坐标系中的位姿。

  6. 计算相机和机械臂之间的变换矩阵:将相机在世界坐标系中的位姿和机械臂末端在世界坐标系中的位姿作为输入,使用OpenCV库中的函数cv2.solvePnP()计算相机和机械臂之间的变换矩阵。

  7. 应用手眼标定结果计算目标世界坐标:对于每个目标点的像素坐标,使用相机的内参矩阵将其转换为相机坐标系下的坐标,然后使用相机和机械臂之间的变换矩阵将其转换为机械臂末端坐标系下的坐标,最后使用机械臂的逆运动学模型计算机械臂需要运动到的关节角度,从而实现目标点的定位。文章来源地址https://www.toymoban.com/news/detail-595698.html

import cv2
import numpy as np
import rospy
from sensor_msgs.msg import Image, CameraInfo
from cv_bridge import CvBridge

# 订阅相机图像和相机信息
def image_callback(image_msg):
    global cv_image
    bridge = CvBridge()
    cv_image = bridge.imgmsg_to_cv2(image_msg, desired_encoding='bgr8')

def camera_info_callback(info_msg):
    global camera_info
    camera_info = info_msg

rospy.init_node('handeye_calibration')

# 订阅相机图像和相机信息
rospy.Subscriber('/camera/image_raw', Image, image_callback)
rospy.Subscriber('/camera/camera_info', CameraInfo, camera_info_callback)

# 获取标定板参数
pattern_size = (9, 6) # 内部角点数量
square_size = 0.0254 # 标定板方块大小
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# 定义物体点和图像点数组
object_points = []
image_points = []

# 检测标定板并提取角点
while len(image_points) < 20:
    if cv_image is not None and camera_info is not None:
        gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
        if ret:
            object_point = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
            object_point[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
            object_point *= square_size

            corners_refined = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)

            object_points.append(object_point)
            image_points.append(corners_refined)

        cv2.drawChessboardCorners(cv_image, pattern_size, corners_refined, ret)
        cv2.imshow('image', cv_image)
        cv2.waitKey(100)

# 计算相机和机械臂姿态之间的变换
camera_matrix = np.array(camera_info.K).reshape((3, 3))
dist_coeffs = np.array(camera_info.D)[:4]
object_points_array = np.array(object_points)

rvecs_camera = []
tvecs_camera = []
rvecs_robot = []
tvecs_robot = []
for i in range(len(image_points)):
    # 计算相机姿态
    success, rvec, tvec = cv2.solvePnP(
        object_points_array[i],
        image_points[i],
        camera_matrix,
        dist_coeffs)
    rvecs_camera.append(rvec)
    tvecs_camera.append(tvec)

    # 获取机械臂姿态,这里假设机械臂已经正确标定,因此可以直接使用机械臂末端执行器的位姿作为机械臂姿态
    robot_pos = get_robot_pos()
    rvecs_robot.append(robot_pos[:3])
    tvecs_robot.append(robot_pos[3:])

# 执行手眼标定
ret, H = cv2.calibrateHandEye(
    np.array(rvecs_robot),
    np.array(tvecs_robot),
    np.array(rvecs_camera),
    np.array(tvecs_camera),
    method=cv2.CALIB_HAND_EYE_TSAI)

print(f'Hand-eye transformation:\n{H}')

cv2.destroyAllWindows()

到了这里,关于机械臂进行手眼标定(眼在手上)python代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机械臂手眼标定ZED相机——眼在手外python、matlab

    目录 1.眼在手外原理 2.附上眼在手外求得手眼矩阵的python代码 3.眼在手外标定步骤 1)打印棋盘格 2)得到hand数据 3)得到camera数据 4.运行python得到手眼矩阵   眼在手外所求的手眼矩阵是基坐标到相机的转换矩阵 其中:         hand为基坐标系下抓夹的位姿,一般从示教器

    2024年02月11日
    浏览(24)
  • 机械臂与RealSense相机手眼标定

    环境: 本文主要使用kinova mico机械臂 + RealSense D435i深度相机进行了eye to hand的手眼标定。 系统环境:Ubuntu18.04,ROS Melodic 硬件:Kinova mico,RealSense D435i 特别注意:经测试,本方法有效可行,好多博客里说的运行写好的标定launch文件后,只有两个rviz界面,而没有标定的rqt_easy_

    2024年02月15日
    浏览(30)
  • 3D相机与机械臂手眼标定流程

    1.采集n组点云数据,将第一组点云命名为(点云target)基准点云    这些数据可以通过3D相机采集得到,然后通过一些处理方法(如去噪、滤波等)进一步优化。 2.采集n组点云的同时记录n组机械臂位姿,同样将第一组位姿设为基准位姿(机械臂target) 3.将获取的n组机械臂位姿由欧

    2024年02月12日
    浏览(30)
  • 利用ROS做机器人手眼标定和Qt+rviz+图片话题显示的UI设计

            博主是在上一篇博文的基础上作的研究和总结,希望这篇文章可以对诸君有用,同时博主也对鱼香ROS、小鱼大佬、以及其他相关创作者的支持表示由衷的感谢,本文章内容也将继续公开且代码开源。         文章将讲述usb_cam(usb相机内参标定)、handeye-calib(手眼标

    2024年02月21日
    浏览(38)
  • python 手眼标定OpenCV手眼标定(calibrateHandeye())二

    这一章我们来根据上一章的分析,为手眼标定函数calibrateHandEye 准备他那些麻烦的参数 更详细的参数参考链接 即R_all_end_to_base_1,T_all_end_to_base_1, 我们可用通过输入的机械臂提供的6组参数得到,3个位姿与3个欧拉角 示例代码 这里是关系是 通过 cv2.findChessboardCorners 角点查找函数

    2024年02月01日
    浏览(26)
  • python 手眼标定OpenCV手眼标定(calibrateHandeye())一

    以下代码来源 本篇博客通过该代码,附上记录的公式与查找连接,方面以后调用能弄懂各个参数的意思 本篇看完看第二篇代码踩坑部分python 手眼标定OpenCV手眼标定(calibrateHandeye())二 相机标定原理视频介绍 calibrateHandeye() 参数描述如下:R_gripper2base,t_gripper2base是机械臂抓手

    2024年02月15日
    浏览(29)
  • 机器人手眼标定原理与python实现

    机器人手眼标定分为eye in hand与eye to hand两种。介绍之前进行变量定义说明: {b}: base基坐标系 {g}: gripper夹具坐标系 {t}: target标定板坐标系 {c}: camera相机坐标系 1、眼在手上(eye in hand) 眼在手上,相机固定在机器人上。 图1. eye in hand示意图 由以上两公式得: 经变换得: 可得:

    2024年02月02日
    浏览(28)
  • Python-opencv 手眼标定(九点定位)

     Python-opencv 手眼标定(九点定位) 本文主要解决相机像素坐标转换机械臂坐标的问题,用到的opencv版本为4.5.5.64 一、手眼定位原理? 以下可以参考 基于OpenCv的机器人手眼标定(九点标定法) 主要思路就是将九点标定图放在机械臂获取范围内,得到九个圆心坐标(像素坐标

    2024年02月09日
    浏览(31)
  • 将欧拉角转换为旋转矩阵(手眼标定)python版本

    1、欧拉角版 2、四元数版 3、旋转矩阵版本 4、齐次矩阵

    2024年02月16日
    浏览(32)
  • 手眼标定必备——旋转向量转换为旋转矩阵python——罗德里格斯公式Rodrigues

    在使用matlab工具箱对相机标定后,得到的旋转向量转换为旋转矩阵   参考旋转向量和旋转矩阵的互相转换(python cv2.Rodrigues()函数)_旋转向量转旋转矩阵_FC_code的博客-CSDN博客 p为输入的旋转向量cameraParams.RotationVectors 得到旋转矩阵cameraParams.RotationMatrices 结果为 转置之后,刚好

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包