RobotStudio教程:ABB机器人拆垛与码垛应用示教编程与虚拟仿真

news2024/11/19 5:36:22

目录

任务描述

机器人拆垛与码垛工作站创建

机器人拆垛与码垛工作流程分析

机器人位置偏移函数介绍

机器人拆垛与码垛应用示教编程

机器人拆垛与码垛虚拟仿真


任务描述

在RobotStudio软件中创建ABB机器人拆垛与码垛工作站,并示教机器人拆垛与码垛程序,实现机器人拆垛与码垛应用虚拟仿真。ABB机器人的型号规格、工具等外围设备根据实际需要自行选定。

拆垛垛块排序如下图所示,垛块长度为600mm,宽度为200mm,高度也为200mm。垛块共码放了3层,每一层码放8块。每一层的垛块横向摆放6块,竖向摆放2块,并且层与层之间垛块采用混合交叉方式码放。

码垛垛块排序与拆垛垛块排序方式基本一致,也是码放3层,每层横竖码放共8块,层与层之间也是采用混合交叉码放方式,只是码垛垛块的码放位置与拆垛垛块的码放位置为镜像对称码放,如下图所示。

机器人拆垛与码垛工作站创建

在RobotStudio软件中创建虚拟仿真项目,添加一台ABB机器人模型,机器人使用吸盘工具,可从外部导入设计好的三维模型。再添加两个托盘,并布局到合适位置,其中一个用于码放拆垛垛块,另一个用于码放码垛垛块。

按照任务描述要求,使用软件自带的模型创建功能创建码垛垛块。垛块创建好后,将垛块一层一层地码放到拆垛托盘上。在码垛托盘上也分别横竖码放两个垛块,作为机器人示教编程的位置参考。模型全部布局完成后,其效果如下图所示。

从布局创建ABB机器人虚拟系统,然后添加动态吸盘Smart组件,用来吸取与释放垛块。动态吸盘Smart组件的添加方法可参考之前发布过的文章《RobotStudio软件:机床上下料工作站机器人工具Smart组件添加》,这里不再过多介绍。

机器人拆垛与码垛工作流程分析

机器人码垛应用其实也是一种搬运应用,只是这种应用是机器人按照一定的规律重复点对点的运动路径的搬运应用。机器人拆垛应用可以看作是机器人码垛运动的逆运行。

一般情况下,机器人码垛的垛块规格、码垛的层数以及每一层垛块的码放个数、码放样式都是固定的,并且具备一定的数学运算关系,通过这个数学运算关系就能规划出机器人拆垛与码垛应用的运动路径。

如下图所示,是本例ABB机器人拆垛与码垛应用的工作原理示意图。机器人位于拆垛垛块与码垛垛块中间,也就是大地坐标系位置处,两边的垛块码放位置关于大地坐标系YZ轴所在平面镜像对称。工作时,机器人先由左侧的拆垛托盘上从右向左、从上向下依次吸取垛块;然后运动到右侧的码垛托盘处从右向左、从下向上依次释放垛块。

如果将码垛托盘上序号为1的垛块与序号为7的垛块分别作为机器人吸取垛块的示教点,以大地坐标系为参考,那么其余的垛块的示教点就可以看作是这两个垛块的示教点沿着大地坐标系X、Y、Z轴按照一定的距离的动态偏移。

机器人拆垛运动过程与码垛运动过程基本相同,只是示教点的偏移方向与码垛示教点的偏移方向在大地坐标系Y轴与Z轴方向上相反。

机器人位置偏移函数介绍

根据上述分析可知,在对机器人示教编程时,除了要用到机器人的常规运动指令外,还要用到另外一种运动功能,即机器人位置偏移函数。

市面上常见的工业机器人都具备这种位置偏移函数,当然,ABB机器人也不例外。“Offs”就是ABB机器人的位置偏移函数,它的功能是用于在已有的机器人位置的工件坐标系中添加一个偏移量。这里一定要注意,它是在机器人的工件坐标系中叠加的偏移量,其完整的函数语句格式如下图所示。

函数Offs中Point的数据类型为robtarget,其余三个偏移量的数据类型均为num。

机器人拆垛与码垛应用示教编程

在ABB机器人虚拟示教器中创建机器人拆垛与码垛例行程序,首先将机器人各个关节手动运行到合适位置,然后将当前姿态示教为机器人HOME点程序,示教点名称为pHome。

再将机器人分别手动运行到拆垛托盘上的1号、7号垛块处,以及码垛托盘上的1号、7号垛块处,并示教出这4个机器人姿态的点位程序,4个示教点分别命名为pLPick、pLPick90、pRPlace、pRPlace90。

在示教过程中,机器人TCP使用标定好的吸盘工具TCP,工件坐标系使用默认的工件坐标系(wobj0)。当然,工件坐标系也可以分别在拆垛托盘和码垛托盘上分别标定。这里要注意的是,一般情况下,在RobotStudio软件中ABB机器人默认工件坐标系(wobj0)通常与虚拟仿真环境中的大地坐标系重合。

机器人拆垛与码垛程序关键点示教完成后,根据上述工作流程分析即可编写出机器人工作逻辑判断程序以及垛块吸取与释放位置偏移程序,完整的程序代码如下图所示。

完整的ABB机器人拆垛与码垛程序代码如下所示。

MODULE Module1
	CONST robtarget pHome:=[[1405.50,0.00,1620.00],[2.35481E-8,-7.53893E-9,1,-1.77528E-16],[0,0,-1,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
	CONST robtarget pLPick:=[[1600.00,-1100.00,740.00],[1.01751E-7,-1.31278E-7,1,-7.4175E-8],[-1,-1,-1,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
	CONST robtarget pRPlace:=[[1600.00,1100.00,340.00],[9.86443E-9,-1.70914E-8,1,-1.23181E-8],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
	CONST robtarget pLPick90:=[[1400.00,-700.00,740.00],[1.50459E-7,0.707107,0.707107,-6.22807E-8],[-1,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
	CONST robtarget pRPlace90:=[[1400.00,700.00,340.00],[8.97325E-9,0.707107,0.707107,4.92759E-9],[0,-1,1,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    PERS robtarget pLPickSafety:=[[800,-700,640],[1.50459E-7,0.707107,0.707107,-6.22807E-8],[-1,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    PERS robtarget pRPlaceSafety:=[[800,700,1040],[8.97325E-9,0.707107,0.707107,4.92759E-9],[0,-1,1,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    CONST num L:=600;
    CONST num W:=200;
    CONST num H:=200;
	CONST num LHNum:=6;
    CONST num LVNum:=2;
	CONST num Layer:=3;
    PROC main()
        MoveJ pHome, v1500, fine, tVacuume;
        Reset doVacuume;
        FOR i FROM 1 TO (LHNum+LVNum)*Layer DO
            !First layer horizontal
        	IF i<=LHNum THEN
                !Pick
                pLPickSafety:=Offs(Offs(pLPick,-W*(i-1),0,-H*(Layer-3)),0,0,300);
        		MoveJ pLPickSafety, v1500, z50, tVacuume;
                MoveL Offs(pLPick,-W*(i-1),0,-H*(Layer-3)), v1000, fine, tVacuume;
                Set doVacuume;
                WaitDI diVacuumeOK,1;
                MoveL pLPickSafety, v1000, fine, tVacuume;
                !Place
                pRPlaceSafety:=Offs(Offs(pRPlace,-W*(i-1),0,H*(Layer-3)),0,0,300);
                MoveJ pRPlaceSafety, v1500, z50, tVacuume;
                MoveL Offs(pRPlace,-W*(i-1),0,H*(Layer-3)), v1000, fine, tVacuume;
                Reset doVacuume;
                WaitDI diVacuumeOK,0;
                MoveL pRPlaceSafety, v1000, fine, tVacuume;
            !First layer vertical
            ELSEIF i>LHNum AND i<=(LHNum+LVNum) THEN
                !Pick
                pLPickSafety:=Offs(Offs(pLPick90,-L*(i-LHNum-1),0,-H*(Layer-3)),0,0,300);
                MoveJ pLPickSafety, v1500, z50, tVacuume;
                MoveL Offs(pLPick90,-L*(i-LHNum-1),0,-H*(Layer-3)), v1000, fine, tVacuume;
                Set doVacuume;
                WaitDI diVacuumeOK,1;
                MoveL pLPickSafety, v1000, fine, tVacuume;
                !Place
                pRPlaceSafety:=Offs(Offs(pRPlace90,-L*(i-LHNum-1),0,H*(Layer-3)),0,0,300);
                MoveJ pRPlaceSafety, v1500, z50, tVacuume;
                MoveL Offs(pRPlace90,-L*(i-LHNum-1),0,H*(Layer-3)), v1000, fine, tVacuume;
                Reset doVacuume;
                WaitDI diVacuumeOK,0;
                MoveL pRPlaceSafety, v1000, fine, tVacuume;
            !Second layer horizontal
            ELSEIF i>LHNum+LVNum AND i<=2*(LHNum+LVNum)-LVNum THEN
                !Pick
                pLPickSafety:=Offs(Offs(pLPick,-W*(i-LHNum-LVNum-1),W,-H*(Layer-2)),0,0,300);
        		MoveJ pLPickSafety, v1500, z50, tVacuume;
                MoveL Offs(pLPick,-W*(i-LHNum-LVNum-1),W,-H*(Layer-2)), v1000, fine, tVacuume;
                Set doVacuume;
                WaitDI diVacuumeOK,1;
                MoveL pLPickSafety, v1000, fine, tVacuume;
                !Place
                pRPlaceSafety:=Offs(Offs(pRPlace,-W*(i-LHNum-LVNum-1),-W,H*(Layer-2)),0,0,300);
                MoveJ pRPlaceSafety, v1500, z50, tVacuume;
                MoveL Offs(pRPlace,-W*(i-LHNum-LVNum-1),-W,H*(Layer-2)), v1000, fine, tVacuume;
                Reset doVacuume;
                WaitDI diVacuumeOK,0;
                MoveL pRPlaceSafety, v1000, fine, tVacuume;
            !Second layer vertical
            ELSEIF i>2*(LHNum+LVNum)-LVNum AND i<=2*(LHNum+LVNum) THEN
                !Pick
                pLPickSafety:=Offs(Offs(pLPick90,-L*(i-2*LHNum-LVNum-1),-L,-H*(Layer-2)),0,0,300);
                MoveJ pLPickSafety, v1500, z50, tVacuume;
                MoveL Offs(pLPick90,-L*(i-2*LHNum-LVNum-1),-L,-H*(Layer-2)), v1000, fine, tVacuume;
                Set doVacuume;
                WaitDI diVacuumeOK,1;
                MoveL pLPickSafety, v1000, fine, tVacuume;
                !Place
                pRPlaceSafety:=Offs(Offs(pRPlace90,-L*(i-2*LHNum-LVNum-1),L,H*(Layer-2)),0,0,300);
                MoveJ pRPlaceSafety, v1500, z50, tVacuume;
                MoveL Offs(pRPlace90,-L*(i-2*LHNum-LVNum-1),L,H*(Layer-2)), v1000, fine, tVacuume;
                Reset doVacuume;
                WaitDI diVacuumeOK,0;
                MoveL pRPlaceSafety, v1000, fine, tVacuume;
            !Third layer horizontal
            ELSEIF i>2*(LHNum+LVNum) AND i<=3*(LHNum+LVNum)-LVNum THEN
                !Pick
                pLPickSafety:=Offs(Offs(pLPick,-W*(i-2*LHNum-2*LVNum-1),0,-H*(Layer-1)),0,0,300);
        		MoveJ pLPickSafety, v1500, z50, tVacuume;
                MoveL Offs(pLPick,-W*(i-2*LHNum-2*LVNum-1),0,-H*(Layer-1)), v1000, fine, tVacuume;
                Set doVacuume;
                WaitDI diVacuumeOK,1;
                MoveL pLPickSafety, v1000, fine, tVacuume;
                !Place
                pRPlaceSafety:=Offs(Offs(pRPlace,-W*(i-2*LHNum-2*LVNum-1),0,H*(Layer-1)),0,0,300);
                MoveJ pRPlaceSafety, v1500, z50, tVacuume;
                MoveL Offs(pRPlace,-W*(i-2*LHNum-2*LVNum-1),0,H*(Layer-1)), v1000, fine, tVacuume;
                Reset doVacuume;
                WaitDI diVacuumeOK,0;
                MoveL pRPlaceSafety, v1000, fine, tVacuume;
            !Third layer vertical
            ELSE
                !Pick
                pLPickSafety:=Offs(Offs(pLPick90,-L*(i-3*LHNum-2*LVNum-1),0,-H*(Layer-1)),0,0,300);
                MoveJ pLPickSafety, v1500, z50, tVacuume;
                MoveL Offs(pLPick90,-L*(i-3*LHNum-2*LVNum-1),0,-H*(Layer-1)), v1000, fine, tVacuume;
                Set doVacuume;
                WaitDI diVacuumeOK,1;
                MoveL pLPickSafety, v1000, fine, tVacuume;
                !Place
                pRPlaceSafety:=Offs(Offs(pRPlace90,-L*(i-3*LHNum-2*LVNum-1),0,H*(Layer-1)),0,0,300);
                MoveJ pRPlaceSafety, v1500, z50, tVacuume;
                MoveL Offs(pRPlace90,-L*(i-3*LHNum-2*LVNum-1),0,H*(Layer-1)), v1000, fine, tVacuume;
                Reset doVacuume;
                WaitDI diVacuumeOK,0;
                MoveL pRPlaceSafety, v1000, fine, tVacuume;
        	ENDIF
        ENDFOR
        MoveJ pHome, v1500, fine, tVacuume;
    ENDPROC
ENDMODULE

机器人拆垛与码垛虚拟仿真

在RobotStudio软件中对ABB机器人仿真运行,其中一段的仿真运行效果如下方动态图所示,可以看到机器人从拆垛托盘上吸取垛块,并按照一定的码放顺序将其码放到码垛托盘上。

 The End


上一篇:ABB机器人:工件坐标系介绍以及标定操作与使用方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql与redis数据一致性问题相关面试题

1、mysql 与 redis 如何保证数据一致性问题 1. 更新 mysql 数据&#xff0c;在手动清除 Redis 缓存 &#xff0c;在重新查询最新的数据同步到Redis 中 伪代码&#xff1a; 判断如果 redis 是为空的 则读取 mysql 同步到 redis 中 setRedis(key&#xff0c;mysql 数据) 2.更新…

法律常识(二)婚姻法解读

目录 参考 &#xff3b;重婚&#xff3d;禁止有配偶者与他人同居 &#xff3b;有配偶者与他人同居&#xff3d; &#xff3b;家庭暴力&#xff3d; 实践中对于借婚姻索取财物一般如何处理&#xff1f; 索要“彩礼”是否是婚姻法所禁止的行为&#xff1f; 实践中因夫妻一方…

【GD32F427开发板试用】多路ADC规则组同时采样 DMA进行传输数据 顺带开启FPU浮点运算

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Hello_eQN7e7 前言 开启浮点运算 加快浮点类型数据计算使用GD32F427V-START开发板的ADC1采样四路电路使用DMA1进行数据实时搬运至内存读出数据…

Spark RDD 转换算子

文章目录Spark RDD 转换算子一、Value 类型1、map (映射)2、 mapPartitions (map优化缓冲流)(1&#xff09;函数说明(2) 代码示例(2&#xff09;小案例获取每个分区的最大值3、 map 和 mapParitions 的区别4、 mapParitionsWithIndex(1) 小案例只获取第二个分区的最大值(2&…

开工干活累了,晚上不得找个陪玩打打游戏?我教你们用python找个人美声甜的

序言 好兄弟们&#xff0c;陪玩大家多少都知道亿点吧&#xff01; 漂亮妹妹超级多&#xff0c;长得又好看&#xff0c;还会萝莉音御姐音&#xff0c;滋溜~ 就是说&#xff0c;今天来带咱们来爬爬陪玩的数据&#xff0c;一起看看行情咋样~ 工欲善其事&#xff0c;必先利其器…

使用CyberController来将旧手机改造成电脑外挂

这个是我在哔哩哔哩中发现的感觉比较实用在这里发表一下使用过程中的问题和见解 原作者视频旧手机改电脑外挂-效率或将“提升300%&#xff1f;”_哔哩哔哩_bilibili 参考视频旧手机改电脑外挂&#xff0c;简陋的参考视频_手机游戏热门视频 (bilibili.com) 感谢这两位博主 这个是…

Java十大经典排序算法

目录1. 插入类排序1.1 直接插入排序1.2 希尔排序2. 选择类排序2.1 直接选择排序2.2 堆排序3. 交换类排序3.1 冒泡排序3.2 快速排序&#xff08;递归&#xff09;3.2.1 快排的优化3.3 快速排序&#xff08;非递归——栈&#xff09;4. 归并类排序4.1 二路归并排序&#xff08;递…

管理者必备的六大复盘方法工具汇总

无论是对于企业还是个人来说&#xff0c;复盘都是一个能让我们快速成长的方法&#xff0c;尤其是项目经理和PMO&#xff0c;你是带领项目团队的&#xff0c;每一次项目的完成&#xff0c;都有很多经验&#xff0c;俗话说&#xff0c;最大的浪费是经验的浪费&#xff01;复盘的作…

基础IO-文件操作函数,文件描述符,理解缓冲区

文章目录基础IO回顾c语言的文件操作函数操作系统的文件操作函数open—打开文件write—写入文件read—读文件内容感性现象理解文件文件描述符fd文件描述符的分配规则重定向重定向函数dup2输出重定向追加重定向输入重定向再次理解文件理解缓冲区感性理解缓冲区缓冲区刷新策略写一…

新的一年,建议尝试下这7个JavaScript 库

常言道“你不必重新发明轮子”。第三方库它可以帮助您以简单的方式编写复杂且耗时的功能&#xff0c;一个好的项目应当使用一些优秀的库&#xff0c;下面我推荐下&#xff0c;在你的下个项目中&#xff0c;建议用上这7 个有用的库。1、Video.jsVideo.js 是一个基于 HTML5 的视频…

跑步用挂脖耳机好还是无线耳机、公认最好的跑步耳机推荐

蓝牙耳机近几年受到市场的欢迎&#xff0c;种类越来越多&#xff0c;各类功能也日益五花八门&#xff0c;消费者很难准确的进行分辨&#xff0c;一不小心可能买到华而不实的产品。现在了解一下值得入手的蓝牙耳机&#xff0c;从多个角度对蓝牙耳机进行评估后&#xff0c;得出以…

互联网导航系统——DNS:《流浪地球2》中重启互联网的现实解读

《流浪地球2》展现了一个浩大的宇宙级工程&#xff1a;宏大壮观的万座行星发动机、拥有超强算力的量子计算机、连接天地的太空电梯……这些“硬科技”让观众大开眼界。 电影中刘德华饰演的图恒宇能否重启互联网根服务器是拯救地球任务的关键。互联网可以重启吗&#xff1f;现实…

Array.prototype.sort()排序,升降排序使用方法

sort() 方法对数组中的元素进行适当排序并返回数组。这种情况不一定稳定。默认排序顺序根据字符串 Unicode 代码点。 目录 升序降序排序法 对象可以按照某个属性排序 const months [March, Jan, Feb, Dec] months.sort() // [Dec, Feb, Jan, March] console.log(months) // …

聊聊GC是如何快速枚举根节点的

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 世界上最快乐的事&#xff0c;莫过于为理想而奋斗。——苏格拉底 文章目录什么是根节点枚举根节点枚举存在的问题如何解决根节点枚举的问题安全点安全区域HotSpot使用的是可达性分析算法&#xff0c;该算法需…

ssm高校大学校园租赁平台的设计与实现java

当今社会&#xff0c;信息技术发展快速。同时&#xff0c;随着生活水平提高&#xff0c;学生有了更大的购买力&#xff0c;这就使得闲置物品增多&#xff0c;校园里物品更新快&#xff0c;使用周期短。而且传统的校园租赁平台&#xff0c;已经不能够满足学生的需求。学院校园租…

人工智能识别图片食物

一、准备食物图片&#xff08;橘子和苹果&#xff09;二、识别学习关键代码编写public static void study() throws Exception {//学习Picture picture new Picture();//图片解析类 图片&#xff08;文件&#xff09;-三通道矩阵Config config new Config();//现有的环境业务…

一文了解WebSocket及Springboot集成WebSocket

文章目录WebSocket是什么WebSocket通信原理和机制WebSocket协议是什么WebSocket协议和Http协议有什么区别WebSocket常用在那些场景Springboot集成WebSocketpom依赖java相关代码configcomponenthtml代码页面访问效果WebSocket是什么 &#x1f34a;WebSocket是一种网络通信协议&…

Linux C编程

编写C代码 编辑器&#xff1a;vim&#xff0c;编写.c文件 编译 gcc 源文件 -o 生成可执行文件名 gcc -c&#xff1a;只编译&#xff0c;不链接&#xff0c;生成.o文件 make工具和Makefile文件 make工具&#xff1a;GNU make&#xff0c;是一个文件&#xff0c;用于将源代…

【CANoe示例分析】EthernetCanGW_Test_CN

1、工程路径 此示例工程来自于Vector官网:EthernetCanGW_Test_CN 感兴趣的可以自行下载! 2、示例目的 如何在CANoe中创建一个网关,实现转发以太网报文到多个CAN网络中。该使用案例是对CAN网络进行压力测试 3、示例内容 本示例通过执行Test Module里的测试用例Bus_load…

《电路/电路原理》—戴维宁(南)定理实战演练

前言战前准备什么是戴维南定理&#xff1f;戴维南定理&#xff08;Thevenins theorem&#xff09;标准解释&#xff1a;含独立电源的线性电阻单口网络N&#xff0c;就端口特性而言&#xff0c;可以等效为一个电压源和电阻串联的单口网络。电压源的电压等于单口网络在负载开路时…