《狂人日记NO.8》— 从零到一,我开发了一款高性能卫星轨道计算库

2 阅读4分钟

前言

2026年3月,我完成了 kbe3d-satellite 的第一个稳定版本,并发布至 npm。

回首过去这段时间,从最初对卫星轨道计算一知半解,到如今能够熟练运用 SGP4/SDP4 模型、掌握 TLE/OMM 数据格式、实现 CPU 与 GPU 双引擎并行计算——这段旅程,值得记录。

image.png

一切的起点

故事的开始,其实很朴素。

我需要在一个三维地球项目中展示卫星的实时位置。搜索了一圈,找到了 satellite.jstle.js 这两个优秀的开源库。它们很强大,但也有些“门槛”:satellite.js 提供了精确的算法,但 API 偏底层,需要手动处理时间差、坐标转换;tle.js 简化了数据解析,但计算能力有限。

于是我想:能不能把两者的优势结合起来,再融入 GPU 加速能力,做一个更易用、更高性能的封装?

这就是 kbe3d-satellite 的雏形。


从 TLE 到 OMM:理解卫星轨道数据

要做卫星计算,首先得理解数据。

TLE(两行根数)是 NORAD 发布的标准格式,两行 69 个字符,包含了卫星的轨道根数、摄动参数等。而 OMM(轨道平均根数消息)是更新的 JSON 格式,更适合程序处理。

我花了不少时间研究这两种格式的转换。最难的是历元时间的转换,年积日转 ISO 字符串,看似简单,却容易在闰年、时区上踩坑。

最终,我实现了 transTleToOmmtransOmmToTle 的双向转换,支持从六根数(半长轴、离心率、倾角、升交点赤经、近地点幅角、平近点角)构建 OMM 对象,也支持从 TLE 字符串解析。


CPU 计算:从 satellite.js 出发

核心计算依赖 satellite.js 的 SGP4 算法。但原始 API 需要手动计算时间差、处理坐标转换、循环采样。我做了三层封装:

  1. sgp4Orbit:一次调用,传入开始/结束时间和步长,返回完整的位置数组
  2. sgp4OrbitLive:实时更新模式,支持多颗卫星的批量计算
  3. 配置项isGetDetails 控制是否返回速度、经纬度等详细信息

这样,用户不再需要关心 satrec 对象、儒略日、时间差计算——传参数,拿结果。


GPU 加速:挑战与突破

当卫星数量增加到几百上千颗时,CPU 计算开始吃力。sgp4.gl 这个 GPU 加速库进入了我的视野。

但 GPU 的计算模式完全不同——它擅长并行处理大量独立任务,而不是串行计算时间序列。我花了很长时间理解它的 API:WasmElementsWasmConstantsWasmGpuConstsregister_const_setpropagate_registered_f32……

最大的收获是理解了**“一星多点”与“多星一点”**的区别。GPU 加速的核心是“批量并行”,而不是“单点加速”。最终我实现了 propagatorLiveWithGPU,支持:

  • 多颗卫星的实时位置计算
  • 与外部时钟解耦,可自由集成到 Cesium 等三维引擎
  • 双缓冲机制,避免渲染卡顿
  • 自动回退到 CPU 计算(当 GPU 不支持或时间范围过大时)

实测 26000 多颗卫星,以笔记本英伟达 3050Ti 为例:

  • CPU 模式:约 20 fps
  • GPU 模式:超过 90 fps

性能提升超过 4 倍,丝滑流畅。


坐标系与可视化

有了位置数据,还得让它们在地球上显示。

Cesium 的坐标系体系是另一个学习曲线:ECI(地心惯性系)是 SGP4 的输出,但 Cesium 默认使用 ECF(地心地固系)。我在代码中集成了 eciToEcf 转换,支持 PointPrimitiveCollection 的高性能批量更新。

最终,卫星的实时轨迹能够平滑地呈现在三维地球上。


发布与总结

经过一周左右闲暇时间的开发和测试,kbe3d-satellite 终于在 npm 上发布了。

这个库支持:

  • ✅ TLE/OMM/六根数输入
  • ✅ CPU/GPU 双计算引擎
  • ✅ 批量实时更新与一次性轨迹计算
  • ✅ 完整的 TypeScript 类型定义
  • ✅ 与 Cesium 无缝集成

技术栈

  • 核心计算:satellite.jssgp4.gl
  • 可视化:Cesium
  • 语言:TypeScript
  • 构建:Vite
  • 文档:TypeDoc

写在最后

回头看,这段经历让我深刻体会到:技术方案的选择,往往取决于应用场景

如果你只需要展示一两颗卫星,CPU 计算足够;如果你要做“太空态势感知”,GPU 并行是必经之路。

如果你正在寻找一个易用且高性能的卫星轨道计算库,欢迎尝试 kbe3d-satellite

npm install kbe3d-satellite

感谢 DeepSeek,在遇到技术难题时,总能给我清晰而深入的解答。

在线文档移步 kbe3d.online/docs

image.png image.png

愿我们的代码,能带人们看见更远的星空。

欢迎评论

如果大家有什么看法或问题,也可以关注我的公众号哦—【诗传千古地负海涵】 🌟