MOOS-ivp 实验十四(2)behavior简要概述
继续上一章的内容,对行为使命进行进一步的介绍和参数配置工作。
文章目录
前言
我准备在接下来的内容里,记录一下MOOS文件中关于使命配置的相关内容,并加上我自己的理解。然后按照说明进一步完善第十四个实验的相关内容
一、简要概述
在介绍Ivp behaviour之前首先需要介绍一下ivp helm,ivp helm是作为整个水下机器人控制系统中作为决策的主要部分,其采用了基于行为的架构来组织其决策行为,主要采用了多目标优化以及区间规划的方式来进行决策。在机器人或者无人驾驶车辆的自主实现基于行为的架构的概念主要来自于Rodney Brooks 的 Subsumption Architecture,这一架构的优势之处在于可以逐步完善并且逐步进行系统的构建。
在水下机器人执行特定任务期间,其自主性主要体现在两个方面:
1.车辆的行为及其算法的开发过程
2.通过行为和模式的配置来对任务进行规划
如上图,就像其他MOOSapp一样,ivpbehaviour同样也有着自己的循环函数Iterate(),并且在该循环中执行者ivpbehaviour的基本功能,如上图,其基本功能主要分为五个步骤:
1.读取从MOOSDB中发布的变量,并将其存储在当地的缓存中供行为进行读取和使用
2.对.bhv文件中的模式声明进行评估,主要是读取.bhv文件中的mode声明,然后根据当前行为的condition条件来进行行为的决策,类似于 condition = (MODE==SURVEYING)
3.对每一个行为进行查询,并且基于当前行为产生需要发布的MOOS变量对以及IVP function到ivpsolver中去。(发布不同行为的标志位)
4.ivpfunction在ivpsolver中被进行解析,开始进行决策,并产生为一个需要水下机器人执行的行为动作,并且发布需要的MOOS变量对到MOOSDB中(发布当前行为的决策信息)
5.统一将MOOS变量发布到MOOSDB中去
在MOOS中的行为到底是什么?简要来说行为就是一个C++的类,它是伴随着MOOSapp pHelm一同运行的一种程序,行为可以决定水下机器人在运行时所执行具体的内容。行为的特定属性以及相关函数都是来源于IvPBehavior 的父类。
1.IvP Behaviors的四种状态
在phelm中循环使命将会有四种状态,这里来进行一下解释:
1.Idle
如果行为未完成且未满足运行条件(condition)那么该行为就会处于空闲状态,该状态下会循环执行onIdleState()函数的内容。
2.running
如果行为满足运行条件并且尚未完成,那么该行为就进入了执行状态,该状态下每次循环会执行onRunState() 函数的内容,
3.active
当一个行为处于running状态,并且切实产生了需要输出的目标函数,并且该目标函数对IVPbehaviour产生了行为上的影响时,该行为就进入了活跃状态。进入执行状态的行为不一定处于活跃状态,比如距离障碍物足够远的避碰行为,其虽然处于执行状态,但是由于距离障碍物足够远,所以并不会输出目标函数值从而对行为产生影响。
4.completed
当行为的duration计时打到截止时间或者行为结束之后,就会进入完成状态,一般在完成状态还会调用setComplete()函数,一般是对endflag标志进行发布,也可以自主对该虚函数进行重构。
2.IvP Behavior类的五个主要虚函数
IvPBehavior派生出来的子类包括MOOS自带的相关行为以及第三方也就是自己定义的行为。自己定义的行为必须是IvPBehavior的子类才可以与pHelm一起运行。pHelm基本上都会调用IvPBehavior所定义的虚函数,这些虚函数在新定义的行为中基本上都会被重载。而且新定义的行为内部也可以写一些私有的函数,来协助行为更好的运行。
上图是IvPBehavior类的定义,其中提供了五个主要的虚函数,这些虚函数一般都会在子类的行为中被重载,撰写新的使命主要是对这些函数进行重载,下面对这些函数的相关定义进行介绍:
1.setParam()
用来设置行为的一些初始化参数,从而可以决定行为的不同属性
2.onRunState()
该函数定义了行为的执行状态,其主要是行为实现的核心函数,在满足行为执行条件的情况进行执行,其可能输出一个目标函数或者将一些变量发布到MOOSDB中去。
3.onIdleState()
该函数定义了行为的空闲状态,其主要指当行为未满足执行条件的情况下,该行为所发出的动作。其动作可能包含了更新使命中的历史变量或者创建一个发布到MOOSDB中的变量。
4. onIdleToRunState()
当行为从空闲状态转移到运行状态时会执行一次该函数,而相对应的onRunState() 函数在满足执行条件后在每次循环中都会被进行调用。
5.onRunToIdleState()
与上面的函数类似,当行为从运行状态转移到空闲会执行一次该函数,而相对应的onIdleState()在行为不满足执行条件下每次循环都会被调用。
3.IvP Behaviors的基础参数
IvPBehavior作为父类定义了很多基础的参数,这些参数可以在使命配置文件中进行初始化设置,也可以随着使命的函数执行而动态发生调整,这里主要介绍一些IvPBehavior父类所涉及到的所有基础的参数,在自己定义行为使命的过程中,也可以对setParam()函数进行重载,从而设置自己所需要的参数。
下面是IvPBehavior源代码中所涉及到的基本参数:
1.name
每一个行为的名称都应该是独一无二的,即使是出自同一个行为模板,那么也应该注意行为的名称取不同的名字。文档中指出loiter和 loiter_two这样拥有相似前缀的名称是不太安全的,因为可能因为相同的前缀导致前一个行为串联后一个行为(这里不是很懂。。。)行为输出的Log文件都会按照行为的名称来进行记录
2.priority
主要用来配置行为中的优先级,默认是100。也可以设置行为根据现实情况自行对优先级进行设置。
举一个例子,可以设定避碰行为在没有通讯中断的条件设置优先级为最高,当通讯恢复之后,可以将优先级恢复为正常值。优先级不可以设置为负,否则会报错进入MALCONFIG状态。
3.duration
行为持续时间,可以设定一个行为的截止时间。行为可以因为超时结束,或者因为行为完成而结束。如果不进行持续时间的设置的话,行为就永远不会因为超时而结束。一旦满足行为一旦进入执行状态就会开始计时,即使从执行状态转移到空闲状态仍旧维持计时。
duration = value (positi