去除不可用的点之前的效果
去除不可用的点之后的效果
3.2改造OpenTCS之如何避免无效路由
3.2.1问题的提出
OpenTCS的默认Router(寻路器)实现中,路由的规划是静态;因此给出的路由可能实际上是Unreachable(不可达)的。这里给出Windows 10环境下的一个实例。
3.2.1.1准备
(1)为保证结果可重现,我们可以使用下载的原始openTCS-4.17.0-bin.zip,解压后,在启动TCS内核前,先修改配置文件“\openTCS-Kernel\config\ opentcs-kernel-defaults-baseline.properties”,找到对应的行,改成这样子:
pei'zhi'wen'jian'xiu'gai
(2)用Plant Overview生成一个简单的示意图。其拓扑形如一个打倒的“目”字,包含:42个点,6个工位,2个块,由全部外围路径形成的顺时针方向回路和中间的顺时针方向回路;2辆车,其中Ve0001最初停在A(即图上工位Lo0122)对应的点Pt0121,Ve0002最初停在B(即图上工位Lo0125)对应的点Pt0124。
本文shi'yong'de地图
模型文件中车辆的属性是这样子的:
模型文件中che'liang'de'shu'xing
(3)我们在批处理中用curl生成准备两个运单,运单1让Ve0001[从A出发]去C(即Lo0127,对应点Pt0128)装货然后停在那儿,运单2让Ve0002[从B出发]去E(即Lo0206,对应点Pt0246)装货然后停在那儿。
用于生成运单的批处理
3.2.1.2运行前观察
我们直接看出来的路由
我们假设运单1比运单2先生成且先执行,而且Ve0001先于Ve0002到达Pt0004;因此,在实际执行运单2前,Router是知道Ve0001要在Pt0128停着的,这时路由Route2是“死路”而路由Route3是“活路”。那么,实际运行时给出的是哪条路呢?
3.2.1.3实际运行给出的路由
改造前Router给出的路由是无效的
Router为Ve0002执行运单2给出的竟然是无效的路由Route2!这显然不合常理!
3.2.2问题的分析
Router之所以会出现以上明显的“弱智”现象,一个原因是:OpenTCS的默认Router实现,为点静态地生成最优路径,并未利用可以避免给出无效路由的已知条件,如上例中:在实际执行运单2前,Router是知道Ve0001要在Pt0128停着的,因而路由Route2很可能无效;我们可以看出,最迟在Ve0002到达Pt0008之前,如果不能确定它可通过Pt0128,那么就应该将它的路由更新为Route3。
3.2.3问题的解决
根据以上分析,一个解决思路是:找出Graph中导致“死路”的“不可用的点”,将其及相关的边从Graph中去掉之后,寻路器再根据更新后的Graph寻路。
何为“不可用的点”?Case1,当前空闲的车辆停泊的点;Case2,对除了本运单之外全体处理中的运单的目标位置,若这些个运单的承运车辆无后续运单(即被预订),则该点被占用时间暂不可知。
以下给出对应该思路的一个参考实现,其还有改进的空间。
(1)修改文件”\openTCS-Strategies-Default\src\main\java \org\opentcs\strategies\basic\ routing\DefaultRouter.java”。
1)添加获取不可用的点的方法getUnusablePoints。
2)添加获取实际点寻路器方法getActualPointRouter,其中调用getUnusablePoints,如上图。
3)修改既有getRoute,其中调用getActualPointRouter。
(2)修改文件“\openTCS-Strategies-Default\src\main\java\ org\opentcs\strategies\basic\ routing\PointRouterFactory.java”。
1)添加一个方法声明createPointRouter。
(3)修改文件“\openTCS-Strategies-Default\src\main\java\org\opentcs\strategies\basic\routing\ jgrapht\AbstractPointRouterFactory.java”。
1)修改方法createPointRouter,其中调用方法createPointRouterInternal。
2)添加方法createPointRouter。
3)添加方法createPointRouterInternal,实际构造出PointRouter。
(4)修改文件“\openTCS-Strategies-Default\src\main\java\ org\opentcs\strategies\basic\ routing\PointRouter.java”。
1)添加方法声明removeUnusablePoints。
(5)修改文件“\openTCS-Strategies-Default\src\main\java\ org\opentcs\strategies\basic\routing\ jgrapht\ShortestPathPointRouter.java”。
1)添加方法removeUnusablePoints。
(6)修改文件“\openTCS-Strategies-Default\src\main\java\ org\opentcs\strategies\basic\routing\ jgrapht\DefaultModelGraphMapper.java”。
1)修改translateModel。
3.2.4解决后的效果
改造后Router给出的路由已有效le
可以看出,结果已符合预期。
错漏和不足难免,欢迎您指正和拍砖,感谢您的收藏、转发或关注。如果您需要文中所述模型文件或批处理文件,请私信我。
举报/反馈

零流ST

70获赞 54粉丝
专注AGV领域的相关软件。
关注
0
0
收藏
分享