[发明专利]基于状态机图的无人机飞行模式的C++代码生成方法有效
申请号: | 202010425423.3 | 申请日: | 2020-05-19 |
公开(公告)号: | CN111596915B | 公开(公告)日: | 2022-12-02 |
发明(设计)人: | 马建峰;康龙宇;尹文耀;孙聪;张涛;沈玉龙;李亚晖;王中华 | 申请(专利权)人: | 西安电子科技大学;中国航空工业集团公司西安航空计算技术研究所 |
主分类号: | G06F8/35 | 分类号: | G06F8/35;G06F8/41;G05D1/08;G05D1/10 |
代理公司: | 陕西电子工业专利中心 61205 | 代理人: | 陈宏社;王品华 |
地址: | 710071*** | 国省代码: | 陕西;61 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 状态机 无人机 飞行 模式 c++ 代码 生成 方法 | ||
1.一种基于状态机图的无人机飞行模式的C++代码生成方法,其特征在于,包括如下步骤:
(1)制定无人机飞行控制系统各飞行模式的工作流程:
(1a)根据无人机的不同任务需求,将无人机飞行控制系统的n个飞行模式划分为全球卫星导航定位系统飞行模式子集合M1和非全球卫星导航定位系统飞行模式子集合M2,其中M1中至少包含自动模式,M2中至少包含降落模式,并将M1和M2合并为无人机飞行控制系统飞行模式集合M,M={m1,m2,...,mi,...,mn},其中mi表示第i个飞行模式,1≤i≤n,n≥2,且
(1b)将每个飞行模式mi划分为数据获取模块、功能模块和控制信号传输模块,并根据每个飞行模式mi的任务需求制定mi所划分的三个模块的工作流程;
(2)构建无人机的框架SysML状态机图:
构建包括多个状态和各状态之间迁移的无人机框架SysML状态机图,多个状态包括初始化状态、结束状态、下降状态、数据获取复合状态、调库复合状态、模式复合状态以及控制复合状态,其中:
初始化状态,用于对待生成的C++代码内部变量进行定义,该状态中的行为执行结束后无人机迁移至数据获取复合状态;
结束状态,用于结束C++代码;
下降状态,用于调用设定的下降函数完成无人机下降,该状态中的行为执行结束后迁移至结束状态;
数据获取复合状态,包括连接伪状态和自写子状态,其中连接伪状态用于对从其他状态迁移至数据获取复合状态的事件进行判断,若需要调用代码库则迁移至调库复合状态中的传感库子状态,否则迁移至自写子状态;自写子状态用于代码设计人员手动编写数据获取C++代码以获取俯仰角、横滚角、偏航角速度、高度、油门和当前位置,当油门最低、升降速度小于预定值并且高度不超过预定值时,迁移至结束状态,该状态中的行为执行结束后迁移至模式复合状态的连接伪状态;
调库复合状态,包括传感库子状态、核心库子状态、功能库子状态和接口库子状态;传感库子状态用于调用传感器代码库中的函数,以获取无人机姿态数据,该状态中的行为执行结束后迁移至数据获取复合状态中的自写子状态;核心库子状态用于调用帮助快速完成无人机飞行控制系统的计算工作代码库中的函数,该状态中的中的行为执行结束后转换至功能库子状态;功能库子状态用于调用快速完成无人机飞行模式mi的相应功能的代码库中的函数,该状态中的行为执行结束后迁移至模式复合状态的连接伪状态;接口库子状态用于使用无人机接口代码库中的函数以获得硬件接口,该状态中的行为执行结束后转换至控制复合状态中的位置管理器子状态;
模式复合状态,包括连接伪状态、卫星导航子状态和非卫星导航子状态;连接伪状态用于对从其他状态迁移至模式复合状态的事件进行判断,若需要全球卫星导航系统辅助飞行的迁移至卫星导航子状态,否则迁移至非卫星导航子状态;卫星导航子状态用于使用调库复合状态中的传感库子状态得到的数据和数据获取复合状态中的自写子状态得到的目标点位置数据,如果通过全球卫星导航系统得到的位置信息和当前位置吻合则意味着到达目标位置,迁移至下降状态,否则迁移至调库复合状态中的接口库子状态,如果在卫星导航子状态中检测到飞行员发出了操作信号就转换至非卫星导航子状态;非卫星导航子状态用于接收飞行员操作,再通过使用已有库函数计算得到的数据或根据不同模式需求手写函数计算得到的目标点位置数据,该状态中的行为执行结束后迁移至调库复合状态中的接口库子状态;
控制复合状态,包括位置控制器子状态、姿态控制器子状态和数据发送子状态;位置控制器子状态用于获取无人机竖直方向数据,该状态中的行为执行结束后结束后迁移至姿态控制器子状态;姿态控制器子状态用于期望数据调用库函数或自写函数的接口改变无人机姿态,该状态中的行为执行结束后转换至数据发送子状态;数据发送子状态用于向无人机操作员发送结果数据,该状态中的行为执行结束后转换至数据获取复合状态中的连接伪状态;
(3)基于框架SysML状态机图构建飞行模式mi的子SysML状态机图:
根据每个飞行模式mi中三个模块的工作流程为框架SysML状态机图中的每个子状态添加行为和事件,得到与n个飞行模式对应的n个子SysML状态机图T={t1,t2,...,ti,...,tn};
(4)获取每个飞行模式mi的XMI文件:
通过papyrus软件,将每个飞行模式mi对应的子SysML状态机图ti转化为XMI文件X={x1,x2,...,xi,...,xn};
(5)制定层次性代码生成规则:
(5a)制定层次性代码生成规则的第一层代码生成规则:
(5a1)对XMI文件xi逐行查找以packagedElement name=name*中nam e*命名一个接口类,作为外界访问此状态机图的接口,在该接口类中定义各个状态的state变量,接口类的初始化函数中包括各个状态机图中的状态的state变量初始化,以及接口类state的默认定义用来确定初始状态,其次该类中包括状态机图中所有transition xmi:type=uml:Transitionxmi:id=*name=*source=*target=*/事件的定义;
(5a2)建立一个以packagedElement name=name*中name*加state命名的用于接口类访问内部状态的具体接口的抽象类,此抽象类中包含(5a1)定义的接口类的变量context,抽象类的初始化函数的形参为(5a1)定义接口类变量,以d命名,在该初始化函数内部定义context=d,在该抽象类中包含ti中所有事件的声明,事件具体的实现由继承于该抽象类的子类来完成;
(5a3)在(5a1)定义的接口类中加入一个由(5a2)定义的抽象类state变量,用来记录当前状态图所处的状态;
(5b)制定层次性代码生成规则的第二层代码生成规则:
(5b1)对XMI文件xi逐行查找,xi中每一subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex作为简单状态,将xi每一subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex之中有region xmi:type=uml:Regionxmi:id=name=/region且“region”中有至少一个subvertex xmi:type=uml:Statexmi:id=name=/或subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex作为复合状态,复合状态分为顺序复合状态和并发复合状态,在复合状态subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex中只有一个region xmi:type=uml:Regionxmi:id=*name=*/region作为顺序复合状态,在复合状态subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex中有两个及以上region xmi:type=uml:Regionxmi:id=*name=*/region作为并发复合状态处理;
(5b2)简单状态和复合状态均建立为C++类,以subvertex xmi:type=uml:Statexmi:id=*name=name*/subvertex中name*为此类命名,继承自第一层代码生成规则的抽象类;
(5b3)顺序复合状态subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex内部的每一个subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex或subvertex xmi:type=uml:Statexmi:id=name=name*/建立为一个C++类,类名为name*,这个类继承自外部的顺序复合状态类;
(5b4)并发复合状态的每个region xmi:type=uml:Regionxmi:id=*name=name*/region单独生成一个抽象类作为访问其内部子状态subvertex xmi:type=uml:Statexmi:id=name=name*/或subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex的接口,类名为name*,其subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex中所有的connectionPoint xmi:type=uml:Pseudostatexmi:id=name=name*kind=/和transition xmi:type=uml:Transitionxmi:id=name=name*source=target=/转换为以name*为函数名的函数定义在此抽象类中,每个内部子状态类继承自其所属region xmi:type=uml:Regionxmi:id=*name=name*/region的抽象类;
(5b5)每个subvertex xmi:type=uml:Statexmi:id=*name=*/subvertex状态中的connectionPoint xmi:type=uml:Pseudostatexmi:id=name=name*kind=/,将其定义为此状态类中的函数,函数名为name*,其中when行为转化为if函数来实现;
(5b6)使用transition xmi:type=uml:Transitionxmi:id=source=target=trigger xmi:type=uml:Triggerxmi:id=name=event=id*//transition中的id*逐行查找XMI文件xi,通过source和target分别确定事件的来源和目标,将packagedElement xmi:type=uml:ChangeEventxmi:id=id*name=changeExpression xmi:type=uml:type*xmi:id=name=name*/定义为来源状态的类中的函数,以name*为函数名;
(5b7)subvertex xmi:type=uml:Pseudostatexmi:id=name=kind=junction/为伪状态,逐行查找XMI文件xi当目标状态为伪状态时,在来源状态生成的类中通过对伪状态的转换条件进行判断来进行状态迁移;
(6)基于层次性代码生成规则,获取无人机飞行控制系统飞行模式的C++代码:
(6a)根据第一层代码生成规则对XMI文件xi进行提取,得到接口类C++代码以及以抽象类C++代码;
(6b)根据第二层代码生成规则对XMI文件xi进行提取,得到含有实现行为的状态的代码;
(6c)将步骤(6a)和(6b)生成的代码进行合并,得到飞行模式mi的C++代码,并将所有(n)飞行模式的代码合并 ,得到无人机飞行控制系统飞行模式的C++代码。
2.根据权利要求1所述的基于状态机图的无人机飞行模式 的C++代码生成方法,其特征在于,步骤(1b)所述的将每个飞行模式mi划分为数据获取模块、功能模块和控制信号传输模块,以及三个模块的工作流程,其中:
三个模块的划分标准为:数据获取模块用于获取无人机当前姿态数据和控制人员发送的控制数据,功能模块用于实现为无人机的任务需求而做的计算和操作,控制信号传输模块用于向无人机硬件接口和操作员发送计算结果数据;
三个模块的工作流程,是指无人机为实现特定的任务目标而做的用文字表述的步骤。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于西安电子科技大学;中国航空工业集团公司西安航空计算技术研究所,未经西安电子科技大学;中国航空工业集团公司西安航空计算技术研究所许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202010425423.3/1.html,转载请声明来源钻瓜专利网。
- 上一篇:电动机组件
- 下一篇:一种精细化电炒茶设备能耗监测及控制系统