试飞实时数据可视化方法研究
2015-11-07覃杨森范彦勤乔东峰
覃杨森 聂 睿 范彦勤 乔东峰
试飞实时数据可视化方法研究
覃杨森 聂 睿 范彦勤 乔东峰
依靠单一的数值分析及数据演算判断很难提高对实时试飞科目的评判效率,并严重影响了险情处置时的快速决策。将实时试飞数据分析结果进行结构化存储,采用列模式内存对齐方法,提高单个参数的检索查询及图形输出操作效率;对C++builder标准组件类属性及方法进行扩充,实现对常规和特殊飞行科目定制结果曲线图的绘制输出;嵌入VC++动态计算库,利用进程调用方式,融合Matlab平台GUI应用程序,共享试飞科目数据分析常用算法库,扩展软件综合输出功能。实现了对试飞实时数据分析结果的可视化输出,为飞行决策提供了更直观的数据参考。
在国内的飞行试验过程中,通过采集飞机姿态及状态参数,利用遥测链路将飞行数据实时传回地面,经解算后显示输出到监控画面中,以帮助试飞工程师及地面指挥员及时判断飞行状态是否达到飞机设计指标要求,整个监控系统架构如图1所示。同时在飞机遇到险情时,数据的实时监控输出能够为准确决策出恰当的处置方案提供最直观最可靠的判断分析依据。因此,在试飞实时监控环境下,需要及时对试飞数据分析结果做出评判。而如何对分析结果的可视化输出,以全面准确反映出飞机各个系统交联状态的参数信息,突出飞行试验中特定时刻下的关键数据,是完成评判决策环节的重要步骤。
目前,在数据结果可视化输出中常用的origin软件生成方法虽然形式丰富,但由于其着重于软件通用性设计,反而使得针对性功能薄弱,无法针对试飞科目评判图将数据输出。因此,在实时的分析结果处理中,较简便针对性强的可视化输出方法就更有利于数据分析的完成。除了具备使用便捷、平台可扩展及能够完成特殊飞行科目曲线绘制等特性外,同时应可对常用的Matlab GUI应用程序提供必要的方法接口,充分具备平台融合的综合输出特点。基于C++builder环境下试飞数据分析结果的可视化输出方法,扩展了标准绘图构件类属性及方法,结合结构体的内存存储特点,解决与Matlab平台的调用及进程管理问题,有针对性完成了相应的数据可视化综合输出功能的设计与实现。
方法设计
试飞数据分析结果的可视化输出方法分为数据结构化存储、数据时间段选取、参数数据导出、特殊曲线绘制和扩展平台综合输出五个阶段步骤。步骤间通过进程控制信号或者数据流指针等接口实现内存数据区的交互和共享,总体架构如图2所示。
步骤一:数据结构化存储通过输入进程事件触发。选择需要进行分析的文件路径,由此获得文件句柄,依次完成对文件内部数据的内存导入,进行文件元素的遍历,完成对文件存储结构体的构造,同时根据文件的信息,初始化下一阶段内存区域及进程控制信号。
步骤二:在数据时间段选取阶段中,对需要画图的参数进行标记,触发相应图形区域的绘制信号量。创建数据检索进程,查找出参数的最大最小值,自主完成画图区域的上下限设定,并根据相应的操作控制事件进行手动调节,通过不同区域的图形绘制进程的同步控制,使得需要导出的参数进行时间点和选取时间段的同步。
步骤三:将选定的参数时间段数据进行另存操作。以选取好的时间段为基准,对全部或者部分参数数据以文本格式导出分析平台,进而可以将数据在其他平台中进一步分析。对于导出的分析结果,可以创建新的内存缓冲区块,构造生成图片格式的保存或者打印,以运用于分析报告的编写。
步骤四:绘制指定科目特殊曲线。根据飞行实时绘图评判需求,完成例如参数对曲线图、1对1曲线图、1对N曲线图及散点评判图等图形显示,由定制曲线绘制进程单独完成,并利用进程的内存空间,获取数据指针信息,完成相应的图片格式储存及打印输出。
步骤五:通过平台扩展接口,结合科目分析中常用的DLL算法动态库,操作数据指针及内存模块,进行一些频谱分析或伯特图输出。同时,利用进程控制信号与Matlab平台应用程序进行内存数据交互调用,将数据与状态参数综合显示到指定绘图区域中,以实现对结果的综合输出。
方法实现
图1 试飞数据实时监控系统架构图
图2 方法步骤流程图
根据可视化方法过程,基于C++builder开发平台进行可视化输出软件设计与实现。C++builder平台有着丰富的图形绘制功能,以控件模块的实现方式更容易对操作事件及控制信号进行管理和响应。在对数据进行处理过程中,可以利用列对齐管理方式,通过系统本身的信号收发机制响应动作句柄,并建立共享缓存区域,发挥C++builder与VC++平台的兼容性及结合Matlab的工具箱,获得图形结果的综合显示输出。整体实现方案如图3所示。
数据结构化存储
由于编译器在对内存进行分配管理时,对于结构体的存放遵循列对齐管理模式,有别于数组内存管理的顺序存放模式,所以在考虑到数据量大小的前提下,采用结构化存储方式。获取数据在内存中的文件句柄之后,对文件元素进行遍历,依次完成结构体的构造。根据实际使用需求,大部分操作都是由参数列为引导,以完成各功能之间的关联与融合。因此,采用列模式元素遍历方式,即将数据与其参数名称关联,存放入同一个结构体中。在节省了内存开销的同时,也可以提高对各个参数的操作效率。由于时间信息不是特定的数据类型,因而采用了包含String数组的结构体存放,并与数据点数一一对应,方便了时间段的检索和起始点的选择。
图3 软件整体框架图
数据时间段截取
对于某一飞行科目而言,所涉及的参数之间,都存在着某种必然的关系。因此,在进行数据时间段截取的过程中,就必须充分了解各个参数在同一时间点的数据状态。根据参数间的相互应证关系,去分析和判断飞机的飞行状态。为此,可视化输出软件提供了四种参数显示页面模式,分别可以同时在同一页面显示两个、四个、六个及九个参数之间的曲线关系。同时,也可以将所有的图形操作同步到总体控制滑块上,以完成不同显示画面上参数的操作关联。
在进行参数曲线显示时,使用C++builder环境下的标准TChart控件,因而对于单个的控件而言,所包含的属性值及方法都是私有的,要完成它们相互之间的同步显示,必须在窗体类TFrom下定义公共的类,其中的属性和方法能够被外部控件所获取和修改。另外,在窗体类下嵌套定义的曲线显示公用类,还可以避免标准控件TChart使用析构函数释放资源时引起的溢出异常。由于C++builder环境下的标准组件内都封装了与之相匹配的析构函数,用于被调用结束后会释放系统资源,而析构函数本身是不可以被重载和覆盖的。因此,如果对标准组件的内部属性或者方法进行修改后,必然会引起系统资源使用的变化,使得析构函数不能完整释放资源空间,导致容器构件的运行异常,出现不确定性的错误。在软件中,自定义的公共类及方法接口类的UML类图如图4表示。
基于以上的类关联设计,可以完成参数之间X轴方向上的上下限同步操作。同时,还可以根据参数Y轴方向上的数值变化范围,分别调整相应的上下限,将不需要的变化范围进行过滤。在对某一参数完成起始点的确定后,其他参数自动显示对应的起始标记线,与之同步操作。
数据导出
将参数数据导出到外部文件中,使得可以借助其他软件对相关参数完成进一步的分析。可视化输出软件设计了按照时间段截取方式对所有参数或者部分参数导出到数据文本的操作。当确定好数据时间段的起始标记线以后,可以通过鼠标操作,在参数名称列表中进行导出标记。如果没有标记其中某一参数时,软件默认将所有参数导出,否则,只导出已被标记选中的参数。导出的参数以文本格式进行存储,可以使用Origin、Matlab或其他数据分析软件直接读取。另外,对于某些特殊的参数,需要通过图片或者打印将曲线图输出。软件平台对每一个图形曲线都绑定提供了这两种操作。软件将需要保存图片或打印的曲线图加载到内存缓冲区中,实例化为图片或者打印的对象。如果是保存图片操作,则根据选取的图片格式进行压缩输出;如果是打印操作,则启动打印机,根据画面大小,调整分辨率后,打印输出文件,可以选择PDF打印格式或者是系统默认的MDI格式。
图4 自定义UML类图
特定曲线绘制
在某些飞行科目的数据分析中,经常利用横纵轴去分别表示不同的参数,以得到更准确的评判结果。类似于这样的曲线图,在软件中作为特殊构图处理。根据目前的分析需要,分为三种特殊图形类:(1)在同一个曲线图中同时绘制多条曲线,即1对N模式;(2)在等级评判分析图中显示数据点分布状态,即散点分布图模式;(3)可以同时设定横纵轴所表示的参数,即参数对曲线模式。
对于第(1)种特殊曲线图,需要用不同的曲线标记区别不同的参数曲线,以使得图形能够清晰表示出参数的变化情况,并在图形右上方显示不同标记与参数的对应关系。在该种曲线图中,也融合了右键快捷菜单的“关联”、“图片导出”及“打印”操作,以方便与其他页面模式下的参数进行关联分析,并能够便捷的将曲线结果保存和输出。
等级评判分析主要针对类似姿态敏捷、动力升限和振动状态评估等需求应用。在此类图形的构建中,首先需要明确各等级的坐标关系,绘制出等级判别曲线。通过右键快捷菜单,以描点曲线类型的显示方式,导入需要绘制的结果数据。同样的,可以对曲线进行图片保存及打印操作,如图5所示。
在双轴曲线绘图中,需要对横轴和纵轴分别设定相对应的参数。曲线图将会根据实际的数据,分别设定出图形的上下限。在分析过程中,可根据需要更改各个轴方向上所表示的参数,并且可以使用上下限设置按钮,合理设置图形所显示的放大或缩小倍数。最终,可以以图片格式对结果进行保存。
扩展接口实现
由于各个飞行科目参数的计算分析方法不尽一致,因此,需要根据每个科目的具体要求,设计相关的算法。这些算法可以直接嵌套到软件平台的控件操作中,也可以外部程序调用的方式实现。对于嵌套式的算法调用,最便捷的方式是通过按钮控件进行触发加载VC++平台的DLL动态计算库,并可以利用指针地址传递操作程序体内存中的相关变量。同时,嵌套式动态库调用与软件平台使用同样的进程资源,在交互计算操作上更有效率,也不需要对同样的数据进行多次内存分配。
图5 散点分布图
对于一些较复杂的算法,在构件的方法下实现起来比较困难,因而可以借助Matlab计算平台,将这些算法结合到计算分析过程中。可视化输出软件中设计的与Matlab平台接口,主要是通过可执行程序的交互调用来实现。在Matlab平台下,将需要使用的算法库写成函数形式的M文件,可以在函数体中对算法库直接调用,也可以是嵌套调用。在函数形式的M文件中定义需要使用到的参数接口,这将影响到用户界面GUI的输入组件设计。完成函数的参数接口定义之后,创建Matlab图形用户界面工程,根据参数接口定义的情况,对应分布输入组件,针对组件绑定的callback属性,与函数建立起对应关系,并由此获取到算法中需要的计算参数。如果是文件,则需要启用文件选择对话框交互,获取到文件句柄,形成传递参数,完成算法参数的响应。接着,针对GUI工程中的M文件,启用Matlab命令Deploytool,以exe工程方式新建项目,将GUI工程编译形成可执行exe文件,并生成对应的说明文本。在此,便可以在C++builder环境下,以进程应用程序的调用语句,即可将在软件界面上添加入Matlab的交互执行触发动作,方法如图6所示。
对于此方式的调用,需要通过单独的共享数据区实现两个平台的数据操作,不可以通过全局变量定义或变量外部调用。另外,命令Deploytool在Matlab2012b版本下使用更为方便,对于早期的版本,可以借鉴使用Comtool命令。如果需要在没有Matlab软件环境下使用exe程序,则需要在对M文件打包过程中,在文件包中包含入MCR(Matlab Compiler Runtime)安装包,用于在无Matlab安装的环境下解析形成的exe程序,以实现跨平台的应用。
应用验证
将可视化输出软件运行于实时遥测数据监控平台系统客户端中,接收实际飞行数据,根据试验任务书的需要进行了多种图形的输出,给飞行指挥员及试飞工程师提供了多种飞行姿态的评判参考。经对比验证表明,可视化输出方法的结构化数据存储,以列模式内存对齐检索,方便了功能实现。由于计算机运行时,对于内存块的利用并不是连续的,因此如果定义了较大的数组存储空间时,会因为在内存中无法找到同样大小的连续内存块而溢出。但如果以结构体存放,则可以使用动态内存空间申请的方式,因而避免了溢出的发生。
同时,软件实现中对C++builder标准构件类进行属性及方法的扩展,为构件间的关联操作提供了更便捷的途径。将标准构件的关联属性及方法定义到容器构件类的公用定义范围内,有效避免了标准构件类内部的析构函数运行时产生内存泄露的异常。
另外,软件提供了与Matlab计算平台融合应用的接口管理。除了有DLL算法库的调用关系以外,兼容了GUI界面与用户进行交互。由于带有GUI组件的Matlab程序,不是单一的函数M文件,因此编译生成的可执行文件在C++builder主程序中以进程应用程序方式调用,合理分配了计算资源。
图6 综合输出平台结构图
结束语
试飞数据分析结果的可视化输出方法及软件实现以参数时间段同步选取导出为基本功能,结合并扩展了开发平台下各个标准构件之间的关联属性及方法,提供了便于曲线结果导出的图形保存及打印输出功能。同时,根据实际科目分析需求,实现了特殊曲线图形的绘制。在与Matlab平台结合应用的过程中,考虑了两个平台之间的进程调用及任务资源的管理关系,以提高参数操作效率。可视化输出方法将以现阶段的功能应用为基础,继续深入探索两个平台之间在程序编译过程中的差异,为提高平台函数库互用的计算效率做更多工作。
10.3969/j.issn.1001-8972.2015.21.009