如何利用一条短的 LED 灯带来实时显示飞机在进近过程中的位置以及其飞行高度
扫描二维码
随时随地手机看文章
这个项目是为我物理计算课程中的数据可视化项目而设计的。其核心理念是通过 LED 灯带来展示飞机在天空中的位置,每盏 LED 灯都代表着一个位置。这些灯光会随着飞机的活动而移动并改变颜色。
我为这个项目使用了 Particle Photon 2,因为它非常出色,而且能非常轻松地将这个微控制器连接到互联网。这绝对是一款出色的微控制器,我会强烈推荐(我还买了另外两个)。
所有跑道均以芝加哥奥黑尔国际机场(ORD)为参照标准。
Webhook/ API
查询
这是通过使用 OpenSky 网络及其 REST API 来完成的,该 API 的详细文档可在此处查阅。
这个 API 如何运作的最简单且最易于演示的例子,可以通过一个匿名的 API 请求来实现,该请求遵循基本的查询设置,并将其输入到网络浏览器中。例如,要查找位于 28C/10C 圆形区域内所有飞机的查询,其格式应如下所示:
理想情况下,应该能够将该内容以 GET 请求服务的形式(比如使用 Particle 的服务)提交出去。但对我来说,这似乎从未奏效。无论我尝试何种身份验证方式,无论使用何种访问令牌,无论设置何种参数、头信息还是响应模板,都无法让我摆脱“ETIMEDOUT”错误(即当 API 回复时间过长时出现的 Particle 错误)。我把它发到了 OpenSky 的 Discord 和 Particle 论坛,但都没有效果。如果您找到了解决办法,请告知我;那样会让这一切变得简单得多。
为了解决这个问题,我使用了我手头有一台旧的 Raspberry Pi 3 来从 OpenSky API 获取数据,然后使用 Particle.publish() 函数将这些数据推送到我的 Particle 设备上。该代码可以在本项目的“代码”部分中查看。
一个优点是这种接力方式确实可行。另一个优点是它能为我提供 OAuth2 客户端凭证,这样我每天就能获得 4000 个 API 信用额度。但有一个缺点是,如果我想要更改跑道的地理围栏,我就得进入树莓派并自行修改代码。
“光子 2 编程”
这就是一切精彩内容的开始。我将为大家展示每个步骤的具体操作过程,并且不会深入讲解编程本身的内容。如需了解更多详情,请查看下面这个项目的“主”代码部分。我用内嵌注释对其进行了详细的记录,这样您就可以跟着实际的代码一起操作了(如果您愿意的话)。我会标注行号,以便于您更好地理解。
解析数据
首先,OpenSky API 返回的 JSON 文件包含了整个虚拟区域内所有的飞机信息。所有的飞机。在空中飞行的、起飞的、在地面的……所有内容都在其中。所以首先我们必须对其进行排序!我用这个来获取每个数据值,还用这个便捷的工具让我的工作变得轻松些。下面是我是如何操作的(第 45 行):
需要指出的是,当我确定这架飞机正是我想要的那一架后,我会获取其所有数据并将其存储到一个“飞机”对象中,这样我就再也不需要再接触 JSON 数据了。这个飞机对象的结构如下:
这些对象被添加到一个数组中,这样我就能方便地对其进行存储和排序了。
整理飞机停放位置
我不太清楚 OpenSky API 在返回 JSON 数据时是依据什么标准对飞机进行排序的,但可以肯定的是,它并非依据距离奥尔德姆机场的远近来进行排序。因此,我必须将这些混乱的对象数组整理成一个能触发警报的数组。
需要指出的是,存储混乱排列的飞机对象的数组长度总是会小于表示灯光的数组长度。我有 8 个灯,所以它由一个 7 个索引的数组来表示。每个灯代表 1.5 英里的空域。所以它看起来是这样的:
飞机的数量绝不会超过 4 架,因为如果超过了,那一定是空中交通管制员搞错了。因为根据美国联邦航空局的 JO 7110.65 5-5-4 规定,飞行器之间必须保持 3 英里的间隔。这意味着最多每 3 个间隔才能有一架飞机。
那么如何对其进行排序呢?其实很简单。这个过程发生在第 100 行到第 156 行之间,通过一系列“if”语句来实现。每架飞机都会被检查其经度,并被放置到相应位置的正确数组槽中。如果没有飞机在那里,就会创建一个假飞机,其高度设为 -1000 米,以便于更容易地识别出来。这就是您能得到的所有解释了:)
打开灯
很简单。首先,关闭所有没有对应飞机的灯。然后,如果这个灯有对应的飞机,就将其打开,并将颜色设置为代表飞机所处高度的样式。我使用了 switch-case 结构,因为我是个酷家伙(第 182 行至 219 行)。
结论
就是这样啦!如果拆解开来的话,其实挺简单的,但从零开始进行编程可不是一件容易的事!虽然仍有几处关于神秘飞机和奇怪的地理围栏错误的问题,但总体来说这个项目已经达到了 98% 的功能性。
根据 Raspberry Pi 代码的最后一行设定,数据每 10 秒更新一次,而灯也会随之相应地变化,因为“光子”始终处于循环状态。即便以这样的频率运行,我每天 4000 个 API 信用额度也需要大约 12 个小时的持续使用才会用完。我的 Pi 电脑连接到一个智能插座,这样我就可以从家里远程开关它,而且在我不需要它的时候它也不会消耗我的信用额度。
本文编译自hackster.io





