moos-ivp 程序框架(二)

1.生成例子代码

用命令生成一个名为pExample的project

./moos-ivp/scripts/GenMOOSApp Example   p "leone"

2.文件结构

文件结构如下:
在这里插入图片描述
主要的代码结构在Example.cpp中

OnNewMail类成员函数用来订阅消息


// Procedure: OnNewMail
 
bool Example::OnNewMail(MOOSMSG_LIST &NewMail)//消息订阅接口
{
  MOOSMSG_LIST::iterator p;
   
  for(p=NewMail.begin(); p!=NewMail.end(); p++) {
    CMOOSMsg &msg = *p;
 
#if 0 // Keep these around just for template
    string key   = msg.GetKey();//这个就是消息的topic名字
    string comm  = msg.GetCommunity();//这个没用到
    double dval  = msg.GetDouble();//获取double类型的message
    string sval  = msg.GetString();//获取string类型的message
    string msrc  = msg.GetSource();//这个是个数据流,一般用来传输大数据,比如图片
    double mtime = msg.GetTime();//获取时间戳
    bool   mdbl  = msg.IsDouble();//这个是判断类型用的,因为发布消息有不同类型
    bool   mstr  = msg.IsString();
#endif
   }
  
   return(true);
}              

Iterate函数相当于while语句,以固定频率运行,具体运行频率可由下面moos配置文件中来设置

bool Example::Iterate()
{
  //Notify(topic,value);//一般在这里发布消息,topic代表消息名,value表示要发布的消息类型
  return(true);
}

OnStartUp函数用来初始化,程序输入参数配置

bool Example::OnStartUp()
{
  list<string> sParams;
  m_MissionReader.EnableVerbatimQuoting(false);
  if(m_MissionReader.GetConfiguration(GetAppName(), sParams)) {
    list<string>::iterator p;
    for(p=sParams.begin(); p!=sParams.end(); p++) {
      string line  = *p;
      string param = tolower(biteStringX(line, '='));
      string value = line;
      
      if(param == "foo") {
        //handled
      }
      else if(param == "bar") {
        //handled
      }
    }
  }
  
  RegisterVariables();  
  return(true);
}

RegisterVariables函数,如果需要订阅某个topic,需要注册一下。例如,订阅名为FOOBAR的topic,如下这样注册

void Example::RegisterVariables()
{
   Register("FOOBAR", 0);
}

pExample.moos文件是配置文件,内容如下:

// pExample config block
ProcessConfig = pExample
{
   AppTick   = 4
   CommsTick = 4
}

pExample就是要运行的节点名

AppTick = 4,CommsTick = 4代表程序以4hz频率运行,即上文讲的Iterate()函数运行频率

3.总结

(1)moos-ivp代码很规范,需要利用GenMOOSApp事先生成一个代码框架,很便利,后续直接往里填就好了。
(2)代码框架中,订阅发布消息的类型好像只有double,string和source三种类型:

 double dval  = msg.GetDouble();//获取double类型的message
string sval  = msg.GetString();//获取string类型的message
string msrc  = msg.GetSource();//这个是个数据流,一般用来传输大数据,比如图片

也不方便自己建立类型,不过看有将变量封装成string发布,这点后面再试试。
(3)但是,发布和订阅消息实在太方便了
发布只需:

Notify(topic,value);//topic代表消息名,value表示要发布的消息类型

订阅只需:
第一步注册:

 Register(topic, 0);//注册topic

第二部订阅:

if (key == topic) {
  data = msg.GetDouble();//比如topic为double类型
}

(4)这节只简单介绍moos-ivp的应用程序通用结构,下节实现图像的发送接收例子

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值