资源描述
沈阳航空航天大学
综 合 课 程 设 计
ADS-B报文数据解析研究
班 级
学 号
学 生 姓 名
指 导 教 师
课 程 设 计 任 务 书
课程设计内容及要求:
一、 设计说明
对接收到ADS-B数据进行解析,就是要对航空报文有较多了解,依据编码协议对报文进行解码,从里面提取出有用信息,能让人直观了解报文信息
二、 设计要求
依据链路协议及编码协议,对报文解析,要实现:
1.能够解析出速度,高度,经纬度等关键信息;
2.界面尽可能友好,误差要小;
3.数据能够实时更新
三、 试验要求
用VC++实现编程和解析
四、推荐参考资料
五、根据要求撰写课程设计汇报
成绩评定表
评语、提议或需要说明问题:
指导老师签字: 日期:
成 绩
一、概述
空中交通管理根本目标是使航线上飞机安全、有效和有计划地在空域中飞行, 管制员需要对管制空域内飞机飞行动态进行实时监视。传统雷达监视手段采取问询/ 应答方法对目标探测。从长远来看, 雷达系统本身含有很多不足: 雷达波束直线传输形成了大量雷达盲区; 无法覆盖海洋和荒漠等地域; 雷达旋转周期限制了数据更新率提升, 从而限制了监视精度提升; 无法取得飞机计划航路、速度等态势数据, 限制了跟踪精度提升和短期冲突告警STCA ( Short TermConflict Alert ) 能力。所以, 需要发展新监视手段。
广播式自动相关监视ADS- B( Automatic DependentSurveillance- Broadcast ) 即航空器自动广播由机载星基导航和定位系统生成正确定位信息, 地面设备和其它航空器经过航空数据链接收此信息, 卫星系统、飞机和地基系统经过高速数据链进行空天地一体化协同监视。ADS- B 精度和数据更新率比雷达高, 除位置信息外,ADS- B 还提供其它信息, 包含速度和飞行意向等, 尤其适合于山区、荒漠、边远机场等不宜建设雷达区域, 也适合于高密度机场监视, 是未来监视系统关键组成部分和发展方向。
现在,ICAO(International Civil Aviation Organization,国际民用航空组织)高度重视ADS‐B 发展和应用,并制订了相关技术标准和发展计划,并一直在努力提倡在全球统一布署相同标准 ADS‐B 体系,实现全球范围内飞行监控和数据共享。 中国民用航空业现在正处于成长久,飞机数量、飞行规模和空域范围全部在不停扩大,需要引进并吸收 ADS‐B 技术,以丰富和改善我们自己空中交通管制系统和体系,并实现和国际最新技术接轨。在 ADS‐B 技术吸收和应用中,需要不停地研究其基础原理,掌握其技术关键,促进实现国际优异技术和中国当地情况不停融合。
导航卫星
发送
发送
相互发送接收数据
飞机B
飞机A
地面基站
图1 ADS-B技术在航空中应用示意图
二、 ADS-B 系统工作原理
ADS-B OUT 系统中,关键功效由 S 模式应答机实现,在其正常工作期间,周期性将 DF17 格式扩展断续振荡信号广播出去,为飞机和地面站提供相关信息包含飞机经纬度信息、高度信息、航行速度信息等。在系统正常工作时,应答机接收来自GPS 接收机导航消息,经过对数据分析,提取有有用信息部分组合成为使用于 S模式传输报文格式,然后以特定速率经过应答机天线发送出去,当地面站和其它飞机接收到这些信息后,经过对信息解码、检错、纠错、报文生成过程获取这架飞机飞行参数,高度速度等有效信息,这些信息将很有效帮助完成空中管理和飞机间相关监视过程。
和应答机应答二次雷达问询一样,DF17 格式扩展断续振荡信号用一个
1090MHz 载波频率进行调制并以 1Mbps 数据速率广播脉冲位置,扩展断续振荡脉冲长度为 112 比特。
ADS-B消息结构
Bit
1----5
6----8
9----32
33---88
89---112
DF=17
DF=10001
CA
AA(ICAO)
ME字段
PI
图2 ADS-B消息结构
在接收数据部分中,以 DF17 格式扩展断续振荡信号为例,共有 5 个关键飞行任务字段。其中,第一个字段为 DF 位格式字段,长度为 5 比特,关键作用在于识别扩展断续振荡内容,此字段设置为固定值 17(十进制数),本项目工作研究也关键针对这类信号。接下来则是 3 比特应答机能力(CA)字段,该字段描述了飞机 S 模式数据链通信能力,如是否装载了 ADS 系统等。广播地址(AA)字段是消息中最关键一个字段,该字段唯一识别了每个飞机独一无二 24 比特 S 模式地址,用来表明飞机身份。接下来是机载设备采集整合信息 ME 字段,56 比特扩展型断续振荡报文是关键 ADS-B 消息,该消息关键包含飞机参数信息如高度、速度、经度、纬度等信息,它为飞机参数如 GPS 位置和速度提供报文有效信息。最终,24 比特奇偶性(PI)字段,该字段为前 88 位数据信息 CRC 校验余数,用于实现 CRC 检错纠错。
三 相关技术
1.1090 ES 数据链
1090 ES(Extended Squitter,扩展电文)命名中包含两层含义。1090 指是该数据链下行传输频带是 1090MHz。ES 指是对原有 ADS-B 报文长度扩展。原有报文长度通常为 56-112 比特。
1090 ES 是由 ICAO 推荐、唯一一个能够在全球范围内使用数据链技术,得到了美国、欧洲、亚洲等大部分国家认可和应用。在第 11 次国际航空会议上,已经将1090 ES 作为 ADS-B 关键数据链技术,并制订了相关协议和标准。
1090 ES 是一个 S 模式数据链,支持一对一问询-应答机制。S 是Selective 意思,指是能够对航空器进行选择通信。
1090 ES 采取 PPM(脉冲位置调制)编码。
2. ADS-B IN 设备报文
系统采取 ADS-B IN 设备,在收到 ADS-B 报文后,对 ADS-B 报文进行了二次封装,增加了报文头,将 ADS-B 报文作为它载荷。封装后报文被 ADS-B IN 设备经过网络转发给其它设备。除此之外,ADS-B IN 设备还发送部分状报文,描述设备时间和位置等信息。
ADS-B IN 设备能够发出报文一共有三类:
1)Message Report
2)Time Report
3)Position Report
我们用接收设备是SBS-3接收机,关键分析Message Report,即DF17数据,所以其它两种 Report不多做介绍。
表1 Message report格式
字段
长度(字节)
含义
STX
1
报文头标识,其固定值为0x20
LEN
1
报文长度,不包含报文头标识和结尾标识
type
1
报文类型,用于区分三种类型
time
6
报文抵达时间
message
14
报文内容
flags
1
报文标识
amp
1
信号强度
crc
2
CRC校验值,从 LEN到 amp
ETX
1
报文结尾标识
Message Report 报文长度共 28 个字节。部分关键字段说明以下:
<type>字段,取值范围是 0-4,0-3 代表 Message Report 或 Time Report,二者区分能够经过<message>字段内容来分辨。0-3 不一样之处于于<time>时间标准不一样。0是当地时间,1 是 NOT COUPLED 类型 UTC 时间,2 是 COASTING 类型 UTC 时间,3 是 COUPLED 类型 UTC 时间。4 代表 Position Report。
<flag>字段是一个按位解析字段,第 0 位指示了接收天线,其值为 0 表示从 A天线接收;值为 1 表示从 B 天线接收。第 3 位指示了<amp>字段单位和范围,其值为0 表示信号强度单位是 ADC LSB,范围是 0 到 255;值为 1 表示信号强度单位是d Bm,范围是-127 到 127。其它位现在全部没有使用,缺省设置为 0。
<crc>字段计算采取了常见 CRC-16,其生成多项式是 X16+X15+X2+1,对应二进制位列为 1 1000 0000 00000101,因为其 MSB 肯定为 1,能够省略 MSB,简写为0101。
3. ADS-B 基础报文
ADS-B 报文由业务数据和附加数据两部分组成。ADS-B 基础报文指是从宏观角度,将业务数据作为一个整体而不考虑其细节,所展现出来 ADS-B 报文。ADS-B 基础报文对 ADS-B 业务数据进行了封装,作为 ADS-B 基础报文一个独立字段存在。在ADS-B 业务数据中,包含了不一样类型业务数据,它们含有不一样结构。本节将这些不一样格式业务数据称之为 ADS-B 业务报文。
ADS-B 报文长度共 112 位,是按位进行格式设计结构。下表是 1090ES 报文结构定义,ADS-B 报文基础结构包含在其中
表2 1090ES报文结构
Bits 1--5
Bits 6---8
Bits 9---32
Bits 33---88
Bits8 9---112
DF=17
CA
AA
ICAO地址
ADS-B
ME字段
PI
DF=18
CF=0
AA
ICAO地址
ADS-B
ME字段
PI
CF=1
AA
非 ICAO地址
ADS-B
ME字段
PI
CF=2 to 3
AA
TIS-B ME字段
PI
CF=4
TIS-B和ADS-B管理报文
PI
CF=5
AA
TIS-B ME字段
PI
四.信息处理
ADS-B数据信息处理包含数据接收和解析两大部分,其中包含循环冗余校验, LSB 和 MSB,数据打包和解包 ,多线程操作,CPR解码算法等技术,因为侧关键不一样,这里关键讲一下数据发送和接收及解析算法。
1. 数据发送和接收
ADS-B 报文从发送从网络上接收最初始数据,到转换成 ME 报文,其过程以下图所表示。
IP网络
数据链
ADS-B
OUT设备
机载
设备
数据采集设备
ADS-B
IN设备
Message Report
Message Report
ADS-B
报文
ADS-B
业务数据
ADS-B
报文
ADS-B
报文
ADS-B
报文
ME报文
图3 收发,解析数据示意图
数据发送和接收遵照TCP通信协议,根据协议编码就行,这里不再赘述。
2. 数据解析
数据解析是重中之重,这是决定你能否得到想要结果至关关键一步,也是此次课设所关键研究方面。数据编码和解析是根据协议进行,对飞机身份,编号,高度,速度,经纬度等信息进行编码,其中除了经纬度,其它信息大多根据进制数进行编码,不需要太复杂算法,所以,这里只讲经纬度算法解析。
CPR解码分为全球解码和当地解码两种情况。 假如同时接收到奇编码和偶编码两个消息,那么进行全球解码。 假如只接收到一个奇编码或偶编码消息,那么进行当地解码。 不管是全球解码还是当地解码,又分为空中位置和地面位置两类情况
全球明确空中位置和地面位置解码步骤为:
1) 计算纬度Zone 尺寸Dlati
Dlati = 360°/( 4NL - i) 空中位置 i = 0(偶编码)
90°/( 4NL - i) 地面位置 i = 0(偶编码)
2) 计算纬度索引j
j = floor(( 59 × YZ0 - 60 × YZ1 )/217 + 1/2)
当j<0 时, j = 偶纬度Zone 编号- 60, j = 奇纬度Zone 编号- 59;当j≥0 时, j= 偶纬度Zone 编号,j = 奇纬度Zone 编号。
3)计算偶形式纬度Rlat0
和奇形式纬度Rlat1
Rlati = Dlati × MOD( j,60 - i) + YZi /217
若求出纬度绝对值大于90°,则应减去360°。因为纬度取值范围为-90°~+90°。
4) 计算纬度数NL( Rlat0) 和NL( Rlat1) 。
判定NL( Rlat0) 是否和NL( Rlat1) 相等。若相等,则计算经度Zone 尺寸Dloni。不然,继续等候下一个位置消息。
5) 计算经度Zone 尺寸Dloni。
依据刚接收到空中位置消息是偶编码( i = 0) 还是奇编码( i = 1) ,按式( 12) 计算
Dloni = 360°/ni空中位置 i = 0(偶编码)
90°/ni地面位置 i = 1(奇编码)
式中ni = max[NL( Rlati) - i,1]。
6) 采取纬度数NL,计算经度索引m
m =
floor[ XZ0×( NL( Rlati) - 1) - XZ1 ×NL( Rlati)/217 +12]
当m<0 时,m = 偶纬度Zone 编号- n0,m = 奇纬度Zone 编号- n1; 当m≥0 时,m = 偶纬度Zone 编号,m = 奇纬度Zone 编号。
7) 计算全球经度Rlon0和Rlon1。
依据接收到ADS- B 位置消息是偶编码( i = 0)还是奇编码( i = 1) ,按式 计算Rloni = Dloni × MOD( m,ni) + XZi /2
若求出经度绝对值大于180°, 则应减去360°。因为经度取值范围为-180°~ +180°。
怎样实现飞机经度和纬度消息CPR 格式编码和解码, 是1090ES ADS- B 系统中有效提升ADS- B 位置消息传输效率关键。本文针对全球位置和当地位置两种情况,说明了飞机在空中位置和地面位置时经度和纬度编解码算法基础原理和具体实现步骤, 有利于从事ADS- B 技术科技人员掌握CPR 编解码原理和进行相关软件开发。
ADS-B消息提取
提取CPR数据
否
是
奇编码
存放CPR编码数据,设置
Target_TTL,ODD_TTL
存放CPR编码数据,设置
Target_TTL,EVEN_TTL
否
否
是
ODD_TTL为0
EVEN_TTL为0
计算NL(Rlat0)和
NL(Rlat1
计算NL(Rlat0)和NL(Rlat1)
NL(Rlat1)
否
否
是否相等
是否相等
是
是
提取其它信息
计算Rlat0
计算Rlat1
存放解码位置信息
存放解码位置信息
信息
结束
结束
图 4 CPR 消息解码步骤图
图4 解析数据界面
四.课程设计体会
不知不觉这次课程已经结束,这个学期接触了它我了解了很多。从刚开始一无所知到逐步熟悉,这个过程是令人充实。每做一个试验,我感觉我收获不少。做试验是让我们对平时理论知识和实际操作相结合,在理论和试验中更深入去掌握自己学到知识比加以掌握和提升,学会将知识应用和实际方法,提升分析和处理问题能力。在试验过程中,我感到自己实力有限。有些东西没见过,不是在我能力范围内。经过我自己慢慢学习和探讨我最终有了些眉目。
经过这次课程设计,我充足认识到理论和实际相结合关键性,理论知识再丰富,没有实际操作经验,本身能力是不会有所提升。我认为,在学习中要学以致用,不能过分盲目标学习理论知识,我们必需要将理论和实践结合。应该侧重于基础方法和使用实例。从软件应用环境和特点来看,培养一定应用系统分析能力和初步设计能力而为以后学习和设计才是最终目标。社会竞争是猛烈,我们应该把握大学学习时间,充足利用好自己价值,充实自己,完善自我,全方面发展,做一名优异大学生,努力做好自己事,让自己成为有用之才。
卫星导航行业是一个朝阳行业,中国北斗导航现在正处于全球组网快速发展时期,我这次课设乃至以后毕设正是这方面研究,我相信经过课设和毕设,我水平一定会再上一个台阶,为以后工作和生活提供不小助力。
参考文件:
[1] 顾春平.空中交通管制新技术监视新技术介绍[J].现代雷达,,32(9): 1-7.
[2] 1090 兆赫扩展电文广播式自动相关监视地面站(接收)设备测试要
求[S].民航局空管局技术中心(0207 版),.
[3]吕小平. ADS—B 应用中 UAT 技术介绍[J], 空中交通管理, ,(8), 19-21
[4] 丁立平. 基于 VDL-4 技术机场场面车辆管理系统研究[J]. 指挥信息系统和技术, , (6), 55-60
[5] 邱伟杰. ADSB 广播式自动相关监视系统多数据链路融合方案探索[J].
[6] 肖飞; 余子寒; 隋天宇; 刘文. LTE 中 CRC 算法研究和实现[J]. 电子测量技术
. , (7), 36-39
[7] 李耀.基于模式 S ADS-B 系统研究[D].武汉:电子科技大学硕士论文,
[8] 李自俊.ADS-B 广播式自动关监视原理及未来发展和应用[J].中国民航飞行学院
学报,(5):11-14.
[9] 苏英振.主动推进空中交通管制一体化建设[J].国防,(6):59-60
[10] 中国民航科学技术研究指南(-) [M].中国民航总局,.
[11] ICAO. Comparative Analysis of ADS-B data Links[R].AN-Conf/11-IP/1 2.Montreal,
CANADA:ICAO,.
CPR部分算法
#include "stdio.h"
#include "stdlib.h"
#include <math.h>
#include "cpr.h"
# define M_PI 3.
#define LATZ 15
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
int nz(int type) {
return 4 * LATZ - type;
}
float nl(float lat) {
if (abs(lat) >= 87.0)
return 1.0;
return floor(
(2.0 * M_PI) *
pow(acos(1.0 - (1.0 - cos(M_PI / (2.0 * LATZ))) /
pow(cos((M_PI / 180.0) * abs(lat)), 2)), -1)
);
}
float dlat(int type, int surface) {
float res = surface ? 90.0 : 360.0;
int nz_val = nz(type);
if (nz_val)
return res / nz_val;
else
return res;
}
float dlng(float dec_lat, int type, int surface) {
float res = surface ? 90.0 : 360.0;
float nl_val = MAX(nl(dec_lat) - type, 1);
return res / nl_val;
}
float decode_lat(int enc_lat, int type, int surface, float recv_lat) {
float t1 = dlat(type, surface);
float t2 = ((float) enc_lat) / pow(2, 17);
float j = floor(recv_lat / t1) +
floor(0.5 + (fmod(recv_lat, t1) / t1) - t2);
return t1 * (j + t2);
}
float decode_lng(float dec_lat, int enc_lon, int type, int surface, float recv_lng) {
float t1 = dlng(dec_lat, type, surface);
float t2 = ((float) enc_lon) / pow(2, 17);
float m = floor(recv_lng / t1) +
floor(0.5 + (fmod(recv_lng, t1) / t1) - t2);
return t1 * (m + t2);
}
struct dec_location *cpr_resolve_local(struct dec_location *recv,
struct enc_location *loc, int type, int surface) {
float dec_lat = decode_lat(loc->lat, type, surface, recv->lat);
float dec_lng = decode_lng(dec_lat, loc->lng, type, surface, recv->lng);
struct dec_location *dec_loc = (dec_location *)malloc(sizeof(*dec_loc));
dec_loc->lat = dec_lat;
dec_loc->lng = dec_lng;
return dec_loc;
}
struct dec_location *cpr_resolve_global(struct enc_location *even,
struct enc_location *odd, struct dec_location *recv, int recent_type, int surface) {
float dlat_even = dlat(0, surface);
float dlat_odd = dlat(1, surface);
float even_lat = (float) even->lat;
float even_lng = (float) even->lng;
float odd_lat = (float) odd->lat;
float odd_lng = (float) odd->lng;
/* latitude index */
float j = floor(((nz(1) * even_lat - nz(0) * odd_lat) /
pow(2,17)) + 0.5);
float rlat_even = dlat_even * ((fmod(j, nz(0))) + even_lat / pow(2,17));
float rlat_odd = dlat_odd * ((fmod(j, nz(1))) + odd_lat / pow(2,17));
if (rlat_even > 270.0)
rlat_even -= 360.0;
if (rlat_odd > 270.0)
rlat_odd -= 360.0;
if (nl(rlat_even) != nl(rlat_odd))
return 0;
float rlat = recent_type ? rlat_odd : rlat_even;
if (surface && recv->lat < 0)
rlat -= 90.0;
float dl = dlng(rlat, recent_type, surface);
float nl_rlat = nl(rlat);
/* longitude index */
float m = floor((((nl_rlat - 1) * even_lng - nl_rlat * odd_lng) /
pow(2,17)) + 0.5);
printf("%f %f\n", dl, nl_rlat);
float enc_lon = recent_type ? odd_lng : even_lng;
float rlng = dl * ((fmod(m, MAX(nl_rlat - recent_type, 1))) + enc_lon / pow(2,17));
if (surface) {
float wat = recv->lng;
if (wat < 0)
wat += 360.0;
wat = 90 * ((int) wat / 90);
rlng += (wat - (90 * ((int) rlng / 90)));
}
if (rlng > 180) {
rlng -= 360.0;
}
struct dec_location *dec_loc = (dec_location *)malloc(sizeof(*dec_loc));
dec_loc->lat = rlat;
dec_loc->lng = rlng;
return dec_loc;
}
void main()
{
}
展开阅读全文