(一)关于手眼标定理论相关的笔记

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上图中黄色向下的箭头表示:方程左右两边同时求逆。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过手法确定XYZ轴:伸出右手,大拇指是X轴方向,食指是Y轴方向,剩下的四指是Z轴方向。

1.手眼标定的基本介绍

  • 眼指的是相机,手指的是机械臂对应的夹爪。

  • 输入:机械臂位姿可以通过示教器或者SDK进行获取

  • ①眼在手上(eye In hand):即相机固定在机械臂末端,主要标定相机和机械臂末端的转换矩阵。

  • 标定过程中:标定板放在一个位置中固定不变,标定板和基底的相对位置不变,然后机械臂带着相机在不同的位姿下对标定板进行拍照,拍照的过程中保存当前拍到的标定板图片以及记录图片对应示教器上的世界坐标。

  • 输出:(眼在手上)机械臂末端(夹爪)与相机之间的位姿关系
    在这里插入图片描述
    在这里插入图片描述

  • ②眼在手外(eye To hand):即相机固定在机械臂以外的地方,主要标定相机和基底坐标系的转换矩阵。

  • 标定过程中:标定板固定在机械臂的法兰盘上,保证标定板和夹爪(法兰盘)的相对位置不变,然后相机和基底的相对位置不变,之后机械臂带着标定板去运动,相机对标定板进行拍照,拍照的过程中保存当前拍到的标定板图片以及记录图片对应示教器上的世界坐标。

  • 输出:(眼在手外)机械臂基座与相机之间的位姿态关系
    在这里插入图片描述
    在这里插入图片描述

2.手眼标定中的坐标系

  • 手眼标定坐标系表示:
  • 机械臂基底坐标系–base
  • 机械臂末端坐标系–end机械臂末端的夹爪坐标系–gripper法兰上的工具坐标系–tool(我看了好多资料,这个的叫法都不一样,但意思都差不多,看别人的源码时要搞清楚是哪个坐标系)
  • 相机坐标系–camera
  • 标定板坐标系–board目标标定板坐标系–target

(手眼标定的实质就是两个点在这四个坐标系中的转换。)

3.相机标定API:calibrateCamera( )

double cv::calibrateCamera	(InputArrayOfArrays objectPoints,
							 InputArrayOfArrays imagePoints,
							 Size imageSize,
							 InputOutputArray cameraMatrix,
							 InputOutputArray distCoeffs,
							 OutputArrayOfArrays rvecs,
							 OutputArrayOfArrays tvecs,
							 OutputArray stdDeviationsIntrinsics,
							 OutputArray stdDeviationsExtrinsics,
							 OutputArray perViewErrors,
							 int flags = 0,
							 TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) 
)		
double cv::calibrateCamera	(InputArrayOfArrays objectPoints,
                             InputArrayOfArrays imagePoints,
                             Size imageSize,
                             InputOutputArray cameraMatrix,
                             InputOutputArray distCoeffs,
                             OutputArrayOfArrays rvecs,
                             OutputArrayOfArrays tvecs,
                             int flags = 0,
                             TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) 
)		

官网介绍:
https://docs.opencv.org/3.2.0/d9/d0c/group__calib3d.html#ga3207604e4b1a1758aa66acb6ed5aa65d

  • 参数:
  • 输入:objectPoints
    表示世界坐标系中的点。在使用时,类型为vector<vector<Point3f>>,用于保存不同图片标定板上角点的三维坐标。
  • 输入:imagePoints
    表示对应的图像点,即检测到的所有角点,类型为vector<vector<Point2f>>
  • 输入:imageSize
    标定图像的像素大小,在计算相机的内参数和畸变矩阵需要用到。
  • 输入:cameraMatrix
    相机的内参数矩阵(3×3),输入一个Mat cameraMatrix即可。
  • 输入:distCoeffs
    相机的5个畸变系数:k1,k2,p1,p2,k3,输入一个Mat distCoeffs即可。
  • 输出:rvecs
    输出每张图像(vector<vector<Point3f>>)的旋转向量,类型为vector<Mat> rvecs;
  • 输出:tvecs
    输出每张图像(vector<vector<Point3f>>)的平移向量,类型为vector<Mat> tvecsMat;
  • 输出:stdDeviationsIntrinsics
    内参数的输出向量,输出顺序为: (fx,fy,cx,cy,k1,k2,p1,p2,k3,k4,k5,k6,s1,s2,s3,s4,τx,τy) ,如果不估计其中某一个参数,值等于0。
  • 输出:stdDeviationsExtrinsics
    外参数的输出向量,输出顺序: (R1,T1,…,RM,TM) ,M是标定图片的个数, Ri,Ti 是1x3的向量 。
  • 输出:perViewErrors
    表示每张标定图片的重投影均方根误差的输出向量。
  • 输入:flags
    表示不同的标志,可以为0或以下值的组合
    在这里插入图片描述
  • 输入:criteria
    表示迭代优化算法的终止准则。

4.手眼标定API:calibrateHandEye()

#include <opencv2/calib3d.hpp>

cv::calibrateHandEye(InputArrayOfArrays R_gripper2base,
					 InputArrayOfArrays t_gripper2base,
					 InputArrayOfArrays R_target2cam,
					 InputArrayOfArrays t_target2cam,
					 OutputArray R_cam2gripper,
					 OutputArray t_cam2gripper,
					 HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI 
)	

官网介绍:
https://docs.opencv.org/4.5.3/d9/d0c/group__calib3d.html#gaebfc1c9f7434196a374c382abf43439b

在这里插入图片描述

  • 参数:
  • 输入:R_gripper2base
    描述为将在机械臂末端坐标系(夹爪坐标系,gripper)中的点转换到机器人基坐标系(base)中。表示机械臂末端坐标系(夹爪坐标系,gripper)到机器人基坐标系(base)的变换矩阵中的旋转矩阵部分,包含了3x3的旋转矩阵和3x1的旋转向量。
  • 输入:t_gripper2base
    和R_gripper2base同理,表示的是平移向量的部分。
  • 输入:R_target2cam
    描述为将在目标标定板坐标系(target)中的点转换到相机坐标系(cam)中。表示目标标定板坐标系(target)到相机坐标系(cam)的变换矩阵中的旋转矩阵部分,包含了3x3的旋转矩阵和3x1的旋转向量。
  • 输入:t_target2cam
    和R_target2cam同理,表示的是平移向量的部分。
  • 输出:R_cam2gripper
    描述为将在相机坐标系(cam)中的点转换到机械臂末端坐标系(夹爪坐标系,gripper)中。表示相机坐标系(cam)到机械臂末端坐标系(夹爪坐标系,gripper)的变换矩阵中的旋转矩阵部分,包含了3x3的旋转矩阵和3x1的旋转向量。
  • 输出:t_cam2gripper
    和R_cam2gripper同理,表示的是平移向量的部分。
  • 输入:method = CALIB_HAND_EYE_TSAI
    有五种计算方法,一般选择TSAI。

5.求解的原理过程

推荐看这个视频:【标定】机器人手眼标定-方法及原理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  在我的程序中,并未使用OpenCV的solvePnP()函数来计算每张标定板图片的旋转矩阵R平移向量t
  而是通过projectPoints()函数得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的二维投影点。
  然后通过Rodrigues()函数将旋转向量转换为相对应的旋转矩阵。
在这里插入图片描述
在这里插入图片描述
在calibrateHandEye()函数中,看下其中的输入输出参数,按字面理解的意思和我程序中的源码不同。。。。。。。。。。回头看看。
在这里插入图片描述
  上图中的公式解读(看着很绕,实际就是点在四个坐标系之间的相互转换):
     Pb = bT gPg = bTg gTc Pc = bTg gTc cTt Pt

在基地坐标系(base)中的P点位置
= 夹爪坐标系(gripper)到机器人基底坐标系(base)的变换矩阵在夹爪坐标系(gripper)中的P点位置
= 夹爪坐标系(gripper)到机器人基底坐标系(base)的变换矩阵相机坐标系(camera)到夹爪坐标系(gripper)的变换矩阵在相机坐标系(camera)中的P点位置
= 夹爪坐标系(gripper)到机器人基底坐标系(base)的变换矩阵相机坐标系(camera)到夹爪坐标系(gripper)的变换矩阵目标标定板坐标系(target)到相机坐标系(camera)的变换矩阵在目标标定板坐标系(target)中的P点位置

参考博文:
手眼标定calibrateHandEye()
手眼标定源码相关的参考博客:
https://blog.csdn.net/weixin_42203839/article/details/103882739
https://blog.csdn.net/hellohake/article/details/104808149
手眼标定的实际演示:
https://live.csdn.net/v/177543

推荐手眼标定参考的博主:https://blog.csdn.net/qq_27865227/category_11281986.html?spm=1001.2014.3001.5482

弧度和角度之间的转换计算器:http://www.ab126.com/geometric/10631.html
三维旋转转换器:https://www.andre-gaschler.com/rotationconverter/
四元数和欧拉角转换器:https://quaternions.online/

关于手眼标定中的一些名词解释:https://blog.csdn.net/qq_27865227/article/details/119650554
手眼标定中准确性的提高思路:https://blog.csdn.net/qq_27865227/article/details/119650675
手眼标定的源码:https://blog.csdn.net/qq_27865227/article/details/119681638
①相机中心到标定板的距离: 距离越小越好
②每次运动机械臂末端运动的距离:距离越小越好
③尽量采集多组用于求解的数据

  • 12
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值