PythonPi实现目标驱动型控制的核心是任务组件。在介绍任务组件之前,我们先要讨论一下所谓的降阶控制。在一个复杂的控制任务中,由于涉及到的传感器、执行器众多,其功能、特性各异,如果集中在一起进行处理,会过于复杂,难以高效的实现。针对这种情况,IT最基本的解决思路就是分层处理,也就是所谓的分而治之原则。我们将一个控制系统分为三个层次分别实现不同的控制任务:
组织层,用于目标定义、任务规划,如无人驾驶中组织层需要完成你想去哪(目标设定),行驶路线规划(根据路况、远近、耗时等选择一条路线:先到a、再到b、c…目的地)
协调层,用于各子系统之间的协商、协作来完成组织层面下达的任务,如启动、停车、拐弯、直行、加速、减速、紧急制动等等
执行层,则是实现具体的功能,就是各个传感器信号的采集,如交通部门通报的路况实时信息、摄像头对路面情况的识别、雷达接近告警等等;各个执行机构的控制:各个车轮、刹车、车灯等
根据任务和系统的复杂,可以扩展或缩减这个层次,但基本思路就是如此:根据复杂度,在每个层次将本系统所需要负责的功能分解为数个(一般是3-7个)子系统,然后将本系统所有需要完成的功能分解为这些子系统的操作序列,这样一来,本系统的功能实现过程,就分解为如下的步骤:
对目标(来自上层系统下达或用户提交)进行测算,分解为各子系统的目标
对各子系统的操作序列进行规划,并向其下达分解后的子目标
调控/监测子系统的运行
等各子系统(不一定要求每个功能所有子系统都参与)执行完毕,对完成情况进行检查
如果没有完成,重复上述动作,否则向上级汇报完成情况
这就是所谓的降阶控制,越往下,目标越具体、控制越精细。根据这个步骤流程,PythonPi平台提供了任务组件,来提供包括任务规划、子系统驱动、目标检测等功能在内的任务框架。
其中:
检验:是对任务目标的完成情况进行核查,如果没有完成则启动新一轮次的任务逼近,如果完成则转结束函数以进行任务提交或汇报
调节:任务框架采取的是迭代逼近的任务完成思路,是通过一次次的迭代来逐步逼近任务目标,所以调节函数就是根据任务目标计算本轮次各子系统的任务目标
子任务流转:利用表达式、Petri网等工具对子任务进行了组织,每一轮次的迭代就是从start到end子任务的一次旅行
结束:当检验函数经过计算,发现当前的系统状态已经达到了指定的任务目标,则任务完成,将执行本函数来进行清理、汇报等
在任务框架中,为了提供灵活的子任务规划能力,借鉴Petri网的思路对子任务进行了组织:
所有子任务通过有向弧进行连接,有向弧甚至可以指向自己,这个有向弧带有一个条件判别表达式
子任务执行完毕则通过各有向弧尝试触发所有的后继子任务
如果有向弧没有携带条件表达式或表达式判别为真,则触发该有向弧所指向的子任务,如果表达式判别为假则后继子任务不触发
如果某子任务所有的前导子任务都向其发送了触发,则该子任务开始执行
子任务的执行是并发的,也即子任务的执行和后面的触发等等都是隔离的
所有的子任务以一个特定的start节点开始,以一个特定的end节点结束,只要end节点被触发,则本轮次的执行即宣告结束
和通常的Petri网不同的是,子任务流转时是带有条件表达式进行判定的,任务框架可以借助这种手段在调节环节实现对下级子任务流转过程的控制。目前,尚未提供相应的锁死、饿死、终止等检测手段,需要设计人员精心设计以避免锁死、饿死等情况。在未来,PythonPi平台会提供相应的辅助工具进行相关的检查和提示,以降低这些风险。
PythonPi平台的任务框架是一个通用的任务框架,并不局限于组织层、协调层还是执行层,设计人员可以扩展子任务、通过对子任务的组织使得本任务成为高层次的任务,也可以具体执行某项控制动作来作为执行层的子任务供高层次的任务来组织。
====================================================================================================
关注我的公众号及时获取推送的最新文章