使用 FANUC Roboguide 进行拆垛应用仿真

[ 博客首页 ]
黄杰, 2020-04-07
root[a]linuxsand.info

最近公司让我紧急做个 FANUC 机器人的拆垛仿真,需要:

  1. 评估循环时间
  2. 仿真需要有吸取放置的效果

前者这条约束,导致没法用 RoboDK 这样的第三方软件。

于是不得不用 FANUC 的 Roboguide 了,虽然我接触 FANUC 好些年了,但只用 Roboguide 做程序代码的仿真和基本的布局验证。

好一顿折腾,记录如下。不欢迎全文转载或部分转载,请使用超链接传播


我会从本次任务中抽取几个主题,构成本文内容:

  1. 基本的建模
  2. 概念:Part / Fixture
  3. 手动生成垛型
  4. 实现仿真抓放
  5. 混合使用机器人程序(TPE)和仿真程序

1. 基本的建模

除去机器人模型外,需要若干基本模型,用于支持仿真。例如,搬运对象:箱子(立方体);托盘;机器人工具(吸盘)。

可以通过文件来导入,也可以在 Roboguide 内进行简单几何体的建模。模型导入或创建完毕后,依据布局图进行相应的模型摆放。

如何安装机器人工具这类操作,不在此赘述,请查找自带的帮助文档,或者按照你习惯的操作进行探索。

Roboguide 给框定的操作逻辑是,用户先想好导入的模型是什么类别(machine / fixture / part / obstacle),然后再导入。

2. 概念:Part / Fixture

摘录自帮助文档的《Working with Parts》章节:

例如,已经导入了类别为 Part 的模型,但是它不能直接使用;用户需要将它与夹具或机器人工具关联。

3. 手动生成垛型

下表为手工生成垛型的操作。

示意图 说明
左图已经安装了机器人工具,放置了托盘到合适位置;箱子作为 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] 的形式来表征。

4. 实现仿真抓放

为了实现仿真抓放,我们先配置机器人工具以实现抓取、放置的动画效果,下表的操作将机器人工具(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 指令)。至此完成了仿真抓放。

5. 混合使用机器人程序(TPE)和仿真程序

终于到了综合部分:如何让机器人运动到某个位姿,抓取箱子,运动到另一个位姿,放置箱子。

如果抓取位姿、放置位姿都是固定的,那么很简单:添加仿真程序,插入类似 J P[...] 100% FINE 的指令,混合 Pickup Drop 指令就可以。

但是本任务的特点是:

好,这“一推一拉”的形势,决定了我们肯定要用聪明些的方法。

5.1 仿真程序的限制

帮助文档的《Teach a program》章含有 Combining simulation and TP programs into a single animation program 小节,完成本任务需要用到仿真程序和机器人程序的结合。因为仿真程序(Simulation program)的指令和能力非常有限。

5.2 思路分解

  1. 设法得到所有箱子的位姿
  2. 在程序中设法利用上一步的箱子位姿

我的思路为,得到箱子位姿后,设法计算、生成两个机器人程序(APPRO.TP / PICK.TP,前者为接近、离开某个箱子提供位姿数据,后者为吸取某个箱子提供位姿数据);这两个机器人程序被仿真程序调用,如下图。

细心的读者会发现,在仿真程序中使用了全局的数字寄存器 R[1],用以表示当前搬运哪个箱子。APPRO.TP / PICK.TP 会查询 R[1] 的值,来提供正确的箱子位姿,同样地,当前的箱子位姿使用了全局的位置寄存器 PR[1]

5.3 得到箱子们的位姿

示意图 说明
回到托盘:托盘属性的 part 标签页下,有 Export 按钮,点击后即可导出箱子数据
导出格式为 CSV 文件,利于外部处理;打开 CSV 文件可以看到,每行是单个箱子的位姿 X Y Z RX RY RZ;这个位姿的含义是:箱子参考托盘的位姿

5.4 箱子位姿数据处理

5.3 节得到了箱子参考托盘的位姿,实际使用时应该把箱子位姿变换到机器人世界坐标系下面:托盘位姿是已知的,所以箱子的绝对位姿是可以在外部算出来的。

得到箱子的绝对位姿后,至少要按照箱子的 Z 值排序,以便进行从高到低的拆垛(废话)。当吸盘比箱子大时,同层的箱子也不能随便吸取,否则就露馅了;而是应当用吸盘边角去吸取。这个涉及到计算,为了减少麻烦,本次通过设置机器人工具的 part offset 来规避。

5.5 机器人程序生成

到这里,我们已经手握 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

至此,仿真程序就能调用生成的机器人程序(包含接近、吸取、离开箱子的位姿),实现精确运动到每个箱子上表面,抓取和放置了。