skylight

来源:GitHub · ⭐ 1212 stars

Skylight:把头顶的航班实时投影到天花板上

项目简介

当你躺在床上仰望天花板时,是否想过能看到真实的飞机从头顶飞过?Skylight 正是这样一个充满浪漫色彩的开源项目——它通过廉价的 RTL-SDR 软件定义无线电接收器,实时捕获附近飞机的 ADS-B 信号,并将这些飞行器的位置、航向等信息投影到你的天花板上,同时叠加太阳、月亮、星辰乃至国际空间站的天体图层。

这个项目的核心价值在于将抽象的数据可视化转化为沉浸式的空间体验。传统的飞行追踪应用(如 Flightradar24)局限于二维屏幕,而 Skylight 打破了这一边界,利用房间的天花板作为"穹顶",让用户以第一人称视角感受头顶空域的繁忙。1212 个 Star 的背后,是开发者社区对"物理空间与数字信息融合"这一理念的认可。项目采用 TypeScript 全栈开发,兼顾了硬件接口的稳定性与前端渲染的流畅性。

核心特性

  • 实时 ADS-B 信号解码:通过 RTL-SDR 接收 1090 MHz 频段的飞机广播信号,无需网络 API 即可获取真实空域数据,延迟低至秒级
  • 天花板投影映射:自动计算飞机相对于用户地理位置的方位角与高度角,转换为天花板上的二维坐标,飞机图标会按实际航向旋转
  • 多层天体渲染:集成太阳、月亮、主要恒星及 ISS 的实时位置,支持根据时间动态调整天空背景(昼夜渐变、月相变化)
  • Web 端可视化界面:基于现代浏览器技术构建,支持任意显示设备(投影仪、智能电视、平板),无需专用硬件
  • 地理坐标自动校准:结合用户 GPS 或手动输入的经纬度,精确计算本地水平坐标系(Alt-Az)与天体的对应关系

技术实现

Skylight 的技术架构体现了"边缘计算 + 浏览器渲染"的轻量级设计理念。硬件层使用 RTL-SDR 接收原始 IQ 数据,经由 dump1090 或兼容的 ADS-B 解码器转换为 JSON 格式的 SBS1/BaseStation 消息。这里的关键在于 TypeScript 服务层对坐标系统的处理:项目需要将 WGS-84 椭球坐标系下的飞机位置(经纬度高),通过大地主题解算转换为以观察者为中心的地平坐标系(Azimuth/Altitude)。

具体而言,代码中实现了 Vincenty 公式或 Haversine 公式的变体来计算大圆距离与方位角,随后将高度角映射为天花板上的径向距离(天顶为中心,地平线为大圆边界)。对于天体图层,项目集成了天文算法库(如基于 Jean Meeus《天文算法》的实现),计算太阳、月亮的视位置,并处理岁差、章动、光行差等修正项。

前端渲染方面,项目 likely 采用 Canvas 2D 或 WebGL 进行高性能图形绘制。飞机图标的方向通过 CSS transform: rotate() 或 Canvas 的 rotate() 方法实时更新,而 ISS 作为快速移动目标,需要更高频度的位置插值。值得称道的是,整个系统的状态管理:ADS-B 信号存在丢包、延迟、位置跳变等问题,Skylight 需要实现卡尔曼滤波或滑动平均来平滑轨迹,避免投影上的"抖动"。

快速上手

硬件准备:RTL-SDR Blog V3 或兼容的 DVB-T 接收器(约 30 美元),配合 1090 MHz 天线。

# 克隆项目
git clone https://github.com/cpaczek/skylight.git
cd skylight

# 安装依赖
npm install

# 配置环境变量
cp .env.example .env
# 编辑 .env,设置 SDR 数据源与地理位置
# ADSB_SOURCE=tcp://localhost:30003  # dump1090 默认端口
# LATITUDE=31.2304
# LONGITUDE=121.4737

# 编译并启动
npm run build
npm start

若已有 dump1090 运行,可直接对接:

# 典型 dump1090 启动方式(需 rtl-sdr 驱动)
dump1090 --device-index 0 --gain -10 --net --net-ro-port 30003

浏览器访问 http://localhost:3000,将显示设备对准天花板即可。对于无 SDR 硬件的开发者,项目支持模拟数据模式:

// 启用模拟航班数据(开发调试)
const mockProvider = new MockADSBProvider({
  aircraftCount: 5,
  updateIntervalMs: 1000,
  centerLat: 31.2304,
  centerLon: 121.4737
});

应用场景

航空爱好者与家庭教育:家长可将 Skylight 安装在儿童房,孩子看到天花板上的飞机时,同步讲解飞行原理、航线规划与天体运行。相比静态星图,动态关联真实世界的体验更具教育价值。

沉浸式冥想空间:瑜伽馆或冥想室利用 Skylight 营造"露天"氛围。夜间模式下,仅显示缓慢移动的飞机光点与静谧的星空,配合环境音效,帮助用户建立与广阔天空的心理连接。

机场周边酒店增值设施:浦东、大兴等机场周边的精品酒店可在客房部署此系统,旅客能直观看到自己即将搭乘的航班正在进近,或观察凌晨货运航班的繁忙轨迹,将"机场噪音"转化为独特的住宿体验。

总结

Skylight 是一个技术浪漫主义的典范项目:它以极低的硬件门槛(30 美元 SDR),将冰冷的射频信号转化为富有诗意的空间叙事。其 TypeScript 技术栈的选择兼顾了 Node.js 对串口/网络流的处理能力,以及浏览器生态的图形渲染优势。坐标转换、天文算法、状态平滑等细节展现了开发者扎实的工程功底。该项目最适合航空爱好者、STEM 教育者、以及所有对"物理计算 + 空间交互"感兴趣的开发者——它不仅是一个工具,更是一扇重新发现头顶天空的窗户。