@mickeywzx: 与其从宏观角度追踪卫星,许多观测者可能总会好奇:一颗卫星刚刚越过……
摘要
SatIdentifier 是一款开源工具,用于识别哪些卫星穿过了你的望远镜视场,将观测到的轨迹与轨道星表进行匹配,并在星图上渲染预测路径。
查看缓存全文
缓存时间: 2026/08/05 02:18
与其从宏观视角追踪卫星,许多观测者可能总是会好奇:
一颗卫星刚刚经过我的望远镜视场,或者从头顶飞过。那是哪颗卫星? SatIdentifier 会给你答案。
https://t.co/2zSoUTKiQA https://t.co/ZzTZ4V9A4e
exoplanet5/SatIdentifier
来源:https://github.com/exoplanet5/SatIdentifier
SatIdentifier
卫星跟踪器的逆向工具。它不问 那颗卫星在哪里,而是问 我的视场里是谁 —— 因此,一帧图像上无法识别的轨迹可以与目录进行匹配。
给它一个站点、一个历元和一个时间跨度、一个指向(J2000 RA/Dec、Alt/Az,或从轨道给出的 LVLH 角)以及一个视场。它会找出穿过该视场的每一个编目目标,并在真实恒星背景上以日晷投影天空图绘制每条轨迹,可直接与你的帧图像对比。
站点本身也可以是一颗卫星(天基空间态势感知):从已加载目录中按 NORAD 编号选择任意目标,扫描就从它的传感器进行——从轨道上看,谁穿过了我的视场。
SatIdentifier — 带预测轨迹的天空图、全天上下文视图、穿越列表和卫星信息
本地 Python 后端(目录获取、缓存、持久化——仅使用标准库)+ 浏览器前端(Web Workers 中的 SGP4、canvas 图表)。作为 SatObserver-MX 的姊妹项目,共享其架构和风格。
模块 API 见 CONTRACT.md;构建过程和测量结果见 DEVLOG.md。
运行要求
打包应用(位于 release/)——无运行时依赖;Python 和星表已打包在内。获取目录需要网络访问(缓存数据可离线使用)。完整目录需要一个免费的 space-track.org (https://www.space-track.org) 账户(首次使用时保存在本地)。
- macOS(
SatIdentifier-macOS-arm64.zip):Apple Silicon。未签名——在其他机器上首次启动需要右键单击 → 打开一次。用户数据位于~/Library/Application Support/SatIdentifier/。 - Windows(
SatIdentifier-windows-x64.zip,如果存在):由 CI 在 Windows runner 上生成,未在真实硬件上测试——与 SatObserver-MX 的 Windows 版本存在相同的注意事项。
从源码运行(浏览器模式):
- Python ≥ 3.10 —— 仅标准库,无需任何包
- 任何现代浏览器(针对 Chrome 开发;打包应用使用 WKWebView)
重新构建 .app:
python3 -m venv .venv-build && .venv-build/bin/pip install pywebview pyinstaller
(重新生成图标还需要 pillow),然后:
sh .venv-build/bin/pyinstaller --noconfirm --clean --windowed \ --name "SatIdentifier" --icon build_icon/SatIdentifier.icns \ --add-data "app:app" --osx-bundle-identifier "local.satidentifier" desktop.py
运行
macOS 应用:解压 release/SatIdentifier-macOS-arm64.zip,双击 SatIdentifier.app。原生窗口;关闭即退出。
开发 / 浏览器模式:
sh python3 server.py
在 http://127.0.0.1:8476 启动本地服务器并打开浏览器。
选项:--port N、--no-browser。或者双击 SatIdentifier.command。
在开发模式下,数据位于 ./data/。
工作流程
- 目录 —— 点击 加载完整目录(Space-Track 完整 GP;需要免费账户并保存在本地)。添加 CelesTrak 单目标查询(NORAD / COSPAR / 名称包含,无需账户——同一标签页也可下载完整 SATCAT 元数据表)、McCants 分类轨道根数,或粘贴 TLE——所有内容合并到一个目录中,按 NORAD 去重,以最新根数为准,并且按来源显示根数龄期统计,因为过期的根数是识别失败的主要原因。
- 站点 —— 添加你的观测站点并将其标记为活动。两种类型:地面(纬度 / 经度 / 海拔)或 轨道(一颗观测卫星,从已加载目录中按 NORAD 编号或名称选择——TLE 从目录中实时解析,因此观测者永远不会相对目标而过期)。
- 指向 —— 开始时间、时间跨度、指向、视场。
- 穿越 —— 点击 扫描。
- 天空图 —— 将轨迹与你的帧图像进行比较。
从轨道观测(天基空间态势感知)
当轨道站点处于活动状态时,相同的流程为卫星搭载的仪器回答“谁穿过了我的传感器视场”:
- Az/El 变为 LVLH 角(标记为 AzL/ElL):Az 从沿轨(速度)方向指向轨道法线,El 从当地水平面指向天顶(径向向外;−90° = 最低点)。Mount 跟踪模式变为 LVLH——一种本体固定的凝视传感器,以轨道速率在恒星间漂移,就像停驻的地面支架以恒星速率漂移一样。
- 地球边缘遮挡取代地平线:只有当视线穿过地球本身时,目标才会被剔除,而入/出时间解析一个从地球边缘后方升起的目标的方式与解析视场边缘的方式相同。在轨道上,永远没有折射。
- 观测者永远不会识别自身,其自身的 TLE 误差被添加到匹配容差中——在传感器看来,这与目标的误差无法区分。
- 全天视图是地面地平线投影,并在轨道站点上说明这一点;天空图对两种站点均适用。
正确性证明也覆盖轨道几何:几何剔除与禁用剔除时返回完全相同的穿越集合,每个报告的位置都与独立的二体重算一致到约 0.01′′(见 tools/test_scan.js 第 [o] 节)。
计算内容
- 穿越:入 / 最近接近 / 出时间、分离角、RA/Dec(J2000)、Az/El、距离、距离变化率、角速率和位置角、估计星等、日照/半影/本影、轨道类别、TLE 龄期。
- 两种角速率,因为哪个会在曝光中留下轨迹取决于你的跟踪方式。相对于恒星(
d(RA,Dec)/dt)是恒星跟踪帧上的轨迹——注意,地球静止目标在这里并非静止,它约以 15′′/s 漂移,这就是 GEO 在跟踪图像中出现条纹的原因。相对于地平线(d(alt,az)/dt)是停驻支架看到的情况,其中 GEO 是固定点,而恒星反而在移动——在轨道站点上,这第二种速率是相对于 LVLH 坐标系测量的,即本体固定凝视传感器记录的内容。图表绘制与你的跟踪模式匹配的轨迹,包括停驻支架看到的视场旋转,并且绘制在入点到出点之间穿过视场的轨迹,正是要与你的帧图像对比的内容。 - 天空图上的恒星背景来自 Tycho-2 至 V = 9.0(130 183 颗恒星),亮端附带 BSC5/HYG 测光数据——足够深,1° 视场不会为空——以及银河、太阳/月球(含月相)和星座名叠加层,每个都有独立的工具栏开关。全天面板仅使用亮星集合(V ≤ 4.6,与 SatObserver 相同),并带有相同的银河和太阳/月球开关。两种视图都不会用暮光或日光为其背景着色。
精度——在相信识别结果之前请阅读此节
帧处理刻意谨慎,因为该工具将卫星位置与恒星场进行比较:
- 坐标是 J2000 平春分点。SGP4 返回 TEME,而 TEME 不是 J2000——自 J2000 以来的岁差在 2026 年为 0.36°,是典型望远镜视场的二十倍。应用完整的 TEME → J2000 旋转(IAU-1976 岁差、IAU-1980 章动、分点方程)。已通过与 satellite.js 自身的 alt/az 路径在 1102 个样本上验证,覆盖 LEO/HEO/GEO 和四个站点:一致度 1.4e-5 角秒。
- 折射始终应用于 Alt/Az(El 30° 时为 1.7′,El 10° 时为 5.4′),并通过迭代求解逆变换,因此模式切换可精确可逆。
但帧并非限制性误差——根数才是:
| 项 | 量级 | 是否应用? |
|---|---|---|
| TLE 位置误差(新鲜 → 一周老) | ~1–20 公里 ⇒ 500 公里距离处 7′–2° | 不可消除 |
| 默认忽略 UT1−UTC | ≤ 0.9 秒 ⇒ ≤ 2.9′ | 可选 DUT1 设置 |
| 折射 | El 30° 时为 1.7′,El 10° 时为 5.4′ | 始终应用 |
| 周年光行差 | ≤ 20.5′′ | 否——见下文 |
| 光行时 + 轨道光行差(轨道站点) | 各 ≤ ~5′′ | 否——比 TLE 误差低两个数量级 |
| 岁差 + 章动 | < 1′′ | 是 |
光行差既不应用于卫星也不应用于恒星,因此图表和天体保持相互一致;只修正一侧只会让事情更糟。TLE 龄期在每一行和卫星信息中显示,因为它是决定识别结果是否可信的数字。
星等是估计值,且大多为先验值。 每行显示方法:
| 方法 | 含义 |
|---|---|
qsmag | McCants 标准星等——真实的观测值 |
rcs | 来自 SATCAT 雷达散射截面的漫反射球 |
model | 有记录的星座亮度(Starlink、OneWeb) |
type | 来自 SATCAT 目标类型的大小类别(R/B ≫ PAY ≫ DEB) |
default | 1 米球。一种猜测,并明确标记为猜测 |
两个数据事实使得较低层级成为必要而非可选:CelesTrak 不发布 NORAD 50000 以上的 RCS(实测:40000 以下覆盖率为 41–97%,40000–49999 为 25.6%,50000 以上为 0.0%),以及 mmccants.org/programs/qsmag.zip 目前返回 HTTP 404。因此,在现代目录中,大多数目标落在先验值上,真实散布在一个星等或更多。不要把星等列当作测光数据。
仓库布局
server.py Python 3 仅标准库后端:静态文件 + JSON API desktop.py pywebview 壳,用于原生窗口 SatIdentifier.command 双击启动器(开发模式) app/ index.html 按固定顺序加载 CSS 和脚本 css/app.css 整个设计系统,深色主题 assets/stars_m9.bin Tycho-2 至 V=9.0,130 183 颗恒星,1.3 MB js/frames.js 坐标框架、岁差/章动、折射、TAN js/propagate.js SGP4 封装和地心解算 js/scan.js worker 池、合并、预算 js/worker/scan-worker.js 三阶段扫描引擎 js/stars.js 深空星表、圆锥查询 js/photometry.js 五层星等模型、地球阴影 js/chart.js 日晷投影天空图(主视图) js/crossings.js 穿越列表(主列表) js/pointing.js 输入窗口 js/allsky.js 全天上下文视图及视场足迹 js/state.js util.js clock.js windows.js sources.js locations.js satinfo.js tools/ make_starcat.py 构建星表资源(仅开发) test_*.js 验证框架——见 DEVLOG docs/ 截图 data/ 状态、缓存、凭据(gitignored)
致谢
传播:satellite.js (https://github.com/shashwatak/satellite-js)(SGP4/SDP4)。
恒星:Tycho-2(Hog+ 2000),通过 VizieR,以及通过 d3-celestial (https://github.com/ofrohn/d3-celestial) 获得的 BSC5/HYG 亮星测光数据。目录数据:CelesTrak、Space-Track、Mike McCants。扫描的结构——将 SGP4 初始化提升出时间循环、旋转指向而非目录、以及用廉价标量测试门控昂贵计算——来自 Bill Gray 的 sat_code (https://github.com/Bill-Gray/sat_code);岁差处理遵循他在 lunar/precess.cpp 中的推理。问题框架受益于 SatSkyMap (https://github.com/lnicastro/SatSkyMap)。
相似文章
Show HN: Orbit – AR卫星追踪器,观测超过1.5万个天体
Orbit是一款iOS应用,利用增强现实技术,将摄像头对准天空即可实时追踪超过15000颗卫星、行星和太空碎片。
卫星追踪器 – Starlink 及其他3万颗卫星的实时地图
一个实时地图网页应用及iOS应用,通过WebGL可视化追踪超过3万颗卫星(包括Starlink、GPS等)的位置。
@akshay_pachaar: 我在3D地球仪上构建了一个实时卫星追踪器。它交互式地显示超过一万颗绕地球运行的活跃卫星,其中包括…
一位开发者使用 Tiger Cloud (TimescaleDB) 和 Claude Code 构建了一个实时3D卫星追踪器,展示了用于时间序列数据的 Tiger CLI MCP 服务器。文章还重点介绍了 Speedcast 在生产规模上对该技术的应用。
Show HN: StarScope – 面向美国/英国以外观测者的免费天文仪表板
StarScope 是一个免费的天文仪表板,提供面向半球感知的实时信息流、提醒和社区功能,面向全球业余天文学家,特别注重南半球观测者的平等性。
@ApoStructura:我制作了一个网站,可视化历史上及当前每一个在轨卫星
一个个人项目网站,可视化当前及历史上所有在轨卫星