StarLab 实战(一):为什么用 Java 仿真 4000 颗卫星?

第 1 / 9 章 发布于
StarLab 实战(一):为什么用 Java 仿真 4000 颗卫星?

StarLab 实战(一):为什么用 Java 仿真 4000 颗卫星?

一、从一个空白搜索结果说起

写这个系列之前,我在中文技术社区搜了一圈"LEO 卫星仿真""星间链路""星地切换"。

结果很能说明问题:星链(Starlink)的科普视频播放量千万级,中国星网 GW 星座和千帆 G60 星座的发射新闻一周好几条,但"怎么用代码把这件事仿真出来"的中文技术文章,两只手数得过来。搜到的要么是航天专业论文(公式从第一页淹到最后一页),要么是 MATLAB/STK 的商业工具教程(license 比我的笔记本还贵)。

这就形成了一个很有意思的错位:

  • 行业侧:低轨(LEO)星座是 2026 年最确定的基础设施赛道之一。Starlink 在轨超过 8000 颗,国内两大星座进入密集组网期,信关站、终端、运控软件的岗位需求肉眼可见地涨;
  • 技术社区侧:Java 后端工程师对"卫星互联网"这四个字的普遍认知,约等于零。

对一个写博客的人来说,这种错位就是机会。数字孪生系列里我说过一句话:真正让面试官抬头的问题只有一种——他没见过的项目。LEO 仿真比数字孪生还要冷门一个量级:面试官不但没做过,甚至没见过别人做。你简历上写"LEO 卫星互联网仿真平台",面试的第一个问题一定是"这个怎么做出来的?"——而这恰恰是你准备了 12 章内容来回答的问题。

二、这个项目是什么:60 秒版

StarLab(星地智连仿真系统)是一个跑在浏览器里的 LEO 星座仿真平台:

  • 你在三维地球上看到几千颗卫星按真实轨道力学飞,时间轴可以加速、暂停、回放;
  • 点开任意时刻,平台算出哪颗卫星正飞过北京信关站上空(仰角够不够、还剩几分钟窗口);
  • 星座内部有星间链路(ISL)拓扑:哪两颗星互相可见、哪条路径从北京到喀什跳数最少;
  • 一颗卫星飞出地面站覆盖范围时,切换算法决定把连接交给哪颗下一颗星——贪心、预测式、干扰感知三种策略可以同参数并排对比;
  • 同频干扰模型实时算载干比(C/I),告诉你为什么"仰角最高"的那颗星不一定是好选择。

StarLab 功能展示

一句话总结:它把"卫星互联网怎么运作"这件事,从科普动画变成了每一帧都能用物理公式验算的代码。

三、仿真到底仿什么:一条数据的旅程

"仿真"这个词太大了,拆开说。StarLab 的仿真由五层组成,也是后面十几章的目录:

┌──────────────────────────────────────────────────────────┐
│ ① 轨道层  SGP4/开普勒传播                                  │
│    输入: TLE 两行根数 或 Walker 参数                        │
│    输出: 每颗星在任意时刻的 ECI/ECEF/经纬高 + 速度           │
├──────────────────────────────────────────────────────────┤
│ ② 可见性层  地面站可见 + 星间可见                            │
│    地面站: 仰角 ≥ 10°(ITU 标准)                           │
│    星间:   星地连线不穿地球(圆锥遮挡判定)+ 链路距离上限      │
├──────────────────────────────────────────────────────────┤
│ ③ 链路层  自由空间损耗 + ITU-R P.618 雨衰 + 噪声底           │
│    输出: SNR / 载干比(含同频干扰星座的 ACIR 建模)           │
├──────────────────────────────────────────────────────────┤
│ ④ 决策层  STCN 切换(贪心 / 预测式 / 干扰感知)              │
│           ISL 路由(Dijkstra,边权 = 传播时延)              │
├──────────────────────────────────────────────────────────┤
│ ⑤ 呈现层  Vue 3 + Cesium                                   │
│    三维地球 + 卫星实时渲染 + 切换过程可视化 + 时间轴回放       │
└──────────────────────────────────────────────────────────┘

以"北京信关站建立一次连接"为例,一次完整的数据流是:

  1. 轨道层把星座里每颗星传播到当前时刻,算出经纬高和地面对地速度——550km 高度的卫星,一圈约 95 分钟,对地约 7.5 km/s;
  2. 可见性层筛出仰角 ≥ 10° 的候选星,给出"过境窗口还剩 4 分 12 秒"这类预测;
  3. 链路层对每颗候选星算链路预算:2 GHz 载波、自由空间损耗、雨衰、噪声底,得出 SNR;
  4. 决策层的切换算法在"信号最好的"和"窗口最长的"之间做权衡——如果下一秒就出覆盖区,SNR 再高也是坏选择;
  5. 前端把这一切画出来:卫星掠过北京上空,一条链路线亮起,切换瞬间旧的线熄灭、新的线接上。

仿真数据流流程

后面每一章,就是这五层里的一环。 学完你不但能复刻,还能对着这张图把每一层的"为什么"讲三分钟。

四、技术栈:每一项都选得有理由

面试官的固定曲目是"为什么用 X 不用 Y",我把答案直接写进选型:

| 层 | 选型 | 为什么是它 | 预设追问 | |---|------|-----------|---------| | 语言 | Java 21 | 团队主流栈;虚拟线程(后续章节)对批量轨道传播是真刀真枪的收益 | "物理计算不是 Python 更顺手吗?"——Python 做原型快,但平台化(API、并发、工程化)是 Java 的主场,第 11 章专门对比 | | 框架 | Spring Boot 3.2.5 + WebFlux | 卫星位置是时间驱动的事件流,响应式模型天然契合;WebFlux 的背压正好管住前端订阅节奏 | "为什么不老老实实 Spring MVC?"——第 10 章有时间对齐的实战案例 | | 物理内核 | 自研 SGP4-lite | 商业库(STK)和 Python 库(skyfield)学到的是调用,不是原理;自己实现一遍才敢在简历上写"理解 SGP4" | "自己写的靠谱吗?"——第 3 章用黄金数据测试回答,误差给数字 | | 前端 | Vue 3 + Cesium | 数字孪生系列同款,三维地球是这类系统的标配;Cesium 的 Primitive 体系撑得起几千个目标的渲染 | "4000 颗星不会卡吗?"——会,这正是第 10 章的性能工程素材 | | 存储 | 暂时没有 | 刻意的:先把物理层做对,再谈持久化。仿真 run 历史、对比分析是升级路线图的第 8 站 | "没有数据库也配叫平台?"——问得好,这正是本系列的升级主线之一 |

注意最后一条。这个项目现在的完成度,我自己的评价是"一个能跑的、物理上基本正确的 Demo",还够不上简历级——没有测试、没有 CI、没有持久化、规模测试只到 4000 颗。我在一开始就把它亮出来,因为这个系列真正的卖点不是"看我做了一个多牛的项目",而是:

完整记录把一个 Demo 升级成简历级项目的全过程。 每一个短板怎么发现、怎么量出来、怎么修,都是章节。

五、先亮基线:现在的真实水平

动笔前我把现在的家底测了一遍,这些数字就是后面每一章优化时要打的靶子:

| 指标 | 现状 | 说明 | |------|------|------| | Walker 4000 星 ISL 拓扑发现 | 5,392 ms | O(n²) 双重循环逐对算可见性,540 万对 | | 1000 → 4000 星耗时增长 | × 22 | 平方律的教科书展示 | | 外推 10,681 颗(真实 Starlink 在轨数) | 约 40 s | 能跑,但不能交互 | | SGP4-lite vs ISS 真实 TLE | 误差 ~2.4% | 单点验证,黄金数据测试待建 | | 测试数量 | 0 | 物理代码没验证,这在面试里是减分项 | | CI / 部署 | 没有 | "能不能跑"取决于谁的机器 |

第 11 章收官时,目标是把第一行打到 1 秒以内、第三行做成 60 秒以内的交互式体验——手段就是虚拟线程并行传播 + 轨道壳空间索引,每一步的基准数据都会贴在文章里。

六、和其他系列的关系

如果你看过《数字孪生巡检平台实战》,会注意到两个系列共享同一套前端选型(Vue 3 + Cesium),但领域完全不同、内容完全独立:

  • 数字孪生讲的是"设备数据如何穿过边缘网关、MQTT、规则引擎,变成三维大屏上的工单"——主角是消息链路;
  • 这个系列讲的是"轨道力学、链路预算、切换算法如何撑起一个星座仿真"——主角是物理模型。

两个系列合起来,恰好覆盖了"空间里的移动目标"这类系统的两半:怎么采它的数据,和怎么算它的轨迹。任选其一入坑都不影响阅读。

七、本系列章节地图(12 章)

| # | 章节 | 免费/付费 | 核心内容 | |---|------|----------|---------| | 1 | 为什么用 Java 仿真 4000 颗卫星 | 免费 | 领域背景、五层架构、基线数据 | | 2 | 开普勒六参数,30 分钟讲透 | 免费 | TLE 解剖、开普勒方程、Walker 星座生成 | | 3 | SGP4-lite:把 ISS 的真实 TLE 算到误差 2.4% | 星球专属 | J2 摄动、BSTAR、黄金数据测试 | | 4 | 真实 Starlink TLE 批量导入:10,681 条数据的坑 | 星球专属 | TLE 解析边界、负 BSTAR 溢出、批量校验 | | 5 | 链路预算:自由空间损耗 + ITU-R P.618 雨衰 | 星球专属 | dB 世界观、噪声底、SNR | | 6 | 干扰建模:为什么仰角最高的星不一定是好星 | 星球专属 | C/I 载干比、ACIR、同频叠加 | | 7 | STCN 切换三策略:贪心 / 预测 / 干扰感知 | 星球专属 | 策略模式、同参数并排对比 API | | 8 | 星间链路:圆锥遮挡判定 + Dijkstra 路由 | 星球专属 | 可见性工程决策、传播时延边权 | | 9 | Cesium 3D:时间对齐与卫星渲染 | 星球专属 | 前后端时钟同步、Primitive 体系 | | 10 | 性能工程:从 5.4 秒到 1 秒以内 | 星球专属 | 虚拟线程、空间索引、基准对比 | | 11 | 补齐简历级短板:测试 / CI / Docker / 持久化 | 星球专属 | 黄金数据回归、Testcontainers、公网 demo | | 12 | 面试考点全景:30 个高频追问 | 星球专属 | 每一章的追问汇总 + 参考回答 |

前 2 章免费读完全文;第 3 章起为知识星球专属内容,一次加入解锁全部更新。更新节奏预计每周 1~2 章——物理章节要跑基准、贴数据,比纯文字慢,但每个数字都经得起复现。

八、下一章预告

第 2 章我们解决一个最基础的问题:给你 6 个数字和一个时间点,怎么把一颗 550km 高、7.5 km/s 的卫星的当前位置算出来?

会讲到 TLE 两行根数的逐段解剖、开普勒方程为什么必须用牛顿迭代、以及 30 行 Java 代码生成一个 Walker 星座。全程不涉及任何第三方库—— because 这正是这个项目对读者最大的价值:每一个公式都落到代码,每一行代码都能跑。

→ 继续阅读:StarLab 实战(二):开普勒六参数,30 分钟讲透