调度内核运行原理:修订间差异
小 (→交管计算原理) |
(→交管计算原理) |
||
| 第2行: | 第2行: | ||
=== 交管计算原理 === | === 交管计算原理 === | ||
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来继续延长路线并增加事件。 | ||
| 第15行: | 第34行: | ||
CarProgram一旦经过规划,必须提交,否则不允许后续生成针对该车的CarProgram。 | CarProgram一旦经过规划,必须提交,否则不允许后续生成针对该车的CarProgram。 | ||
对于每个车,当前运行的CarProgram执行完毕后,可以继续执行下一个CarProgram。 | |||
2025年3月12日 (三) 13:00的版本
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。
对于每个车,当前运行的CarProgram执行完毕后,可以继续执行下一个CarProgram。