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++语言来进行编写,第二个实验也是为此而做的一些准备工作。我学了这五六天可算是终于要进入正题,美滋滋。