MOOS-ivp 实验三 MOOS简介(3)

MOOS-ivp 实验三 MOOS简介(3)

继上一篇文章继续对实验进行记录


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


六、A Simple Example with pXRelay

pXRelay是一个简单的MOOSapp,它的作用是说明MOOSapp的基本功能。它注册一个变量,当它收到这个变量的发布的邮件之后,将发出另一个+1的变量。

1.pXRelay基本使用

pXRelay在配置文件中拥有属于自己的块,其主要内容是:(a)传入变量incoming,它为传入的邮箱注册一个变量(b)传出变量outgoing,它将在每次接受到传入邮件之后给传出变量递增一个数值。下面是基本格式:

ProcessConfig = pXRelay
{
    
    
outgoing_var = <MOOSVar>
incoming_var = <MOOSVar>
}

2.pXRelay简单例子

0  // (wget http://oceanai.mit.edu/2.680/examples/xrelay.moos)
1  ServerHost = localhost
2  ServerPort = 9000
3  Community = alpha
4
5  ProcessConfig = ANTLER
6  {
    
    
7  MSBetweenLaunches = 200
8
9  Run = MOOSDB  @ NewConsole = false
10  Run = pXRelay  @ NewConsole = false ~pXRelay_PEARS
11  Run = pXRelay  @ NewConsole = false ~pXRelay_APPLES
12  }
13
14  ProcessConfig = pXRelay_APPLES
15  {
    
    
16  AppTick  = 10
17  CommsTick  = 10
18  incoming_var = APPLES
19  outgoing_var = PEARS
20  }
21
22  ProcessConfig = pXRelay_PEARS
23  {
    
    
24  AppTick  = 10
25  CommsTick  = 10
26  incoming_var = PEARS
27  outgoing_var = APPLES
28  }

启动文件之后,可以看出两个pXRelayapp都在等待对方内容的发布。为了打破僵局,我们可以发布一个消息:

 uPokeDB xrelay.moos PEARS=1

接下来观察一下变量的状态

 uXMS xrelay.moos --all --show=time

pears的数值开始不断递增
在这里插入图片描述

3.pXRelay实验

1.以下是实验要求:
(1)添加一个脚本块,使得pXRelay可以自行进行启动。
(2)改变脚本添加一个由一到十的计数器,其计数的条件是当PEARS=APPLE的时候进行计数。在uXMS中进行观察
2.使得pXRelay进行自启动,在uTimeScript模块里添加如下命令即可:

  event = var=PEARS, val=1, time=1.0

3.添加计数器,并确定脚本的逻辑条件增加以下命令即可:

  event  = var=COUNTER_B, val=1,  time=0.5
  event  = var=COUNTER_B, val=2,  time=1.0
  event  = var=COUNTER_B, val=3,  time=1.5
  event  = var=COUNTER_B, val=4,  time=2.0
  event  = var=COUNTER_B, val=5,  time=2.5
  event  = var=COUNTER_B, val=6,  time=3.0
  event  = var=COUNTER_B, val=7,  time=3.5
  event  = var=COUNTER_B, val=8,  time=4.0
  event  = var=COUNTER_B, val=9,  time=4.5
  event  = var=COUNTER_B, val=10, time=5.0
  condition = APPLES == $(PEARS)

4.完整代码如下:

ServerHost = localhost
ServerPort = 9000
Community  = alpha

//------------------------------------------
// Antler configuration  block
ProcessConfig = ANTLER
{
    
    
  MSBetweenLaunches = 200

  Run = MOOSDB   @ NewConsole = true
  Run = pXRelay  @ NewConsole = false ~ pXRelay_PEARS
  Run = pXRelay  @ NewConsole = false ~ pXRelay_APPLES
  Run = uXMS  @ NewConsole = true
  Run = uTimerScript @ NewConsole = false
}

ProcessConfig = uXMS
{
    
    
  AppTick   = 4
  CommsTick = 4
  VAR  = DB_CLIENTS,PEARS,APPLES,COUNTER_B
  DISPLAY_SOURCE = true
  DISPLAY_TIME  = true
  COLOR_MAP  = DB_CLIENTS, red
  COLOR_MAP  = PEARS, blue
  COLOR_MAP  = APPLE, red

}

ProcessConfig = uTimerScript
{
    
    
  AppTick   = 4
  CommsTick = 4
  paused = false
  event = var=PEARS, val=1, time=1.0
  event  = var=COUNTER_B, val=1,  time=0.5
  event  = var=COUNTER_B, val=2,  time=1.0
  event  = var=COUNTER_B, val=3,  time=1.5
  event  = var=COUNTER_B, val=4,  time=2.0
  event  = var=COUNTER_B, val=5,  time=2.5
  event  = var=COUNTER_B, val=6,  time=3.0
  event  = var=COUNTER_B, val=7,  time=3.5
  event  = var=COUNTER_B, val=8,  time=4.0
  event  = var=COUNTER_B, val=9,  time=4.5
  event  = var=COUNTER_B, val=10, time=5.0
  condition = APPLES == $(PEARS)
  reset_max  = nolimit
  reset_time = all-posted
}


//------------------------------------------
// pXRelay_APPLES config block

ProcessConfig = pXRelay_APPLES
{
    
    
  AppTick   = 10
  CommsTick = 10
  INCOMING_VAR  = APPLES
  OUTGOING_VAR  = PEARS
}

//------------------------------------------
// pXRelay_PEARS config block

ProcessConfig = pXRelay_PEARS
{
    
    
  AppTick   = 10
  CommsTick = 10
  INCOMING_VAR  = PEARS
  OUTGOING_VAR  = APPLES
}



5.有一个思考实验,叫我把pXRelay模块中的AppTick = 0.1,说先在脚本大多处于不满足状态的情况,解释问什么。但是我并不清楚AppTick是用来控制什么的,个人感觉像是某个app的时钟计时?还是等我搞清楚之后来解决这个问题吧。

七、First Experiments in Modifying MOOS App Code

1.下载一个MOOS模板文件

输入以下代码来对MOOS模板文件及其目录树来进行下载后面的yourname可以写成自己的名字,我自己的就是pitt gao:

svn co https://oceanai.mit.edu/svn/moos-ivp-extend/trunk moos-ivp-pittgao

接下来下载好之后对其进行编译

 cd moos-ivp-janedoe
 ./build.sh

2.打开MOOS模板文件

打开moos树文件夹,查看源代码Relayer.CPP的源代码,尤其是OnNewMail() 和Iterate()函数

//---------------------------------------------------------
// Procedure: OnNewMail

bool Relayer::OnNewMail(MOOSMSG_LIST &NewMail)
{
    
    
  MOOSMSG_LIST::iterator p;
  for(p = NewMail.begin(); p!=NewMail.end(); p++) {
    
    
    CMOOSMsg &msg = *p;
    
    string key = msg.GetKey();

    if(key == m_incoming_var) 
      m_tally_recd++;
  }
  return(true);
}
//---------------------------------------------------------
// Procedure: Iterate()

bool Relayer::Iterate()
{
    
    
  m_iterations++;

  unsigned int i, amt = (m_tally_recd - m_tally_sent);
  for(i=0; i<amt; i++) {
    
    
    m_tally_sent++;
    Notify(m_outgoing_var, m_tally_sent);
  }
  
  // If this is the first iteration just note the start time, otherwise
  // note the currently calculated frequency and post it to the DB.
  if(m_start_time_iterations == 0)
    m_start_time_iterations = MOOSTime();
  else {
    
    
    double delta_time = (MOOSTime() - m_start_time_iterations) + 0.01;
    double frequency  = (double)(m_iterations) / delta_time;
    Notify(m_outgoing_var+"_ITER_HZ", frequency);
  }
    

  // If this is the first time a received msg has been noted, just
  // note the start time, otherwise calculate and post the frequency.
  if(amt > 0) {
    
    
    if(m_start_time_postings == 0)
      m_start_time_postings = MOOSTime();
    else {
    
    
      double delta_time = (MOOSTime() - m_start_time_postings) + 0.01;
      double frequency = (double)(m_tally_sent) / delta_time;
      Notify(m_outgoing_var+"_POST_HZ", frequency);
    }
  }
  return(true);
}


讲道理这实验上来就让我修改程序,我上来怎么就会了呢?第四个实验就是介绍怎在MOOS中进行编程的,这个就是让做一个前提条件,先把框架下载好再说。

总结

到这里第三个实验就结束了,第三个实验内容还不少,主要是对于PAntler脚本块如何进行编写的。又介绍了几个比较重要常用到的模块,接下来第四个实验正式的进入MOOS程序的编写,主要用C++语言来进行编写,第二个实验也是为此而做的一些准备工作。我学了这五六天可算是终于要进入正题,美滋滋。

猜你喜欢

转载自blog.csdn.net/weixin_44151170/article/details/108870595