3D相机机器人手眼标定(眼在手上)全过程

本文详细介绍了如何进行3D相机与机器人手眼标定的过程,强调了机器人参数准确性的重要性。首先,需确保机器人标定准确,然后选择合适的标定板,如OpenCV的棋盘格。接着,安装好机器人和3D相机,并通过收集不同视角下的有效图片及对应机器人状态数据。使用OpenCV进行内外参计算,包括初始化参数、计算角点、亚像素定位等步骤,最后评估标定误差。通过这一系列步骤,完成手眼标定的全过程。
摘要由CSDN通过智能技术生成

3D相机机器人手眼标定(眼在手上)全过程

简述

目前在机器人高层规划中,机器人越来越依赖于摄像头的反馈信息,比如自动打磨,焊接,喷涂的智能规划,或者一些分拣,码垛的规划. 在项目开始前, 第一步要做的一定是给机器人和摄像头进行标定. 那么如何结合机器人标定摄像头就是本片要讨论的问题. 本片接下来就是记录我自己做的标定全过程.

标定摄像头前一定要先标定机器人

手眼标定非常依赖机器人给出的参数,如果参数不准确,一定会影响到标定结果. 而且还很难察觉. 否则,会浪费大量时间在检查摄像头标定步骤中, 却忽略机器人参数本身.

选取好的标定板

标定板也很重要, 简单的棋盘格标定板可以从opencv官网上链接下载并打印. 如果追求精度,那就要在淘宝上购买更精确的标定板. 为了追求精确度,就不要省钱了.

计算标定板的角点

在这里插入图片描述
上图为opencv的棋盘标定板, 角点计算是算这个棋盘的内部角点(也就是正方块的角), 就是说边缘部分的角是不算的. 那么从左往右数,这个棋盘的长中,角点有九个, 宽中角点有6个. 就是说这个棋盘是6*9的

安装好手眼

在这里插入图片描述
如图安装好机器人和相机, 该相机安装在机器人的末端,所以就是眼在手上的机器人标定.

开始标定

手眼标定原理

手眼标定的原理我就不在这里探讨了,我贴一段别人的博客,可以去看那里.
https://blog.csdn.net/yaked/article/details/77161160

参数收集

第一步就是先把足够的参数收集起来 然后再统一计算. 那么需要哪些参数呢

  1. 标定棋盘参数, 比如我们的棋盘如上是6*9的, 棋盘的宽度, 我算了下大概是23.8mm
  2. 机器人一个随机位置下的可以拍摄到该标定板的有效图片
    解释起来就是把机器人随机移动,装换相机的一个视角去观察这个标定板, 如果该视角下看不到,或者只
    看到一小部分标定板,那么该图片无效,我们要把有效的图片记录下来,那么尽量让机器人移动到一个位置下, 相机能拍摄到标定板全貌. 然后记录保存该图片
  3. 记录该图片拍摄下的机器人状态(6轴状态)
  4. 重复2和3步骤, 20次.
    解释下,也就是获得20组图片对应机器人状态的数据. 但不一定是20组, 看你自己吧.

计算

用opencv计算出内外参比较简单具体的做法可以直接看官方教程

https://docs.opencv.org/4.4.0/dc/dbb/tutorial_py_calibration.html

具体的方法讲解
  1. 初始化准备参数
	A = n_long * side
    B = n_short * side
    # termination criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
  1. 准备好标定板的世界3d坐标
	objp = np.zeros((n_short*n_long,3), np.float32)
    objp[:,:2] = np.mgrid[0:A:side,0:B:side].T.reshape(-1,2)
    # Arrays to store object points and image points from all the images.
    objpoints = [] # 3d point in real world space
    imgpoints = [] # 2d points in image plane.
    axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3) * side
    rvecs = []
    tvecs = []
  1. 迭代获取的图片参数步骤
    具体的cv函数用法可以看这篇博客
    https://blog.csdn.net/weixin_41695564/article/details/80422329或者看opencv官网
    3.1 获得灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

3.2 计算棋盘标定板的角点

ret, corners = cv2.findChessboardCorners(gray, (n_long,n_short),None)

3.3 进一步在获得的角点参数下亚像素信息

corners2 = cv2.cornerSubPix(gray,corners,(15,15),(-1,-1),criteria)

3.4 重复上述3.1到3.3的迭代获取多组亚像素信息

3.5 计算相机的内外参

 ret, mtx, disto, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],intrinsic,disto)

3.6 计算误差

    for i in range(len(images)):
        imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, disto)
        error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
        mean_error += error
    print("mean error: ", mean_error/len(objpoints))

至此为利用opencv计算内外参的手眼标定全部过程. 当然具体要根据自己的项目情况来优化代码.

手眼标定是一种机器人视觉引导控制的技术,其目的是通过计算机视觉技术将机器人工具(例如相机)与机器人末端执行器之间的转换矩阵进行计算,从而实现精准的机器人控制。在手眼标定中,相机和机械臂的位置都是已知的,因此可以通过采集相机和机械臂在不同位置下的图像来计算出相机和机械臂之间的变换矩阵。 在Python中,可以使用OpenCV库进行手眼标定。以下是一个简单的手眼标定的Python代码示例: ```python import numpy as np import cv2 # 定义机器人末端执行器和相机之间的变换矩阵 Tc = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) Te = np.array([[1, 0, 0, 0.1], [0, 1, 0, 0.2], [0, 0, 1, 0.3], [0, 0, 0, 1]]) # 定义相机内参矩阵和畸变系数 K = np.array([[100, 0, 320], [0, 100, 240], [0, 0, 1]]) distCoeffs = np.array([0, 0, 0, 0]) # 定义相机拍摄的机器人姿态和相机图像的点集 robot_poses = [] image_points = [] # 通过机器人移动获取机器人姿态和相机图像的点集 # 使用OpenCV进行手眼标定 retval, R, t = cv2.calibrateHandEye(robot_poses, image_points, Tc, Te, K, distCoeffs, cv2.CALIB_HAND_EYE_TSAI) # 输出机器人末端执行器和相机之间的转换矩阵 print("Transformation Matrix: ") print(np.vstack((np.hstack((R, t)), np.array([0, 0, 0, 1])))) ``` 需要注意的是,在进行手眼标定时,需要采集足够数量的机器人姿态和相机图像的点集,并且这些点集需要保证其空间位置和姿态关系已知。另外,在手眼标定时,需要确保相机和机械臂之间的坐标系定义一致,否则会影响标定的精度。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值