MOOS-ivp 实验十四(4)behavior脉冲使命的撰写

14 篇文章 0 订阅

MOOS-ivp 实验十四(4)behavior脉冲使命的撰写

这里开始对behavior脉冲使命的撰写进行一个简单的介绍


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

主要会结合MOOS所涉及到的一些函数以及MOOS相关的一些代码来进行介绍,也主要是对我自己学习过程的一个详细记录,话说马上要开组会了,感觉没啥进度这可咋办?


一、编辑使命从infobuffer获取信息

首先编写之前介绍到的脉冲使命,需要从buffer中获取两个信息:AUV当前坐标(X,Y)下一个目标点的序列及其坐标。
由于behavior是作为phelm的一部分,所以其不能直接访问MOOSDB,去订阅MOOSDB中的MOOS变量,也不能直接向MOOSDB发布MOOS变量的修改。behavior只能通过phelm作为中介,来对MOOS变量进行操作。info_buffer是phelm中的一种数据结构,其主要作用是作为MOOS变量的一个集合来供behavior进行访问的。info_buffer是所有behavior共享的一个数据结构,每一个行为都有一个可以用来访问info_buffer类的指针。下面介绍一下如何对info_buffer的数据进行访问和修改

1.请求访问information buffer中的一个变量

void IvPBehavior::addInfoVars(string varnames)

调用上面的函数,可以请求将MOOS变量包含在phelm的信息缓冲区之中,以供behavior来进行调用。一般情况下,会在behavior的构造函数中进行调用,调用该函数后,phelm会在每次循环结束的时候向MOOSDB中请求订阅这些MOOS变量。在运行状态下被调用的变量都会进入到信息缓存区中,供behavior进行访问和读取。其中在update和nostarve参数中写入的变量也会被自动订阅。

2.从information buffer中获取变量信息

使用下面的函数就可以从infobuffer中获取变量信息,注意在调用函数时,分清MOOS变量的类型,是double还是string。

string IvPBehavior::getBufferStringVal(string varname, bool& result)
double IvPBehavior::getBufferDoubleVal(string varname, bool& result)

该函数第一个参数是查询的变量名称,第二个参数是得到返回的结果是一个布尔值。

double IvPBehavior::getBufferTimeVal(string varname);

该函数可以获得自从上一次更改变量以来的时间值。如果该变量正好在phelm中进行了更新,那么本次返回值为0,未找到该变量返回值-1。

double IvPBehavior::getBufferCurrTime()

该函数可以获取从开始使用pHelm以来的时间。buffercurrtime是info_buffer数据结构的一个局部变量,通过这个函数对其进行获取。

vector<string> IvPBehavior::getBufferStringVector(string varname, bool& result)
vector<double> IvPBehavior::getBufferDoubleVector(string varname, bool& result)

如果要获取变量更新以来的所有值的序列,可以使用该函数进行读取。最新的值在序列的最上方。

二、编写使命程序

1.参数初始化

如下面代码所示,在setparam()函数中,设置需要初始化的变量。
代码如下(示例):

bool BHV_Pulse::setParam(string param, string val)
{
  // Convert the parameter to lower case for more general matching
  param = tolower(param);

  // Get the numerical value of the param argument for convenience once
  double double_val = atof(val.c_str());

  if((param == "foo") && isNumber(val)) {
    // Set local member variables here
    return(true);
  }
  else if ((param == "pulse_range") && (isNumber(val))) {
    m_pulse_range=double_val;
    return(true);
    // return(setBooleanOnString(m_my_bool, val));
  }
  else if  ((param == "pulse_duration") && (isNumber(val))) {
    m_pulse_duration=double_val;

    return(true);
    // return(setBooleanOnString(m_my_bool, val));

  }
  // If not handled above, then just return false;
  return(false);
}

2.发布到MOOSDB中

因为要向umarineview发布一个脉冲现象,需要定义相关函数。相关代码如下,最后的函数postMessage可以将相关MOOS变量发布到MOOSDB中去,产生一个脉冲现象。
代码如下(示例):

void BHV_Pulse::postPulse(double time)
{
  XYRangePulse pulse;
  pulse.set_x(m_osx);
  pulse.set_y(m_osy);
  pulse.set_label("bhv_pulse");
  pulse.set_rad(m_pulse_range);
  pulse.set_duration(m_pulse_duration);
  pulse.set_time(time);
  pulse.set_color("edge", "yellow");
  pulse.set_color("fill", "yellow");

  string spec = pulse.get_spec();
  postMessage("VIEW_RANGE_PULSE", spec);
}

3.订阅所需变量

一般来说初始化变量和订阅所需变量都是在构造函数中进行的,相关代码如下,订阅MOOS变量的函数为addInfoVars("NAV_X, NAV_Y,WPT_INDEX ")。

BHV_Pulse::BHV_Pulse(IvPDomain domain) :
  IvPBehavior(domain)
{
  // Provide a default behavior name
  IvPBehavior::setParam("name", "pulse");

  // Declare the behavior decision space
  m_domain = subDomain(m_domain, "course,speed");
  m_osx  = 0;
  m_osy  = 0;
  m_pulse_range = 30.0;
  m_pulse_duration = 5;
  m_wpt_index = 0.0;
  m_wpt_index_curr = 0.0;
  m_pulse_time=0.0;
  // Add any variables this behavior needs to subscribe for
  addInfoVars("NAV_X, NAV_Y,WPT_INDEX ");
}

4.在到达目标点时发布脉冲

程序中采用了当目标点的序列发生改变时,发布脉冲相关的MOOS变量到MOOSDB中去。相关代码如下:

IvPFunction* BHV_Pulse::onRunState()
{
  bool ok1, ok2,ok_wpt;
  double m_curr_time=0;
  m_wpt_index = getBufferDoubleVal("WPT_INDEX",ok_wpt);
  m_curr_time = getBufferCurrTime();
  m_osx = getBufferDoubleVal("NAV_X", ok1);
  m_osy = getBufferDoubleVal("NAV_Y", ok2);
  // Part 1: Build the IvP function
  IvPFunction *ipf = 0;

  if (m_wpt_index != m_wpt_index_curr){
    //New waypt, set pulse time
    m_pulse_time =m_curr_time+4;
    m_wpt_index_curr = m_wpt_index;
    postPulse(m_pulse_time);
  }
  //postMessage("m_wpt_index_curr", m_wpt_index_curr);
  //postMessage("m_wpt_index", m_wpt_index);
  // Part N: Prior to returning the IvP function, apply the priority wt
  // Actual weight applied may be some value different than the configured
  // m_priority_wt, depending on the behavior author's insite.
  if(ipf)
    ipf->setPWT(m_priority_wt);

  return(ipf);
}

5.观察实验现象

运行pMarineViewer,便可以观察到编写的脉冲使命正常运行了。
在这里插入图片描述

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值