全球FlexSim系统仿真中文论坛

标题: 案例五 AGV检测碰撞和避碰方式的选择 [打印本页]

作者: Yumaotuo    时间: 2018-4-28 09:20
标题: 案例五 AGV检测碰撞和避碰方式的选择
这个模型可以解决AGV系统中的避碰方式的选择问题,当AGV在路径中检测到碰撞,会采取什么样的逻辑来避开碰撞。

1、模型描述

避碰方式有很多种,这里分享一个解决巷道式车间里AGV碰撞时选择偏移避让的案例:巷道内只有一条AGV路径,当两台AGV在巷道内发生对向碰撞时,其中一台AGV向路径一侧偏移一定距离,待另一台AGV离开之后再回到路径上继续行进。(控制区域可以很好的解决交叉路径的避碰控制,但是一条路径上的对向碰撞使用控制区域将会造成死锁)

2、模型布置

[attach]4305[/attach]
3、实现过程

碰撞下拉列表

[attach]4306[/attach]

勾选检测碰撞并且设置碰撞检测时间间隔,在AGV两端绘制半径为0.5m的碰撞球,选择模型中检测避碰的另一台AGV,最后编辑避碰逻辑。

碰撞逻辑

这个案例里需要AGV每0.1秒检测一次碰撞,容易出现在一次避碰过程中出现多次检测,从而一次避碰中执行多次避碰逻辑。我们先给AGV添加一个test-times的标签赋初始值为0。
[attach]4307[/attach]

在碰撞处理触发器写入避碰逻辑
/**避碰逻辑*/
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进行相同的编辑。这个模型演示了任务执行器设置避碰的一般逻辑,更多的避碰方式需要在避碰处理中设置相应的逻辑。

作者: 非凡    时间: 2018-4-28 10:50
谢谢分享啊

作者: cmc    时间: 2018-4-30 09:01
這個很實用超讚
作者: Yumaotuo    时间: 2018-5-2 09:19
cmc 发表于 2018-4-30 09:01
這個很實用超讚


作者: superyangkk    时间: 2019-2-22 10:06
给力!谢谢
作者: zjj0605    时间: 2019-2-22 17:25
很好的学习资料,果断拿走
作者: 温酒师    时间: 2019-3-5 14:41
厉害了
作者: 贾跃    时间: 2019-4-12 08:58
谢谢分享
作者: lnspriation    时间: 2019-12-24 15:02
这段代码复制进去一直报错,未声明
作者: 飞飞    时间: 2020-4-24 11:54
刚照着楼主的帖子,做了一遍,当小车跑了2个来回后就乱掉了,是为什么呢?请高人指点

作者: 不见庐山    时间: 2020-5-20 20:26
很不错,谢谢分享
作者: f824391097y    时间: 2020-8-11 10:31
我也报错呢,这是为啥
作者: f824391097y    时间: 2020-8-11 10:39
本帖最后由 f824391097y 于 2020-8-11 10:51 编辑

咦,代码解决了 没报错了,但是碰撞的时候,还是死锁停止了
作者: Sccc0206    时间: 2020-8-11 11:52
f824391097y 发表于 2020-8-11 10:39
咦,代码解决了 没报错了,但是碰撞的时候,还是死锁停止了

因为由于软件更新,对于避碰已经不采取这种方式了,有更简便的方式达成目的。您可以在flexsim贴吧,报名参加关于AGV避碰的远程培训,或者近期北京创时能的公众号也会推出关于避碰的模型案例供大家学习分享,敬请关注。
作者: dashugen    时间: 2021-7-22 14:42
lnspriation 发表于 2019-12-24 15:02
这段代码复制进去一直报错,未声明

这段代码需要覆盖掉所有的声明,不然前四行会报错,部分备注部分缺少了//,还有一段用了回车,记得删除,if和else if中的terrnodets  中间少了空格,应该是 treenode ts,这样就不会报错了




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3