环月轨道设计

这篇文档讲 e2m2e 怎么设计环月轨道。配套示例 examples/main_lunar_orbits.py 用四条轨道演示了全过程,本文讲清示例背后的东西:环月轨道是什么、e2m2e 用哪些时空系统、计算经过哪些步骤、数据怎么流动。

先从一个具体的任务说起。给 e2m2e 四个数:半长轴 7000 km、近月点高度 200 km、倾角 75 度、近月点幅角 270 度,要它算出这条轨道未来几天的位置。这四个数在哪个坐标系里有意义?它们要经过哪些转换、哪些计算,才能变成一份可信的星历?把这个任务跑通,环月轨道设计就懂了。

一、环月轨道是什么

环月轨道是以月球为中心天体的环绕轨道。按离月距离分四层,每层的主导动力学不同,设计语言也不同。

轨道

尺度与形态

主导动力学

稳定性与周期

近月轨道 LLO

离月面 100 到 2000 km,近圆

月球引力主导,近似二体开普勒

稳定,周期约 2 小时

大椭圆冻结轨道 ELFO

近月点低(约 200 km),远月点数千到上万 km,高偏心

月球引力加非球形摄动

周期约 1 天,拱线可冻结

远距轨道 DRO

离月 1 到 5 万 km,逆行

地月三体动力学显著,但轨道仍绕月闭合

中性稳定,周期数天到十几天

平动点轨道 Halo

绕地月 L1 或 L2,月心距离约 6 万 km

三体动力学主导

不稳定,周期约半个月

主线是尺度。离月越远,地球引力占比越高,动力学从二体开普勒过渡到三体问题,轨道从稳定变为不稳定。

第①层 LLO 是纯二体语言。开普勒根数完整描述轨道,周期 2 小时量级,形状近圆,主要用途是遥感与着陆中间轨道。e2m2e 没有单独的 LLO 类型,把 ELFO 管线的离心率取到趋近 0 就是近圆轨道。

第②层 ELFO 是环月轨道里最有讲头的一类。大椭圆轨道绕月飞行时,月球非球形摄动(主要是 J2 项)使拱线长期旋转,近月点高度随之变化,轨道不再重复。选合适的倾角与近月点幅角,让摄动的长期效应相互抵消,拱线漂移趋近于零,轨道就冻结了。e2m2e 示例采用倾角 75 度、近月点幅角 270 度的构型,即远月点朝地球。需要分清:冻结是验证出来的性质,不是构造出来的。ELFO 管线不做求解,用户给一组参数,管线在全摄动动力学里传播后统计漂移量,用数据回答这组参数冻不冻结。

第③层 DRO 逆着月球公转方向飞行。三体动力学已显著,但轨道仍绕月闭合。DRO 中性稳定,既不发散也不收敛,维持成本低,是月轨空间站的候选轨道之一。它不能用开普勒根数描述,得用三体语言。

第④层 Halo 绕平动点运动,不直接绕月,近月点离月面几千到几万 km,随振幅变化。三体动力学主导,轨道不稳定,需要连续保持。NRHO 是大振幅 Halo 的近直线形态,近月点离月面只有几千公里,NASA 的月球门户空间站采用。

一个词概括:环月轨道是一个家族,不是一条轨道。设计时必须先问轨道落在哪一层,再选对应的模型语言。

二、时空系统与坐标变换

时间

UTC 只出现在输入输出边界。动力学自变量用 TDB,SPICE 里称星历时间 ET。原因:UTC 有闰秒,不连续,不能做动力学的自变量;TDB 是历表与动力学统一的时间尺度。二者当前相差约 69 秒,若拿 UTC 直接当 TDB 查月球位置,月球以约 1 km/s 绕地球公转,位置错出约 70 km。e2m2e 接口收 UTC 字符串,内部一律转 ET 秒。

坐标系

环月轨道设计经过四套坐标系,各有各的用途:

  1. 月心惯性系。轴与 J2000 对齐,原点在月球。开普勒根数的家。ELFO 输入的四个数(半长轴、近月点高度、倾角、近月点幅角)只有在这个系里有意义;近月点、远月点、周期这些几何量也在此计算。

  2. 地心惯性系(GCRS)。轴为 J2000,原点在地球。传播的家。e2m2e 的星历力模型以地球为中心构建,航天器状态与月球状态都在这个系里描述。月心状态等于航天器地心状态减月球地心状态,一条减法完成两个系的换算。近月点高度这类月心量,传播后从地心星历里提取。

  3. 地月会合系。旋转系,x 轴指向月球,地月静止,平动点定点。CR3BP 的家。CR3BP 模型在这个系里最简单,初猜与修正都在此完成。它是无量纲的:长度除以特征长度,时间除以特征时间。两个原点约定并存:质心归一(月球在 x = 1-mu)与地心归一(月球在 x = 1),e2m2e 内部计算用质心归一,输出星历的 synodic_position 用地心归一。

  4. 月固系(MOON_PA 主轴系)。月球引力场球谐的展开系。非球形摄动加速度在月固系算,再旋转回惯性系。

特征量取自 DE421 基准集:mu = 0.01215058535(地月质量比)、特征长度 384400 km(地月平均距离)、特征时间 375190 s(约 4.34 天)。月球引力场用 GRGM900C 模型,参考半径 1738 km。

变换的实现与一个坑

会合系与 J2000 的转换由 SynodicJ2000System 完成,批量版本下沉 Rust。会合系 x 轴取瞬时月地单位矢量,z 轴取月地轨道面法向,y 轴右手补齐。会合系坐标除以的是当时的地月距离,这个距离在 36 万到 40.5 万 km 之间变化。

由此产生一个必须知道的坑:synodic_position 每点除以的是瞬时地月距离,把无量纲坐标乘常数 384400 还原成 km 会引入约 5% 的尺度误差。示例里 1838 km 的轨道这样算会得到 1746 km。要拿精确月心距离,用地心惯性位置减月球位置,星历表的 position_km 与月球星历都可得,不经过会合系。示例里的 _moon_centric_position_km 正是这么做的。

三、计算流程

e2m2e 按轨道类型分派到两条管线,对应两种动力学语言。

ELFO 管线

orbit_type=ELFO,输入是开普勒根数。六步:

  1. 换算离心率。近月点高度加月球半径得近月点距离,e = 1 - rp/a。

  2. 根数转月心笛卡尔。经典二体公式,真近点角取 0,即从近月点出发。

  3. 叠加月球地心状态。月心笛卡尔加月球当时的地心状态,得到地心惯性系初值。

  4. 地心系全摄动传播。Rust 积分器,相对容差 1e-12。力模型含地球、月球、太阳与各大行星引力,地球与月球非球形 10 阶,炮弹模型光压。

  5. 逐点提取月心根数。每点地心状态减月球位置,批量换算开普勒根数。

  6. 漂移统计。计算传播弧段内离心率、近月点幅角、近月点距离的首末差,再对近月点幅角做线性拟合得年漂移率。

这条管线不做修正。冻结与否由输入参数决定,管线负责用真实动力学验证并报告漂移量。示例的 75 度倾角加 270 度近月点幅角组合,4 天传播的近月点幅角漂移约 2 度,离心率与近月点高度基本不动,就是冻结的表现。年漂移率用更长的窗口(默认 60 天)拟合才可靠。

CR3BP 管线

orbit_type=DROHALO 等,输入是形状参数。初值不是算出来的,是生成的:

  1. 生成初猜。族生成器在 CR3BP 内生成周期轨道。DRO 从种子轨道出发,固定 x 轴穿越点做微分修正加延拓,振幅定义为月心距离最小最大值的均值。Halo 从 Richardson 三阶解析近似出发,微分修正后沿族行走,振幅是 y=0 穿越点的 z 坐标,正北负南。

  2. 相位定位。按相位参数在周期轨道上定位初值,DRO 额外偏移半个周期。

  3. 采样节点。沿轨道采 patch points。策略按族分开:Halo 在近月点加密(近月点速度大、状态转移矩阵病态);NRHO 与其余族等时间采样。删近月点附近节点仍可作为工具函数对照(强制含历元 t=0),但自 #473 起不再作 NRHO 生产默认。

  4. 批量转会合系到 J2000。

  5. 星历修正。CR3BP 模型与真实星历有差:月球轨道非圆、有太阳与其他行星摄动,理想周期轨道拿到真实动力学里不再闭合。修正用 Rust 多重打靶把节点锚到真实星历上。稳定轨道(DRO)走速度加权的 two_level 路径,修正一圈后自由外推有界;不稳定轨道(Halo/NRHO)走 segmented 全程分段打靶,逐段积分填满星历网格。NRHO 第 1 步固定 1 圈/段,Halo 最长 3 圈/段。

  6. 组装星历表。

NRHO 与 Halo 同走 segmented,离散默认独立:等时间 + 1 圈/段。默认 L2 南族、近月点高度 5000 km、相位 0.5、约一个月弧长可收敛得到与时间网格等长的标称星历(#473;5.7.2 的删近月点默认在该量级仍有历元空洞或合并层不收敛)。更贴月(近月高约 2000 km)短弧同样可用。

计算在哪发生

两条管线的数值重活都在 Rust:传播、打靶、批量坐标转换、批量星历查询。Python 只做编排:构造请求、分派管线、解释结果。示例四条轨道全量不到 1 分钟(release 构建),大头是 ELFO 管线的严格容差积分,不是 Python。

四、数据流

数据从请求进,从结果出,中间经过分派与两条管线。

输入是 DesignOrbitRequest,Pydantic 校验。orbit_type 决定分派;形状参数按类型校验并填默认值;ELFO 必填半长轴,默认倾角 75 度、近月点幅角 270 度、近月点高度 200 km、传播 60 天;传播参数统一用秒,输出步长默认 3600 秒;摄动开关与球谐阶数可覆盖。

design_orbit 收到请求后按 orbit_type 分派,产出一个 OrbitDesignResult

  • ephemeris:标称星历,EphemerisTable 容器。每行含 UTC 日历时间、GCRS 位置(km)与速度(m/s)、会合系无量纲位置。GCRS 是任务数据,会合系是给三体视角绘图用的。

  • initial_state:历元时刻地心惯性系 6 维状态,可直接喂给预报与控制链路。

  • cr3bp_orbitcr3bp_jacobicorrection:CR3BP 参考周期轨道、Jacobi 常数与修正结果。ELFO 场景为 None 或 nan。

  • drift_edrift_aop_degdrift_rp_kmsecular_aop_rate_deg_per_year:ELFO 的冻结诊断。

  • moon_centric_elements:ELFO 的月心根数序列,每点都有。

消费星历时的坐标系纪律重申一遍:月心几何量(近月点高度、远月点高度、月心距离)从 GCRS 位置减月球位置得到,不要用会合系乘常数还原。会合系列用于观察轨道在三体视角下的形态。

五、配套示例

examples/main_lunar_orbits.py 把上面的内容变成可跑的四条轨道,对应四个分层:

  • LLO:ELFO 管线,半长轴 1838 km、近月点高度 100 km,离心率趋近 0,传播 2 天约 24 圈。

  • ELFO:半长轴 7000 km、近月点高度 200 km,传播 4 天约 4 圈。

  • DRO:振幅 5 万 km,周期 8.4 天,传播 9 天取一整圈多。

  • Halo:L2、振幅 3 万 km,周期 14.6 天,传播 15 天取一整圈。

示例画三张图。图 1 四条轨道的月心距离随时间演化,对数轴,一眼看清从 1800 km 到 7 万 km 的尺度层次。图 2 月心 X-Y 平面形态,分近月区与远距区两个子图。图 3 ELFO 冻结性验证,近月点幅角、离心率、近月点高度三个量随时间的演化,看拱线是否稳定在 270 度附近。

运行方式:

python examples/main_lunar_orbits.py --save          # 无头环境,存 PNG
python examples/main_lunar_orbits.py                 # 交互式出图
python examples/main_lunar_orbits.py --skip DRO      # 跳过某条轨道

需要 SPICE 内核(仓库根 kernels/)。每条轨道的设计参数、耗时、近远月点与冻结诊断都打印在终端。想深挖单条 Halo 的设计细节,看 examples/main_design.py