调度内核运行原理:修订间差异

来自MDCS wiki
跳到导航 跳到搜索
 
(未显示同一用户的1个中间版本)
第2行: 第2行:


=== 交管计算原理 ===
=== 交管计算原理 ===
SimpleCore使用动态规划和搜索方法(DPS算法)进行交管机选。首先使用动态规划计算双车间的通行矩阵,然后在实际车辆需要上锁时,通过进行剪枝的搜索算法进行多车死锁可能性检测并决策。详细的算法可以参考[[DPS调度算法详解]]。
SimpleCore使用动态规划和搜索方法(DPS算法)进行交通管制。首先使用动态规划计算双车间的通行矩阵,然后在实际车辆需要上锁时,通过进行剪枝的搜索算法进行多车死锁可能性检测并决策。详细的算法可以参考[[DPS调度算法详解]]。
 
用户可以完全不再关注交管,DPS算法几乎在所有情况下得到正确交管顺序。不过由于算法的取向较为保守,可能在多车长路径交管冲突上选择要求人工介入判断,也可通过调整参数强制要求算法自动判断。


=== 可编程的路径搜索算法 ===
=== 可编程的路径搜索算法 ===
在SimpleCore框架中,路径搜索算法采用了一种高度可编程的方式,通过Heuristics(启发式)系统来实现灵活的路径规划。其核心是基于A''算法的变体,结合了反射机制和特性(Attribute)系统,''这种设计允许开发者为不同类型的车辆和场景定制搜索行为,而不需要修改核心搜索算法。详细的对路径搜索用法可见[[使用手册 - 寻路启发器功能|使用手册 - 寻路启发器功能 - MDCS wiki]]。
系统采用的是启发式优先搜索算法(类似A*''),通过以下关键组件实现:''
* 优先队列(Heap):维护待探索节点,按优先级(代价+启发值)排序
* 上下文信息(SearchStat和Container等):表示搜索状态,包含当前位置、累计代价、优先级、路径信息、状态标记等
* 启发式函数:通过自定义方法计算节点的评估值,指导搜索方向


=== 路径编译 ===
=== 路径编译 ===
路径编译器将计划路线(表示为站点和路线的序列)转换为 AGV 可以理解和执行的可执行代码。这种转换过程可通过模板或插件的方法完成,类似于编译器。其使用方法见:[[使用手册 - Simple:coder(路径编译器)机制详解|使用手册 - Simple:coder(路径编译器)机制详解 - MDCS wiki]]
路径编译的方法允许:
* 车辆特定行为:不同的车辆类型可以有不同的代码生成策略
* 站点特定操作:在特定站点的特殊操作(如装载/卸载,调整避障范围,或者为了解决一致性问题对站点微调等)
* 轨道特定参数:速度控制、方向控制等


=== 任务逻辑 ===
* 复杂条件:可以使用javascript或者c#程序判断复杂条件(如一口气生成全向磁导航车的控制序列)
 
=== 总体任务逻辑 ===
[[文件:Snipaste 2023-12-21 00-04-09.jpg|缩略图|下发任务流程图]]
[[文件:Snipaste 2023-12-21 00-04-09.jpg|缩略图|下发任务流程图]]
下发任务时,首先进行寻路,如通过FindRoute生成一个SegmentPlan,或者手动构造一个SegmentPlan。然后调用Compile方法得到CarProgram。Compile方法默认会做交管规划,若在参数中给了forecast:false,接下来可以Append多个SegmentPlan来继续延长路线并增加事件。
下发任务时,首先进行寻路,如通过FindRoute生成一个SegmentPlan,或者手动构造一个SegmentPlan。然后调用Compile方法得到CarProgram。Compile方法默认会做交管规划,若在参数中给了forecast:false,接下来可以Append多个SegmentPlan来继续延长路线并增加事件。
第14行: 第33行:
无论Append与否,由于CarProgram需要做交管规划,若参数中给了forecast:false,则需要调用Forecast。调用Forecast时可以给一个escape参数,为一个SegmentPlan,用来设定逃逸路线,该路线只参与交管规划而不执行(可参见交管规划原理)。最后需要调用Queue进行提交。
无论Append与否,由于CarProgram需要做交管规划,若参数中给了forecast:false,则需要调用Forecast。调用Forecast时可以给一个escape参数,为一个SegmentPlan,用来设定逃逸路线,该路线只参与交管规划而不执行(可参见交管规划原理)。最后需要调用Queue进行提交。


CarProgram一旦经过规划,必须提交,否则不允许后续生成针对该车的CarProgram。
CarProgram一旦经过规划,必须提交,否则不允许后续生成针对该车的CarProgram。执行期间和Simple设计的交互几乎仅限于交管,详见[[AGV任务运行逻辑|AGV任务运行逻辑 - MDCS wik]]
 
对于每个车,当前运行的CarProgram执行完毕后,可以继续执行下一个CarProgram。
 
=== 总结 ===
SimpleCore调度将'''AMR调度转换为“图的资源占用与释放”问题。'''首先启发式深度优先搜索寻路,可同时搜索可行区域、进行热力计算,并做好流量分配。资源(站点)获取顺序动态规划预计算,执行任务前通过动态规划预先搜索通行顺序的解空间,可通过包络、可达性预计算避免车体和静物之间的物理冲突。最后资源(站点)序列编译为动作脚本,而动作脚本可以完全离线执行,机器人仅在资源上锁/解锁时需要与调度通信。这使得本预计算集群调度具有以下优势:
 
# 高抽象化 将AMR调度的底层数学问题剥离,软件工程架构更有优势。更容易针对不同车型和业务场景进行交付适配,可应对业务和资产快速变更的时代需求。
# 高适用性 自动通行顺序预计算,无需针对不同业务场景人工配置交管规则。
# 低通信复杂度 通信次数极低。AMR的任务已经预计算,网络波动时,不会导致AMR动作失控,AMR将在网络恢复后接续最新交管信息。
# 低算力需求 相对于“遥控作业型”调度,预计算调度的算力需求低。数百台AMR的交管可在普通个人电脑上运行,无需高配置的服务器工作站。

2025年3月12日 (三) 13:13的最新版本

SimpleCore保证静态的任务和路线一定能够完成,从而简化了机器人车队调度的开发困难。静态指路线一旦下发一般不会改变,交管保证满足该路线一定能执行到位且不会发生死锁(即通过死锁预防算法),相对于“解死锁”方法,“死锁预防”方法可以满足在大量工业场景中的工艺需求,如过风淋门、叉车等不允许折返的场景。当然,SimpleCore也支持动态更改路线的需求。所有路线的增加和变更都会进行交通规划计算,保证场景的正常运行。SimpleCore也提供了多种方便路线设计和变更的机制。

交管计算原理

SimpleCore使用动态规划和搜索方法(DPS算法)进行交通管制。首先使用动态规划计算双车间的通行矩阵,然后在实际车辆需要上锁时,通过进行剪枝的搜索算法进行多车死锁可能性检测并决策。详细的算法可以参考DPS调度算法详解

用户可以完全不再关注交管,DPS算法几乎在所有情况下得到正确交管顺序。不过由于算法的取向较为保守,可能在多车长路径交管冲突上选择要求人工介入判断,也可通过调整参数强制要求算法自动判断。

可编程的路径搜索算法

在SimpleCore框架中,路径搜索算法采用了一种高度可编程的方式,通过Heuristics(启发式)系统来实现灵活的路径规划。其核心是基于A算法的变体,结合了反射机制和特性(Attribute)系统,这种设计允许开发者为不同类型的车辆和场景定制搜索行为,而不需要修改核心搜索算法。详细的对路径搜索用法可见使用手册 - 寻路启发器功能 - MDCS wiki。 系统采用的是启发式优先搜索算法(类似A*),通过以下关键组件实现:

  • 优先队列(Heap):维护待探索节点,按优先级(代价+启发值)排序
  • 上下文信息(SearchStat和Container等):表示搜索状态,包含当前位置、累计代价、优先级、路径信息、状态标记等
  • 启发式函数:通过自定义方法计算节点的评估值,指导搜索方向

路径编译

路径编译器将计划路线(表示为站点和路线的序列)转换为 AGV 可以理解和执行的可执行代码。这种转换过程可通过模板或插件的方法完成,类似于编译器。其使用方法见:使用手册 - Simple:coder(路径编译器)机制详解 - MDCS wiki 路径编译的方法允许:

  • 车辆特定行为:不同的车辆类型可以有不同的代码生成策略
  • 站点特定操作:在特定站点的特殊操作(如装载/卸载,调整避障范围,或者为了解决一致性问题对站点微调等)
  • 轨道特定参数:速度控制、方向控制等
  • 复杂条件:可以使用javascript或者c#程序判断复杂条件(如一口气生成全向磁导航车的控制序列)

总体任务逻辑

下发任务流程图

下发任务时,首先进行寻路,如通过FindRoute生成一个SegmentPlan,或者手动构造一个SegmentPlan。然后调用Compile方法得到CarProgram。Compile方法默认会做交管规划,若在参数中给了forecast:false,接下来可以Append多个SegmentPlan来继续延长路线并增加事件。

无论Append与否,由于CarProgram需要做交管规划,若参数中给了forecast:false,则需要调用Forecast。调用Forecast时可以给一个escape参数,为一个SegmentPlan,用来设定逃逸路线,该路线只参与交管规划而不执行(可参见交管规划原理)。最后需要调用Queue进行提交。

CarProgram一旦经过规划,必须提交,否则不允许后续生成针对该车的CarProgram。执行期间和Simple设计的交互几乎仅限于交管,详见AGV任务运行逻辑 - MDCS wik

对于每个车,当前运行的CarProgram执行完毕后,可以继续执行下一个CarProgram。

总结

SimpleCore调度将AMR调度转换为“图的资源占用与释放”问题。首先启发式深度优先搜索寻路,可同时搜索可行区域、进行热力计算,并做好流量分配。资源(站点)获取顺序动态规划预计算,执行任务前通过动态规划预先搜索通行顺序的解空间,可通过包络、可达性预计算避免车体和静物之间的物理冲突。最后资源(站点)序列编译为动作脚本,而动作脚本可以完全离线执行,机器人仅在资源上锁/解锁时需要与调度通信。这使得本预计算集群调度具有以下优势:

  1. 高抽象化 将AMR调度的底层数学问题剥离,软件工程架构更有优势。更容易针对不同车型和业务场景进行交付适配,可应对业务和资产快速变更的时代需求。
  2. 高适用性 自动通行顺序预计算,无需针对不同业务场景人工配置交管规则。
  3. 低通信复杂度 通信次数极低。AMR的任务已经预计算,网络波动时,不会导致AMR动作失控,AMR将在网络恢复后接续最新交管信息。
  4. 低算力需求 相对于“遥控作业型”调度,预计算调度的算力需求低。数百台AMR的交管可在普通个人电脑上运行,无需高配置的服务器工作站。