logo好方法网

基于模块定义图的无人机飞控系统的C++代码生成方法


技术摘要:
本发明公开了一种基于模块定义图的无人机飞控系统的C 代码生成方法,旨在解决现有无人机飞控系统C 生成代码技术中存在的生成效率和正确率较低的技术问题。其实现步骤包括:构建无人机飞控系统的SysML模块定义图;获取SysML模块定义图对应的XMI文件;基于XMI文件构建  全部
背景技术:
嵌入式系统是一个以应用为中心的专用计算机系统,在航空航天安全关键领域被 广泛应用。相比于一般的计算机处理系统而言,嵌入式系统存在较大的差异性,不能实现大 容量的存储功能,对软件代码有较高的可靠性和实时性要求。一般应用于嵌入式系统开发 中使用的程序语言有很多种,包括java、C/C 、python等,其中C 语言实现了面向对象程 序设计,且在高级语言中运行速度是最快的,因此在嵌入式系统的开发中应用最为广泛。 一个可应用于嵌入式系统的生成C 代码方法应具有较高的生成效率,且生成C 代码的正确率高,代码结构完整。现有的生成C 代码方法包括技术人员直接开发和使用模 型驱动技术自动生成两种,其中使用模型驱动技术自动生成的基本思想是将工作重点放在 模型构建上,通过模型转换自动生成代码,避免了人工书写代码可能出现的错误,因此具有 开发效率高、生成代码正确率高的优点。模型驱动首先需要建立适合设计对象的模型,建模 时可选择的模型分为SysML模型、UML模型等。其中SysML模型是一类专门面向系统工程建立 的模型,SysML结构模型是SysML模型的一部分,分为模块定义图、内部模块图和包图,模块 定义图用于描述系统的层次以及系统/组件的分类,通过模块之间的组成、泛化、依赖等关 系来表示各个子系统之间的关系。 无人机的飞行控制系统是一个典型的嵌入式系统,无人机飞控系统是指能够稳定 无人机飞行姿态,并能控制无人机自主或半自主飞行的控制系统,是无人机的大脑,主要的 功能就是自动保持飞机的正常飞行姿态,具体包括模态控制、位置控制、切换飞行模式等功 能。随着无人机的广泛应用,各项功能趋于完善,无人机飞行控制系统作为一种实时控制系 统,其复杂性也日益增加,使得人工开发飞行控制系统难度大,开发时生成代码的效率低, 代码正确率低。 为了提高生成C 代码的正确率和效率,研发人员做了尝试,例如授权公告号为 CN102929681B,名称为“一种虚拟试验分布式对象模型框架代码自动生成方法”的发明专 利,公开了一种从虚拟试验分布式对象模型自动生成C 代码的方法,该专利定义一种虚拟 试验分布式对象模型的描述语言,对使用所述语言描述的虚拟试验分布式对象模型的文本 文件进行词法分析和语法分析,建立所述描述语言与IDL语言的映射关系,调用IDL编译器 生成对应的虚拟试验分布式对象模型框架代码,构建分布式对象模型模板,通过标签替换 生成虚拟试验分布式对象模型框架C 代码。该发明给出的方法通过词法分析和语法分析 虚拟试验分布式对象模型的描述语言,建立描述语言与其他语言的映射关系,将模型自动 转换为C 代码,减少了开发人员的工作量,提高了应用开发的可靠性和效率。但因为只提 出了基于虚拟分布式试验对象模型的生成代码方法,应用于生成无人机代码的步骤过多, 需要定义模型描述语言并映射为IDL语言,再通过标签替换生成C 代码,生成无人机代码 6 CN 111596901 A 说 明 书 2/18 页 正确率较低,生成效率较低。
技术实现要素:
本发明的目的在于克服现有技术存在的缺陷,提出一种基于模块定义图的无人机 飞控系统的C 代码生成方法,旨在解决现有无人机飞控系统C 生成代码技术中存在的生 成效率和正确率较低的技术问题。 本发明的技术思路是:首先构建无人机飞控系统的SysML模块定义图,获取SysML 模块定义图对应的XMI文件,并将此XMI文件元素映射为结构树节点,生成对应的结构树,之 后查找结构树中的所有节点,将节点元素转换为无人机C 代码中类代码、枚举类型代码, 最后将类代码和枚举类型代码相连得到完整的无人机飞行模式的C 代码,完成从SysML模 块定义图到无人机飞控系统的C 代码转换,其实现方案包括如下步骤: (1)构建无人机飞行控制系统的SysML模块定义图: 在papyrus软件中,构建无人机飞行控制系统的SysML模块定义图,包括基础功能 模块和与其并行连接的多个飞行模式模块,以及多个枚举类型模块,其中: 所述基础功能模块,用于生成无人机C 代码中的部分类代码,该模块包含了无人 机飞行控制系统中所有飞行模式共有的操作和块属性,操作用于生成C 类中的函数,块属 性用于生成C 类中的变量定义,操作中包含参数定义,用于生成类中函数的参数,操作和 属性均具有属性name、visibility、type、isstatic,参数具有属性name、type、direction; 所述飞行模式模块,是为每一种无人机飞控系统飞行模式构建的多个模块,用于 生成无人机C 代码中的部分类代码,每个模块包含一种飞行模式用到的操作和块属性,操 作中包含参数定义,每个模块包含与基础功能模块的泛化关系,并泛化关系与基础功能模 块相连接,操作和块属性均具有属性name、visibility、type、isstatic,参数具有属性 name、type、direction,泛化关系具有属性general; 所述枚举类型模块,是为无人机飞行控制系统开发中需要用到的枚举类型构建的 多个模块,用于生成无人机C 代码中的枚举类型代码,每个模块包含枚举类型的关键字和 具体信息,关键字具有属性name,具体信息包括name和value,关键字用于生成枚举类型的 常量定义,具体信息用于生成枚举类型常量中的具体取值和文本; (2)获取SysML模块定义图对应的XMI文件: 通过papyrus软件读取SysML模块定义图对应的XMI文件,文件里包含对模块定义 图中的多个元素,每个元素有对应的标签和属性,元模型为模块定义图,标签为model,基础 功能模块、飞行模式模块和枚举类型模块对应的标签均为packagedelement,其中: packagedelement是model的子标签,其中基础功能模块、飞行模式模块对应的 packagedelement类型为block,枚举类型模块对应的packagedelement类型为 enumeration; 类型为block的packagedelement,子标签分别为块属性的标签ownedattribute、 操作的标签ownedoperation和泛化的标签generalization;其中ownedoperation的子标签 为参数的标签ownedparmeter; 类型为enumeraiton的packagedelement,子标签为关键字的标签ownedliteral; ownedliteral的子标签为具体信息的标签specification; 7 CN 111596901 A 说 明 书 3/18 页 (3)基于模块定义图的XMI文件构建结构树: (3a)定义结构树T,T=(V ,E),其中V表示节点集,E表示有向边集,并初始化 (3b)获取结构树节点集V: (3b1)在XMI文件中查找标签model、packagedelement的元素,并将model的元素作 为T的根节点加入至V中; (3b2)分别将XMI文件中标签packagedelement类型为block、enumeration的元素 作为T的枝节点加入至V中,分别将XMI文件中标签为 ownedoperation、ownedliteral的元素作为T的枝节点 加入至V中,其中作为的子节点,作为< block>的子节点,作为的子节点,且所有枝节点个数均大于 等于1; (3b3)分别将XMI文件中所有标签为ownedattribute、generalization、 ownedparmeter、specification的元素作为T的叶子节点、< generalization>、加入至V中,其中作为的子节点,作为的子 节点,作为的子节点,且所有叶子节点个数均大于等于1; (3c)获取结构树有向边集E: (3c1)将组成的有序二元组(,)、(,)作为有向边加入E; (3c2)分别将组成的有序二元组( ,)、( ,)、(< block>,)作为有向边加入E,将组成的 有序二元组(,)作为有向边加入E; (3c3)将组成的有序二元组( ,),以及组成的有序二元组(< ownedoperation>,)作为有向边加入E; (3d)通过结构树有向边集的有向边连接节点集的节点得到结构树: (3d1)将根节点通过(,)与枝节点相连,将根节点 通过(,)与枝节点相连; (3d2)分别通过(,)、(,)、(< block> ,)将枝节点与叶子节点、枝节点< ownedoperation>、叶子节点相连;通过( ,< ownedparmeter>)将枝节点与叶子节点相连接; (3d3)通过(,)将枝节点与枝节 点相连接;通过( ,)将枝节点< ownedliteral>与叶子节点相连接,得到基于XMI文件的结构树T; (4)基于结构树自动生成无人机飞控系统的C 的类代码: (4a)定义C 的类代码Code<block>,并初始化Code<block>为空字符串; 8 CN 111596901 A 说 明 书 4/18 页 (4b)判断结构树T中每一个枝节点是否存在有向边( ,< generalization>),若是,执行步骤(4c);否则,将字符串#include<stdio.h>、#include <stdlib.h>、#include<stddef.h>、#include<string.h>、#include<stdint.h>、# include<cmath ..h>、#include"enumType .h"依次相连为库包含代码字符串Code< defaultInclude>,然后将Code<block>和Code<defaultInclude>相连为字符串Code <block>1,并执行步骤(4d); (4c)将的叶子节点的属性general转换为C 代码中类 的名称字符串[block .generalization .general],并将Code<block>和字符串"# include\"[block.generalization.general].h\""依次相连为字符串Code<block>2,然 后执行步骤(4e),其中"\"为引号的转义字符; (4d)将的属性name转换为C 代码中类的名称字符串[block.name],并将 Code<block>1、字符串"class"以及[block.name]依次相连为字符串Code<block>2,然 后执行步骤(4e); (4e)判断是否连接有向边(,),若是,将Code< block>2、":public"、[block.generalization.general]、"{"依次相连得到字符串Code< block>3,并执行步骤(4g);否则将Code<block>2与"{"依次相连为字符串Code<block >3,并执行步骤(4f); (4f)查找该节点除叶子节点以外的其他子节点,将节 点信息转换为成员变量以及成员函数的代码Code<X>,并将Code<block>3与Code<X> 依次相连得到新字符串Code<block>4; (4g)将Code<block>4与字符串"}"依次相连为字符串Code<block>5,将Code< block>5写到以"[block.name].cpp"为文件名的类代码文件中,得到与枝节点数 量相同的字符串,并将字符串作为最终生成的C 的类代码; (5)基于结构树自动生成无人机飞控系统的C 的枚举类型代码: (5a)定义C 的枚举类型代码Code<enum>,并初始化Code<enum>为空字符串; (5b)对于结构树T中每一个枝节点,将其属性name转换为C 代码 中枚举类型的名称字符串[enumeration .name];并将Code<enum>、字符串"enum"、 [enumeration.name]和"{"依次相连为字符串Code<enum>1; (5c)对于的每一个子节点,将其属性name的值转 换为C 代码枚举常量的名称字符串[ownedliteral .name],将子节点< specification>的属性value值转换为C 代码中枚举值[ownedliteral.specification. value],判断当前是否为最后一个的子节点,若是,则将 Code<enum>1、[ownedliteral.name]、"="、[ownedliteral.specification.value]、"}" 依次相连为字符串Code<enum>2;否则,将Code<enum>1、[ownedliteral.name]、"="、 [ownedliteral.specification.value]依次相连为字符串Code<enum>2; (5d)将Code<enum>2写到以"enumType.h"为文件名的头文件中,得到与枝节点< enumeration>数量相同的字符串,并将字符串作为最终生成的C 的枚举类型代码; (6)获取无人机飞控系统的C 代码的生成结果: 将C 的类代码与C 的枚举类型代码相连得到无人机飞控系统的C 的代码 9 CN 111596901 A 说 明 书 5/18 页 Codefinal。 本发明与现有技术相比,具有如下优点: 1.本发明首先构建无人机的SysML模块定义图,生成模块定义图对应的XMI文件结 构树,再基于结构树生成无人机的C 代码。本发明将无人机飞行控制系统的模型具体到模 块定义图,简化了建立无人机飞行控制系统的模型的过程,模块定义图结构简洁,使得从模 块定义图生成无人机代码的效率更高。 2.本发明基于模块定义图对应的结构树生成无人机的C 代码,结构树读取方便 结构清晰,从结构树生成无人机C 代码的过程简单精准,使得生成的代码正确率高,且进 一步提高了生成的C 代码的效率,与现有技术相比有效提高了生成C 代码的质量。 附图说明 图1是本发明的实现流程图。 图2是本发明实施例中所构造的结构树的拓扑结构图。
下载此资料需消耗2积分,
分享到:
收藏