Linux 在空中交通管制中的应用
许多人说 Linux 尚未准备好用于空中交通管制,但实际上,它已经准备就绪并已被使用。最近,我参与了一个项目,该项目将 FAA 的 Common ARTS 软件 (www1.faa.gov/ats/atb/Sectors/Automation/CommonArts/index.htm) 移植到 Linux。

亚特兰大的一名管制员
当我们大多数人想到空中交通管制系统时,我们通常会看到带有扫描的圆形屏幕。有些人知道雷达天线阵列是什么样的。在雷达天线和显示器之间有一些计算机使事情变得更容易。数字信号处理器 (DSP) 位于天线建筑物中,并且也使用了自动化系统。本文介绍了自动化系统如何工作,以及 Linux 在哪里被使用。
自动化雷达终端系统 (ARTS) 于 1964 年在 Univac 计算机上启动。该系统最终于 1973 年在全国范围内推广。原始计算机已升级并继续使用至今。许多较大的站点在 1980 年代从 Univac 计算机转移到微处理器。所有旧版 ARTS 软件都在转移到微处理器的过程中被移植或用 C 语言重写,以在实时 LynxOS 下运行。
迁移到 LynxOS 是幸运的,因为它提供了一个 POSIX 基础,可以在此基础上进行进一步的移植。使用 LynxOS 还允许开发人员选择使用哪些微处理器。最初,该软件在 Motorola 68K CPU 上运行,目前在 PowerPC 上运行。
Common ARTS 系统是一个高度分布式、网络化、多线程的实时系统。绝对可靠性是基本要求。使用双网络,在正常情况下,每个特定任务分配两个备份。该软件的设计使得一个子系统的某些功能可以由另一个子系统接管。
雷达数据通过串行线路进入每个航迹处理器 (TP)。通常,每部雷达有四条串行线路连接到每个 TP。雷达上的数据包括原始雷达信号、应答器信标(每架飞机都应有一个应答器,每次雷达 ping 飞机时,应答器都会在信标中返回 ID 和高度)和天气数据。同一个天线阵列通常接收所有三个信号。任何雷达和信标数据都可以通过三条串行线路中的任何一条传输,而天气数据则通过其自己的串行线路传输。
TP 至少分为两个子系统,串行消息组装和实际航迹处理。串行消息组装将每种消息类型(原始雷达、信标和天气)转换为网络消息。航迹处理涉及将雷达和信标消息(目标)关联到单个航迹。航迹是飞机的已知历史记录。目标可以是雷达信号、信标信号或两者兼而有之。一旦目标与航迹相关联,另一个航迹消息就会被放在网络上。
消息通常在网络上广播。它们使用 UDP 在两个主干上发送,并且每条消息都有唯一的包 ID。网络上的每台计算机都监听两个主干,并记录从每个唯一网络 ID 听到的包 ID。如果包 ID 中存在间隙,则机箱可能会请求重新广播。重复的包 ID 将被忽略,假设它是另一个主干上的消息或某些其他机箱请求重新广播。
每个系统都必须在网络上广播心跳信号。如果错过心跳信号,则假定系统已关闭,并且其他系统之一会发送消息以让备用系统接管。
处理网络消息的下一个处理器是公共处理器 (CP)。CP 做很多事情,例如将飞行计划与航迹匹配、发送冲突警报 (CA)、最低安全高度警告 (MSAW) 以及监控 Common ARTS 系统的一些心跳信号。CP 做的最重要的事情是确定航迹的空速和方向。
CA 使用速度和方向来查看其他航迹,以确定发生冲突的可能性。如果检测到冲突,CP 会广播 CA 消息,指示冲突中的飞机。当飞机以 300 节(约每分钟五英里)的速度飞行时,提前一两分钟观察非常重要。
MSAW 使用针对站点调整的地图来了解该区域的地形。地形可以是丘陵和山脉,也可以是塔楼和建筑物。对于配备应答器的飞机,MSAW 系统会查看高度和位置,并确定飞机是否可能过低。如果确定飞机过低,则会广播 MSAW 消息。
后台的最后一个主要系统是系统监控和控制 (SMC)。SMC 的主要目的是监控和控制其他系统。它是 SMC 显示 PC 的网关,SMC 显示 PC 是用于监控网络及其当前状态的 GUI。当前状态指示在线、离线、待机或空闲的系统。如果错过心跳信号,SMC 会指示备用系统接管。系统操作员可以随时指示手动切换、加载新软件或从此 PC 重启系统。SMC 也用于记录所有穿过网络的数据。
当我们大多数人想到空中交通管制时,我们想到的是显示器:一个房间里摆满了圆形矢量显示器,穿着白衬衫的人们正在观看它们。越来越多的站点正在使用大型 20 英寸方形彩色显示器。新的彩色显示器是 2048×2048 像素的 X 窗口显示器。显示处理软件 (DPS) 的设计使得它的某些部分可以被任何显示器类型使用,例如彩色方形显示器(如 ARTS 彩色显示器 (ACD))或圆形矢量显示器(如全数字 ARTS 显示器 (FDAD))。
DPS 接收广播消息并根据系统状态显示相应的图像。在正常运行中,显示器包括航迹指示、方向历史指示、完整或部分数据块以及各种系统的状态。
来自 CP 的飞行计划信息消息显示在 TP 为其创建航迹的飞机附近的完整数据块中。广播的 SMC 总体状态也可以显示。网络可以使用一个或数百个显示器。
此外,每个系统都可以在一个或多个 CPU 上运行。如果 CPU 足够强大,则所有系统和子系统都可以在单个 CPU 上运行。
最初,移植到 Linux 的原因是允许开发人员在办公桌上测试和调试系统,然后再在目标硬件上进行测试。目标硬件是运行 LynxOS 的 VME 机箱中的 Motorola OEM 板。这些系统相对昂贵,因此 FAA 和 Lockheed-Martin 都不希望有一堆系统闲置。相反,几个测试系统几乎全职用于集成测试和开发。
由于 IS 部门为开发人员提供了 Microsoft Windows NT PC,因此尝试将软件移植到 NT。当我开始为该公司工作时,大部分移植工作已经完成。对于测试某些东西,NT 工作正常。使用适配器层使 POSIX 线程、文件 I/O 和图形的行为类似于目标系统,因此它不擅长测试这些功能。
当我开始在 Lockheed-Martin 承包工作时,我被安排在消息传递层小组,该小组负责维护系统的通信、线程和文件 I/O。基本上,我的任何测试都无法在桌面上完成,我必须使用目标硬件。最初,一个附带项目是研究这是否可行,我被分配了一台旧的(200MHz 奔腾)PC 用于开发目的。
大多数代码编译得很好,尽管 POSIX 标准存在一些问题。LynxOS 2.4 和 3.0 使用了较旧的标准,而 Linux 使用了当前的标准。最初,我在 Red Hat 7.0 和 2.2 内核上进行开发,它不支持命名信号量或命名共享内存段。在我们这样的分布式系统中,在处理器中使用标准名称比使用其他通信机制来了解共享内存和信号量在哪里更容易。我拼凑了一个命名的共享内存兼容层,并且我找到了一个俄罗斯网站,其中包含一个命名的信号量兼容层。
在开发过程中,我迁移到 Red Hat 7.1,它应该支持命名共享内存,但是 glibc 和头文件之间存在不兼容性。我能够查看源代码以找到这个问题,并在内核邮件列表中发布了一条注释。不过,有人抢先我一步。为了保持原样,允许任何人获取任何没有此修复程序的 Red Hat 版本,我将我拼凑的版本留在了代码中。
目标硬件都是大端序(Motorola 68K 和 PPC),而 Linux PC 是 x86 小端序,因此我需要进行一些字节交换才能使整个系统工作。许多文件以二进制(地图、适配等)格式存储。网络层已经内置了字节交换机制,并且效果很好。
一旦我编译并运行了所有消息传递代码,我就需要一个应用程序。FAA 同意资助 TP、CP、SMC 和 DPS 系统的进一步开发,用于桌面测试和调试。这些系统都移植得很好,但是 DPS 在 X 显示方面存在一些问题。通常,大型 2048×2048 像素显示器在具有两个或三个伪彩色物理平面的专用硬件上运行。如果地图和菜单绘制在底层平面上,天气绘制在另一个平面上,飞机绘制在顶层平面上,则如果飞机移动,则无需重绘整个显示器。为了使这个平面的想法起作用,颜色映射被分成三个部分。由于是伪彩色(8 位),因此限制了每个平面中的颜色数量。地图和菜单平面获得一种颜色(白色),天气获得另一种颜色(棕色),主显示平面获得 78 种颜色。
因此,我们需要进行更多的颜色表调整,因为通常主显示器使用 250 种颜色。大型显示器具有动画淡化历史轨迹,可模拟矢量显示器上的淡化荧光粉。需要 128 个颜色单元才能使动画工作。对于此应用程序,我制作了一个单元格,没有动画。它看起来非常棒。通过找到所有相似的红色、相似的绿色以及黄色、蓝色、白色和灰色,我将表格修剪到 78 种可用颜色。
完成所有这些工作后,我获得了一张双平面显卡,以查看系统是否仍然可以工作。更改一个编译时标志使整个系统都正常工作了。双平面显卡将天气地图和菜单放在同一平面上。
大约在这个时候发生了两件事。我将 Linux 代码交付给 FAA,另外几位开发人员的任务是让 Linux 在目标 PowerPC 硬件上工作。FAA 发现了一些我没有在代码基线中跟进的更新,我们能够在这方面协同工作。其他开发人员发现我的大多数 #ifdefs 都特定于 Linux,而不是机器架构。因此,当 FAA 最终接受它时,我能够保留我对 FAA 的更改并进行正确的 #ifdefs。
PowerPC Linux 项目旨在改进 SMC 处理的数据记录任务。当前的系统使用消费级、现成的光盘,这些光盘不适合 24/7 写入。新系统采用了 SAN 磁盘,SAN 磁盘更适合空中交通管制需求。尽管从技术上讲是成功的,但该项目目前已暂停。
在 2003 年春季,FAA 开始在 Linux 上使用 Common ARTS 用于非关键子系统,这是一种廉价的网关系统,将 ARTS 数据馈送到其他系统。最终可能会获得完整认证。
Tom Brusehaver 是一位代码苦工,自从 PC 出现之前就开始编写代码。他现在主要从事合同工作,更喜欢嵌入式系统。他已婚,有成年的孩子、两只猫和一条狗。天气好的时候,他正在建造一架飞机。