MOOS-ivp 实验四 MOOS编程入门(1)


文章目录

  • MOOS-ivp 实验四 MOOS编程入门(1)
  • 前言
  • 一、MOOS概览
    • 1.MOSS应用程序结构
    • 2.定义在MOOSmsg上的便携函数(handy function)(MOOS mail)
  • 二、下载moos-ivp-extend树
    • 1.下载
    • 2.初步了解
  • 三、建立第一个MOOSapp——An Odometry MOOS App
    • 1.创建moosapp
    • 2.添加moosapp
  • 四、写自己的moosapp
    • 1.完成初步内容
  • 总结

前言

这一次实验的主要内容就是MOOS编程的入门教学,我现在刚开始看也同样啥也不懂,相信我再看个几天,等到写完这篇文章的时候,应该基本就差不太多了。


一、MOOS概览

一些内容之前有过介绍,我这里只放一些我觉得新的部分和有用的部分,原文实验手册里写的很细,废话也很多。

1.MOSS应用程序结构

在实验三中主要使用的是已经存在的MOOS应用程序,我们对它的改动只不过是在一些参数上进行相关的改动。但是MOOS的所有应用不应该是固定的,只要你想要的修改,你就可以对它进行修改。你可以对其中任何一个app进行重写或者复制重命名,改进出来你想要的功能。或者也可以从头开始构建自己的应用程序结构,这是本次实验内容的重点。

如上图所示,所有的MOOS应用程序都是由以上三个子类来构成的。

2.定义在MOOSmsg上的便携函数(handy function)(MOOS mail)

在正常的情况下,系统的app主要是用OnNewMail()这个子类来进行消息处理的,除了我们所知道的变量名称之外,我们还可能希望知道相关的量
(1)值是多少
(2)由那些app发布的
(3)什么时间发布的
(4)值的类型,是string型还是double型等等
在我们的示例文件pXRelayTes里,我们调用msg.GetKey() (这个函数在Relayer.cpp中)来对消息进行获取。下面列举的这些方法都可以对消息来进行获取,这注释上都说了各个函数的作用:

// 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函数的范例就是用这个模板生成的:

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等区别

二、下载moos-ivp-extend树

1.下载

代码如下(示例):

直接下载,下载好后编译添加路径,重启之后在进行检查,前几章讲过,再写一下:
将执行文件添加到路径中去。
首先返回到根目录,之后再执行ls -a查看隐藏文件
找到文件**.bashrc**对其进行编辑,输入vim .bashrc

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,修改这些变量使用公共成员函数来操作,比如15、16行的那些代码。

三、建立第一个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

四、写自己的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类进行一下进一步的学习。

MOOS-ivp 实验四 MOOS编程入门(1)相关推荐

  1. MOOS-ivp 实验四 MOOS编程入门(2)MOOS类讲解

    MOOS-ivp 实验四 MOOS编程入门(2)MOOSapp类讲解 文章目录 MOOS-ivp 实验四 MOOS编程入门(2)MOOSapp类讲解 前言 一.MOOSapp父类的结构和方法 1.使用 ...

  2. linux 程序实验总结,Linux实验报告(实验四) shell编程实验

    实验四 shell编程实验(二) 班级:姓名:学号:上机时间:年月日 任课教师:实验教师:实验成绩: 一.实验目的 综合Linux常用命令和vi编辑器的使用,熟练掌握shell脚本编程. 二.实验注意 ...

  3. 实验四 Shell编程

    一.实验目的 1.掌握shell环境变量.管道.输入输出重定向使用方法: 2.掌握shell脚本建立和执行方法: 3.掌握shell脚本的基本结构: 4.掌握基本的shell编程方法. 二.实验环境: ...

  4. MOOS-ivp 实验五 MOOS编程进阶(2)

    MOOS-ivp 实验五 MOOS编程进阶(2) 今天继续我的实验,感觉每个实验都要被卡住,这种感觉真的好难受,但是如果把问题成功的解决掉,又会给人以非常大的成就感.今天写这篇博客,希望我可以相对顺利 ...

  5. MOOS-ivp 实验五 MOOS编程进阶(3)

    MOOS-ivp 实验五 MOOS编程进阶(3) 经过近日的学习与摸索,我来重新完善以下实验五的相关内容,上次做到三分之二的内容放弃了,主要原因还是因为C++功底不够深厚,需要更多的学习和积累.经过我 ...

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

    MOOS-ivp 实验三 MOOS简介(3) 继上一篇文章继续对实验进行记录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 MOOS-ivp 实验三 MOOS简介(3) ...

  7. MOOS-ivp 实验三 MOOS简介(2)

    MOOS-ivp 实验三 MOOS简介(2) 继上一篇文章继续对实验进行记录 文章目录 MOOS-ivp 实验三 MOOS简介(2) 四.Launching a Mission with pAntle ...

  8. 实验一OpenGL图形编程入门

    实验一OpenGL图形编程入门 一. 实验目的 1.了解和掌握OpenGL的安装. 2.掌握一个简单的基于OpenGL的C++程序结构. 3.掌握Win32程序框架. 4.掌握OpenGL中若干基本图 ...

  9. 实验四 数据库SQL语言基础编程

    -- 实验四 数据库SQL语言基础编程 -- 实验目的: --  掌握数据库查询语句的编写方法 --  掌握利用查询语言完成基本查询 --  掌握利用SQL语句完成数据的添加.删除.修改操作 -- 实 ...

最新文章

  1. zabbix 自定义 key (转)
  2. 9.2.4 .net core 通过ViewComponent封装控件
  3. effective C++ 条款 47:使用traits classes表现类型信息
  4. C++类成员的初始化
  5. Struts2与FreeMarker整合
  6. 第九十八期:TIOBE11月榜单:C、Swift、Go、D与Rust起起伏伏
  7. 【java SOAP】对SOAP的一个个人印象
  8. WEB下的excel批量导入功能
  9. python基础之pip、.pyc、三元运算、进制、一切皆对象、可变与不可变类型
  10. ubuntu使用笔记
  11. Unity 烘焙材质到单一贴图的脚本
  12. Java温习(基础语法一)
  13. python傅里叶变换相位谱图_图像傅里叶变换的幅度谱、相位谱以及双谱重构原图像...
  14. 组件、控件和插件的区别
  15. vue3.0 + tsx 构建el-button
  16. postman打不开
  17. Qt将选中的字体加粗下划线
  18. Unity使用C#网络下载用户头像
  19. mybatipse 下载_Windows实用软件推荐(2)——下载工具
  20. React 入门:JSX

热门文章

  1. 【Leetcode】[190] 颠倒二进制位
  2. 【分享】一个查看无线网络密钥的小方法(查看 wife密码,热点密码)
  3. iOS 如何判断静音开关是否打开
  4. 小米5S TWRP刷面具、EdXposed
  5. 容易发错音的英语单词及音标
  6. 使用Lambda表达式对中文拼音排序(按中文字典排序)
  7. 转:详尽的变速器调节方法
  8. [solr] solr Similarity:切换不同相似度计算方法
  9. java学习---类与对象
  10. 考研英语单词-近义词分类-Second Day