juliensimon/starlink-viz
GitHub: juliensimon/starlink-viz
一款实时3D Starlink卫星追踪器,用于可视化卫星网络性能。
Stars: 15 | Forks: 4
## 标题: Starlink 任务控制中心
表情符号: 🛰
颜色来源: blue
颜色目标: indigo
软件开发工具包: docker
应用端口: 7860
置顶: false
# starlink-viz
实时3D Starlink卫星追踪与任务控制面板。追踪SpaceX Starlink星座中的每一颗卫星,监控实时的地面终端遥测数据,可视化地面站,观测卫星切换,并预测星间激光链路(ISL)路由——所有计算均基于公开可用数据。包含Stellarium风格的夜空视图,带有星座和太阳光照建模。使用Next.js、React Three Fiber和Three.js构建。









### 太空视图

### 天空视图

## 功能介绍
### 太空视图(从太空俯视地球)
- **约10,000颗Starlink卫星**,通过SGP4轨道力学在5个轨道壳层中实时传播
- **GPS星座**与Starlink卫星一同追踪,可悬停识别
- **实时的地面终端遥测**,通过gRPC连接真实的Starlink地面终端(或使用模拟数据的演示模式)
- **天文精度的太阳和月亮**,具有实时定位、镜头光晕和自然月相变化
- **卫星切换追踪**——监控您的地面终端在卫星之间的切换
- **地面站**数据来自FCC/国际备案文件(从[HF数据集](https://huggingface.co/datasets/juliensimon/starlink-ground-stations)加载),包含运营/计划状态
- **ISL路由预测**——建模星间激光链路,包含受限PoP的网关选择、视线检查以及每个网关的回程估算
- **连接光束**可视化,从地面终端到连接卫星(青色上行链路,绿色ISL跳数,橙色下行链路)
- **演示位置**——5个偏远位置(冰岛海峡、大西洋、墨西哥湾、凯尔特海),在这些位置ISL路由是必需的
- **昼夜地球**模型,暗面带有城市灯光,大气辉光效果
### 天空视图(观察者视角的Stellarium风格夜空)
- **地平线相机**——从您的地面终端位置提供360度全景视图,可从地平线拖拽到天顶
- **约500颗参考恒星**,基于星等大小、B-V色指数着色,最亮的恒星带有命名标签
- **88个IAU星座**,带有棍形线条和标注名称
- **太阳光照模型**——圆柱形地球阴影将处于阴影中的卫星亮度调暗至10%;天空渐变感知太阳,经历白天/黄昏/夜晚阶段过渡
- **悬停时的卫星轨迹**——在穹顶上显示过去(青色)和未来(黄色)的轨道弧线
- **工具提示**显示卫星(名称、NORAD ID、方位角/仰角、壳层、日照状态)和恒星(名称、星等)
- **连接卫星的辉光光环**,实时跟随切换变化
- **天空抬头显示器(HUD)**——太阳仰角、卫星计数(日照/阴影)、UTC时间、白天能见度警告
- **罗盘方向**,每隔10度一个刻度,北/南/东/西方向加粗
## 快速开始
```
npm install
npm run dev
```
访问[http://localhost:3000](http://localhost:3000)。如果网络中未检测到Starlink地面终端,将自动激活**演示模式**并使用模拟遥测数据。
## 连接Starlink地面终端
服务器通过gRPC连接到`192.168.100.1:9200`(标准的Starlink路由器地址)的Starlink地面终端。您必须连接到Starlink网络。
```
# 自定义 dish 地址
DISH_ADDRESS=192.168.100.1:9200 npm run dev
# 强制 demo 模式(无需 dish)
DEMO_MODE=true npm run dev
# 自定义 dish 位置(默认为 48.910°N, 1.910°E)
NEXT_PUBLIC_DISH_LAT=37.7749 NEXT_PUBLIC_DISH_LON=-122.4194 npm run dev
```
## 架构
```
server.ts Custom HTTP + WebSocket + Next.js server
├── gRPC client Polls dish status (1s) and history (5s)
├── WebSocket server Broadcasts telemetry to all browser clients
└── Next.js app Serves the frontend
src/
├── components/
│ ├── scene/ 3D scene (React Three Fiber)
│ │ ├── Globe Earth with day/night textures
│ │ ├── SatellitePropagator Headless SGP4 propagation (shared by both views)
│ │ ├── Satellites Space view instanced mesh renderer
│ │ ├── SkyView Sky view root (groups all sky components)
│ │ ├── sky/ Sky view components
│ │ │ ├── SkyDomeCamera Stellarium-style horizon camera + OrbitControls
│ │ │ ├── SkyEnvironment Ground plane, sky gradient, horizon ring, compass
│ │ │ ├── SkyGrid Elevation circles, azimuth lines, cardinal labels
│ │ │ ├── SkyConstellations 88 IAU constellation lines + labels
│ │ │ ├── SkySatellites Az/el dome projection with sun shadow coloring
│ │ │ ├── SkyStars ~500 reference stars with RA/Dec→Az/El transform
│ │ │ ├── SkyBeam Glow halo on connected satellite
│ │ │ ├── SkyTooltip Hover tooltips for satellites + stars
│ │ │ └── SkyTrajectory ±5min trajectory arc on hover
│ │ ├── GpsSatellites GPS constellation overlay
│ │ ├── Sun Directional light + glow + lens flare
│ │ ├── Moon Textured sphere with Fresnel halo
│ │ ├── Atmosphere Fresnel glow shader
│ │ ├── GroundStations Gateway markers (star-shaped, operational/planned)
│ │ ├── ConnectionBeam Dish-to-satellite-to-gateway beams (always mounted)
│ │ ├── DishMarker Your dish location
│ │ └── SceneSetup Camera, controls, starfield
│ └── hud/ Overlay panels
│ ├── StatusBar Connection state, uptime, quality
│ ├── TelemetryPanel Ping, throughput, SNR charts
│ ├── SatelliteInfoPanel Satellite link, gateway, PoP, confidence
│ ├── HandoffPanel Starlink Network stats, shell info, handoffs
│ ├── SkyHud Sky view stats (sun elevation, sat counts, UTC)
│ ├── EventLog Real-time event feed
│ └── ViewControls Space/Sky toggle, auto-rotate, altitude filter
├── data/ Embedded datasets
│ ├── bright-stars.ts ~500 stars (mag ≤ 4.0) with J2000 RA/Dec
│ └── constellations.ts 88 IAU constellation stick figures
├── stores/ Zustand state (app + telemetry)
├── hooks/ useSatellites, useHandoff
└── lib/
├── satellites/ TLE fetching, SGP4 propagation, satellite store
├── websocket/ Client + server + protocol + types
└── utils/ Coordinates, astronomy, observer frame, sun shadow,
star coordinates, shell colors, formatting
```
## 命令
| 命令 | 描述 |
|------|------|
| `npm run dev` | 启动开发服务器(HTTP + WebSocket + Next.js) |
| `npm run dev:next` | 仅启动Next.js(无后端轮询) |
| `npm run build` | 生产环境构建 |
| `npm run start` | 启动生产服务器 |
| `npm run test` | 运行测试(vitest) |
| `npm run update-gs` | 更新地面站数据 |
| `npm run ingest` | 从CelesTrak导入最新的TLE数据 |
## 技术栈
- **[Next.js 16](https://nextjs.org/)** — 应用路由、API路由、SSR
- **[React Three Fiber](https://r3f.docs.pmnd.rs/)** — Three.js的React渲染器
- **[drei](https://drei.docs.pmnd.rs/)** — R3F辅助工具(OrbitControls、Billboard、Text、Stars)
- **[satellite.js](https://github.com/shashwatak/satellite-js)** — SGP4/SDP4轨道传播 + GMST
- **[Zustand](https://zustand.docs.pmnd.rs/)** — 轻量级状态管理
- **[starlink-dish](https://www.npmjs.com/package/starlink-dish)** — Starlink地面终端本地gRPC API的TypeScript客户端
- **[Tailwind CSS 4](https://tailwindcss.com/)** — 样式化
## 工作原理
**卫星传播**:从CelesTrak获取TLE(两行轨道根数)数据。一个无头的`SatellitePropagator`组件使用SGP4在每个动画帧计算每颗卫星的位置,并写入共享的`Float32Array`中。太空视图和天空视图都读取这个共享缓冲区——无论哪个视图处于活动状态,传播只发生一次。
**天空视图**:卫星位置使用ENU(东-北-天)参考坐标系(由地面终端的经纬度构建)从地心3D坐标投影到观察者的本地水平坐标系(方位角/仰角)。每颗卫星被放置在其方位角/仰角位置的虚拟穹顶上。恒星使用通过格林尼治恒星时进行的RA/Dec→Az/El转换。太阳光照使用圆柱形地球阴影模型来确定哪些卫星处于日照中,哪些处于阴影中。
**地面终端遥测**:Node.js服务器连接到Starlink地面终端的gRPC接口,轮询状态和信号历史。数据通过WebSocket广播到所有连接的浏览器,并存储在Zustand中。
**太阳和月亮**:位置通过真实的天文算法计算得出——太阳来自黄道经度和地球自转轴倾角,月亮来自平均轨道要素并加上摄动校正。方向光跟随太阳,因此地球的昼夜两侧和月相在物理上都是准确的。
## 数据源与准确性
本项目旨在尽可能准确,完全使用公开数据。未使用任何SpaceX专有系统、内部API或机密星座参数。
| 数据源 | 提供内容 |
|--------|----------|
| [CelesTrak / NORAD](https://celestrak.org/NORAD/elements/gp.php?GROUP=starlink&FORMAT=tle) | 每个被追踪的Starlink和GPS卫星的TLE轨道参数 |
| [Starlink地面终端gRPC API](https://github.com/sparky8512/starlink-grpc-tools) | 来自您自己地面终端的实时遥测数据(信号、吞吐量、天线方向) |
| [FCC / ITU备案](https://fcc.report) | 地面站位置,并与社区研究进行交叉引用 |
| [Hipparcos / Yale BSC](https://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/bsc5p.html) | 约500颗亮星的位置(J2000 RA/Dec、星等、B-V色指数) |
| [IAU星座数据](https://www.iau.org/public/themes/constellations/) | 88个星座的棍形线条定义 |
| Starlink DNS 约定 | PoP代码映射(例如,`customer.frntdeu.pop.starlinkisp.net` → 法兰克福) |
| 系统 traceroute / DNS | 网络路径分析——您的流量使用哪个互联网出口点 |
**本应用无法访问的内容**:SpaceX的内部卫星调度、星间激光链路路由、每颗卫星的容量/负载、地面终端使用的精确轨道数据(比公开TLE更准确)、或卫星机动/离轨状态。
除了公开数据和实时地面终端读数外,所有内容都是近似值或合理推测。关于哪些是实测数据、哪些是推断数据的完整分解,请参阅[技术审查](docs/TECHNICAL_REVIEW.md)。
## 舰队监控与历史数据集
`/fleet`页面使用历史NORAD TLE数据跟踪Starlink星座的健康状况——星座增长、高度分布、壳层填充率、发射节奏、卫星生命周期、轨道平面和ISL覆盖范围。
完整数据集已在Hugging Face上发布:**[juliensimon/starlink-fleet-data](https://huggingface.co/datasets/juliensimon/starlink-fleet-data)**
- **每日星座快照**,追踪每一颗Starlink卫星(2019年5月至今)
- 每日按壳层汇总:按状态(运行中、升轨中、离轨中、衰变、异常)统计的卫星数量
- 提供Parquet文件,可直接与`datasets`、pandas或DuckDB一起使用
## 文档
- **[用户指南](docs/USER_GUIDE.md)** — 设置、配置、界面导览和功能参考
- **[技术审查](docs/TECHNICAL_REVIEW.md)** — 数据源、准确性分析,以及哪些是实测数据、哪些是近似值
## 许可证
MIT
标签:3D可视化, Docker, gRPC, ISL路由, React, satellite.js, SGP4, Starlink卫星, Syscalls, Three.js, TypeScript, 任务控制台, 卫星切换, 卫星追踪, 地面站, 天文建模, 天文观测, 天空视图, 安全插件, 安全防御评估, 实时系统, 实时追踪, 星座视图, 用户界面, 空间视图, 自动化攻击, 航天技术, 航天监控, 请求拦截, 轨道力学, 遥测数据