MOOS程序解析记录(3)MOOSapp结构解析

14 篇文章 0 订阅

系列文章目录

这里根据文档programming with MOOS来写一下关于MOOSapp的程序结构解析,在这里进行一下记录



前言

先给出一个示例,在分析一下示例里的相关内容


提示:以下是本篇文章正文内容,下面案例可供参考

一、MOOSapp示例?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

二、MOOSapp重要虚函数

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1.Iterate

通过在一个新的派生类中重写CMOOSApp::Iterate函数,作者创建了一个函数,可以从中编排应用程序要完成的工作。作为一个例子,毫无偏见地,想象一下这个新的应用程序被设计用来控制一个vehicle。迭代函数由基类定期自动调用,因此从这个“迭代”函数执行一个控制器代码周期是有意义的。这里需要注意的几点:
(1)不要在这里写无限等待的代码块
(2)可以通过配置SetAppFreq()方法调用Iterate的速率,或者在任务文件中指定“AppTick”参数
(3)注意传递给SetAppFreq()的参数指定了将调用Iterate的最大频率。也需要注意lterate的最大频率不会超过程序运行的最小频率,例如,如果你在迭代中编写的代码需要1s才能完成,那么迭代调用的频率就不可能超过1Hz。
(4)调用iterate最大频率,只需调用SetAppFreq(0)
(5)当literate被调用的时候,系统会自动启动MOOSTime来记录时间

2.OnNewMail

OnNewMail这个函数在CMOOSApp::Run()中被调用,如果其他进程已经发布了这个MOOSapp提前声明需要的数据,那么mail就会以 std::list的方式进行发布,编程人员可以随意对这个list进行循环检索,查看谁发送了数据,数据类型,发布时间等消息。
代码如下(示例):

3.OnConnectToServer

不同于以上两种虚函数,OnConnectToServer不是直接被CMOOSApp::Run()所声明的,它实际上是一个来自m_comms对象(一个实例CMOOSCommsObject)中的线程的回调,CMOOSApp拥有这个对象来处理所有的IPC通信。该函数只要与位于MOOS拓扑中心的MOOSDB服务器取得联系,就会发生回调。编程者调用m_Comms.Register来通知MOOSDB,如果任何其他进程提交了与特定变量相关的数据,那么希望收到相关邮件。记住,在这个回调函数中执行的代码不在线程0中。

4.OnDisconnectFromServer

这个部分是OnConnectToServer的相反对应部分,这个函数在与MOOSDB失去联系时被进行调用。这个函数在这里是为了完整性。如果在通信丢失时没有什么特别的事情要做,那么就不必费心将这个函数添加到CMOOSApp的派生类中。

5.OnStartUp

这个函数被CMOOSApp::Run调用,在CMOOSApp::Run进入循环之前,是进行初始化参数填充的函数部分。这就是要用初始化代码填充的地方,特别是使用m_MissionReader成员对象提供的功能从文件读取配置参数(包括那些修改CMOOSApp基类默认行为的参数)。

三、第二个示例 Handling Mail

在Main.cpp中的文件不进行变动,更新一下后面两个list的代码。假设正在构建一个在vehicle上运行的进程——可能是某种导航进程。如果这个进程需要知道vehicle的航向以及状态。假设其他一些进程正在通过MOOS基础设施发布这些数据。问题是如何得到这些数据?首先要做的是“注册”邮件,然后在OnNewMail函数中编写代码来解析邮件。下面将会对此进行讨论:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.registering for mail

如何注册邮件?一个MOOSapp的示例CMOOSCommClient对象声明了一个变量m_Comms,通过调用m_Comms.Register()函数这个变量可以允许我们注册邮件。在上面的list5当中DoRegistrations函数里,通过对m_Comms.Register()函数进行调用,我们注册了“Heading” 和“VehicleStatus”两个变量。请注意,heading’将以4Hz的最大值发布(不管未知外部进程写数据的频率有多高),而“VehicleStatus”消息将在每次有人写入“VehicleStatus”时发布。
那么何时何地进行变量的注册呢?建议在两个地方进行,在OnStartup()结束进行注册,一次在OnConnectToServer()结束进行注册。主要有两个原因:
(1)因为通常在onstartup处执行代码来确定我们要注册那些邮件
(2)数据库连接是异步的。相应地,OnConnectToServer可能在OnStartUp()之前或之后被调用,所以在前一种情况下,我们希望在OnStartUp结束时执行变量注册,在后一种情况下,在OnConnectToServer进行变量注册中。

2.Parsing Messages

如何对消息进行解析呢?list5中最需要关注的是OnNewMail方法。这里也可以看到CMOOSMsgs列表时如何进行发布的。在将执行集中到专用于处理与特定命名数据相关的CMOOSMsgs的代码区域之后(就像我们相当人为的例子中的车辆状态标题),我们需要提取数据本身。CMOOSMsgs可以包含双数据(Msg.GetDouble())或字符串数据(Msg.GetString())。在这种情况下,其他开发人员向我们承诺,“车辆状态”将是一个字符串变量,“标题”将是一个双变量。可以在list5中的两种消息破解方法中看到这个契约。从航向信息中提取双精度数据并不重要,但是从车辆状态字符串中提取数据更有趣,也是应用程序中的一个常见问题。如您所料,有一大堆工具已经准备就绪,等待着帮助您完成这项任务(其中许多工具可以在头文件MOOSGenLibGlobalHelper.h中找到——参见第10节)。我们将在第4.5节的解析内存对象的上下文中讨论字符串操作

3.Using ::PeekMail for Sorting Mail

list5中的示例代码在交互整体消息中使用了一堆“if”语句,将传入消息打包到正确的处理程序中。通过使用CMOOSCommsClient::PeekMail可以取消for循环。这个函数的参量是一个整个传入整个消息列表的引用,并可以根据我们需要的变量的名称提取相关信息。重要的是,该方法可以提取给定名称变量的最新信息。重要的是,该方法可以提取给定名称的最新消息。为什么这样有用?想象一下,您已经请求接收对一个命名变量的每次写操作的通知。很有可能,自从我们的应用程序上次收到邮件以来,其他一些客户端多次发布了关于该特定变量的数据。因此,当调用OnNewMail时,我们将收到与MOOSMSG列表中同一变量相关的多个消息。我们可以想象,有时只对最新的信息采取行动是非常有用的。对PeekMail的调用也可以从MOOSMSG列表中移除(而不是复制)消息。清单6给出了一个编码示例。

4.Checking for Stale Messages

当一个进程启动并注册邮件时,它不知道存储在数据库中的变量的状态。如果在应用程序注册一个特定变量的通知时,该变量已经存在于MOOSDB中,它将被发送一个关于该变量的消息,该消息将在第一次调用OnNewMail时出现在邮件中。这可能意味着一个应用程序从数据库中接收到一条关于某个发布已有几天的消息。一个显而易见的方法是检查每条消息的时间字段.
方法CMOsmSg::IsskEvd是一种检查这一点的简单方法——在幕后,它只是确保有问题的消息在当前时间的几秒钟内有一个时间字段。
在这里插入图片描述

5.Parsing Strings

MOOS解析变量时通常解析相关格式的字符串,因为字符串包含着更多的信息,比如下面图片所示的相关变量:
在这里插入图片描述
对于每一个需要解析的CMOOSMsg可以通过使用MOOSGenLib库中的::MOOSValFromString来进行解析
该处使用的url网络请求的数据。

四、Testing The New Application

如何对新编写的MOOS程序进行测试,下面给出了两个工具,一个是在程序执行之前设定变量,另一个工具是查看MOOSapp的相应。

1.Testing with uMS

测试方法就是启动图形工具uMS


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值