3.3改造之动态更新路由
3.3.1问题的提出
在上一篇文章《改造OpenTCS之如何避免无效路由of基于OpenTCS的二次开发实践》中,我们实现了寻路时去除不可用的点,从而避免静态规划出无效路由的问题。
在实际运行中,由于车辆故障、点位故障、道路故障或其他异常的发生,或其排除,使得点位的可用性发生变化,为提高系统整体的资源利用率,最小化运单执行时间,我们有必要适时更新路由。本文讨论动态更新路由的一种参考实现方法。
3.3.1.1准备
(1)在启动TCS内核前,先修改配置文件“\openTCS-Kernel\config\opentcs-kernel-defaults-baseline.properties”,找到对应的行,改成这样子:
(2)我们使用上一篇文章中所用的地图,即:生成的拓扑形如一个打倒的“目”字,包含:42个点,6个工位,2个块,由全部外围路径形成的顺时针方向回路和中间的顺时针方向回路;2辆车,其中Ve0001最初停在A(即图上工位Lo0122)对应的点Pt0121,Ve0002最初停在B(即图上工位Lo0125)对应的点Pt0124。
本文使用的地图
模型文件中车辆的属性是这样子的:
模型文件中车辆的属性
(3)几条要用到的路由。
3.2.1.2期望达到的效果
我们使用2个例子来描述期望达到的效果。
(1)例1 我们依次创建2个运单,使运单1创建之后立即派发:
运单1,使用车辆Ve0001从A即(Lo0122对应的)Pt0121出发,去目的地C即(Lo0127对应的)Pt0128装货;
3秒钟后创建运单2,以便Ve0002先到达Pt0004;
运单2,使用车辆Ve0002从B即(Lo0125对应的)Pt0124出发,去目的地E即(Lo0206对应的)Pt0246装货。
执行运单1的车辆Ve0001先出发,到达目的地Pt0128后就停着,其何时离开暂时是未知的;执行运单2的车辆Ve0002要从Pt0124出发到达Pt0246。在实际执行运单2前,知道Ve0001要在Pt0128停着且不知道其何时离开Pt0128,因此我们期望系统为其分配路由Route3(这在上一篇文章中已经实现)。那么执行运单2的过程中,Ve0002先到达Pt0004,于是Ve0002可通过Pt0128,因此我们期望可以更新其路由为Route2。
(2)例2 我们依次创建4个运单,使运单1创建之后立即派发:
运单1,同例1的;
5秒钟后创建运单2,以便Ve0001先到达Pt0004;
运单2,同例2的;
5秒钟后创建运单3,以便Ve0002此前未到达Pt0008;
运单3,由车辆Ve0001从C即(Lo0127对应的)Pt0128出发,去目的地A即(Lo0122对应的)Pt0121卸货;
20秒钟后创建运单4,
运单4,由车辆Ve0002从E即(Lo0206对应的)Pt0246出发,去目的地B即(Lo0125对应的)Pt0124卸货。
相关批处理文本如下所示:
在派发运单3后,执行运单2的车辆Ve0002尚未到达Pt0008,此时已知其可通过Pt0128,因此我们期望可以更新其路由为Route2。
3.2.2问题的分析
要支持动态更新路由,只需车辆运行的子拓扑Graph中的资源发生变化时,如每完成行单中的“一步”时,特别是无效点变为有效点或有效点变为无效点时,为相关运单重新规划路由。这里需要强调的是,鉴于重新规划路由是计算密集的,应做必要的过滤,以尽可能减少不必要的计算。
3.2.3问题的解决
根据以上分析,一个解决思路是:在行单中的“一步”完成时,即调用Reroute。
以下给出的实现,其还有较大的改进空间。
(1)修改文件“\openTCS-Strategies-Default\src\main\java\ org\opentcs\strategies\basic\ dispatching\DefaultDispatcherConfiguration.java”,添加配置项“ROUTE_STEP_FINISHED”:
(2)修改文件“\openTCS-Kernel\src\main\resources\ org\opentcs\kernel\distribution\ config\opentcs-kernel-defaults-baseline.properties”,将重新规划路由触发器改为“ROUTE_STEP_FINISHED”:
(3)修改文件“\openTCS-API-Base\src\main\java\ org\opentcs\components\kernel\ Dispatcher.java”,添加一个方法声明,如上图。
(4)修改文件“\openTCS-Strategies-Default\src\main\java\ org\opentcs\strategies\basic\ dispatching\DefaultDispatcher.java”,添加方法vehicleUpdatedProgressIndex的实现,如上图。
(5)修改文件“\openTCS-Kernel\src\main\java\org\opentcs\kernel\vehicles\DefaultVehicleController.java”,修改方法“updatePositionWithOrder”的实现:
(6)修改文件“\openTCS-API-Base\src\main\java\ org\opentcs\components\kernel\ services\DispatcherService.java”,添加一个方法声明,如上图所示。
(7)修改文件“\openTCS-API-Base\src\main\java\ org\opentcs\access\rmi\ services\RemoteDispatcherService.java”,如上图所示。
(8)修改文件“\openTCS-Kernel\src\main\java\ org\opentcs\kernel\ services\StandardDispatcherService.java”,实现vehicleUpdatedProgressIndex方法,如上图所示。
(9)修改文件“\openTCS-API-Base\src\main\java\ org\opentcs\access\rmi\ services\RemoteDispatcherServiceProxy.java”,实现vehicleUpdatedProgressIndex方法:
(10)修改文件“\openTCS-Kernel-Extension-RMI-Services\src\main\java\ org\opentcs\kernel\extensions\ rmi\StandardRemoteDispatcherService.java”,实现vehicleUpdatedProgressIndex方法,如上图所示。
3.2.4解决后的效果
初始qing'xing
(1)对应例1
Ve0001先出发
Ve0002先到达Pt0004,更新路由
quan'bu运单完成时
(2)对应例2
Ve0001先出发,其暂时没有后续运单
Ve0001先到达Pt0004
Ve0002到达Pt0008前Pt0128可通过
Ve0001先到达Pt0128
Ve0001离开Pt0128
可以看出,期望的效果已实现。
错漏和不足难免,欢迎您指正和拍砖,感谢您的收藏、转发或关注。
举报/反馈

零流ST

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