首先,我们要了解一下常规的手眼标定流程是怎么样的。

(一)如果吸嘴中心就是法兰盘的中心则

是下面这样的:按九宫格走九个点,取得九组吸嘴的像素坐标与法兰盘的机械坐标

(图1)

进行标定

(二)如果吸嘴位置不在法兰盘中心

则标定流程要复杂些:人工创建工具坐标Tool 1,把工具坐标中心创建到标定片的Mark点上去

按九宫格走九个点,取得九组特征点的像素坐标与对应的机械坐标

进行标定

这里的难点是创建工具坐标的方法。

人工创建工具坐标,一般按工具向导来创建,需要第二个点同第一个点U轴差180度。对于结构紧凑的机器来说,你是不可能做到的。

即使能做到,这个过程是相当磨人的。

如果想不转180度创建工具坐标,则需要自己写算法,而不是使用工具向导来创建。

这里勇哥介绍一下同事用到的一种利用旋转中心进行标定的方法,它可以用以实现自动标定的需求。

注意:如果你得人工去创建工具坐标的话,就做不到自动标定了。

另外,自动标定是需要机器人里面写程序,IPC上写一段自动标定的程序与之配合才可以做到的。

第一步:

机器人吸嘴上放上标定片,走矩形四个位置。取得4组特征点B的像素坐标。

同时取得4组机械坐标,这个机械坐标是机器人U轴中心A的机械坐标。(这个过程简化了九点标定,只取4个点)

我们同时有了四组像素与机械坐标,用halcon算子vector_to_hom_mat2d进行标定。

此时标定的结果不是我们想要的,它只是把机器人法兰盘中心(U轴中心)的A点和特征点B标定在了一起。

因为机器人默认使用tool 0工具坐标系工作的,我们这样标定也就是把特征点和Tool 0工具坐标的中心(这个中心就是法兰盘的中心)标定在了一起。

这是我们的第一次标定,它标定出来的结果是存在一个固定偏差的,这个偏差就是法兰盘中心(u轴中心)到特征的固定的距离偏差。

标定成功后,我们获得一个标定关系的矩阵homMat2D

(图2)

第二步:

接下来进行三点定圆心的操作。如下图所示,我们通过旋转机器人法兰盘(u轴中心)的中心旋转出三个位置。

通过三个特征点B,我们可以求出通过它们的一个圆,其圆心是法兰盘中心(u轴中心)在相机坐标系中的像素坐标。

现在我们求出的圆心只是像素坐标,通过第一步的标定关系矩阵homMat2D,利用halcon算子affine_trans_point_2d可以计算出这个圆心的机械坐标。

重要的地方来了! 这个圆心的机械坐标并不是法兰盘的中心坐标,而是拥有固定偏差值的一个坐标!

注:如果只看图3,你可能很疑惑,这3个角度明明是绕着U轴中心转动的呀,为什么说这个中心不是法兰盘U轴的中心呢?

注意,这个三点的中心只是在像素坐标系里面是U轴的中心!

但是,当你把这个像素转为机械坐标时,因为你原来第一次标定时的矩阵homMat2D,里面的信息就是法兰盘中心到特征点的关系,所以此时你把圆心像素坐标转为机器坐标时,你还是用的这个矩阵homMat2D在转换。因此你转化后的机械坐标不是U轴中心,而是法兰盘到特征点机械坐标的距离。

(图3)

第三步

接下来进行第二次标定的过程。

有了第3步的Tool 0工具坐标中心的机械坐标,我们可以计算工具1和工具0的毫米偏差,并把最初标定时的Tool0下的四个特征点的机械坐标加上这个毫米偏差,使其变为Tool1下的坐标,Tool1的工具中心就是我们选取的特征点那个地方。

说人话: 法兰盘中心(u轴中心)机械坐标减去 用3点定圆那个圆心的机械坐标,求出固定偏差值。

这个固定偏差就是法兰盘到特征点机械坐标的距离!

然后我们用这个偏差值更新一下第一次标定时的四组像素与机械坐标数据,重新标定即可。

这次更新的过程其实就是把Tool0下的四组机械坐标转化为Tool1下的四组机械坐标。

可能你会说,我们目前为止根本没有Tool1呀,这个没关系,本步骤不需要Tool1,第四步才会创建Tool1坐标。那个时候用得上三点圆心的机械坐标了。

第四步

最后利用三点定圆的圆心机械坐标,我们来创建Tool 1坐标系。要实现求出工具坐标x,y的过程可以在机器人端写程序,也可以用C#代码来实现,但是创建Tool 1坐标系这一步仍然还是需要在机器人端来执行。

最后我们就达到最终的目的:

创建工具坐标Tool 1,把工具坐标中心创建到标定片的Mark点上去,然后生成四组特征点的像素坐标与机械坐标。

大功告成!

(图1:  4个标定点,3个旋转点,1个测试点)

(图2: 第一次标定)

(图3:第二次标定)

下面是标定的输出信息,请参考:CT1机械坐标:

mechanicalPosX=-22.585

mechanicalPosY=170.856

p1

{X = 1102.115 Y = 1110.051}

IsEmpty: false

X: 1102.115

Y: 1110.051

p2

{X = 289.26 Y = 1175.885}

IsEmpty: false

X: 289.26

Y: 1175.885

p3

{X = 1814.609 Y = 1332.285}

IsEmpty: false

X: 1814.609

Y: 1332.285

圆心位置:

{X = 857.9301 Y = 3146.18433}

圆心转机械坐标:

row1AfterTrans={-14.4875695091889}

col1AfterTrans={88.6095108466213}

第一次标定后的矩阵:

homMat2D:

{[-0.040066467819754, -0.000775766400971161, 22.3672349752005, 0.000818720706487857, -0.0402510697036496, 214.656297497753]}

偏差:CT1机械坐标-圆心机械坐标

//double spanX = Convert.ToDouble(mechanicalPosX) - row1AfterTrans.D;

//double spanY = Convert.ToDouble(mechanicalPosY) - col1AfterTrans.D;

spanX=-8.0974304908110746

spanY=82.246489153378647

第二次标定后的矩阵:

homMat2D:

{[-0.040066467819754, -0.000775766400971159, 14.2299334255784, 0.000818720706487857, -0.0402510697036496, 296.790879463611]}

17:10:13   等待机器人前往标定点1......

17:10:28   模板位置:0, X:438.338, Y:560.191, U:0

17:10:29   机器人到达标定点1,当前像素坐标为:457.791;445.217机械坐标为:3.703;197.128

17:10:29   等待机器人前往标定点2.....

16:55:54   模板位置:0, X:414.878, Y:1742.642, U:-0.001

16:55:55   机器人到达2号点,当前像素坐标为:434.001;1627.619机械坐标为:3.704;149.502

16:55:55   等待机器人前往标定点3......

16:56:01   模板位置:0, X:1679.666, Y:1718.163, U:0.001

16:56:02   机器人到达标定点3,当前像素坐标为:1699.957;1602.742机械坐标为:-46.975;151.532

16:56:02   等待机器人前往标定点4......

16:56:05   模板位置:0, X:1700.915, Y:601.786, U:0

16:56:06   机器人到达标定点4,当前像素坐标为:1720.958;486.131机械坐标为:-46.975;196.502

16:56:06   开始Tool0下的标定......

16:56:06   Tool0下标定完成,开始创建工具坐标

16:56:06   等待机器人前往创建工具2号点......

16:56:09   模板位置:0, X:315.584, Y:1289.472, U:-0.397

16:56:10   机器人到达创建工具2号点,当前像素坐标为:289.26;1175.885

16:56:10   等待机器人前往创建工具3号点......

16:56:13   模板位置:0, X:1754.706, Y:1432.779, U:0.366

16:56:14   机器人到达创建工具3号点,当前像素坐标为:1814.609;1332.285

16:56:14   等待机器人前往创建工具1号点......

16:56:15   模板位置:0, X:1081.994, Y:1225.572, U:0.001

16:56:16   机器人到达标创建工具1号点,当前像素坐标为:1102.115;1110.051机械坐标为:-22.585;170.856

16:59:12   Tool0工具中心经标定关系转化后的坐标为:-14.4477;88.7214

17:06:10   机器人工具1创建完成

17:06:14   模板位置:0, X:1112.962, Y:916.192, U:-0.398

17:06:15   标定精度测试结果:X偏差:0.104mm,Y偏差:0.041mm

17:06:15   标定精度较差

17:06:15   自动标定完成

本次标定成功后,tool1结果为:

x,y,z,u

82.008, 9.569, 0, 0

这里勇哥想知道的是,怎么把tool1结果转换为tool0呢?

tool0

3.703,197.128

tool1:

-4.377,279.296

显然并不是简单的把Tool0加上工具坐标这么简单。

---------------------

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!

更多工业机器人的专题请参见本站的置顶帖子。

===========================================

机器人应用,编程

机器人视觉,标定校准

机器人的坐标

===========================================

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。

收藏 | 0点赞 | 1打赏作者

halocn标定找旋转中心_一种利用旋转中心进行手眼标定的原理性介绍相关推荐

  1. 工业机器人工具中心点标定的意义_一种利用平面标定板的机器人工具中心点标定方法_2015108676182_说明书_专利查询_专利网_钻瓜专利网...

    技术领域 本发明涉及机器人工具中心点(Toolcenterpoint,TCP)标定方法,尤其涉及一种利用平面标定板的机器人工具中心点标定方法. 背景技术 机器人工具中心点(Toolcenterpoin ...

  2. 麦克风声源定位原理_一种利用麦克风阵列进行声源定位的方法与流程

    本发明涉及计算机信号处理领域,具体涉及一种用麦克风阵列时延估计定位声源的方法. 背景技术: 20世纪80年代以来,麦克风阵列信号处理技术得到迅猛的发展,并在雷达.声纳及通信中得到广泛的应用.这种阵列信 ...

  3. 分包组包 北斗通信_一种利用北斗短报文实现第三方数据双向传输的方法与流程...

    本发明涉及通信技术领域,特别涉及一种利用北斗短报文实现第三方数据双向传输的方法. 背景技术: 中国北斗卫星导航系统是中国自行研制的全球卫星导航系统,北斗RDSS是北斗系统区别于其他导航系统的特点之一, ...

  4. java编写字符串连接程序注释_一种利用JAVA注释支持多行字符串的方法

    从BeetlSql项目将SQL全放在Beetl模板里得到启发,又想到一个比较偏门的用法.以下代码实测通过,详见jSqlBox项目的test\examples\multipleLineSQL\SqlTe ...

  5. python批处理栅格转点_三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例...

    时至今日,笔者已经总结了三种用Python语言结合ArcGIS10.2提供的接口去批量处理地理数据的方法.即: 1. 用IDLE.Python Tools for Visual Studio等去编写独 ...

  6. 标定板标定和九点标定的区别_射频导纳物位计的标定方法

    射频导纳物位计使用前需要标定,为满足实际界位测量要求,根据现场条件,射频导纳物位计可以采用两种标定方法:湿标法,根据实际界位变化调整仪表的输出值进行标定的方法:干标法,利用标准电容器送电容值代替实际界 ...

  7. 机器人手眼标定快速精度验证方法

    一.原理及流程 机器人的手眼标定原理在本文中不再过多描述,基本流程都是先标定相机的内外参数,然后标定两台相机之间的位置关系,如果相机是可以转动的话,还要标定转台与机械臂之间的关系. 在手眼标定完成后, ...

  8. 利用Tsai-lenz算法实现手眼标定

    利用Tsai-lenz算法实现手眼标定 目录 利用Tsai-lenz算法实现手眼标定 自己的理解 算法的推导 标定数据的获取和使用 自己的理解 手眼标定我主要参考了 link.通过该作者的连续几篇内容 ...

  9. 手眼标定_全面细致的推导过程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 新机器视觉 本文解决的问题: 机械手搭载双目相机,手 ...

最新文章

  1. Unity 配置:typeConverter的使用
  2. UPYUN CDN 高可用架构实践
  3. [HEOI2016TJOI2016]排序(二分+线段树)
  4. mysql自增id获取失败
  5. SpringMVC(一):环境搭建
  6. 极简的 PNG 编码函数 svpng(),用来学习C语言,真的很爽
  7. php json_decode NULL
  8. 【PTA】 PAT乙级真题,95题(C++,AC代码)
  9. java 选取topn_取Oracle中实现TOPN,选取前几条记录
  10. 程序江湖:第五章 机会是一种困扰
  11. python dataframe列名_pandas 修改 DataFrame 列名
  12. Java多线程学习(三)volatile关键字
  13. Asp.Net 4.0 SEO增强之 UrlRouting
  14. 如何使用计算机中的导出,解决方案:如何使用Canon 2525i复印机将文档扫描到计算机中并生成PDF格式?...
  15. dell 恢复介质_戴尔官方WIN10恢复介质镜像下载与安装教程 | Dell 中国
  16. 微信代金券--免充值代金券创建、激活、发放,查看详情
  17. Prometheus+Grafana监控系统
  18. 三重积分(Triple Integral)
  19. iOS 仿百度外卖,饿了么-商品列表页
  20. liunx检测上下行带宽及丢包率

热门文章

  1. Python爬虫爬下IT之家图片
  2. 【实验室预约平台系统——开题报告 分享(仅供参考呀)】
  3. 关于RO、RW、ZI的说明
  4. 一款功能强大的 IP 查询工具!开源,放心用
  5. Prometheus+Grafana
  6. JavaScript基础语法_JavaScript内置对象
  7. 使用遗传算法和模拟退火改进的K均值聚类
  8. 财务自由之路--笔记
  9. antdesignpro ProTable 搜索模式自定义搜索字段
  10. python的歌曲评论数据分析_用Python爬取陈奕迅歌曲10万条评论的新发现