基于海康机器视觉算法平台的对位贴合项目个人理解 | CSDN原力计划

扫码参与CSDN“原力计划”
都说“纸上得来终觉浅,绝知此事要躬行”,可惜咱没这条件呀,没项目咱也不能干坐着呀,那咱发挥主观能动性,咱不是学机械的么,还好还记得一点CAD的知识,今天小杨说事,咱就“纸上谈兵”,用CAD结合公司的视觉算法平台VisionMaster来说说相机映射和对位贴合的事,如果有错误的地方,还请各位自动化前辈多多指教,毕竟网上的关于这个知识太少了。
实际的生产过程中,我们常常会碰到这样的情况,机械手从工位一吸着对象到工位二进行贴合,但是工位二我们不方便执行标定,通常的做法是在工位一执行一次标定流程,然后使用两点映射或者四点映射把工位二的相机坐标映射到工位一的相机一中。说起来很轻松,咱没实战过呀,但是咱可以模拟呀,说干就干,咱开始动手吧。
如上图所示,咱们为了验证一般性,把机械手坐标系,工位一的相机1坐标系,工位二的相机2坐标系画的夸张一些,但是在CAD图上我们是通过旋转的方式来改变两个相机的坐标系和机械手坐标系的夹角的,事先是知道相机1坐标系X轴和相机2坐标系X轴和机械手坐标系X轴的夹角分别是10°和45°。当然关于单像素精度,这里是采用一比一的方式,因为现实成像比这个更复杂,为了方便描述而已,不影响咱的用户体验。
现实场景中,咱一般碰到的都是机械手末端吸盘和末端中心不共轴的情况,那这边咱就选用最通用的12点标定来求出这个旋转中心,啥,你不知道什么是不共轴,啥是旋转中心,那你out了,赶紧看看这个博主的博客,人家讲的很详细,地址如下:
https://blog.csdn.net/KayChanGEEK/article/details/73878994
看完了那咱继续,吸盘吸着带MARK点的标定板,在相机视野里面平移9次,旋转3次,当然尽量贴近实际对象所在的平面,移动范围尽量覆盖实际对象可能出现的范围。以X方向每次平移640.3044,Y方向每次平移389.3736,角度每次旋转30°,使用海康的算法平台呢,咱一般使用相对坐标系,尽量不使用绝对坐标系。咱一般是以平移的第5点作为基准哈,所以有了下图的12点的关系以及在CAD里面的坐标数据,机械手的绝对坐标是可以从机械手的示教器读出来的,相对坐标呢,都是相对第5点的坐标哈,至于像素坐标,这里咱取的是标定板上的那个圆Mark点的圆心,这个使用一个模板匹配,位置修正,圆查找工具就完事哈。

由于咱是使用的CAD模拟,那只能使用N点标定工具,手动输入啦,对应着输入就行啦,如下图:

可以看到输完执行之后,像素精度确实是1.0,由于点是完全一一对应的,所以标定平移和旋转误差都是0,实际生产中,这里是有标定误差值的。同时,这边也算出了机械手末端中心在图像中的理论像素坐标(891.371,970.815),咱回到CAD图中,把图纸的坐标系从机械手坐标系切换到相机1坐标系,看看第五点时刻,机械手的旋转中心的像素坐标是多少,没错就是下图粗红色圆圈出来的地方,查看坐标发现是一致的。
好啦,相机1标定完成之后,咱紧接着该对两个相机进行相机映射,制作一个映射板,上面做4个Mark点,这里咱采用4个圆来模拟,同样用机械手吸盘吸着映射板,在相机1视野中进行拍摄,记录当前机械手的位置,这个地方其实是以后对象每次在相机1处的拍照位,就是图中的蓝色直线交点处,然后机械手进行平移,咱这里只进行一个X方向平移,到红色直线的交点处,记录当前的机械手位置,这是以为每次对象到相机2处的,可以叫做贴合的基准位置(但是实际上是不用建立基准的,这里可以理解为以后每次在这里对对象进行偏移贴合就行,明白的人一看就明白了哈)。

注意每次采集4个Mark点的圆心坐标,在CAD里面要切换对应的坐标系,圆心点也需要对应哈,采集的坐标如下:
然后使用相机映射模块,将四和个圆心坐标对应输入进去,注意对象点和目标点的关系即可,生成相机映射文件,其实就是一个坐标系之间的变换矩阵,如下:
当然咱可以使用工具打开这个文件可以看到矩阵的参数,里面包含了坐标系变换的旋转角度信息和平移量信息:
这里咱尝试改变映射板在相机2中的X和Y的位置,发现自始至终旋转矩阵是不变的,变化的只是平移量,可见咱之前要确定机械手的两个位置的重要性,否则平移量发生变化了,要自己修正旋转矩阵的平移量呀。
那为了进一步加深理解这个映射的关系咱来看看这个映射关系表示的是啥呗,既然是把相机2中的4点映射到相机1,那么我们直接把相机2带着4个点移动到相机1处,然后来手动检验一下,如下图:

打开映射文件,看到映射矩阵如下:
CAD切换坐标系到相机1坐标系,查看平移之后的相机2坐标系的原点在相机1中的坐标如下:
关于旋转矩阵,前面我们知道两个相机坐标系分别是逆时针转10°和顺时针转45°,那么它们之间的夹角就是55°,求解余弦值和正弦值如下,和矩阵是一致的:
至此咱所有的准备工作都结束了,那咱就开始验证贴合呗:
下图是机械手吸着实际对象进行贴合过程模拟,咱用一个矩形方便描述,注意此时机械手的吸盘并没有吸到对象的中心,由于咱刚才记住了两个固定的机械手的拍照位置,那么首先要做的是吸着对象到刚才的相机1拍照位进行图像采集,建立模板,贴合点我们模拟的对象的十字线交叉点。然后在相机2的拍照位处,假设有个目标和对象是一样的,注意此时我们只需要确保对象移动到相机2的拍照点时,目标对象的角度是一样的,我们要建立一个角度基准,然后对目标建模版,也是选择矩形的中心作为贴合点,后面做映射的时候,咱就是把这个点的像素坐标映射到相机1,再加上目标的旋转角度就可以算出机械手贴合需要走到的位置。
那咱先看最简单的情况,目标不发生角度旋转,只有平移的情况:
目标位置相对于原始位置Y方向移动了439.85,然后切换坐标系读出,当前的目标矩形中心贴合点的像素坐标为:
对象还是基准状态,切换到相机1读出对象矩形中心点的像素坐标为:
和之前映射验证一样,咱把此时的目标也映射到相机1中,也就是上图中的蓝色矩形的位置,然后搭建如下图的方案,查看使用相机映射文件进行标定转换之后的像素坐标和实际的CAD测量结果进行对比:
切换到相机1坐标系,读出目标映射过来的贴合点的坐标如下:
可见理论计算和实际结果是一致的,然后咱们使用单点对位模块来计算贴合的偏移量,输入对象和目标对应的贴合点标定转换之后的坐标以及角度偏差,计算出来的贴合偏差如下:

发现和之前的假设的偏移量是一致的,那么此时咱可以在相机1的拍照位进行便宜然后再走之前相机映射的时候的固定偏移量去到相机2处进行贴合,也可以先到相机2的拍照位然后再直接走偏移量也能实现贴合。
以上模拟的是一个简单的情况,目标和对象都有角度旋转以及XY方向偏移,这个就当做作业留给各位看官们自己验证吧,反正咱自己是验证了。当然实际生产过程更加复杂,比如相机安装反了导致坐标系之间旋转了180或者90,机械手左右手坐标系的选择,实际贴合点和拍照得到mark点是不一样的等等问题,有兴趣的可以相互探讨。
本文为CSDN原力计划获奖作品,扫描下方二维码参与CSDN原力计划
▼▼▼
◆
精彩推荐
◆
相关文章:

解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题
swift中开发选择图片上传,会使用到Tap Gesture Recognizer控件,对应 UITapGestureRecognizer API,以下是代码示例(取自IOS developer library): IBAction func selectImageFromPhotoLibrary(_ sender: UIT…

测试发现equals和hashCode与书上描述的不一样
2019独角兽企业重金招聘Python工程师标准>>> 如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。但是现实情况,两者产生的hashCode值却不相等求解? 转载于:htt…

海思3559A上编译OpenCV4.1.0源码操作步骤
1. 从https://github.com/opencv/opencv/releases 下载opencv源码opencv-4.1.0.zip并解压缩; 2. 修改最顶层的CMakeLists.txt,在第658行加入一条语句如下,fix error: pngstruct.h:30:18: fatal error: zlib.h: No such file or directory #i…

如何从零开始设计与开发一款通用模型预测调度系统 | 干货分享
机器学习模型从训练导出到生成环境部署,这个过程中涉及大量工作,会面临着各种问题与挑战,比如不断丰富的业务场景,系统需要负载种类繁多的神经网络,预测任务不均匀等,然而企业拥有的计算资源(如…

闲来无事,总结 Xcode常用快捷键
IOS模拟器home键:Command Shift H 构建应用程序:Command + B 运行app:Command + R 清理工程:Command + Shift + K 打开Xcode首选项:Command + ÿ…

openNebulafrontEnd ComputeNode 配置记录
openNebulafrontEnd ComputeNode 配置记录 1,OpenNebula nfs(file system shared) for image datastore; openNebula computeNode挂载,如果frontend与compute在同一台服务器则不用做NFS shared; 3,make raw image 4,配置过程中配置服务器网桥报错 报错信息 bringing up interfa…

武汉大学提出ARGAN:注意力循环生成对抗模型用于检测、去除图像阴影 | ICCV 2019...
作者 | 王红成出品|AI科技大本营(ID:rgznai100)【导读】如何去除一张图像中的阴影部分?在ICCV 2019会上,武汉大学的一篇论文针对这一问题提出了一种用于阴影检测和去除的注意循环生成对抗网络——ARGAN。论…

海思3559A上编译libyuv源码操作步骤
1. 下载libyuv源代码,执行: git clone https://chromium.googlesource.com/libyuv/libyuv 2. 通过CMakeLists.txt编译生成库,build.sh脚本内容如下: cmake \-DCMAKE_BUILD_TYPERELEASE \-DCMAKE_C_COMPILER/opt/hisi-linux/x86…

Cocoapods的安装以及使用(2)
Cocoapods 在网上看博客,看了好多次,都没有学会cocoapods,今天上午浪费了一上午的时间,终于算是学会了。其实也是很简单的。 iOS 新版 CocoaPods 安装流程 1.换掉现有Ruby默认源(由于好多人都没有翻墙,所…
MyEclipse10中导入的jquery文件报错(出现红叉叉,提示语法错误)
为了做一个页面特效,导入了一个jquery文件,怎想,myeclipse竟然报错说是语法错误,但是这个js文件我是从官网上下载的,不应该出错才对,百度谷歌之后终于找到了解决办法: 选中报错的js文件…

海思3559A上编译libjpeg-turbo源码操作步骤
1. 从https://github.com/libjpeg-turbo/libjpeg-turbo/releases/tag/2.0.2 下载libjpeg-turbo 2.0.2版本; 2. 脚本build.sh内容如下: cmake \-DCMAKE_BUILD_TYPERELEASE \-DCMAKE_C_COMPILER/opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarc…

免费!这里有一份开发者进阶“宝典”求带走
作为开发者,无论是前端还是后端,做机器学习还是云计算、架构,保持对技术的敏感性都是非常重要的事。新技术一般发源于人力、财力等各方面资源都很雄厚的大厂,经过时间的沉淀逐渐成为技术主流。因此,从 BAT、Google、Fa…

使用终端建立自己需要工程
cocoapods应该是时下类库比较全面的三方管理工具,使用也特别方便,你只需将别人的类库在你的 podfile中 pod "SomeoneNameLibrary" 就可以在你的工程中使用这个库,作为一个开发者,你是否也想让别人在他的项目中 pod &quo…

1.0 封装后的布局成本
2019独角兽企业重金招聘Python工程师标准>>> 1.0.1 C语言中(.c) 1. 数据和函数是分开声明的,语言本身没有支持“数据和函数”之间的关联性。 2. 这种程序方法为程序性的,由一组“分布在各个以功能为导向的函数…

通过gdb core dump方法查看程序异常时的堆栈信息
在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程…

日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的Tencent Kona JDK,分布式HTAP数据库 TBase,企业级…

iOS应用版本更新(自动提醒用户)
在#import "AppDelegate.h" 文件中的application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 方法中调用检测结果 获得发布版本的Version 比较当前版本与新上线版本做比较 UIAlertView代理方法

Bash Shell脚本编程-变量知识
Shell:GUI CLI提供交互式接口:提高效率命令行展开:~ ,{}命令别名:alias命令历史:historyGlobbing:*,?,[],[^]命令补全:$PATH指定的目录下路径补全…

FFmpeg中可执行文件ffplay用法汇总
从https://ffbinaries.com/downloads 下载最新的4.1版本的windows 64位FFplay。目前linux下的只有3.2版本的。FFplay是一个由FFmpeg和SDL库组成的简单媒体播放器,它主要用作各种FFmpeg API的测试。 通过执行以下命令将FFplay信息重定位到ffplay_help.txt文件中便于…
用Go重构C语言系统,这个抗住春晚红包的百度转发引擎承接了万亿流量
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)11 月 20 日,百度的万亿流量转发引擎 BFE 登上了 GitHub Trending Top 3,今日 Star 已突破 270。事实上,这个曾经抗住 2019 年春晚抢红包的转发引擎早已于 2019 年夏在 G…

Swift3.0带来的变化汇总系列一——字符串与基本运算符中的变化
var string "Hello-Swift" //获取某个下标后一个下标对应的字符 char"e" //swift2.2 //var char string[startIndex.successor()] //swift3.0 var char string[string.index(after: startIndex)] //获取某个下标前一个下标对应的字符 char2 "t&qu…

vc+如何添加右键弹出菜单
2019独角兽企业重金招聘Python工程师标准>>> 一、创建新工程 二、编辑菜单资源 1、添加菜单 按“CtrlR”,双击“Menu”图标2、于菜单编辑器内编辑菜单四、添加代码(红色部分) void CCMenuView::OnUpdateShow(CCmdUI* pCmdU…
EMNLP 2019 | 大规模利用单语数据提升神经机器翻译
BDTC大会官网:https://t.csdnimg.cn/q4TY作者 | 吴郦军、夏应策来源 | 微软研究院AI头条(ID:MSRAsia)编者按:目前,目标语言端的无标注单语数据已被广泛应用于在机器翻译任务中。然而,目标语言端的无标注数据…

swift 3.0 json解析、字典转模型三种方案
swift3.0发布有一段时间了,发现很多朋友在swift3.0json解析上上遇到很多问题,我这边为大家提三种常见的json方案。 1.第一种是自带的字典转模型,自带的需要实现系统的setValue方法,然后自己还要实现dictToModel方法即可解析&…

海思3559A上编译GDB源码操作步骤及简单使用
1. 从http://ftp.gnu.org/gnu/gdb/ 下载最新稳定版8.3,即gdb-8.3.tar.gz,解压缩; 2. 在gdb-8.3目录下,创建一个build.sh脚本文件,内容如下: ./configure \--prefix"$PWD/install" \--targetaar…

Hibernate之继承映射
Hibernate的继承映射可以理解为两个持久化类之间的继承关系 例如老师和人之间的关系 持久化类 Person类 public class Person { private Integer id; privvate String name; private String sex; public Person (){} // 无参构造器 p…
AutoML未来可期,工程师的明天何去何从?
人工智能和机器学习建模专业技术人才紧缺,即使是高水平的人工智能专家,在大数据智能分析机器学习建模时,主要依靠人工经验,建模过程费时费力,缺少有效方法。为了解决这一突出问题,国内外出现了一种用机器学…

海思3559A上编译Valgrind源码操作步骤
注:按照以下步骤可以在海思板子上正常编译valgrind源码并生成valgrind可执行文件,但可能还不能在海思板子上正常使用。 1. 从http://valgrind.org/downloads/?srcwww.discoversdk.com 下载Valgrind 3.15.0即valgrind-3.15.0.tar.bz2; 2. 在valgrind-3…

Swift之SDWebImage第三方框架
在学习Swift过程中,最害怕的使用了OC的第三方框架 好不容易配置成功了,却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized selector sent to instance解决办法 第一次配置的时候,因为百度了教程,所以一次性成功…

文件分区格式化及挂载
创建一个5G的分区,文件系统为ext2,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求使用卷标进行挂载,且在挂载时启动此文件系统上的acl功能;在虚拟机创…