刘邦强
(中国民用航空三亚空中交通管理站,三亚572000)
广播式自动相关监视(Automatic Dependent Surveillance-Broadcast,ADS-B)已经成为中国空管当前重要的监视手段之一,在南中国海和新疆地区的应用已经较为成熟。但是要将其融入到空管自动化系统进行处理,实现在空管运行上的真正投产,业内对其的评估褒贬不一[1]。不少国内自动化厂家甚至人为ADS-B 相比二次雷达而言可信度较低,数据运用的可靠性不高。这一方面来源于ADS-B 本身信号处理机制,另一方面也来源于空管自动化系统的设计在ADS-B 的研究上还尚未深入,虽然ADS-B 数据的获取简单,但是要适用于具体功能性测试则要求,根据具体的环境修改相应的数据项参数,定制相应的目标属性和动态,目前国内相关的研究还是空白,这也阻碍了ADS-B 在空管自动化系统上的全面应用。本文从实际出发,提出一种基于C#的ADS-B 数据模拟系统,系统提供了用户接口,用户可以提前定义目标的具体属性和飞行动态,并具有本地态势显示和外接网络输出的功能,可以为相关测试、飞行校飞等提供技术支持。
当前中国应用的ADS-B 主要是欧控监视数据格式,主要是ASTERIX CAT021,CAT021 通过数据项定义描述具体的数据项内容和适用的范围,包括数据包组成的包类型、字段、长度和描述符等。V0.26 版本的报文包含信息如表1[2]。其中,包类型指的是具体的ASTERIX 类别,长度表示报文的具体字节数,字段描述则表示具体的数据项情况。数据项在欧控监视数据格式中分为固定长度和可扩展长度,前者通过给定数据具体数值定义长度,后者则通过扩展标识位进行实际长度的定义。主流的空管ADS-B 数据站对ADS-B 数据的解析主要如下:首先接收到数据包,将报文数据项划分提取处报头,利用报头解析提取处包括类型、长度、字段描述符在内的信息,根据字段描述符和用户应用相关表(User Application Profile,UAP)按照序列顺序依次分割获得各个数据子项的原值;其次,调用数据解析对数据项原值进行解析得到最终的数据项信息,此步骤不仅包含数据项本身内容还记录解析过程出现的各种异常情况(如莱斯三级数据站目标标牌的fake 字段)。一般的解析软件设计上主要通过接收报文数据包记录接收时间并加入接收报文队列,在接收的队列中判断是否存在数据,如若有则解析报文并检查结果,判断结果是否存在异常,将解析结果作为报文信息数据加入解析报文队列,检查解析队列是否存在数据,如若存在则处理具体的报文信息数据并进一步的统计。ADS-B 的数据解析过程是ADS-B 数据应用的关键也是本文设计的参考之一。
表1 CAT021 V0.26 数据格式
系统提供用户定义的配置数据接口[3],该接口可以实现对具体生成目标的设置、起始位置和终点位置设置、速度设置、飞行轨迹定义(单目标直飞、S 型机动、圆周绕飞,多目标的对头飞、相离飞、追赶等)、巡航高度设置等;用户配置结果将以内部消息的形式送到数据封装及处理模块,其首先对配置项进行检测并根据用户输入匹配相应的CAT021 数据格式,如若该数据项为必备数据项则给予用户提醒或对其检测结果为不通过;前端界面显示则用于对ADS-B 数据的态势显示,以及后台进程的处理相关结果提醒。此处,包括对地图的处理和目标的态势处理。最终,系统根据ADS-B网络组播配置设置好系统内部网络接口,数据可以对外输出。具体设计如图1。
图1 系统总体设计
系统主要采用C#设计,软件部署在一台普通工控机上(以HP Z400 为例),如若需要多个数据输出则通过网络端口号设置并外接相关的交换机、路由器等网络设备即可。
用户接口模块主要用于人机交互,在设计上考虑符合实际测试需要的ADS-B 数据模拟设置。主要接口配置有:空管自动化系统两项告警测试(目标冲突告警和低高度告警验证测试)剧本的导入(实现上包括对剧本文件的解析和读取)、校飞剧本配置、普通目标模拟设计以及系统软件运行的普通配置。在用户接口模块中,系统主要处理文本数据,通过正则表达式实现对具体文本参数和关键字的识别和读取[4],读取完毕后转换为系统内部消息,以消息的形式发送给各个主要模块。
数据封装及处理是系统的核心模块,其主要按照CAT021 数据格式结合用户接口模块传送的用户定制参数对数据进行封装,并通过内部函数自动生成目标数据。CAT021 的格式是固定的,在软件实现上只需要将固定的格式写入内部配置数据列表中即可,C#对列表的处理较为快捷,为了后期软件模块化管理,此处定义目标数据类Target_class,该类可以使得模块在接收用户接口消息时实现内部类对象的具体初始化。所有数据项在类处理中将转换为具体对象的具体属性。
ADS-B 在数据站上的更新周期为1s(以南京莱斯ADS-B 数据站为例)。为了与其对应,模块增加Timer控件,定义其周期为1s。在Timer 触发函数中进行类属性的赋值完成数据封装。为了实现具体对象的数据不间断生成,模块设置了信号发生函数,该函数将根据配置在时间范围内实现目标的WGS-84 坐标、高度、速度及上升下降率的生成和更新,实现航迹新建和航迹相关。信号发生函数可以根据用户接口定义的航迹轨迹规划,如单目标直线飞行、圆周飞行、S 机动飞行等对数据模拟进行自定义的绘制,并且根据用户接口提供的在具体fix 点设置实现具体参数的模拟。以速度和位置为例,系统模拟的数据需要根据各个fix 点之间的定义进行平滑计算模拟,这种平滑有异于空管自动化系统的目标航迹平滑,主要通过起点和终点实现过程的平滑。系统将第一个需要计算的fix 点定义为起点,将最后一个计算的fix 点定义为终点,将起点和终点作为参数传入平滑函数中即可完成该航段的数据平滑模拟。在数据处理上,fix 点的属性数据也被定义为类(Fix_class),并形成Fix_class 类列表。平滑模拟函数需要遍历Fix_class 类列表,将所有数据都进行计算。如此循环计算,函数将计算列表中两两相邻对象之间数据模拟平滑。当然,为了提高仿真度,在高度方面的处理,系统对平滑做一定的阈值控制(类似空管自动化系统对高度的不滤波处理),系统目标的高度不会突变。在正常航空器的飞行性能要求下控制模拟的高度符合要求,在到达有高度变化的fix 点的一定范围内(设计取值5km)逐步计算高度的变化使其表现符合现实。对于多目标的模拟,系统类似空管自动化系统,提供了两项告警在内的基础告警的设置,通过界面显示“CA”、“MSAW”等告警字符,相关字符的定义在用户接口模块也可配置,最终以系统配置文件的形式存放在软件启动路径下。
态势显示主要用于系统的本地显示,可以验证发送到外系统数据的准确性和测试相应参数设置。态势显示首先从主程序中获取目标,在信号发生函数中获取相应的动态列表数据更新目标信息。由于ADS-B数据可以直接解出经纬度坐标,因此系统的界面坐标全部设置为WGS-84 坐标,地图文件可以直接利用在用数据站的地图文件SDD_map.txt[5]。界面的显示全部转换为以经纬度为准的坐标描述和具体的格式、颜色设置。而对于目标标牌的显示上,系统本身作为模拟数据源不需要同时显示过多航迹,因此不存在资源占用问题,不需要通过画笔Draw 类进行界面描绘(该方法虽然占用资源少但算法构成较为复杂,需要考虑标牌拖动以及目标移动等多种鼠标操作情况),可以直接采用Label 控件。换言之,系统列表中生成一个目标将绑定生成一个Label 控件和RadioButton 控件,两者组成控件组。RadioButton 的位置为具体目标的经纬度坐标定义,Label 则作为标牌显示具体目标的航班呼号、高度、24 位地址码、速度和告警字段等航迹信息。如若目标对象的属性更新则直接修改相应的参数即可,航迹新建和航迹相关转换为控件组的新建和控件属性的更新。
另外,用户接口模块配置如若出现不合规范的格式或者数值,系统在界面显示模块将会给出提醒,提醒用户修改或删除相应的配置。这种信息的互联主要通过系统内部消息进行,系统开销小,稳定性强。
网络组播接口模块可以采用C#的socket 编程即可[6]。首先建立socket 并将其进行端口绑定,其次增加一个组播域,通过sendto 函数进行数据的发送,完毕后关闭socket。设计上采用特定组播源,特定源组播(Source Specific Multicast,SSM)提供给主机应用程序一个“通道”抽象,每个通道拥有一个源和多个接收者。组播源可以发送一个IP 报文给SSM 目的地址G,接受者可以加入通道(S,G)来接收该报文。
系统首先添加以下命名空间:
实现的部分代码如下:
本文从实际出发,提出一种基于C#的ADS-B 数据模拟系统,该系统通过用户接口配置可以实现对模拟目标的定制模拟和文件导入配置模拟,并具有本地态势显示和外接输出的功能。系统可以验证空管自动化系统对ADS-B 数据处理的算法,同时也可以为相应的校飞和告警测试提供参考。系统实现简洁、稳定,可以为ADS-B 的空管现场运行保障提供一种技术手段。