热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

相机标定(一):机器人手眼标定

hello,大家好,这里是OAK中国,我是助手君。最近有不少小伙伴询问用OAK做机器人项目,正好助手君看到这篇优质好文&#

hello,大家好,这里是OAK中国,我是助手君。

最近有不少小伙伴询问用OAK做机器人项目,正好助手君看到这篇优质好文,分享给大家。注:本文已获取作者@张贶恩授权转载了哦,原文地址。



相机标定是机器人视觉中非常重要的一步,可以帮助机器人转换识别到的视觉信息,从而完成后续的控制工作,例如视觉抓取等等。 笔者做过一些机器人手眼标定的工作,在此用尽量简单的语言来描述下机器人手眼标定的流程。本文的目的在于让大家对于相机标定有一个感性的认知,能够知道不同条件下机器人手眼标定的流程,具体的实现方法及技术细节还需要大家自行google。


1. 坐标系标定通用方法

机器人手眼标定其实就是两个坐标系之间转换关系的标定。假设现在有两个坐标系robot和camera,并且我们已知对应的几个固定点P在这两个坐标系的坐标 robotP和 cameraP 。那么根据坐标系转换公式,我们可以得到:
[1] robotP = robotTcamera cameraP

上式中 robotTcamera 就代表我们希望求出来的相机到机器人的转换矩阵。 robotP和cameraP为补1后的“齐次坐标”: [x,y,z,1]T,这样我们的齐次坐标变换矩阵robotTcamera便可以同时包含旋转以及平移。

只要学过线性代数的同学应该都清楚,式[1]相当于就是一个N元一次方程,只要点P的个数大于我们求解的转换矩阵维度同时这些点线性不相关,我们便可以通过伪逆矩阵计算出来 robotTcamera

[2] robotTcamera = robotP(cameraP)-1

计算出来的坐标变换矩阵便可以直接应用于后续的坐标变换。现在计算出来的矩阵允许坐标进行旋转,平移,以及任意方向的缩放。如果想要把这个坐标矩阵变成刚性的变换矩阵,只需要将其左上角的旋转矩阵正交化即可,但是加了这个约束后有可能降低坐标变换精度,即刚性变换矩阵约束太多,造成欠拟合。

当坐标变换存在非线性变换时,我们也可以设计并训练一个神经网络Tnet 直接拟合两组坐标之间的关系:

[3] robotP =Tnet (cameraP)

当然一般情况下,式[2]中的线性矩阵便足以描述机器人和相机之间的坐标转换关系。引入神经网络进行非线性拟合,训练集的拟合精度会非常高,但是当训练点个数不足的时候,会发生过拟合,使得实际测试时拟合精度反而降低。

通过以上的计算我们可以知道,只要我们能够同时测量出来固定点P在两个坐标系的坐标 robotP和cameraP并且测量出来多组数据,我们就可以很方便地计算出来坐标变换矩阵。当然在实际过程中我们有可能很难同时测量出来固定点 P 在两个坐标系的坐标,在后面我会分相机和机器人的情况讨论如何用一些小trick来尽量实现这个测量目标,如何进行标定,以及如何进行标定精度的验证。


2. 相机放置在固定位置,与机器人分开(eye-to-hand)

Fig 1. 机器人eye-to-hand标定。
Fig 1. 机器人eye-to-hand标定。

我们应该养成一个习惯,即遇到问题时先考虑我们的待求量和已知量。如Fig 1 所示。在eye-to-hand的问题中,待求量为相机到机器人基座坐标系的固定转换矩阵 baseTcamera 。注意我们这里用的base而不是robot来表示机器人基座坐标系,因为需要与机器人其他部分的坐标系进行区分。机器人基座坐标系是固定不动的,而其他的关节,例如机器人末端坐标系end,是不断变化的。考虑到相机是固定在一个位置,因此相机只有相对于基座坐标系才是固定不动的,这样我们的待求量baseTcamera是一个固定参数,标定才有意义。

根据我们在节1中讨论的,我们接下来需要测量几组固定点P在机器人基座坐标系下的坐标baseP和 在相机坐标系下的坐标cameraP。那么怎么去测量这些点的坐标呢?接下来我们需要用到一个标定神器:棋盘格。

Fig 2. 棋盘格及角点识别。

Fig 2. 棋盘格及角点识别。

如Fig 2所示,我们可以通过相应的视觉算法准确地识别棋盘格的角点,具体算法在opencv,python,matlab,和ros等常用平台中都有包装好的函数,直接调用即可,在此不进行赘述。

通过识别棋盘格,我们便可以得到棋盘格角点在相机坐标系的坐标imgP,但是这是二维坐标,通过相机内参和物体的深度信息我们可以计算出来cameraP ,这个我们之后会分为3D相机和2D相机进行讨论。我们可以假设已经测量出来了cameraP ,接下来我们只要测量出来对应的棋盘格点在机器人中的坐标baseP,便可以标定出来机器人和相机之间的转换矩阵 baseTcamera。棋盘格在标定的时候,会固定在机器人的末端,而机器人的末端坐标系(end)到基座坐标系(base)可以通过机器人正向运动学计算得到。那么我们可以通过如下关系测量出来棋盘格点在机器人基座坐标系的坐标baseP :

[4]baseP = baseTendendTboardboradP

式[4] 中,baseTendendTboard分别代表机器人末端坐标系(end)到基座坐标系(base)的转换矩阵和棋盘格坐标系(board)到机器人末端坐标系(end)的转换矩阵。其中baseTend可以实时根据机器人正运动学得到,而endTboard可以通过设计一个固定尺寸的棋盘格得到。当棋盘格尺寸以及安装固定后,我们可以设棋盘格的左上角点为原点,然后测量或者根据设计尺寸得到棋盘格原点到机器人末端坐标原点的平移坐标。另外棋盘格平面一般与机器人末端平面平行,这样该原点的法向量也知道了,接下来便可以计算得到endTboardboradP 代表棋盘格角点在棋盘格坐标系下的坐标,这个同样根据设计棋盘格的尺寸得到。另外我们需要注意棋盘格的角点在机器人坐标系和在图像坐标系的顺序需要一一对应,但是一般的方形棋盘格会有旋转对称的问题,即我们无法区分出来棋盘格的原点是左上角点还是右下角点,因此手眼标定时我们也可以用下面的非对称棋盘格。
Fig 3. 非对称棋盘格及角点识别,旋转180度可以区分左上角点跟右下角点。

Fig 3. 非对称棋盘格及角点识别,旋转180度可以区分左上角点跟右下角点。

当我们根据式[4]计算得到棋盘格角点在机器人基座坐标系中的坐标baseP ,然后根据图像识别加相机内参和深度信息得到棋盘格在相机坐标系中的坐标 cameraP ,我们便可以根据节1所述的方法计算得到相机到机器人的转换矩阵:

[5] baseTcamera = baseP(cameraP)-1

接下来我会再讨论如何将棋盘格在图像中的坐标 imgP ,转换为棋盘格在相机坐标系中的坐标cameraP。


2.1. 3D相机

相机的图像坐标为二维坐标,代表了在图像中的行和列数。将二维的图像坐标转换为在相机坐标系的三维坐标,是基于需要用到相机的内参公式和深度值:
在这里插入图片描述
式[6]中z为目标点的深度值,3D相机能够测出来目标点的深度,从而能够计算出目标点的3维坐标。列数 u 和行数 v 为目标点在图像中的坐标。x,y,z代表目标点在相机坐标系下的三维坐标。 fx和 fy为焦距,用于描述像素单位和三维坐标单位之间的比例关系。 u0和 v0为相机光心在图像中的投影位置,用于计算图像原点和相机坐标系原点之间的位移。

我们通过求逆矩阵,可以根据目标点的图像坐标计算得到其三维坐标cameraP。相机内参一般相机提供方会给出,有的相机提供方还会直接提供计算好的三维点云信息。如果相机提供方只给出了一个深度图,也没有给相机内参,则需要我们通过张正友标定法,标定出来相机的内参。opencv,python,matlab等提供了完善的内参标定工具包,可以直接使用。
Fig 4. 相机内参解释。

Fig 4. 相机内参解释。


2.2. 2D相机

2.2.1. 基于平面深度z进行目标3D坐标估计

在节2.1中我们说明了3D相机的情况下由2D图像坐标转换到3D相机坐标系的方法。如果我们使用的是2D相机,那么我们便缺失了深度信息,也就是式[6]中的 z ,因此2D相机一般用于一个平面的物体识别。这样我们只需要估计出一个平面的 z 坐标,然后便可以根据式[6] 计算得到目标点在相机坐标系下的三维坐标cameraP。

2.2.2. 基于平面参考点集进行目标3D坐标估计

另外当2D相机只用于识别平面上物体的位移和旋转时,我们也可以直接通过下面这个方法直接估计目标点的位置和旋转。

在这里插入图片描述

Fig 5. 非垂直坐标系下目标点的表示。

如Fig 5所示,我们可以通过摆放三个标志物于相机视野的角落,这样识别出来三个位置点 在图像坐标系中的坐标[u0,v0]T
,[u1,v1]T, [u2,v2]T 。然后我们可以构建平行四边形,用两个坐标轴的向量去计算目标点在图像坐标系的坐标[ui,vi]T。注意这里的坐标轴不需要是直角坐标轴,从而更加符合实际情况,因为实际贴标志物时不可能做到两条坐标轴完全垂直。

在这里插入图片描述

接下来,我们在机器人末端安装探针,通过触碰标志物,得到这三个位置点在机器人基座坐标系的坐标[x0,y0,z0]T, [x1,y1,z1]T , [x2,y2,z2]T ,这三个点应该在一个平面上。因为式[9]计算出来的是一个比例关系,因此根据相似三角形的原理,我们可以计算出目标点点在机器人基座坐标系base的坐标basepi= [xi,yi,zi]T :

通过式[7]-[10]我们可以发现,通过建立一个平面中三个参考点的非直角坐标系,然后就可以将目标点的图像坐标[ui,vi]T转换为在机器人基座坐标系的三维坐标basepi= [xi,yi,zi]T 。这个方法需要目标平面与相机平面平行,但是不需要知道目标点的深度值,也不需要参考点为直角坐标系。


3. 相机固定在机器人末端(eye-in-hand)

Fig 6. 机器人eye-in-hand标定。

Fig 6. 机器人eye-in-hand标定。


3.1. 3D相机

如Fig 6所示,当相机固定于机械臂末端时,此时相机坐标系与机械臂末端坐标系的变换关系固定,而与基座坐标系的变换关系会时刻变化,因此此时我们的待求量变为了相机坐标系camera到机械臂末端坐标系end的变换矩阵endTcamera 。而根据Fig 6图中的各个坐标系的关系,我们可以列出来如下的坐标变换方程:

[11] baseP= baseTendendP=baseTendendTcameracameraP

式[11]中 baseP代表固定在某个位置的棋盘格的点到机器人基座坐标系的坐标。这个坐标的计算有两种途径:(i)在机械臂末端装上探针,直接由末端去触碰棋盘格点,根据机器人正向运动学得到的末端到基座坐标系的转换矩阵 [公式] 加上棋盘格角点到末端坐标系的坐标 baseTend ,我们可以得到固定的棋盘格角点在机器人基座坐标系的坐标 endP。(ii)接下来我们在末端装上camera,因为3D相机可以直接测量出棋盘格角点以及对应的3D坐标 baseP ,所以我们加上机器人末端到基座坐标系的转换矩阵baseTend 和相机坐标系到机器人末端坐标系的转换矩阵 endTcamera 便可以求出来棋盘格在机器人基座坐标系的坐标baseP 。不过很不幸,相机坐标系到机器人末端坐标系的转换矩阵 endTcamera是我们的待求量,我们还不知道,因此我们需要对式[11]进行下简单的变换:

[12] (baseTend)-1 basep(cameraP)-1=endTcamera

观察式[12]我们可以发现,左式中的三个变量都是已知量,因此我们便可以通过机器人触碰棋盘格加相机识别棋盘格角点3D坐标的方法,求出来相机到机器人末端坐标系的转换矩阵 endTcamera


3.2. 2D相机

正如节2.2中讨论的那样,2D相机因为无法测量深度值,因此无法直接重建出来目标物体的3D坐标信息。如果2D相机装在手臂上,那大多数是用来进行视觉伺服控制的,可以不用进行相机和机器人末端坐标系的标定。不过我们之前在节2.2.2中提出了一个基于平面参考点集的方法,在这里同样适用。只要目标物体所在工作平台的参考点集可以实时被测量到,同时我们又事先标定了这个参考点集在机器人基座坐标系的坐标,那么我们便可以通过同样的比例关系(见式[7]-[10]),计算得到目标点在机器人基座坐标系的坐标。


4. 标定结果评价

当手眼标定结束后,我们还希望对我们的标定结果进行评价。根据式[1]我们可以发现,目标点 P 在机器人坐标系中的坐标可以由两种途径获得,一种是直接通过机器人末端触碰的方式得到测量值 robotPmeasure ,另外一种是通过相机识别加标定出来的转换矩阵得到预测值 robotPpredict =robotTcameracameraP。通过测量几组不同位置的目标点,我们可以比较测量值robotPmeasure和预测值 robotPpredict =robotTcameracameraP 的距离误差。通过计算各个点的误差的均值和标准差,最终我们可以计算得出标定结果的系统误差(均值)和随机误差(标准差)。


5.总结

本文讨论了在3D/2D eye-to-hand/eye-in-hand的不同情况下,机器人手眼关系的不同的标定方法。正如我们在节1中所提到的,标定两个坐标系最直接的方式就是尽量测量出来同一组点在不同坐标系下的坐标,从而直接可以通过矩阵伪逆的方法计算出来坐标变换矩阵。当然,还有更高级的方法在不满足上述条件下的情况也可以标定出来矩阵,也就是经典的Ax=xB问题的求解,其中A,B已知,x为待求量。这个求解方法我之后有时间会再写文章进行讨论。另外还有经典的张正友相机标定法,我也会抽空进行解读。



OAK中国 | 追踪AI技术和产品新动态
公众号 | OAK视觉人工智能开发
点「这里」添加微信好友(备注来意)
戳「+关注」获取最新资讯↗↗


推荐阅读
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 读手语图像识别论文笔记2
    文章目录一、前言二、笔记1.名词解释2.流程分析上一篇快速门:读手语图像识别论文笔记1(手语识别背景和方法)一、前言一句:“做完了&#x ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 当写稿机器人真有了观点和感情,我们是该高兴还是恐惧?
    目前,写稿机器人多是撰写以数据为主的稿件,当它们能够为文章注入观点之时,这些观点真的是其所“想”吗?最近,《南 ... [详细]
  • ICRA2019最佳论文  Making Sense of Vision and Touch: SelfSupervised Learning of Multimodal Representatio
    文章目录摘要模型架构模态编码器自监督预测控制器设计策略学习控制器设计实验结论和展望会议:ICRA2019标题:《MakingSenseofVision ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
author-avatar
的撒旦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有