态势实时显示与回放系统的设计与实现
2019-03-01张明杰王静平
张明杰,王静平
(中国电子科学研究院,北京 100041)
战场态势是指战场中兵力分布及战场环境当前状态和发展变化趋势,不同战场态势包含不同的态势要素[1]。态势实时显示是指将态势要素的位置、运动状态等信息以计算机可视化的形式实时展现出来,使指挥员能够清晰直观了解战场动态,获取战场信息[2]。态势回放是将指定历史时间段内的态势信息按照时间顺序动态地显示在计算机图形界面上,为分析人员进行态势分析提供一种方便易用的技术手段,主要用于事后回顾和分析[3]。态势实时显示和态势回放都是将态势信息通过计算机展现给相关人员进行决策和分析,态势实时显示更注重态势信息的实时性。
近年来,相关学者对态势实时显示和回放技术进行研究和实现。这些研究和实现要么重点关注态势实时显示,要么重点关注态势回放,而同时关注两者的并不多见。文献[4]基于GIS和COM设计了态势实时显示系统,文献[5]基于Qt实现运行目标态势的实时显示,这两者仅侧重于提高态势实时显示的效率。文献[2][6]实现了基于Web的实时态势显示系统,但是态势显示效率不高。文献[8]基于Skyline对空战仿真数据的三维态势回放进行了研究和实现,文献[9-11]设计和实现了不同应用领域的态势回放系统。文献[7]基于HLA设计并实现了仿真态势实时在线显示与数据记录回放显示一体化的态势显示系统,但是该系统只能在态势仿真结束后进行态势回放,即不具备在线回放功能。
在实际应用中,为了实时确定某一批运动目标的属性,指挥员或情报员可能需要查看该批目标在较长时间段内的运动轨迹及相关信息。由于不具备在线回放功能,现有的态势实时显示系统基本无法满足这种应用场景。
针对上述不足,本文设计并实现了一个态势实时显示与回放一体化的软件系统,即态势实时显示与回放系统。该系统可以实时从通信网络接收数据报文(比如探测源探测到的航迹信息报文、从通信链路接收到的航迹信息报文、战场元素自身发送的位置数据报文等),并从数据报文中提取航迹点(包括时间、位置等信息),然后将航迹点作为关键字存储在B+树文件中。系统工作在态势实时显示模式时,可进行态势的实时显示;工作在态势回放模式时,可进行态势的回放;并且可在两种工作模式之间互相切换。这样,就将态势实时显示和回放结合在一个软件系统中,能为相关人员的使用提供方便。以B+树文件的形式对态势数据进行组织,保证了数据实时更新及查询的效率;以多线程协同工作的方式实现系统,提高了系统的运行效率。
1 系统功能与关键技术
为了实现态势实时显示与回放一体化,态势实时显示与回放软件系统(简称为显示回放系统)需具备的功能有:
1) 从网络实时接收态势数据;
2) 可以长时间稳定运行;
3) 能够对大量态势数据进行存储与快速查询;
4) 能够对态势进行实时计算与显示;
5) 能够实现态势实时显示与回放功能的结合。即可在态势实时显示与回放模式之间相互转换。
其中,数据存储与查询、态势实时计算与显示是系统的关键技术。
1.1 数据存储与查询
态势数据存储与查询是系统的关键技术,数据查询效率对系统的实时性具有决定性作用。为了获得较高的查询效率,将态势数据作为关键字存储在B+树文件中。
B+树是在B树的基础上演化而成的一种动态索引技术[12],具有随机和顺序查询效率高、更新开销小、高度自平衡等特点,特别适合于既需要随机查找也需要顺序查找的应用场景。目前,B+树已在大数据索引[13]、云数据索引[14]等众多领域得到广泛应用。
B+树文件是以B+树形式组织的文件。B+树文件由文件头和文件体两部分组成。文件头描述文件中存储的B+树的相关信息,如B+树的阶数、结点总数、关键字总数、根结点在文件中的位置等;文件体就是B+树的所有结点的数据,可以看作结点的集合,每个结点中的关键字按从小到大的顺序排列。关于B+树文件的逻辑结构描述可参考文献[15]。
但是B+树要求任意两个不同的关键字都能够比较大小,为了适应这个要求,引入多维向量之间的关系及航迹点的形式化定义。
定义1多维向量之间的关系。设x=〈x1,x2,…,xn〉,y=〈y1,y2,…,yn〉是n维欧氏空间Rn中的任意两个向量。若x与y的各个分量相等,则称x与y相等,否则称x与y不相等。若x与y不相等,那么x与y中必定存在不相等的分量,设j是所有不相等的分量的最小下标,即j=min{i|x.xi≠y.yi,(i=1,2,…,n)}。若x.xj>y.yj,则称向量x大于y;若x.xj 定义2航迹点。即包含时间、航迹号、位置等信息的数据单元,可表示为如下形式的多维向量。 p= (1) 式(1)中,p表示航迹点;time是代表时间的正整数,单位是毫秒;No是正整数,代表航迹号;x、y、z表示航迹点的三维空间坐标,单位为米。 可将航迹点看作一个五维向量,依据定义1中的多维向量之间的关系,可以确定任意两个不同的航迹点之间的大小关系。这样,就可以将航迹点作为关键字插入B+树中了。 将B+树文件作为态势数据的存储形式,向文件中写入航迹点时,可采用批量插入算法[16]提高效率;在进行数据检索时,可以充分利用B+树具有随机和顺序查询效率高的特性,提高数据的查询效率,为系统的实时性提供保障。 态势实时计算与显示是指将从B+树文件获取的某个时间段内的航迹点集合转换为航迹集合并将其绘制在图形界面的过程。为了便于表述,引入以下定义。 定义3航迹。即航迹号相同且按从小到大顺序排列的航迹点的集合的特征,如航迹号、航迹长度等,可用下式定义: trk= (2) 其中,No表示航迹号,Len表示航迹的长度(即航迹包含的航迹点数),pl表示航迹的最后一个航迹点。 定义4时间窗。时间窗实质上就是时间段。可用下式定义: tw=[tb,te]=[tb,tb+w] (3) 式(3)中,tw代表时间窗,tb是时间窗的起始时间,te是时间窗的终止时间,w是时间窗的宽度。tb、te、w是正整数,单位是毫秒。 定义5态势。即航迹点集合及对其进行处理得到的航迹集合等信息的总称。 定义6整体态势。将B+树的所有叶子结点中包含的航迹点及对其处理所得到的信息称为整体态势。态势实时显示和回放过程中某一时刻t的整体态势表示为: Sit(t)={pm|m=1,2,…,M} (4) 式(4)中,M是正整数,表示在时刻t的所有航迹点的个数。 定义7局部态势(态势帧)。整体态势在某一时间窗内的子集,称为局部态势。在时刻t的局部态势可表示为: Sit(t,tw)={p|p∈Sit(t)∧p.time∈tw} (5) 式(5)中,tw表示一个时间窗。 定义8态势计算。就是由整体态势得到局部态势,并将局部态势中的航迹点按航迹号相等关系进行划分,从而得到航迹集合的过程。 定义9态势绘制。就是将航迹集合中的航迹绘制在图形界面上的过程。航迹绘制是指将航迹点及其之间的连接线段显示在计算机图形界面上。 定义10态势实时显示。即实时态势绘制,是指将实时接收到的态势进行绘制。从式(5)看,就是时间窗tw必须包含B+树文件中的最大航迹点的时间。 定义11态势回放。是指将整体态势的某一局部态势进行绘制。从式(5)看,就是时间窗tw不一定包含B+树文件中的最大航迹点的时间。 由于B+树文件中未保存航迹信息,需对态势(航迹)进行实时计算与显示,算法描述如下。 算法1态势实时计算与显示算法 输入:有序航迹点集合P={pi|i=1,2,…,N}。 输出:无。 步骤: 1) 将航迹表T置为空,即令T=∅; 2) 顺序扫描P,对pi(i=1,2,…,N),执行步骤3)至5); 3) 在T中查找航迹号等于pi.No的航迹trk。若未找到,则执行步骤4);否则执行5); 4) 在图形界面显示航迹点pi。利用pi的相关信息新建航迹 5) 在图形界面显示航迹点pi及连接pi与trk.pl的线段。将航迹长度trk.Len的值增加1,将航迹的最后一个点trk.pl的值以pi代替;转步骤2); 6) 显示航迹信息。顺序扫描航迹表T中的所有航迹trk,可在图形界面上trk.pl对应的位置显示航迹号、航迹长度等信息。 上述算法的时空复杂度均为线性;对T中航迹进行排序,以便于使用折半查找法提高效率。 为了使系统具备上述所述功能以及较强可控性和易用性,软件采用数据流式架构;按照模块化设计原则,将系统划分为显示回放控制模块、数据源模块、态势数据提取模块、态势数据管理模块、态势绘制模块等模块。显示回放控制模块的引入是为增强系统的可控性和易用性。设计的软件系统组织结构如图1所示。 图1 系统组织结构图 显示回放控制模块。完成态势实时显示与回放控制人机交互界面(简称控制界面)的创建,数据源模块、态势数据管理模块、态势绘制模块加载及相关对象的创建及协调,系统工作模式设置及切换等。 数据源模块。负责从通信网络接收实时数据报文,并将数据报文传输给态势数据提取模块。 态势数据提取模块。按照约定从接收到数据报文中提取航迹点,并将航迹点传输给态势数据管理模块。 态势数据管理模块。保存接收到的航迹点,对外提供航迹点查询功能;该模块将航迹点保存在B+树文件中。 态势绘制模块。按照显示回放控制模块提供时间窗,完成态势实时计算和显示。 系统接口设计分为数据接口设计和功能接口设计。 2.2.1 数据接口设计 数据接口设计主要规定各模块之间交互的数据格式及含义。 通信网络与数据源模块之间的数据接口遵循UDP协议,即目前系统通过UDP协议从网络接收数据;数据源模块与态势数据提取模块之间的数据接口遵循特定的通信体系内部协议。以上两种数据接口无须设计,只需遵循相关的标准和协议即可。 态势数据提取模块、态势数据管理模块、态势绘制模块三者之间的数据接口即航迹点结构体,该结构体定义如下。 struct TrackPoint{ uint64 t; // 时间(毫秒), 64位无符号 整数. uint32 no; // 航迹号. double x,y,z; // 航迹点位置. }; 结构体中时间变量的类型设计为64位无符号整数,是为了能够在其中保存年月日信息。 显示回放控制模块与态势绘制模块之间的数据接口是时间窗结构体,该结构体定义如下: struct TimeWindow{ uint64 tb; // 时间窗的起始时间. uint64 te;// 时间窗的终止时间. }; 2.2.2 功能接口设计 功能接口设计主要规定各个模块实现的功能接口。依据单一职责原则,每个模块只实现一个功能接口。 态势实时显示与回放控制器接口(ISDRC,Interface of Situation real-time Display and Replay Controller)。由态势显示回放控制模块实现,主要方法有:控制界面的创建和显示。 数据源接口(IDS,Interface of Data Source)。由数据源模块实现,主要方法有:1)判断数据源是否有数据;2)得到数据缓存地址。 态势数据提取器接口(ISDE,Interface of Situation Extractor)。由态势提取模块实现,主要方法有:提取航迹点。 态势数据管理器接口(ISDM,Interface of Situation Data Manger)。由态势数据管理模块实现,主要方法有:1)保存航迹点;2)更新航迹点数据;3)得到B+树文件的访问权限。 态势绘制器接口(ISP,Interface of Situation Plotter)。由态势绘制模块实现,主要方法有:态势绘制。 以上各接口方法签名如表1所示(以C语言的形式描述)。 表1 能接口表 系统运行界面设计包括程序主界面(简称主界面)设计和控制界面设计。 主界面使用通用的用户界面模型,由态势绘制区和相关的菜单组成,如图2所示。态势绘制区用于绘制航迹及显示相关信息。 图2 主界面图 在主界面中,点击控制界面菜单项,可显示控制界面;地图操作菜单中的菜单项主要是一些与地图相关的操作,如地图平移、放大、缩小等。 控制界面用于人机交互,包括接收数据端口设置、时间窗宽度设置、工作模式选择、滑动控制条等,如图3所示。 图3 控制界面图 控制界面中,接收端口编辑框用于设置UDP协议的端口号。时间窗编辑框用于设置时间窗的宽度,单位是秒。工作模式下拉列表,用于设置系统的当前工作模式,有态势实时显示和态势回放两种工作模式;在系统运行时,可通过在下拉列表中选择不同工作模式实现系统工作模式切换。更新周期编辑框用于设置实时显示工作模式下的态势更新周期。滑动条控件在态势实时显示工作模式下不可操作;在态势回放工作模式下,使用者可通过拖动滑动块来动态设置时间窗的起止时间,从而完成局部态势的计算和绘制。点击初始化按钮,完成系统的创建及设置;点击运行按钮,系统开始运行;点击终止运行按钮,完成系统的销毁。 由于在运行过程中涉及态势数据实时接收及处理,为了提高运行效率,系统采用多线程协同方式工作。设计的系统工作流程见图4所示。 图4 系统工作流程图 如图4所示,系统运行时的线程主要有数据接收线程Tr、态势数据获取线程Tg、态势数据更新线程Tu、态势绘制线程Tp;数据管理对象主要有缓存管理器(数据源模块内实现IDS接口)、态势数据管理对象(态势数据管理模块内实现ISDM接口);数据处理对象有态势数据提取对象(态势数据提取模块内实现ISDE接口)、态势绘制对象(态势绘制模块内实现ISP接口)。 为了突出多线程对数据的互斥访问,将线程对数据的访问操作专门绘制在相应对象中。如Tr与Tg对缓存的访问操作绘制在缓存管理器中,Tg、Tu和Tp对数据文件的访问操作绘制在态势数据管理模块内。 为了减少线程之间相互等待的时间,提高系统的运行效率,在缓存管理器和态势数据管理对象内部做了特殊的设计。缓存管理器维护两个数据缓存及相应访问控制信号量,在任一时刻都有一个缓存用于读取数据、另一个用于写入数据,可以保证Tr与Tg在较短的时间内得到可用数据缓存。态势数据管理对象内部维护两个堆文件和一个B+树文件及相应的访问控制信号量;在任一时刻,一个堆文件用于Tg写入航迹点数据、一个堆文件用于Tu读取,可以缩短两者之间相互等待的时间。 各线程完成的工作说明如下。 数据接收线程Tr完成的工作是: 1) 初始化。完成从控制界面获取接收数据端口号、创建socket对象等操作; 2) 判断是否终止运行(从控制界面点击终止按钮)。若终止,则销毁socket对象、释放占用资源后,退出;否则,转3); 3) 从基于UDP协议的通信网络接收数据报文; 4) 通过缓存管理器得到可写缓存的访问权限,将数据报文写入数据缓存中后,释放权限,转2)。 态势数据获取线程Tg完成的工作是: 1) 初始化。完成的主要操作是:从控制界面获取态势更新周期,获得缓存管理器的IDS接口、态势数据提取对象的ISDE接口、态势数据管理对象的ISDM接口; 2) 判断是否终止运行。若终止,则线程释放相关资源后,退出;否则,转3); 3) 通过IDS接口HasData方法询问数据源是否有数据; 4) 数据源模块内缓存管理器得到读写缓存访问权限,交换读写缓存指针后,释放权限。判断读缓存是否有数据,将结果返回。 5) 根据返回结果,判断数据源对象中是否有数据,若无数据,则休眠一个态势更新周期后,转2);若有数据,则调用IDS接口GetData方法,执行6); 6) 缓存管理器返回可读缓存的地址; 7) 将缓存中所有数据报文通过ISDE接口ExtractTrkPt方法逐个传递给态势数据提取对象,获得数据报文中包含的航迹点;清空可读缓存; 8) 调用ISDM接口SaveTP方法,完成航迹点存储; 9) 态势数据管理模块SaveTP方法。得到可写文件的访问权限。将航迹点存储到可写文件;释放可写文件访问权限。转2)。 态势数据更新线程Tu完成的工作是: 1) 初始化。完成从控制界面获取态势更新周期、获得态势数据管理对象ISDM接口等操作; 2) 判断是否终止运行。若终止,则线程释放相关资源后,退出;否则,转3); 3) 线程休眠一个态势更新周期后,从控制界面获取系统工作模式,若工作模式为回放模式,则转2)(即不进行态势数据更新);若工作模式是实时显示模式,则执行4); 4) 调用ISDM UpdateTP方法,更新文件中存储的航迹点数据; 5) 态势数据管理模块UpdateTP方法:得到可读文件与可写文件访问权限,交换可读可写文件指针,释放可写文件的访问权限;得到B+树文件的访问权限,将可读文件中航迹点存入B+树文件中,释放可读文件与B+树文件访问权限,清空可读文件内容; 6) 更新控制界面滑动条时间范围及滑动块位置,即将滑动条对应时间范围设置为整体态势时间范围,滑动块位置设置在滑动条的最右端; 7) 将态势绘制线程等待信号量置为有效。转(2)。 态势绘制线程Tp完成的工作是: 1) 初始化。完成的主要工作有:从控制界面获得时间窗的宽度、得到态势绘制对象ISP接口等; 2) 判断是否终止运行。若终止,则线程释放相关资源后,退出;否则,转3); 3) 从控制界面获取系统工作模式,若是实时显示模式,则等待态势绘制信号有效后执行4);若是回放模式,则直接执行4); 4) 从控制界面滑动条滑动块的位置及时间窗宽度得到需要绘制的态势时间段;通过接口ISP PlotSit方法完成态势绘制; 5) 态势绘制对象通过接口ISDM的GetBpt方法得到B+树文件的访问权限,从B+树文件得到指定时间段内的航迹点,完成态势的实时计算与显示。转2)。 通过以上描述可知系统运行时具有以下特点: 1) 系统正常工作不发生丢包的前提是:网络数据的平均传输速率小于系统的平均数据处理(主要是航迹点提取和存储)速率; 2) 资源互斥共享问题得到有效解决。线程Tr和Tg竞争使用数据源管理模块中的数据管理器对象、线程Tg和Tu竞争使用态势数据管理模块中的态势数据管理对象,而这两个对象分别通过引入多个缓存和多个文件解决了竞争问题,可以有效缩短线程的等待时间,提高系统的运行效率; 3) 实现工作模式之间的相互切换。系统工作模式由态势实时显示切换为态势回放时,线程Tg将航迹点存储在态势数据管理对象的某一个堆文件中;当系统状态再次切换为态势实时显示模式后,由于有可能需要将大量的航迹点写入B+树文件中,会导致态势画面在较长时间内不更新。 使用微软Visual Studio 2010的C++语言、基于MFC框架、结合多线程技术对系统进行了实现;实现过程中使用的地图是由第三方提供的矢量地图。 在实现过程中,将设计阶段的各个模块映射为相应的动态链接库(DLL)。借鉴COM的基本思想,并依据功能单一原则做了简化处理,即每个DLL只有一个用于创建对象的导出方法,该方法用于创建实现某一接口的类对象,并返回相应的接口指针供其他模块使用;比如实现IDS接口的动态链接库导出方法名为CreateDS,返回类型为IDS的接口指针。在接口定义的实现方面,除了具有表1列出的方法外,还在每个接口中添加了用于销毁对象的方法。 系统运行过程如下所述: 1) 使用者在主界面点击控制界面菜单项,创建控制界面; 2) 使用者在控制界面中设置接收端口号、时间窗宽度、更新周期、工作模式等参数; 3) 使用者点击初始化按钮,系统进入初始化状态。系统初始化完成的工作主要是:通过DLL的导出方法创建实现各个接口实现类的实例、创建各工作线程、创建信号量并设置初始状态。初始化完成后,点击运行按钮,系统进入运行状态。 4) 在系统运行时,可在控制界面的工作模式下拉列表中选择不同的工作模式,实现系统工作模式的切换。 5) 在控制界面点击终止运行按钮,系统终止运行。 为了对系统设计和实现的正确性、长时间运行的稳定性以及对大量航迹点处理的有效性进行检验,需进行测试实验。由于实际通信网络中存在的不可控因素较多,比如数据流量不可控、数据传输不稳定等,故在实验室内的局域网环境中进行。对系统进行测试实验的配置如图5所示。 图5 系统实验配置图 图5中,数据发送端和数据接收端是由交换机和普通网线连接起来的一般商用台式计算机(型号Dell XPS 8300,操作系统是Windows XP Professional with SP3,内存容量4 GB;硬盘容量1 TB,每分钟7200转;ATI独立显卡)。 数据发送端的硬盘中存储有从某型实际通信网络中接收的真实数据文件(大小固定的数据集);数据接收端运行态势实时显示与回放软件系统。为了能够长时间无限制向数据接收端发送数据、并且使B+树文件的体量不断增大,实验采取的策略是:数据发送端的数据发送软件无限循环读取数据文件,将文件中存储的数据报文通过UDP协议发送给数据接收端;在数据接收端,得到航迹点后,将航迹点的时间属性值改为本地 时间,这样就能保证所有的航迹点都不相同,使得航迹点能够插入B+树文件中,进而使B+树文件的体量不断增大。 在数据接收端,系统相关工作参数设置为:端口号9995,时间窗宽度是100 s,态势更新周期为1 s,B+树的阶数为1024(即每个结点中最多可以存储1024个航迹点)。 在态势实时显示模式下运行7.05天(609 391 364 ms),数据发送端发送数据的速率约为每秒25 K字节,数据接收端形成的B+树文件大小约为3.4 G,B+树的高度为3,叶结点个数为74 480,航迹点个数为38 134 022,每个叶子结点拥有的航迹点个数约为512。 使用每个态势帧的数据加载速率VL、态势计算速率VC、态势计算与显示速率VP对态势实时计算与显示的性能进行衡量,以N表示态势帧包含的航迹点个数,则上述指标的定义如下: VL=N/tL (6) 其中tL是从B+树文件中将航迹点加载到内存所需的时间,tC是tL与对航迹点进行处理得到航迹(不绘制航迹点与线段)所用的时间之和,tP是tC与航迹点与线段绘制所用时间之和。 在控制界面将时间窗设置为300 s,1000个态势帧的上述指标的平均值如表2所示。 表2 态势实时计算与显示性能表 以上实验数据是在数据接收端运行的结果。 实验结果显示,数据加载速率约为每秒27万点,态势计算速率约为每秒13万点,态势计算与显示速率约为每秒7万点,具有较高的查询与处理效率。 上述实验结果表明,系统可以长时间稳定运行,证明了系统设计和实现的正确性以及稳定性。态势实时计算与显示的高效性,证明了系统对大量航迹点进行检索处理的有效性。 本文设计并实现了一个态势实时显示与回放一体化的软件系统,该系统可以通过UDP协议实时从网络接收数据报文,从中提取航迹点,将航迹点作为关键字存储在B+树文件中,态势绘制线程从B+树文件中获取航迹点,完成态势的实时计算与显示。引入了多缓存和多文件管理机制,有效缩短线程竞争使用资源的等待时间,提高了系统的运行效率。由于B+树文件具有随机查询和连续查询的高效性,为态势绘制效率提供了保证。实验结果显示了系统设计和实现的正确性、稳定性和高效性。 在该系统的基础上,将来拟继续在以下方面开展相关研究工作: 1)系统实用化。从实际通信网络中长时间接收数据,进行实际应用试验;对系统进一步完善,使其达到可以实用的状态。 2)大数据存储技术的研究。在系统的实现中,B+树文件存储在本地硬盘上,这就使其存储的航迹点数量受制于硬盘的容量;若能利用大数据存储技术,则可大大提高航迹点的存储量。 3)优化内部组件。对大数据索引技术进行研究和开发,以进一步提高数据存储空间的利用率和查询效率。1.2 态势实时计算与显示
2 系统设计
2.1 架构设计
2.2 接口设计
2.3 界面设计
2.4 系统工作流程设计
3 系统实现与实验
3.1 系统实现及运行
3.2 系统实验
3.3 态势实时计算与显示性能
VC=N/tC
VP=N/tP4 结束语