调度内核运行原理

来自MDCS wiki
跳到导航 跳到搜索

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。