
AGV搭载机械手的复合型机器人,主要用于将物流按要求输送至指定工位,可用于加工工件的抓取、组装、搬运、装卸等作业。此外,复合机器人也可快速布局于工厂、仓储分拣、自动化货物超市等诸多场景,为物料的自动搬运、物品的上下料,以及物料的分拣提供自动化、柔性化的作业支持,使厂内可以实现真正的无人搬运。
现有的产品多是AGV+UR机械臂,在plant里面怎么去处理这个呢,接下来我们就针对这个问题进一步展开说明。
接下来自然会想到以下几个问题:
1. 机械臂如何移载到AGV上?
2. 机械臂怎么运动?
针对以上问题,我们逐一剖析。
玩过plant的都知道,我们可以通过替换数模的方式,将我们所需要的自定义模型导入到基本模型里面,然后再定制动画对象,在写入定义相关动作。
如果把模型导入到Station、Buffer这些是不是可以呢,答案是否定的,因为这些对象无法生成到Transporter上,那么就只能使用Part、Container了,这些都是可以产生在Transporter上面。
如果使用part是否可以呢,答案是否定的,因为Part没有容量,无法容纳物料,所以我们选用Container来作为机械手。
复制一个Container,采用交换对象的方式,导入默认的PickAndPlaceKUKA.s3d作为机械臂,其实我们也可以找一个UR的模型来作为机械臂数模,也是没问题的,如果需要,波哥也可以另一篇单独讲如何制作。

这样的话,机械手就做好了。
然后只需要将agv的容量设置为2,一个放托盘,一个放机械手,AGV创建时,自动create托盘和机械手即可,位置根据需要调整一下,代码插入一下。
-- param onCreate3D: boolean@.robot := .Models.objects.robot.create(@)@.container := .Models.objects.Container.create(@)
这样自主移动机器人就做好啦!是不是很简单!生成一个试一试。

接下来是第二个问题,机械臂怎么运动?
这里就需要使用moveToCoordinate了。
robot._3D.Poses.moveToCoordinate(Coordinate:length[3], Rotation:real/real[4][, TimeSpan:time]) -> time
输入要移动的坐标点给机械臂就可以了。为了方便操作,在agv上面封装两个method来进行上下料,分别是loadPart、unloadPart。这两个method会根据物料和工台的情况自动计算位置点,需要机械臂运行的时候,调用就可以了。
具体的封装可以看模型。这里贴一下unloadPart的代码,loadPart也类似。
param des:objectvar offsetdis := 0.5mvar agv:= self.~agv.ocuupied := trueif agv.robot._3D.Poses.isMovingTo("homepos") agv.robot._3D.Poses.cancelMovement("homepos")endvar d := agv.getpos(agv.container.cont)var offset_d := d + [0, 0, offsetdis]wait agv.robot._3D.Poses.moveToCoordinate(offset_d ,0)wait agv.robot._3D.Poses.moveToCoordinate(d ,0)agv.container.cont.move(agv.robot)d := agv.getpos(des)offset_d := d + [0, 0, offsetdis]wait agv.robot._3D.Poses.moveToCoordinate(offset_d, 0)wait agv.robot._3D.Poses.moveToCoordinate(d, 0)agv.robot.cont.move(des)agv.ocuupied := falseagv.robot._3D.Poses.moveTo(["homepos"])
波哥定义了一个homepos作为机械臂的默认位置点,方便机械臂恢复默认位置。
查看一下效果
Plant Simulation 自主移动机器人
