前言
2026年3月,我完成了 kbe3d-satellite 的第一个稳定版本,并发布至 npm。
回首过去这段时间,从最初对卫星轨道计算一知半解,到如今能够熟练运用 SGP4/SDP4 模型、掌握 TLE/OMM 数据格式、实现 CPU 与 GPU 双引擎并行计算——这段旅程,值得记录。
一切的起点
故事的开始,其实很朴素。
我需要在一个三维地球项目中展示卫星的实时位置。搜索了一圈,找到了 satellite.js 和 tle.js 这两个优秀的开源库。它们很强大,但也有些“门槛”:satellite.js 提供了精确的算法,但 API 偏底层,需要手动处理时间差、坐标转换;tle.js 简化了数据解析,但计算能力有限。
于是我想:能不能把两者的优势结合起来,再融入 GPU 加速能力,做一个更易用、更高性能的封装?
这就是 kbe3d-satellite 的雏形。
从 TLE 到 OMM:理解卫星轨道数据
要做卫星计算,首先得理解数据。
TLE(两行根数)是 NORAD 发布的标准格式,两行 69 个字符,包含了卫星的轨道根数、摄动参数等。而 OMM(轨道平均根数消息)是更新的 JSON 格式,更适合程序处理。
我花了不少时间研究这两种格式的转换。最难的是历元时间的转换,年积日转 ISO 字符串,看似简单,却容易在闰年、时区上踩坑。
最终,我实现了 transTleToOmm 和 transOmmToTle 的双向转换,支持从六根数(半长轴、离心率、倾角、升交点赤经、近地点幅角、平近点角)构建 OMM 对象,也支持从 TLE 字符串解析。
CPU 计算:从 satellite.js 出发
核心计算依赖 satellite.js 的 SGP4 算法。但原始 API 需要手动计算时间差、处理坐标转换、循环采样。我做了三层封装:
sgp4Orbit:一次调用,传入开始/结束时间和步长,返回完整的位置数组sgp4OrbitLive:实时更新模式,支持多颗卫星的批量计算- 配置项:
isGetDetails控制是否返回速度、经纬度等详细信息
这样,用户不再需要关心 satrec 对象、儒略日、时间差计算——传参数,拿结果。
GPU 加速:挑战与突破
当卫星数量增加到几百上千颗时,CPU 计算开始吃力。sgp4.gl 这个 GPU 加速库进入了我的视野。
但 GPU 的计算模式完全不同——它擅长并行处理大量独立任务,而不是串行计算时间序列。我花了很长时间理解它的 API:WasmElements、WasmConstants、WasmGpuConsts、register_const_set、propagate_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.js、sgp4.gl - 可视化:Cesium
- 语言:TypeScript
- 构建:Vite
- 文档:TypeDoc
写在最后
回头看,这段经历让我深刻体会到:技术方案的选择,往往取决于应用场景。
如果你只需要展示一两颗卫星,CPU 计算足够;如果你要做“太空态势感知”,GPU 并行是必经之路。
如果你正在寻找一个易用且高性能的卫星轨道计算库,欢迎尝试 kbe3d-satellite。
npm install kbe3d-satellite
感谢 DeepSeek,在遇到技术难题时,总能给我清晰而深入的解答。
在线文档移步 kbe3d.online/docs。
愿我们的代码,能带人们看见更远的星空。
欢迎评论
如果大家有什么看法或问题,也可以关注我的公众号哦—【诗传千古地负海涵】 🌟