# skylight

> 来源：[GitHub](https://github.com/cpaczek/skylight) · ⭐ 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 天线。

```bash
# 克隆项目
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` 运行，可直接对接：

```bash
# 典型 dump1090 启动方式（需 rtl-sdr 驱动）
dump1090 --device-index 0 --gain -10 --net --net-ro-port 30003
```

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

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

## 应用场景

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

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

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

## 总结

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