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的应用程序通用结构,下节实现图像的发送接收例子