# MBCGO **Repository Path**: growinware/MBCGO ## Basic Information - **Project Name**: MBCGO - **Description**: 基于模型基转换的可成长自主无人系统及配置项成长寻优,北京航空航天大学 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-12-07 - **Last Updated**: 2021-12-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于模型基转换的可成长自主无人系统及配置项成长寻优 #### 介紹 基于模型基转换的可成长自主无人系统及配置项成长寻优 1.项目简介 1.1项目背景 无人系统软件的运行情况涉及到很多配置项参数,在不同任务、资源和环境下,不同的配置项参数选择会使无人设备有不同的运行结果,为了得到更好的运行结果,需要针对不同的任务、资源和环境选择合适的配置项参数,在文献《 Abdelrasoul, Yassin, Abu Bakar Sayuti HM Saman, and Patrick Sebastian. ”A quantitative study of tuning ROS gmapping parameters and their effect on performing indoor 2D SLAM.” 2016 2nd IEEE international symposium on robotics and manufacturing automation (ROMA). IEEE, 2016.》中,为了提高无人设备的建图算法效果,对参数进行定量研究并分析其对性能的影响,需要人为地测试并调整配置项参数,会花费一定的时间和精力,这是要解决的问题。遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。配置项参数的不同选择可以作为一个搜索问题去解决,随着配置项参数的规模增大,组合优化的搜索空间也急剧增大,在计算上用枚举法很难求出最优解。对这类复杂的问题,需要把主要精力放在寻求满意解上,而遗传算法是寻求这种满意解的最佳工具之一。由于遗传算法不能直接处理问题空间的参数,因此必须通过编码将要求解的问题表示成遗传空间的染色体或者个体,为了达到好的算法结果,需要对软件配置项参数进行合适的编码,并且需要设计合适的选择、交叉、变异算法以及适应度函数,使遗传算法能够有效运行,这些均是需要解决的问题。ANTLR提供了源码到抽象语法树转换的流程工具,使用IDEA编辑器的ANTLR插件,可以将c++代码转换成抽象语法树,但是该抽象语法树只有访问的权限,不能直接操作,参考文献《Parr, Terence. ”ANTLR: Another tool for language recognition.”(2006).》,将只供访问的抽象语法树转换成可以操作的抽象语法树,并根据软件源码的抽象语法树,从软件源码中有效地提取配置项参数,是需要解决的问题。 1.2解决方案 一种基于遗传进化的自主无人系统软件配置项调整方法,针对无人系统软件的配置项参数,借助ANTLR工具链,根据抽象语法树和规则提取配置项参数,同时写入YAML参数文件和源码中。将YAML参数文件中的参数编码成二进制,作为遗传算法的基因序列进行计算;源码放在仿真环境中进行测试,得到测试结果作为计算适应度的基础。遗传算法根据适应度对基因序列进行选择、交叉和变异操作,经过迭代计算,得到适应于该任务、资源、环境的软件配置项参数。在仿真环境中,通过更改仿真环境的配置以及任务发布的脚本,来更改任务、资源和环境的要求,重新运行脚本,即可进行新的迭代计算,得到新的配置项参数,适应新的任务、资源、环境要求。 2.项目框架 2.1总体框架 ![总体框架图](https://images.gitee.com/uploads/images/2020/1212/104010_d541358e_8416965.png "图片1.png") 2.2整体流程 方法,包括以下步骤: 步骤(1):使用IDEA编辑器的ANTLR工具,将无人系统软件的源码转换成抽象语法树,送至参数提取器; 步骤(2):参数提取器根据抽象语法树和要提取的参数类型,匹配对应规则,提取出ROS参数服务器中的参数以及源码中的参数; 步骤(3):根据任务、资源、环境的要求,构建仿真测试环境; 步骤(4):根据步骤(2)中提取出参数的数据类型,随机生成参数的值; 步骤(5):根据随机生成的参数,将其写入多份YAML文件,同时随机生成的参数写回源码,生成与YAML文件数量相等的源码文件; 步骤(6):根据步骤(5)生成的源码文件,在仿真环境中进行编译,编译后进行测试,并得到该源码在仿真环境中的测试结果,即这一部分随机参数对任务、环境、资源的适应度; 步骤(7):根据步骤(5)中的YAML文件,将其编码成二进制文件; 步骤(8):根据步骤(7)中的二进制编码文件和步骤(6)中的测试结果,运行遗传算法,经过选择、交叉和变异,生成下一代种群; 步骤(9):根据计算得到的下一代种群,将其参数值写回YAML文件和源码中; 步骤(10):重复步骤(5)~(9),当测试结果符合预取要求时,得到符合任务、资源、环境的配置项参数,写回源码作为最终结果。 3.环境依赖 - IDEA编辑器,安装ANTLR插件 - 仿真环境Ubuntu16.04 + ROS Kinetic - navigation导航包 - rbx1功能包 4.使用方法 - 将项目下载后,导入IDEA中 - 配置好java环境和ANTLR工具 - 运行GeneticProgram.java可读取文件,并提取配置项参数,具体路径需要自行修改,流程如图所示 ![提取配置项参数并生成第一代种群](https://images.gitee.com/uploads/images/2020/1212/110627_cd4c1555_8416965.png "图片2.png") - 将shell、shell2脚本放在Ubuntu中,将生成的第一代种群放在ROS环境中,将nav_test.py、gp.py、gp2.py、gen_parent.py放在rbx1功能包中的rbx1_nav/nodes中 - 若是提取的配置项参数,则运行shell;若是根据固定的yaml文件作为配置项参数,则运行shell2 - 算法会对参数编码并启动遗传算法,流程如下图所示 ![遗传算法整体流程](https://images.gitee.com/uploads/images/2020/1212/111953_238bcfde_8416965.png "图片3.png") -整个脚本的流程如下图所示 ![脚本整体流程](https://images.gitee.com/uploads/images/2020/1212/112049_3bcc6ba1_8416965.png "图片4.png") #### 參與貢獻 1. Fork 本倉庫 2. 新建 Feat_xxx 分支 3. 提交程式碼 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 來支持不同的語言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方部落格 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 這個地址來瞭解 Gitee 上的優秀開源項目 4. [GVP](https://gitee.com/gvp) 全稱是 Gitee 最有價值開源項目,是綜合評定出的優秀開源項目 5. Gitee 官方提供的使用手冊 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一檔用來展示 Gitee 會員風采的欄目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)