面向对象的无人机任务设备通信接收软件设计
2018-08-13皮祖成
皮祖成,陈 文,马 龙,魏 瀚
面向对象的无人机任务设备通信接收软件设计
皮祖成,陈 文,马 龙,魏 瀚
(彩虹无人机科技有限公司,北京 100074)
无人机在执行任务过程中,任务管理计算机需要接收地面控制站发送的遥控指令,同时也将遥测信息发回地面控制站。遥测信息来源于无人机上各种任务载荷的状态遥测和侦察数据遥测信息。任务载荷遥控和遥测的通信处理过程是由任务管理软件来实现的。本文所述的任务设备通信接收软件是任务管理软件的底层通信模块。任务设备通信帧模型采用了数据结构化定义的方式,其基本模块包含通信帧的帧头、帧长和帧校验等区段。为了统一接收所有任务设备的通信数据,本文设计了基于面向对象方法的通信帧接收软件。通过试验测试,本文所述程序能高效的完成通信帧的接收工作,并具备一定的扩展灵活性,并成功应用于某型无人机任务管理处理中。
无人机;状态机;通信帧;面向对象
0 引言
无人机广泛应用于侦察监视等领域[1],随着无人机技术的发展,无人机的载重能力也得到了很大的进步,同时能挂载多型任务载荷。无人机可通过换装搭配不同的任务载荷以实现不同的作业任务需求。为了适应多任务载荷挂载的需求,无人机中通常配备有任务管理计算机[2],任务管理计算机的软件模块如图1所示。任务管理软件实现对任务载荷的控制、状态监控、任务载荷协同控制和数据存储等功能。所有功能通过接口单元向任务载荷和外部系统获取数据,基于获取到的数据来实现特定的功能。
图1 任务管理系统
无人机机载端通常采用RS422、CAN总线、ARINC-429等面向字节数据流的接口进行通信[3-4],为了从数据流中提取出通信帧,解决类似TCP网络通信“粘包”问题[5],一般采用了结构化的方法对数据进行封装。结构化后的通信帧一般包含帧头、帧长、帧识别ID、数据和帧校验等区段。本文通过面向对象的设计方法对通信帧接收过程的软件进行建模[6-7],并设计了通信接收算法[8]。通过C++语言在嵌入式VxWorks操作系统中实现了任务设备通信接收算法[9-10]。
1 软件设计
1.1 通信帧模型
任务载荷设备的通信数据一般被设计为结构化的通信帧。针对不同的任务载荷设备采用不同的帧头,如0xEB90、0x597E、0xEE16、0x597E0BAA51B0等帧头。“帧长”为连续多个字节所表达的长度信息,一个通信帧的总字节数需要从“帧长”区段中获取。通常在任务载荷中采用1个或2个字节的无符号整数直接表达通信帧的长度,而在一些特殊情况下需要将多个字节的“帧长”信息进行复杂的运算后才能获得通信帧的长度。“帧识别ID”区段用于进一步识别通信帧的类型。“数据”段则存放了有效数据。“帧校验”则为多个字节的帧校验信息。
本文将通信帧抽象为具有帧头、帧长和帧附加特征这3种元素的模型。通信帧的“帧头”位于通信帧的开始部分,具有一定长度的连续字节序列。“帧长”表达了一帧数据所有字节的数量,其值为单个字节的整数倍。帧长信息可以从一帧数据的帧头之后的数据中获取,但获取的方式因帧类型而异。“帧附加特征”是一段字节序列,该序列用于进一步识别该通信帧的类型。在此模型的基础上,判断所接收到的数据是否为某一种特定通信帧时,需要具备以下两个条件:①帧头匹配;②附加特征匹配。
为了标识通信帧的所有类型,设计了图2所示的FrameID枚举来表示通信帧类型,其中仅示例了一部分通信帧类型,可根据软件的需求进行增减。设计如图3所示的ComFrame类用于存储一个完整的通信帧数据,其中content用于存放帧的所有内容,id则为该通信帧的类型。
图2 通信帧ID枚举
图3 通信帧类
设计图4所示的FrameTrait通信帧特征类,该类作为一个抽象类描述了通信帧的特征:帧头(header)、帧长(length)、帧附加特征(trait)。通过帧识别符(id)标识了通信帧对象所对应的通信帧类型。因帧接收算法的需要,提供了识别该类通信帧所需要的最少原始字节数(bestPartialSize)信息。从“帧长”的类型来看存在定帧长和可变帧长两种类型,其中定帧长的帧长值为一固定值,用一个大于零的值来代表;当length为零时代表了可变帧长,此时的帧长度需要从帧头之后的数据中计算得出。帧长的计算方法包含于FrameTrait提供的Length方法中。Length方法调用了getVarLength虚方法,FrameTrait抽象类的实现类可根据具体通信帧类型的帧长计算方法来实现该算法。帧头匹配和附加特征匹配算法通过isHeaderOk方法和isTraitOk方法来实现。所有通信帧类型的帧头均为固定值,在FrameTrait中实现了统一的isHeaderOk算法,用于在数据流中检查帧头是否匹配。由于通信帧的附加特征存在各种变化,为了提供算法的可扩展性,将isTraitOk设计为虚函数,以便派生类重写特征匹配算法。通信帧类ComFrame与通信帧特征类FrameTrait之间通过FrameID进行关联,如图5所示。
图4 通信帧特征类
图5 通信帧类与通信帧特征类的关联
为了统一配置和获取通信帧的类型定义,设计了FrameTraitFactory工厂类,如图 6所示。通过该类提供的insertTrait方法可添加通信帧的类型。通信帧的类型定义包含帧识别符、帧头、帧长和帧附加特征这4个属性。在需要使用通信帧特征对象的地方,可提供通信帧ID并使用GetFrameTrait方法获取到所需的通信帧特征对象。
图6 通信帧特征工厂类
1.2 类层次结构的设计
通过FrameTrait抽象类派生并实现了3种通信帧特征类型:StandardFrameTrait、DGPSFrameTrait、SpecialFrameTrait类,如图7所示。其中StandardFrameTrait用于处理固定帧长通信帧和常规的变帧长通信帧。常规变帧长通信帧的结构如图8所示,其中帧长用帧头之后的1个字节表示;固定帧长通信帧则不具有“帧长”区段。特殊可变帧长的通信帧如DGPS(Differential GPS)的某类通信帧,其帧长信息的解析需要使用帧头之后的数据,并采用特定的CalcLength算法进行解算,如图9所示。
图7 通信帧特征类关系图
图8 常规变帧长通信帧
图9 DGPS通信帧
如图10所示的通信帧既需要识别通信帧头,同时还要识别子帧ID才能确定通信帧所属类型。在这种情况下需要用到附加特征匹配功能,此时需要提供附加特征信息和实现isTraitOk方法,该方法在识别到帧头之后进一步判断子帧ID是否与给定的值相同,如图10中当子帧ID位置为“01”则代表了ID_FCC_FrA帧,当帧ID位置为“02”则代表了ID_FCC_FrB帧。附加特征存储在FrameTrait派生对象的trait字段中。isTraitOk算法决定了如何利用附加特征对通信帧类型进行判断。
图10 需要进行附加信息判断的通信帧
1.3 通信帧接收算法
通信帧接收算法封装于FrameFinder类中,如图11所示,每个通信端口绑定一个FrameFinder对象,用于接收该端口的数据。FrameFinder对象必须知道需要从该端口接的通信帧类型,这些信息通过其的构造函数的参数提供。FrameFinder将通信帧类型信息存放于frameTraits变量中。buffer用于缓存来自于通信端口的字节数据流,当端口有数据到来时调用InBuffer方法将数据追加到缓存中。GetFrames方法用于从缓存中获取指定通信帧类型的数据。
图11 通信帧识别算法类
FrameFinder中包含多个FrameTrait对象,并为每各FrameTrait对象提供一个接收算法所需的状态机,如图12所示,该状态机用于查找、识别和接收该类型的通信帧,各状态机的状态存储于states变量当中。WorkingStage描述了状态机的3种状态,不同状态下均需要使用到WorkingState状态变量,其结构如图13所示。NextStage记录了状态机的下一个状态,即在接下来的状态切换时切入该状态。
图12 通信帧接收状态机
图13 状态机状态参数
图14 从buffer中接收一帧数据示意图
图15 缓存buffer的定义及使用
通信帧接收的序列图如图16所示,App作为主程序首先获取通信端口的配置信息。通过端口的配置信息可以得知需要从该端口中接收的通信帧类型(FrameID枚举)的集合。将该集合提供给FrameTraitFactory对象,并调用GetFrameTrait方法获取通信帧类型所对应的FrameTrait。FrameTraitFactory是通过找到对应FrameID的FrameTrait,然后调用FrameTrait的Clone方法完成的对象复制。由FrameTraitFactory将所复制的对象返回给App。App根据所获取的FrameTrait集合创建FrameFinder对象,然后App进入一个循环读取通信端口数据的过程中。在App的循环过程中,App首先获取设备通信端口的新数据,然后调用FrameFinder对象的InBuffer方法将端口数据追加到缓存的尾部。然后,针对每一个状态机的状态,执行相应的帧头查找、特征判断、帧长提取和通信帧数据接收等操作。最后更新数据缓存和各状态机对应的VirtualCutPos位置。状态机的状态转换如图12所示,状态机起始状态为查找帧头状态(Finding),在查找到帧头(Condition A)时进入特征匹配状态(TraitTest)。如果特征匹配失败(Condition C)则退回到查找帧头状态,如果特征匹配成功(Condition B)则进入到数据接收等待状态(WaittingData)。在数据接收等待状态时,待接收完一帧通信数据(Condition D)后再次进入查找帧头状态。
图16 通信帧接收序列图
2 软件的实现
无人机任务管理机载软件运行于PowerPC系列处理器上,软件的底层采用了VxWorks操作系统,并使用面向对象的C++语言编程实现。基本通信帧类ComFrame的content和FrameTrait的header、trait等成员由于变长度的存储需求,采用STL标准容器vector来存储,并实例化为BYTE(即C++中的基本类型unsigned char)的容器。FrameTrait类作为一个通信帧特征描述类,需要具备较灵活的扩展性,并且不同的FrameTrait实例需要给通信帧接收算法提供统一的接口。所以将FrameTrait实现为一个抽象类,将算法变化最多的几个功能实现为其虚函数成员,其中包含了isTraitOk成员、getVarLength成员。同时,因为在应用程序中需要传递FrameTrait子类的对象,但由于其多态性,在FrameTrait中设计了虚的Clone方法,通过该方法可使用其抽象类的指针克隆该指针所指对象。FrameTrait的各派生类的对象可从两种方式获取,第一种方式采用FrameTraitFactory工厂类的GetFrameTait方法获取,另一种方式采用其派生类对象的Clone方法获取。通过这两种方式获取的对象都必须由使用方进行析构。FrameFinder作为算法运行的主体,通过vector容器实现了通信数据的缓冲区,并在每次接收到新的通信数据时进行一次通信帧接收过程。FrameFinder中通过STL标准容器map实现了FrameTrait子对象和帧接收状态机的关联,每一个通信帧接收过程即是对该map的一个遍历过程,完成每个FrameTrait子对象特征的判断、数据的接收过程。
3 结论
本文通过面向对象的方法对无人机机载通信帧接收软件进行了建模设计。利用面向对象的继承、多态等特性给通信帧接收算法创造了较灵活的可扩展机制,为不同的通信帧格式的统一接收设计了一套基本的算法。通过在VxWorks嵌入式操作系统中采用面向对象的C++编程,提高了嵌入式软件的抽象能力。本文所设计的通信帧接收算法为无人机任务管理的各项应用层功能提供了标准的接口,使得上层应用软件的设计得以标准化,降低了对底层处理的依赖。通过项目实践证明本软件能高效的运行于无人机任务管理计算机中,并能满足性能和实时性的需求。
[1] 刘长清, 潘舟浩, 唐晓斌. 国外无人侦察监视飞机发展分析[J]. 中国电子科学研究院学报, 2015, 10(6): 657-661.
[2] 皮祖成, 王诚, 陈文. 某型无人机机载任务管理计算机设计[J]. 航空工程进展, 2016, 7(4): 464-470.
[3] 支超有. 机载数据总线技术及其应用[M]. 北京: 国防工业出版社, 2009.
[4] 刘凯, 何君燕. CAN总线广播系统设计[J]. 软件, 2012, 33(1): 109-111.
[5] 王红霞. 一个内网通信系统的设计与实现[D]. 吉林: 吉林大学, 2014.
[6] 卢超, 黄蔚, 胡国超. 基于图形数据结构的复杂对象建模设计[J]. 软件, 2015, 36(12): 220-223.
[7] 苏荟. 一种新的面向对象软件集成测试序列生成方法[J]. 软件, 2012, 33(3): 75-76.
[8] 张合, 刘小红. 面向对象的对象建模技术及其应用研究[J]. 软件, 2011, 3: 66-68.
[9] 王学龙. 嵌入式VxWorks系统开发与应用[M]. 北京: 人民邮电出版社, 2003.
[10] 段德功, 丁莹亮. 基于嵌入式技术的工业通信管理机的开发及应用[J]. 软件, 2012, 33(6): 83-84.
Object-oriented Design of Communication Receiving Software for UAV Mission Payloads
PI Zu-cheng, CHEN Wen, MA Long, WEI Han
(Cai Hong UAV Technology Co. Ltd., Beijing 100074, China)
The mission management computer needs to receive the remote control commands sent by the ground control station (GCS) during the execution of the mission of UAV. At the same time, mission management computer also needs to send telemetry information to GCS. Telemetry information is derived from telemetry and reconnaissance data for various mission payloads on UAV. The communication procedure of telemetry and remote control is achieved by mission management software. The communication receiving software discussed in this paper is the underlying module of the mission management software. The mission payload communication frame model adopts the structured data definition way, its basic module includes the frame header, the frame length and the frame check sum section and so on. In order to uniformly receive the communication data of all mission payload, this paper designed a communication frame receiving software based on object-oriented method. Throught experiments, the program described in this paper can efficiently complete the reception of communication frames and have a certain degree of expansion flexibility. It is successfully applied to the mission management computer of a certain type of UAV.
UAV; State machine; Datagram; Object-oriented
V247.1
A
10.3969/j.issn.1003-6970.2018.07.013
皮祖成(1985-),男,工程师,主要研究方向:无人机任务载荷应用;陈文(1986-),男,工程师,主要研究方向:无人机任务载荷应用;马龙(1987-),男,工程师,主要研究方向:无人机任务载荷应用;魏瀚(1990-),男,助理工程师,主要研究方向:无人机任务规划。
本文著录格式:皮祖成,陈文,马龙,等. 面向对象的无人机任务设备通信接收软件设计[J]. 软件,2018,39(7):63-67