[ 博客首页 ]
黄杰, 2020-04-07
root[a]linuxsand.info
最近公司让我紧急做个 FANUC 机器人的拆垛仿真,需要:
前者这条约束,导致没法用 RoboDK 这样的第三方软件。
于是不得不用 FANUC 的 Roboguide 了,虽然我接触 FANUC 好些年了,但只用 Roboguide 做程序代码的仿真和基本的布局验证。
好一顿折腾,记录如下。不欢迎全文转载或部分转载,请使用超链接传播。
我会从本次任务中抽取几个主题,构成本文内容:
除去机器人模型外,需要若干基本模型,用于支持仿真。例如,搬运对象:箱子(立方体);托盘;机器人工具(吸盘)。
可以通过文件来导入,也可以在 Roboguide 内进行简单几何体的建模。模型导入或创建完毕后,依据布局图进行相应的模型摆放。
如何安装机器人工具这类操作,不在此赘述,请查找自带的帮助文档,或者按照你习惯的操作进行探索。
Roboguide 给框定的操作逻辑是,用户先想好导入的模型是什么类别(machine / fixture / part / obstacle),然后再导入。
摘录自帮助文档的《Working with Parts》章节:
Parts are objects that the robot can take actions with.
There is a direct relationship between fixtures and parts in the workcell.
Parts are used in fixtures.
Parts must be associated with a fixture and/ or with end of arm tooling before they can be used.
例如,已经导入了类别为 Part 的模型,但是它不能直接使用;用户需要将它与夹具或机器人工具关联。
下表为手工生成垛型的操作。
示意图 | 说明 |
---|---|
左图已经安装了机器人工具,放置了托盘到合适位置;箱子作为 part 已经导入(但由于未关联,因此不显示) | |
左图显示了作为 fixture 的托盘,它的基本属性(位姿等) | |
切换到托盘的 Parts 属性页,可以从中看到仿真工作站内所有的 parts,勾选某个 part 后就完成了 part 与 fixture 的关联 | |
完成关联后,作为 part 的箱子就出现在作为 fixture 的托盘上,由于 part offset 全部为零,箱子位于托盘的几何原点 | |
可以通过调整 part offset 来改变箱子在托盘上的位姿;当前只有一个箱子,点击 Add 按钮后能批量创建箱子副本 | |
进入到 place parts 页面,提供两种方式进行对象的批量产生:类似 AutoCAD 的阵列,或从文本文件导入;左图显示了使用阵列的方式创建四层箱子,每层是三行三列。 | |
创建完成后,可以看到一共有了 36 个箱子, 36 = 3 * 3 * 4,以 box[x, y, z] 的形式来表征。 |
为了实现仿真抓放,我们先配置机器人工具以实现抓取、放置的动画效果,下表的操作将机器人工具(EOAT)与 parts 关联。
示意图 | 说明 |
---|---|
以工具一(EOAT 1)为例。进入其属性页 | |
切换到 Parts 标签页,与上一章节的关联 fixture 与 part 类似,这里也是勾选 part 即可;同样可以编辑 part offset 来调整 part 在工具上的位姿。 注意:右下角有两个复选框:1)示教时可见;2)运行时可见 —— 顾名思义,前者勾选表示在示教时被关联的 part 是显示在机器人工具上的(如图),后者不勾选表示运行时被关联的 part 不会默认显示,除非调用了 Pickup 命令。需要手动测试位姿数据的合理性:将机器人移动到某个箱子上表面附近,点击左图右下角的 MoveTo ,如果不能按预期到达箱子上表面,请检查箱子的姿态。 |
将机器人工具与 part 关联后,如何实现 attach / detach 呢?Roboguide 提供了一种特别类型的程序,叫做仿真程序(Simulation program);它与真实的机器人程序(TPE / KAREL 程序)不同,只能用于仿真环境。
从 Teach 菜单添加仿真程序,例如 attach_box
:
示意图 | 说明 |
---|---|
插入 Pickup 指令,Pickup (part) From (fixture) With (tool) 用什么工具从哪里抓取什么工件,很好理解了 |
|
可以从下拉菜单中选择某个特定的 part 副本,此处选择了 box[*] ,实测效果为抓取最靠近机器人工具的 part 副本,类似于 AttachClosest 这样的语义。 |
同理,可以添加放置的程序(使用 Drop
指令)。至此完成了仿真抓放。
终于到了综合部分:如何让机器人运动到某个位姿,抓取箱子,运动到另一个位姿,放置箱子。
如果抓取位姿、放置位姿都是固定的,那么很简单:添加仿真程序,插入类似 J P[...] 100% FINE
的指令,混合 Pickup
Drop
指令就可以。
但是本任务的特点是:
好,这“一推一拉”的形势,决定了我们肯定要用聪明些的方法。
帮助文档的《Teach a program》章含有 Combining simulation and TP programs into a single animation program 小节,完成本任务需要用到仿真程序和机器人程序的结合。因为仿真程序(Simulation program)的指令和能力非常有限。
我的思路为,得到箱子位姿后,设法计算、生成两个机器人程序(APPRO.TP
/ PICK.TP
,前者为接近、离开某个箱子提供位姿数据,后者为吸取某个箱子提供位姿数据);这两个机器人程序被仿真程序调用,如下图。
细心的读者会发现,在仿真程序中使用了全局的数字寄存器 R[1]
,用以表示当前搬运哪个箱子。APPRO.TP
/ PICK.TP
会查询 R[1]
的值,来提供正确的箱子位姿,同样地,当前的箱子位姿使用了全局的位置寄存器 PR[1]
。
示意图 | 说明 |
---|---|
回到托盘:托盘属性的 part 标签页下,有 Export 按钮,点击后即可导出箱子数据 | |
导出格式为 CSV 文件,利于外部处理;打开 CSV 文件可以看到,每行是单个箱子的位姿 X Y Z RX RY RZ;这个位姿的含义是:箱子参考托盘的位姿 |
5.3 节得到了箱子参考托盘的位姿,实际使用时应该把箱子位姿变换到机器人世界坐标系下面:托盘位姿是已知的,所以箱子的绝对位姿是可以在外部算出来的。
得到箱子的绝对位姿后,至少要按照箱子的 Z 值排序,以便进行从高到低的拆垛(废话)。当吸盘比箱子大时,同层的箱子也不能随便吸取,否则就露馅了;而是应当用吸盘边角去吸取。这个涉及到计算,为了减少麻烦,本次通过设置机器人工具的 part offset 来规避。
到这里,我们已经手握 36 个处理后(排序)的箱子位姿,就可以根据如下的 FANUC TPE 程序的模板来生成 APPRO.TP
/ PICK.TP
了 (注意,下面的代码无法成功编译,仅作示意)。说白了,就是使用你熟悉的工具、编程语言进行文本处理。
点击这里下载生成的 pick.ls 程序,注意 pick.ls 是为了配合仿真程序而生成的,很冗长。
科普:TPE 程序的源文件后缀为 .ls
,可以通过 Roboguide 或 WinOLPC 编译成二进制的 .tp
,.tp
能直接被 FANUC 控制器加载执行。
/PROG PICK /ATTR OWNER = MNEDITOR; COMMENT = "" PROG_SIZE = 913; CREATE = DATE 20-03-28 TIME 11:00:00; MODIFIED = DATE 20-03-28 TIME 11:00:00; FILE_NAME = ; VERSION = 0; LINE_COUNT = 13; MEMORY_SIZE = 1197; PROTECT = READ_WRITE; TCD: STACK_SIZE = 0, TASK_PRIORITY = 50, TIME_SLICE = 0, BUSY_LAMP_OFF = 0, ABORT_REQUEST = 0, PAUSE_REQUEST = 0; DEFAULT_GROUP = 1,*,*,*,*,*,*,* ; CONTROL_CODE = 00000000 00000000; /APPL /MN 1:UTOOL_NUM[GP1]= 1 ; 2:UFRAME_NUM[GP1]= 0 ; ! 一堆运动语句; /POS ! 一堆位姿数据 /END
至此,仿真程序就能调用生成的机器人程序(包含接近、吸取、离开箱子的位姿),实现精确运动到每个箱子上表面,抓取和放置了。