我是靠谱客的博主 傲娇小海豚,最近开发中收集的这篇文章主要介绍MOOS-ivp 实验十四(2)behavior简要概述MOOS-ivp 实验十四(2)behavior简要概述前言一、简要概述二、.bhv文件解析总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MOOS-ivp 实验十四(2)behavior简要概述

继续上一章的内容,对行为使命进行进一步的介绍和参数配置工作。


文章目录

  • MOOS-ivp 实验十四(2)behavior简要概述
  • 前言
  • 一、简要概述
    • 1.IvP Behaviors的四种状态
    • 2.IvP Behavior类的五个主要虚函数
    • 3.IvP Behaviors的基础参数
  • 二、.bhv文件解析
    • 1.变量初始化
    • 2.行为配置模块
    • 3.行为的分层模式
  • 总结


前言

我准备在接下来的内容里,记录一下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 (positive numerical)
duration_status = value (variable name)

4.duration_status
设定完成持续时间后,开始进行计时,那么剩余的时间就会由duration_status设置的参数作为变量在MOOSDB中进行发布,但是该变量只会在使命执行状态时进行发布。
5.duration_reset
该参数采用变量对量进行赋值,比如设置为MY RESET=true变量,那么当MY_RESET=ture发布在MOOSDB中时,该行为的计时将会被重置。
6.post_mapping
该变量主要是进行在行为中发布变量的一个关系映射,设置格式为post mapping = WPT_STAT,WAYPT_STATUS,主要功能是将WPT_STAT映射给WAYPT_STATUS。就是将行为发布的变量换一个名字来进行发布。

post mapping=WPT INDEX,SURVEY INDEX

7.duration_idle_decay
如果该参数设置为false,那么当使命处于空闲状态时,duration计时就会停止。
8.condition
该参数设置行为进入执行状态所需要的条件,在每次行为进行循环的过程中都会进行检查,当符合条件之后,行为才会进入执行状态。可以使用多个条件进行连接来进行处理,条件变量一般都采用MOOSDB发布MOOS变量来进行设置,helm会自动对这些设定的变量进行订阅。一般格式是STATE = normal 或者(K < 4)。
9.runflag
当行为满足进入执行状态的条件时,将会发布runflag指定的变量来作为标志。该标志只会从空闲状态转入执行状态时才会发布。一般采用格式 为TRANSITING=true。并且可以采用布置一个名称来设置,该变量一般作为满足或者阻止其他行为执行的条件。
10.idleflag
类似于runflag,是当行为满足进入空闲状态的条件时才会发布的变量,并且只会从非空闲状态转入空闲状态才会进行发布。格式同上类似于WAITING=true。该变量一般作为满足或者阻止其他行为执行的条件。
11.activeflag
当behaviour进入active状态之后,发布该变量到MOOSDB中去。从非active到active状态才会发布,类似上面的
12.inactiveflag
当behaviour进入非active状态之后,发布该变量到MOOSDB中去。从active到非active状态才会发布,类似上面的
13.endflag
当behaviour到达截止时间或者完成使命之后进行发布,格式类似于ARRIVED_HOME=true,是一个MOOS变量对。
14.updates
该参数用于行为再加载完成初始化之后的参数更新,可以将behaviour设置为动态更改。具体格式如下:

1 Behavior = BHV_Waypoint
2 {
3  name  = WAYPT_RETURN
4  priority = 100
5  speed  = 2.0
6  radius  = 8.0
7  points  = 0,0
8  updates  = RETURN_UPDATES
9  condition = RETURN = true
10  condition = DEPLOY = true
11 }

初始化中的参数表示waypoin的目标点为0,0而速度保持在2.0.

RETURN_UPDATES = "points=50,50 # speed = 1.5"

通过发布MOOS变量RETURN_UPDATES到MOOSDB之后可以对该行为的目标点以及速度进行动态更改。注意,在每次参数更新是在phelm循环时进行读取的。
15.nostarve
该变量的主要工作是用来检测过时变量,以此来保障行为的正常运行,其会每隔一段时间对发布的变量进行检测,查看其是否有最新的更新以及距离上次发布经过的时间,如果这个时间超过了时间阈值,那么就会触发行为failure故障警报使得phelm发布all-stop。

nostarve = variable_1, ..., variable_n, duration
nostarve = NAV_X, NAV_Y, 5.0

例子就是每次循环都会检测NAV_X, NAV_Y变量距离上次发布的时间是否超过的5s。如果超过时间,说明行为状态发生故障。
16.perpetual
将该参数设置为ture之后,行为在结束状态发布endflag之后,不会真的进入结束状态,而是还可以保持运行,每次循环都仍旧会运行completed()函数的内容。其默认状态是FALSE。

perpetual = value(TURE/FALSE)

17.templating
该参数与制定behavior模板相关联,后续将会进行相关概念的介绍。

以下程序就是父类ivpbehaviour对于setparam函数的具体定义,主要工作是读取配置文件中参数的数据并将其传递到需要使用的其他函数中去。(behaviour 为美式说法,behavior为英式说法,两者并无区别)

bool IvPBehavior::setParam(string g_param, string g_val) 
{
  g_val   = stripBlankEnds(g_val);
  g_param = tolower(g_param);

  // Allow parameters to be prefaced by the '_' and be treated
  // as if that character were not present.
  if(g_param[0] == '_')
    g_param = g_param.c_str()+1;

  if(g_param == "us") { 
    m_us_name = g_val;
    return(true);
  }
  else if((g_param == "pwt") || 
	  (g_param == "priwt") || 
	  (g_param == "priority")) {   // Alt way of setting priority
    double pwt = atof(g_val.c_str());
    if((pwt < 0) || (!isNumber(g_val)))
      return(false);
    m_priority_wt = pwt;
    return(true);
  }
  else if(g_param == "condition") {
    g_val = findReplace(g_val, ',', '=');
    bool ok = true;
    LogicCondition new_condition;
    ok = new_condition.setCondition(g_val);
    if(ok)
      m_logic_conditions.push_back(new_condition);
    return(ok);
  }
  else if(g_param == "duration_status") {
    m_duration_status = g_val;
    return(true);
  }
 ...

  return(false);
}

二、.bhv文件解析

.bhv文件主要包含三部分内容
(1)包含行为的配置模块
(2)参数的初始化部分
(3)行为的分层模式设定
下面对其进行介绍和解析

1.变量初始化

initialize <variable> = <value>
...
initialize <variable> = <value>

以上就是变量初始化的语法格式,可以对behaviour中所使用到的变量进行初始化。关键词initialize不区分大小写,后面的variable = value需要注意大小写。初始化将会覆盖到MOOSDB中的响应变量,如果想要在MOOSDB相应变量未写入任何值时就对其进行初始化,就要使用下面的语法:

initialize_ <variable> = <value>  // Deferring to prior posts if any

2.行为配置模块

其主要使用的语法如下:

Behavior = <behavior-type>
{
	<parameter> = <value>
	...
	<parameter> = <value>
}

首先需要对行为的类型进行声明,这里注意区分大小写。parameter = value 主要是对behaviour来进行设置相关参数的设置。其中有些参数可以省略,但有些参数则是必要的,比如waypoint行为中对于路点的配置是不能省略的。

3.行为的分层模式

下面就是行为分层模式的语法:

Set <mode-variable-name> = <mode-value>
{
<mode-variable-name> = <parent-value>
<condition>
. . .
<condition>
} <else-value>

通过对分层声明最终可以形成一颗关于行为的树状图,其中每个行为就构成了其中的相关节点。行为分层内容相对比较复杂,可以在后续章节进行详细展开。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

最后

以上就是傲娇小海豚为你收集整理的MOOS-ivp 实验十四(2)behavior简要概述MOOS-ivp 实验十四(2)behavior简要概述前言一、简要概述二、.bhv文件解析总结的全部内容,希望文章能够帮你解决MOOS-ivp 实验十四(2)behavior简要概述MOOS-ivp 实验十四(2)behavior简要概述前言一、简要概述二、.bhv文件解析总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部