MOOS-ivp 实验四 MOOS编程入门(1)
文章目录
前言
这一次实验的主要内容就是MOOS编程的入门教学,我如今刚开始看也一样啥也不懂,相信我再看个几天,等到写完这篇文章的时候,应该基本就差不太多了。编程
1、MOOS概览
一些内容以前有过介绍,我这里只放一些我以为新的部分和有用的部分,原文实验手册里写的很细,废话也不少。vim
1.MOSS应用程序结构
在实验三中主要使用的是已经存在的MOOS应用程序,咱们对它的改动只不过是在一些参数上进行相关的改动。可是MOOS的全部应用不该该是固定的,只要你想要的修改,你就能够对它进行修改。你能够对其中任何一个app进行重写或者复制重命名,改进出来你想要的功能。或者也能够从头开始构建本身的应用程序结构,这是本次实验内容的重点。
如上图所示,全部的MOOS应用程序都是由以上三个子类来构成的。
bash
2.定义在MOOSmsg上的便携函数(handy function)(MOOS mail)
在正常的状况下,系统的app主要是用OnNewMail()这个子类来进行消息处理的,除了咱们所知道的变量名称以外,咱们还可能但愿知道相关的量
(1)值是多少
(2)由那些app发布的
(3)什么时间发布的
(4)值的类型,是string型仍是double型等等
在咱们的示例文件pXRelayTes里,咱们调用msg.GetKey() (这个函数在Relayer.cpp中)来对消息进行获取。下面列举的这些方法均可以对消息来进行获取,这注释上都说了各个函数的做用:
app
// return the name of the message std::string GetKey(); // return the name of the message (just another way) std::string GetName(); // check data type is double bool IsDouble(); // check data type is string bool IsString(); // return time stamp of message double GetTime(); // return double val of message double GetDouble(); // return string value of message std::string GetString(); // return the name of the process (as registered with the DB) which posted this notification std::string GetSource(); // return the name of the MOOS community in which the orginator lives std::string GetCommunity();
这里稍微解释一下上面std::string是啥意思:
string是C++语言标准模板库(STL)中的一个组成部分,STL中的全部函数类名称(专业点叫标识符)都被存储在一个叫作std的命名空间之中,因此要调用库中的某一个类的时候须要添加头文件,而且使用std命名空间,咱们想要使用string类的时候就须要在最开头添加
框架
include<string> using namespace std;
而后上面那一堆函数都是std类中定义的各类成员函数,可是不少都是标准库里没有的,估计是MOOS系统本身写一些成员函数。
书接正文继续写:
接下来的试验里,会用到到一个MOOS提供的模板,用来生成新的MOOS应用程序的框架代码,下面这个OnNewMail函数的范例就是用这个模板生成的:
dom
bool MyApp::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(); string comm = msg.GetCommunity(); double dval = msg.GetDouble(); string sval = msg.GetString(); string msrc = msg.GetSource(); double mtime = msg.GetTime(); bool mdbl = msg.IsDouble(); bool mstr = msg.IsString(); #endif } return(true); }
我先试着理解一下这个代码框架:
for(p=NewMail.begin(); p!=NewMail.end(); p++)
这句话应该是搞了一个for循环,把最开始的mail起始地址给了p,p一直累加,当p不等于终点地址的时候退出。就是iterator类定义的变量p从起始地址一路指到终点地址的过程。
CMOOSMsg &msg = *p;定义了一个CMOOSMsg类型的引用msg,这句代码的意思是把指针p指向的值赋给引用msg,msg就是p指向的那个值的一个别名。搞不懂的参考下面的网站:
C++中int *a; int &a; int & a; int * &a
C/C++中和&的用法
后面的#if 0就是直接注释掉下面的代码了,若是是#if 1的话就是对下面的代码进行编译(不是执行哦,编译不必定执行)。上面模板里有关传入MOOSmessage的典型函数都被注释掉了,若是须要使用的话能够随时将其拿出来进行调用。关于#if详情参考以下网站
C/C++中常见的#if、if、#ifdef、#if define等区别
svn
2、下载moos-ivp-extend树
1.下载
代码以下(示例):函数
直接下载,下载好后编译添加路径,重启以后在进行检查,前几章讲过,再写一下:
将执行文件添加到路径中去。
首先返回到根目录,以后再执行ls -a查看隐藏文件
找到文件**.bashrc**对其进行编辑,输入vim .bashrc
post
svn co https://oceanai.mit.edu/svn/moos-ivp-extend/trunk moos-ivp-extend cd moos-ivp-extend ./build.sh which pXRelayTest 返回结果相似于说明正确添加路径: /home/you/moos-ivp-you/bin/pXRelayTest
2.初步了解
在进行下一个实验以前,先快速了解一下关于Relayer MOOS app类的一些定义。下面列出这些内容,也能够在目录moos-ivp-extend/src/pXRelayTest/中找到这些相关内容。学习
**File Relayer.h 1 #include "MOOS/libMOOS/MOOSLib.h" 2 class Relayer : public CMOOSApp 3 { 4 public: 5 Relayer(); 6 virtual ~Relayer() { }; 7 8 bool OnStartUp(); // Overriding key virtual function 9 bool OnNewMail(MOOSMSG_LIST &NewMail); // Overriding key virtual function 10 bool Iterate(); // Overriding key virtual functionx 11 12 bool OnConnectToServer(); 13 void RegisterVariables(); 14 15 void setIncomingVar(std::string s) { m_incoming_var=s;} 16 void setOutgoingVar(std::string s) { m_outgoing_var=s;} 17 18 protected: 19 unsigned long int m_tally_recd; 20 unsigned long int m_tally_sent; 21 unsigned long int m_iterations; 22 23 std::string m_incoming_var; 24 std::string m_outgoing_var; 25 double m_start_time_postings; 26 double m_start_time_iterations; 27 };**
(1)在类声明的第一行,都会声明本身是CMOOSapp的子类,CMOOSapp是通常app的父类。
(2)咱们本身定义的类会声明三个关键的虚函数,在8-10行有三个关键的虚函数
(3)编码约定:全部的成员函数都会在成员变量以前进行声明,被覆盖的成员函数在子类特定的成员函数以前进行声明。(这里我搞不懂覆盖是什么意思,为此查了一些资料,搞明白了什么是虚函数和基虚函数、覆盖、重载和隐藏的含义)这些主要是C++多态部分的内容,怪我学艺不精,想不起来了)
(4)编码约定:全部的成员变量都用m_进行开头,以便于跟代码中本地声明的变量区分开来
(5)编码约定:全部成员变量都是protect,修改这些变量使用公共成员函数来操做,好比1五、16行的那些代码。
3、创建第一个MOOSapp——An Odometry MOOS App
本节内容的重点是创建一个本身的MOOSapp,下面使咱们在这里须要实现的目标:
(1)了解如何使用模板脚本从头至尾生成一个moosapp
(2)了解如何在系统中添加moosapp
(3)写一个app,记录AUV行程,这个app叫pOdometry
(4)在Alder例子中测试app,让AUV行驶五十米以后返回而后查看记录的行程
(5)将MOOSapp转化为MOOScasting app
1.建立moosapp
打开目录到moos-ivp-extend/src/.
而后运行指令`
GenMOOSApp Odometry p "Jane Doe"
就能够建立一个moosapp啦,其名称为 Odometry,p是前缀的意思 最后面引号是做者的名字。
2.添加moosapp
咱们须要在系统中将咱们写好的moosapp 添加进去。打开文件目录moos-ivp-extend/src/CMakeLists.txt
打开这个txt文件
咱们在下面添加咱们本身的app名称,上图是已经添加好了的状况。
#========================================================================== # List the subdirectories to build... #========================================================================== ADD_SUBDIRECTORY(lib_behaviors-test) ADD_SUBDIRECTORY(pXRelayTest) ADD_SUBDIRECTORY(pExampleApp) ADD_SUBDIRECTORY(pOdometry) <-- Add your line here
保存以后接下来打开build文件进行编译
cd moos-ivp-extend
./build.sh
编译完成以后找一下建立的moosapp,获得下面结果说明正确了,若是没找到 看一下文件路径是否添加了或者重启系统从新试一下。
which pOdometry
/home/you/moos-ivp-you/bin/pOdometry
4、写本身的moosapp
要写一个简单的moosapp须要完成如下要求:
(1)订阅AUV位置变量NAV_X 和 NAV_Y
(2)程序中反复读取X和Y的位置信息
(3)计算当前位置和以前位置的距离来更新总的路程
(4)将总里程数发布到一个可变的moos变量ODOMETRY_DIST中去
1.完成初步内容
(1)打开如下路径 找到 Odometry.h文件包含上成员变量
bool m_first_reading; double m_current_x; double m_current_y; double m_previous_x; double m_previous_y; double m_total_distance;
(2)在constructor中完成对变量的初始化,打开Odometry.cpp 对变量进行赋值
(3)编辑Odometry.cpp来订阅变量NAV_X 和 NAV_Y
这里由于我不是很懂如何订阅变量,因而在官网找资料在帮助文档中找到了关于MOOS类的相关说明,为了能将实验进行下去,有必要对这篇文档进行仔细的阅读,搞明白各个类的功能以及做用。下面的文章先MOOS类进行学习以后再返回实验。
总结
主要内容是对moos树进行下载以及检查,建立了一个本身的moosapp并将其添加到了系统执行路径中去。最后咱们在写第一个app时遇到问题,不知道如何订阅变量。这里须要对moos类进行一下进一步的学习。