(一)关于手眼标定理论相关的笔记
上图中黄色向下的箭头表示:方程左右两边同时求逆。
内容
- 1.手眼标定的基本介绍
- 2.手眼标定中的坐标系
- 3.相机标定API:calibrateCamera( )
- 4.手眼标定API:calibrateHandEye()
- 5.求解的原理过程
通过手法确定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
①相机中心到标定板的距离: 距离越小越好
②每次运动机械臂末端运动的距离:距离越小越好
③尽量采集多组用于求解的数据
(一)关于手眼标定理论相关的笔记相关推荐
- 手眼标定+jaka机械臂
大家好,我是小鱼. 最近发的都是手眼标定相关的文章,昨天下午帮以为同学完成了手在眼外的程序标定,自我感觉之前写的代码不太友好,决定下周再更新一次,废话不多说,今天讲一讲如何使用jaka机械臂完成手眼标 ...
- 标定系列一、手眼标定基础介绍
一.手眼标定的用途 在实际的自动化工业生产中,我们常需要机械手和相机配合实现物料定位.摆正等操作过程,手眼标定的目标就是实现相机坐标系和机械手坐标系的空间映射,通俗的讲相机相当于眼睛,机械手相当于手, ...
- 基于ROS的机械臂手眼标定-基础使用
机械臂手眼标定-基础使用 你好,我是小智,前一段时间折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂.于是想做一个比较简单易懂易用的手眼标定程序. 程序都是C ...
- 标定学习笔记(六)-- Halcon手眼标定例程:Hand-eye-Calibration with a stationary cam
1 问题概述 本例程演示了如何对一个 Eye-to-Hand 问题进行手眼标定,即相机与机器人基座是固定不动的,用于进行标定的标定板则固定于机械手末端的夹具上. 在本例程中,手眼标定的目的是为了解出 ...
- 测试笔记之测试理论相关
测试理论相关
- 标定板标定和九点标定的区别_标定系列一 | 机器人手眼标定的基础理论分析
旷视MegMaster机器人系列是旷视自主研发的一系列AI智能机器人硬件设备,基于旷视全球领先的人工智能算法及机器人技术,可实现搬运.分拣.托举.存储等功能,被广泛应用于物流仓储.工厂制造等场景.旷视 ...
- matlab相机标定_【显微视界】基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...
今日光电 有人说,20世纪是电的世纪,21世纪是光的世纪:知光解电,再小的个体都可以被赋能.欢迎来到今日光电! ----与智者为伍 为创新赋能---- 标定技术 常见的机器人视觉伺服中要 ...
- matlab tsai手眼标定程序代码_标定系列一 | 机器人手眼标定的基础理论分析
旷视MegMaster机器人系列是旷视自主研发的一系列AI智能机器人硬件设备,基于旷视全球领先的人工智能算法及机器人技术,可实现搬运.分拣.托举.存储等功能,被广泛应用于物流仓储.工厂制造等场景.旷视 ...
- 经典手眼标定算法之Navy的OpenCV实现
经典手眼标定算法之Navy的OpenCV实现 在我的上一篇博客中已经介绍了Tsai的手眼标定算法,下面主要介绍Frank C. Park and Bryan J. Martin在文献Robot sen ...
最新文章
- Linux操作系统选择:Debian or Ubuntu
- 提高开发效率之VS Code基础配置篇
- 参观 Google 总部是一种什么体验?
- [转]一个总成本花费100W的失败项目的小小反省
- bzoj4819 [Sdoi2017]新生舞会 分数规划(实数二分)+网络流检验
- java处理加密文件---实现RSA算法
- 智能家居系统的总线系统和无线系统的具体介绍
- 2021年UI设计风格新风向新趋势,赶紧收藏!
- 一个很不错的远程软件TeamViewer
- figma 导入导出 fig 文件
- python按文件后缀进行分类,解放生产力
- 朋友圈加粗字体数字_微信更新!朋友圈评论能发表情包,结果变成沙雕狂欢
- Tri Tiling·递推
- html 文件常用格式
- 逸仙时空上翻的一个旧帖子
- C 递归 详解(通俗易懂)
- 中国LED芯片行业市场竞争状况分析及十si五发展趋势研究报告2021~2027年
- 【Dubbo实战】基础学习篇(一)
- 元数据管理系统的研究与实现
- [css] 你是怎么选择resetting和normalizing的?为什么?