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提供了大量能使我们快速便捷地处理数据的函数和方法。