这个模型可以解决AGV系统中的避碰方式的选择问题,当AGV在路径中检测到碰撞,会采取什么样的逻辑来避开碰撞。
1、模型描述
避碰方式有很多种,这里分享一个解决巷道式车间里AGV碰撞时选择偏移避让的案例:巷道内只有一条AGV路径,当两台AGV在巷道内发生对向碰撞时,其中一台AGV向路径一侧偏移一定距离,待另一台AGV离开之后再回到路径上继续行进。(控制区域可以很好的解决交叉路径的避碰控制,但是一条路径上的对向碰撞使用控制区域将会造成死锁)
2、模型布置
3、实现过程
碰撞下拉列表
勾选检测碰撞并且设置碰撞检测时间间隔,在AGV两端绘制半径为0.5m的碰撞球,选择模型中检测避碰的另一台AGV,最后编辑避碰逻辑。
碰撞逻辑
这个案例里需要AGV每0.1秒检测一次碰撞,容易出现在一次避碰过程中出现多次检测,从而一次避碰中执行多次避碰逻辑。我们先给AGV添加一个test-times的标签赋初始值为0。
在碰撞处理触发器写入避碰逻辑 /**避碰逻辑*/ Object thisobject = ownerobject(c);//声明当前实体 Object otherobject = param(1);//声明检测到碰撞的实体 treenode thissphere = param(2);//声明当前碰撞球 treenode othersphere = param(3);声明检测到的碰撞球 int collisionsphere = getrank(thissphere);//判断AGV是前端触碰还是后端触碰 if(collisionsphere ==1&&getlabel(thisobject,"test times")==0)//满足前端碰撞且碰撞检测次数为0 { setlabel(thisobject,"testtimes",1);//检测次数设置为1,这里的设置是避免两AGV在一次碰撞中被检测多次,出现多次避碰任务 treenodets = createemptytasksequence(thisobject,0,1);//若是前端碰撞,创建避碰任务序列 inserttask(ts,TASKTYPE_TRAVELRELATIVE,NULL,NULL,0,2,0,0);//上移2米 inserttask(ts,TASKTYPE_DELAY,NULL,NULL,5,STATE_BLOCKED);//等待5秒 inserttask(ts,TASKTYPE_TRAVELRELATIVE,NULL,NULL,0,-2,0,0);//下移2米回归路线 dispatchtasksequence(ts); } else if(collisionsphere ==2&&getlabel(thisobject,"test times")==0)//满足后端碰撞且碰撞检测次数为0 { setlabel(thisobject,"testtimes",1);//检测次数设置为1,这里的设置是避免两AGV在一次碰撞中被检测多次,出现多次避碰任务 treenodets = createemptytasksequence(thisobject,0,1);//若是后端碰撞,创建避碰任务序列 inserttask(ts,TASKTYPE_DELAY,NULL, NULL, 2, STATE_BLOCKED);//等待2秒 dispatchtasksequence(ts); } senddelayedmessage(thisobject,2,thisobject,1);//避碰结束后的消息触发,检测次数的标签值回归为0 避碰结束后在AGV 的消息触发中使test_times的标签值回复为0,等待下一次避碰。 /**避碰结束后检测次数调为0*/ Object current = ownerobject(c); if(msgparam(1)==1)//避碰结束后检测次数调为0 { setlabel(current,"testtimes",0); } 另一台AGV进行相同的编辑。这个模型演示了任务执行器设置避碰的一般逻辑,更多的避碰方式需要在避碰处理中设置相应的逻辑。
|