MOOS-Ivp前置知识(1)

本文介绍了MOOS-Ivp前置知识,包括如何构建和扩展应用程序pPrimeFactor,该应用处理NUM_VALUE变量,确定其质因数。文章讲解了应用程序的要求,如处理大数字、工作队列的设计,以及C++中处理大整数和字符串转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于小编刚刚接触MOOS-Ivp及C++、linux等,对于MOOS-Ivp前置知识只能边学边记录:

本练习中要解决的一个主要问题是如何构建一个应用程序,测试输入将由另一个应用程序产生。一个应用程序发送一个素数,另一个应用程序分解为不同质数的乘积以后将求解的内容返回。

一、下载自己的可扩展MOOS-Ivp树,moos-ivp-extend。

二、进入moos-ivp-extend/src,使用指令构建一个新的应用程序。

$ GenMOOSApp PrimeFactor p "John Doe"

三、将其添加到CMakeList.txt中

四、注意:  

         扩展全新的pPrimeFactor应用程序以读取邮件NUM_VALUE,并确定它是偶数还是奇数,然后相应地发布新邮件。测试是通过UPOKEDDB完成的。

         使用UTimeScript通过脚本中的一组值代替UPOKEDB测试上面的值。

         处理迭代()循环内的偶数/奇数判定。在NewMail()中构建一个传入列表的C++列表,并在Idter()中处理此列表。

五、pPrimeFor应用程序的说明

      应用程序主要应该满足以下要求:

      ①、你的应用程序应该被称为pPrimeFactor。

      ②、你的应用程序应该注册并处理变量NUM_VALUE值,应用程序应该接受这个包含64位整数值的变量的邮件。最大值为,或1844 67407370955 1615,为64位无符号整数的最大值。你可以假设只有正整数作为输入。

      ③、传入变量是字符串类型。必须将其转换为代码中的数值。

      ④、应用程序应该确定给定输入的主要因素列表,并为每个输入生成以下输出:

               原始数字,

               指示接收到的顺序的索引,

               指示其计算顺序的索引,

               解决分解的时间。这是在正常的时钟时间,而不是CPU时间。使用MOSIMTIME()函数获取接收到的时间和完成的时间。

               主要因素的列表。

               一个唯一的ID指定你,例如,你的用户名。

     ⑤、输出变量应该是PRIME_RESULT结果,格式如下。请注意,如果一个数可以由一个素数均匀地除以一次,如下面的两个3的例子,列出结果中的每一个:

    PRIME_RESULT = "orig=90090,received=34,calculated=33,solve_time=2.03,
    primes=2:3:3:5:7:11:13,username=jane"

      ⑥、应用程序不应该被大量数字所阻塞。无论前面查询的大小如何,我们都应该能够立即看到对低数量查询的响应。

      ⑦、不要使用已知素数的缓存。

六、关键点介绍:

       本练习的关键问题是设计pPrimeFactor应用程序来处理任何大小的数字,但不能阻塞于处理的数字。某些小的数字,以及一小列素数的数字,使它们能够非常快速地计算它们的素因子集。其他数字,如任何20位质数,在确定其结果之前需要更多的步骤。你的应用程序应该能够很快接收到包含数字的邮件。

       其目的是设计你的应用程序来快速处理和发布容易数字的结果,并且当接收到较难的数字时,不要延迟容易数字的结果。您需要建立一个工作队列(以C++列表的形式)来保存新到的和未解决的数字。您需要在OnNewMail()函数中填充该队列。你需要在你的迭代()方法中对这个队列“工作”。

        关键思想是每次调用Iterate()时,都会对队列中的每个项应用固定数量的素因式分解计算。对于某些元素,这将足以完成计算。它们可以从队列中删除,并以传出邮件的形式将其答案发送到MOOSDB。对于当前回合中不能完成的元素,它们将保留在队列中,以便在下一次调用Iterate()时进行连接。诀窍是为任何未完成的工作保存“状态”。

        最后,我们将使用我们的uTimerScript数字序列来检查一个正常工作的pPrimeFactor应用程序,其中混合了简单数字和硬数字。我们将检查这些因素的正确计算,并检查硬数没有阻止容易的数字。

七、C++相关内容

       ①无符号长整数:

       pPrimeFactor应用程序需要接受和处理非负整数,对于64位整数,最大值为: 

       unsigned long int value = 184467440739429084;

       传统上,这是通过使用以下C++数据类型实现的。但是,在一些旧的C++编译器中,“unsigned long int”数据类型只有32位。在最新的编译器中,它们是64位。可以肯定的是,下面的数据类型变得更加常见,而在较新的编译器中,老式的将产生警告。我们将使用这个实验室中最新的样式:

 #include <cstdint>

   uint64_t value = 184467440739429084;

      ②为什么MOOS的输入要设置成字符串模式

      MOOS消息要么是字符串类型,要么是双精度类型。字符串类型实际上允许表示任何其他复杂数据类型,因此基本上可能的消息类型是无限的。双类型是方便表示小数的,但在这里用不到。

     C++中的双类型是8字节,或64位。类型uint64_t也为64位。他们都能够代表或1844 67407370955 1615不同的数字。不同之处在于,对于int64_t变量,仅表示范围[0,18446744073709551615]中的整数。对于双精度,所有负数、所有浮点非整数值(例如,23.87432)和高于18446744073709551615的数字都被填充到相同的64位中。这不可避免地意味着一些数字是不可表示的,而是映射到附近的“闭合”数。这是一些大整数值从数字大于15位数开始的情况。

      这意味着,如果我们想要通过MOOS消息精确地传递大量数字,那么我们应该使用数字的字符串表示。因此,在我们的情况下,如果我们想要构成一个大的18-20位质数,我们需要使用字符串。

      ③字符串到数字,数字到字符串转换

     在这个实验室里,你需要在字符串和数值之间执行一些转换。若要表示一个64位整数,我们希望使用uint64_t类型。

   #include <cstdint>
  uint64_t  value = 0;

       在这个实验室中,如果使用实验室中提供的uTimerScript脚本,这些数字将作为字符串值发布到变量NUM_VALUE。例如:

     NUM_VALUE="5674032334252535"。

    若要将字符串从STR=“5674032334252535”转换为一个“int64_t”,可以使用:  

   

 #include <cstdlib>   // for the strtoul() function

 string str = "5674032334252535"
 uint64_t value = strtoul(str.c_str(), NULL, 0);

    在另一个方面,将数值转换为字符串,可以使用C++ stringstream类来实现:

 #include <sstream>
 ....

 // Create the biggest unsigned long int possibe
 uint64_t ival = 18446744073709551615;

 // Convert it to a string
 stringstream ss;
 ss << ival;
 string str = ss.str();

 // Confirm it works
 cout << "Value:" << str << endl;

    ④用于字符串分析的极好的工具

    在这个实验室中,需要生成以逗号分隔变量=值对的字符串形式发布的结果,如下所示。

  PRIME_RESULT = "orig=90090,received=34,calculated=33,solve_time=2.03”

 八、对于该实验的建议

       构建复杂代码的有效策略是识别相对容易的不同阶段,其中每个阶段都是(a)可验证的,(b)更接近于整体解决方案,(c)不需要在每个阶段之间进行大量重新工作。考虑到这一点,在实验中提供了以下不同的阶段:

      ①构建并编译

      ②增加你的应用程序接受和处理数值输入

     

 

 

未完待续。。。。。

  

<think>好的,我需要处理用户关于MOOS-IVP和VirtualOcean的技术信息和示例项目的查询。首先,用户已经提供了两个引用,引用1提到了IvP基准工具和性能分析,引用2介绍了MOOS-IVP的基本安装和使用。用户现在想要更具体的使用指南或示例项目,特别是与VirtualOcean相关的部分。首先,我应该确认MOOS-IVP和VirtualOcean的关系。根据之前的了解,VirtualOcean是MOOS-IVP生态系统中的一个仿真环境,用于模拟水下机器人的操作场景。可能需要参考官方文档或示例项目来找到相关信息。接下来,我需要检查用户提供的引用内容。引用1中的IvP基准工具可能用于测试算法,但用户可能需要的是VirtualOcean的具体使用步骤。引用2详细介绍了MOOS-IVP的安装和基本使用,但未提及VirtualOcean。因此,需要结合外部知识或官方资源来补充。然后,我应该考虑用户可能需要的关键信息点:安装步骤、配置VirtualOcean、运行示例任务、自定义场景的方法,以及相关文档资源。需要确保回答结构清晰,分步骤说明,并提供示例项目路径,如missions目录中的案例。 此外,用户可能对如何访问官方文档和社区资源感兴趣,应提供链接和途径。需要验证这些链接是否有效,但根据引用2中的信息,官网地址是正确的。最后,生成相关问题,帮助用户深入探索,如安装问题、仿真与真实设备的差异、多机器人协同仿真等。确保问题与主题相关,并促进用户进一步学习。</think>### MOOS-ivp与VirtualOcean使用指南 MOOS-ivp的VirtualOcean是一个用于模拟水下机器人操作环境的工具,常用于任务规划、传感器数据仿真和协同控制测试。以下为关键使用步骤和示例项目说明: --- #### 1. **安装与配置** **步骤1:获取源代码** -MOOS-ivp官方仓库下载VirtualOcean模块: ```bash git clone https://github.com/moos-ivp/moos-ivp-virtual.git ``` - 编译安装: ```bash cd moos-ivp-virtual && ./build.sh ``` **步骤2:环境变量配置** 将编译生成的`bin`目录添加到系统环境变量: ```bash export PATH=$PATH:/path/to/moos-ivp-virtual/bin source ~/.bashrc ``` --- #### 2. **运行VirtualOcean示例项目** **示例1:基础海洋环境仿真** - 进入示例任务目录: ```bash cd moos-ivp-virtual/missions/sim_ocean ``` - 启动仿真: ```bash pAntler ocean_sim.moos ``` 此示例会生成一个包含洋流、地形和水下障碍物的3D环境[^2]。 **示例2:AUV协同任务仿真** - 运行多机器人协同任务: ```bash cd moos-ivp-virtual/missions/multi_auv pAntler multi_auv.moos ``` 该场景模拟多台AUV执行搜索或测绘任务,支持实时路径规划与避障[^1]。 --- #### 3. **自定义仿真场景** **方法1:修改配置文件** - 编辑`.moos`文件调整海洋参数(如洋流速度、海底地形): ```moos VirtualOcean = { CurrentSpeed = 1.5 // 单位:米/秒 BathymetryFile = "terrain.csv" // 自定义地形数据 } ``` **方法2:集成IvP求解器** 通过引用[1]提到的IvP基准工具生成复杂任务实例,并在VirtualOcean中加载测试: ```bash ivp_solver --config=mission_plan.xml --output=result.log ``` --- #### 4. **相关文档资源** - **官方教程**: [MOOS-ivp VirtualOcean Wiki](https://oceanai.mit.edu/moos-ivp/pmwiki/pmwiki.php?n=Site.VirtualOcean) - **代码示例**: `moos-ivp-virtual/missions/`目录包含传感器仿真、动态避障等案例。 - **社区支持**: MOOS-ivp邮件列表(moos-[email protected])提供技术讨论与问题解答。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值