e2m2e.data package

数据层:物理常数、坐标系与星历内核、DFH 模板与轨道类型。

数据层:星历数据管理、时空参考系数据、数据模板、通用数据类型。

第 1 层,依赖方向:仅外部库(SPICE/r2s2/numpy),不依赖 e2m2e 其他层。

  • kernels/:SPICE 内核管理(SPICEManager)与 EphemerisProvider 抽象。

  • frames/:时空参考系**数据** (EOP、闰秒表、r2s2/SPICE 句柄);转换**算法** 在 algorithm/coordinate/

  • templates/:数据模板(轨道族种子、系统参数、摄动开关、力模型配置 schema、领域枚举)。

  • types/:通用数据类型(State/Epoch 类型别名;Orbit/EphemerisTable/NominalOrbit 容器类)。

实现状态:迁移完成(ADR 0011),自 core/io 迁入;旧包已在第 5 批清理中删除。

e2m2e.data.constants package

物理常数层:全库物理常数的唯一来源(阶段 1 骨架)。

本层与 e2m2e.data.templates 平级,职责分开:templates 管任务/算法默认 参数,constants 管物理量真值表。阶段 1 只建骨架,不迁移任何现有文件。

e2m2e.data.constants.universal module

通用物理常量(全库一套)。

单位统一采用 km / s / kg 系;来源标注在 constants.toml。 数值由包内 constants.toml 单一来源加载。

e2m2e.data.constants.bodies module

天体参数目录。

按天体组织,每个天体提供各基准下的 GM、半径、扁率、NAIF ID、自转角速度等。 半径区分两种语义:

  • mean_radius_km:平均/赤道半径,用于阴影、SRP、相对论等几何计算;

  • gravity_ref_radius_km:重力场参考半径,来自系数文件头,用于球谐、 固潮等重力模型。

数值由包内 constants.toml 单一来源加载。

class e2m2e.data.constants.bodies.Body(name, gm_by_datum=<factory>, gm_sources=<factory>, mean_radius_km=None, mean_radius_source=None, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=None, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)[源代码]

基类:object

天体参数。

gm_by_datum 为各基准下的引力参数(km³/s²);mean_radius_km 为 几何/制图平均半径;gravity_ref_radius_km 为重力场系数文件给出的 参考半径;naif_id 为 SPICE/NAIF 整数 ID;rotation_rate_rad_s 为 自转角速度(rad/s),按场景分别命名。

参数:
name: str
gm_by_datum: dict[str, float]
gm_sources: dict[str, ConstantSource]
mean_radius_km: float | None = None
mean_radius_source: ConstantSource | None = None
gravity_ref_radius_km: float | None = None
gravity_ref_radius_source: ConstantSource | None = None
flattening: float | None = None
flattening_source: ConstantSource | None = None
naif_id: int | None = None
rotation_rate_iers_rad_s: float | None = None
rotation_rate_iers_source: ConstantSource | None = None
rotation_rate_gmat_rad_s: float | None = None
rotation_rate_gmat_source: ConstantSource | None = None
require_mean_radius_km()[源代码]

平均半径(km);该天体未定义半径时抛错(如 EMB 无半径概念)。

返回类型:

float

e2m2e.data.constants.bodies.SUN = Body(name='SUN', gm_by_datum={'DE440': 132712440018.0}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=696000.0, mean_radius_source=<ConstantSource.Vallado: 'Vallado'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=10, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

太阳。

e2m2e.data.constants.bodies.EARTH = Body(name='EARTH', gm_by_datum={'DE421': 398600.4415, 'DE440': 398600.435507, 'WGS84': 398600.4418}, gm_sources={'DE421': <ConstantSource.DE421: 'DE421'>, 'DE440': <ConstantSource.DE440: 'DE440'>, 'WGS84': <ConstantSource.WGS84: 'WGS84'>}, mean_radius_km=6378.137, mean_radius_source=<ConstantSource.WGS84: 'WGS84'>, gravity_ref_radius_km=6378.1363, gravity_ref_radius_source=<ConstantSource.GMAT: 'GMAT'>, flattening=0.0033528106647474805, flattening_source=<ConstantSource.WGS84: 'WGS84'>, naif_id=399, rotation_rate_iers_rad_s=7.292115146706979e-05, rotation_rate_iers_source=<ConstantSource.IERS: 'IERS'>, rotation_rate_gmat_rad_s=7.2921158553e-05, rotation_rate_gmat_source=<ConstantSource.GMAT: 'GMAT'>)

地球。

e2m2e.data.constants.bodies.MOON = Body(name='MOON', gm_by_datum={'DE421': 4902.8005821478, 'DE440': 4902.800118}, gm_sources={'DE421': <ConstantSource.DE421: 'DE421'>, 'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=1737.4, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=1738.0, gravity_ref_radius_source=<ConstantSource.GRGM900C: 'GRGM900C'>, flattening=None, flattening_source=None, naif_id=301, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

月球。

e2m2e.data.constants.bodies.EMB = Body(name='EMB', gm_by_datum={'DE421': 403503.242083, 'DE440': 403503.235502}, gm_sources={'DE421': <ConstantSource.DE421: 'DE421'>, 'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=None, mean_radius_source=None, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=3, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

地月系质心(Earth-Moon Barycenter)。

e2m2e.data.constants.bodies.MERCURY = Body(name='MERCURY', gm_by_datum={'DE440': 22031.868551}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=2440.53, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=199, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

水星。

e2m2e.data.constants.bodies.VENUS = Body(name='VENUS', gm_by_datum={'DE440': 324858.592}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=6051.8, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=299, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

金星。

e2m2e.data.constants.bodies.MARS = Body(name='MARS', gm_by_datum={'DE440': 42828.375816}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=3396.19, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=499, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

火星。

e2m2e.data.constants.bodies.JUPITER = Body(name='JUPITER', gm_by_datum={'DE440': 126712764.1}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=71492.0, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=599, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

木星。

e2m2e.data.constants.bodies.SATURN = Body(name='SATURN', gm_by_datum={'DE440': 37940584.8418}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=60268.0, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=699, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

土星。

e2m2e.data.constants.bodies.URANUS = Body(name='URANUS', gm_by_datum={'DE440': 5794556.4}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=25559.0, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=799, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

天王星。

e2m2e.data.constants.bodies.NEPTUNE = Body(name='NEPTUNE', gm_by_datum={'DE440': 6836527.10058}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=24764.0, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=899, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

海王星。

e2m2e.data.constants.bodies.PLUTO = Body(name='PLUTO', gm_by_datum={'DE440': 975.5}, gm_sources={'DE440': <ConstantSource.DE440: 'DE440'>}, mean_radius_km=1188.3, mean_radius_source=<ConstantSource.IAU2015: 'IAU2015'>, gravity_ref_radius_km=None, gravity_ref_radius_source=None, flattening=None, flattening_source=None, naif_id=999, rotation_rate_iers_rad_s=None, rotation_rate_iers_source=None, rotation_rate_gmat_rad_s=None, rotation_rate_gmat_source=None)

冥王星。

e2m2e.data.constants.datums module

基准集定义。

以"基准(datum)"为一等概念,每套基准内部 GM、μ、特征长度、特征时间 来自同一来源,保持自洽。数值由包内 constants.toml 加载。

基准按字段形状分成三类,类型上精确区分“必有值”与“可选值”:

  • _FullEarthMoonDatumSpec:DE421,μ、GM 表、特征长度/时间齐备;

  • _EarthMoonDatumSpec:DE440/DE430,μ 与 GM 表必有值,特征尺度未提供 (避免编造),为合法 None

  • _ShapeDatumSpec:WGS-84,只定义地球形状/地球 GM。

调用方取"必有值"字段时得到 float;取可选字段时类型为 float | None, 需自行确认该基准确实提供该值。

class e2m2e.data.constants.datums.Datum[源代码]

基类:object

物理常数基准集。

用法示例:

from e2m2e.data.constants import Datum
print(Datum.DE421.mu)
print(Datum.DE440.earth_gm)
print(Datum.WGS84.earth_radius_km)
DE421 = _FullEarthMoonDatumSpec(source=<ConstantSource.DE421: 'DE421'>, field_sources={'mu': <ConstantSource.DE421: 'DE421'>, 'char_length_km': <ConstantSource.LITERATURE: 'literature'>, 'char_time_s': <ConstantSource.LITERATURE: 'literature'>, 'earth_gm': <ConstantSource.DE421: 'DE421'>, 'moon_gm': <ConstantSource.DE421: 'DE421'>, 'sun_gm': <ConstantSource.DE421: 'DE421'>, 'emb_gm': <ConstantSource.DE421: 'DE421'>}, mu=0.012150585350562453, earth_gm=398600.4415, moon_gm=4902.8005821478, sun_gm=132712428000.0, emb_gm=403503.242083, char_length_km=384400.0, char_time_s=375190.2588926273, earth_radius_km=None, earth_flattening=None)
DE440 = _EarthMoonDatumSpec(source=<ConstantSource.DE440: 'DE440'>, field_sources={'mu': <ConstantSource.DE440: 'DE440'>, 'earth_gm': <ConstantSource.DE440: 'DE440'>, 'moon_gm': <ConstantSource.DE440: 'DE440'>, 'sun_gm': <ConstantSource.DE440: 'DE440'>, 'emb_gm': <ConstantSource.DE440: 'DE440'>}, mu=0.012150584394709708, earth_gm=398600.435507, moon_gm=4902.800118, sun_gm=132712440018.0, emb_gm=403503.235502, char_length_km=None, char_time_s=None, earth_radius_km=None, earth_flattening=None)
WGS84 = _ShapeDatumSpec(source=<ConstantSource.WGS84: 'WGS84'>, field_sources={'earth_gm': <ConstantSource.WGS84: 'WGS84'>, 'earth_radius_km': <ConstantSource.WGS84: 'WGS84'>, 'earth_flattening': <ConstantSource.WGS84: 'WGS84'>}, earth_gm=398600.4418, earth_radius_km=6378.137, earth_flattening=0.0033528106647474805, mu=None, char_length_km=None, char_time_s=None, moon_gm=None, sun_gm=None, emb_gm=None)
DE430 = _EarthMoonDatumSpec(source=<ConstantSource.DE440: 'DE440'>, field_sources={'mu': <ConstantSource.DE440: 'DE440'>, 'earth_gm': <ConstantSource.DE440: 'DE440'>, 'moon_gm': <ConstantSource.DE440: 'DE440'>, 'sun_gm': <ConstantSource.DE440: 'DE440'>, 'emb_gm': <ConstantSource.DE440: 'DE440'>}, mu=0.012150584394709708, earth_gm=398600.435507, moon_gm=4902.800118, sun_gm=132712440018.0, emb_gm=403503.235502, char_length_km=None, char_time_s=None, earth_radius_km=None, earth_flattening=None)

e2m2e.data.constants.sources module

基准/来源枚举与元数据。

每个物理常量必须标注出处;本枚举提供规范化的来源标识。

class e2m2e.data.constants.sources.ConstantSource(*values)[源代码]

基类:str, Enum

物理常量来源标识(str Enum,可直接作为元数据值使用)。

DE421 = 'DE421'
DE430 = 'DE430'
DE440 = 'DE440'
WGS84 = 'WGS84'
IAU2015 = 'IAU2015'
IAU2012 = 'IAU2012'
CODATA2018 = 'CODATA2018'
GMAT = 'GMAT'
GRGM900C = 'GRGM900C'
IERS = 'IERS'
LITERATURE = 'literature'
NAIF = 'NAIF'
Pesce2023 = 'Pesce2023'
SI = 'SI'
Vallado = 'Vallado'
Cui2025 = 'Cui2025'

e2m2e.data.frames package

时空参考系数据:EOP、闰秒表、历表句柄。

只留**数据** (EOP 文件、闰秒表、r2s2/SPICE 句柄管理);转换**算法** 在 algorithm/coordinate/ (强化现有 Axes/Origin/CoordinateSystem 抽象,不新增 Frame 抽象,见 ADR 0015)。

  • eop.py:EOP 文件解析(源 core/coordinate/gmat_eop.py)。

  • leap_seconds.py:闰秒表(源 core/coordinate/gmat_eop.py 闰秒部分)。

  • r2s2.py:r2s2 句柄管理(源 core/coordinate/gcrs_ebcrs.py 句柄部分)。

  • spice_frames.py:SPICE 帧旋转查询。

e2m2e.data.frames.r2s2 module

r2s2 库适配器(时空参考系数据)。

r2s2(中科院地月空间时空坐标系库)提供 TDT+GCRS ↔ TDB+EBCRS 相对论时空 转换。本模块管**句柄管理** (历表打开/校验,进程级单例注意)与时间星历 校验;转换接口由 EphemerisProvider 提供、转换算法在 algorithm/coordinate/ (源:algorithm/coordinate/gcrs_ebcrs.py 句柄管理 部分,ADR 0011/0015 迁移)。

已知限制:r2s2 的 R2S2.init_E 是进程级全局状态,多历表实例会互相 覆盖(ADR 0010/0015)。

历表要求:必须含内置时间星历(TT−TDB),推荐 JPL de440t.bsp (注意带 t 后缀的变体);INPOP21a 的 spice 格式历表对(主文件 + *_time.bsp)可作为路径列表传入。普通的 de440s.bsp/de440.bsp 不含时间星历,会在构造时报错。

class e2m2e.data.frames.r2s2.R2S2Adapter(ephemeris_path)[源代码]

基类:object

r2s2 历表句柄管理:打开/校验/EMB 平移/JD 拆分。

参数:

ephemeris_path (str | os.PathLike | list[str]) -- 含内置时间星历的行星历表路径(如 de440t.bsp), 或路径列表(如 INPOP 主文件 + 时间星历文件)。

emb_position(jd1, jd2)[源代码]

地月质心相对太阳系质心的位置(km),轴向同 BCRS/ICRS。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

static split_jd(jd)[源代码]

把单精度儒略日拆成整数与小数两段,保持 r2s2 的时间分辨率。

参数:

jd (float)

返回类型:

tuple[float, float]

e2m2e.data.frames.spice_frames module

SPICE 帧旋转查询。

数据层(ADR 0011 迁移,源:core/spice.py 帧查询部分 / 既有 standard_axes 中的 pxform 用法)。SPICE 帧定义(PCK/FK)由 SPICEManager 加载内核提供;本模块只做帧旋转矩阵查询,转换**算法** 在 algorithm/coordinate/

e2m2e.data.frames.spice_frames.frame_rotation(frame_from, frame_to, et)[源代码]

SPICE 帧旋转矩阵(3×3):frame_fromframe_to 在 ET 时刻。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

e2m2e.data.frames.eop module

地球定向参数(EOP)文件解析(GMAT C04 格式)。

数据层(ADR 0011 迁移,源:core/coordinate/gmat_eop.py 的 EOP 部分 + core/coordinate/gmat_data.pyCoordinateDataError)。只留**数据 解析**;EOP → ITRF 的转换算法在 algorithm/coordinate/

GMAT C04 EOP reader:只消费 mjd, x, y, UT1-UTC, LOD;后续 dPsi/dEps 字段保留在原文件中但不进入当前 native ITRF 链路。

exception e2m2e.data.frames.eop.CoordinateDataError[源代码]

基类:E2M2EError, RuntimeError

坐标数据缺失、越界或格式错误。

class e2m2e.data.frames.eop.EopRecord(year: 'int', month: 'int', day: 'int', mjd: 'float', x_arcsec: 'float', y_arcsec: 'float', ut1_utc: 'float', lod: 'float')[源代码]

基类:object

参数:
year: int
month: int
day: int
mjd: float
x_arcsec: float
y_arcsec: float
ut1_utc: float
lod: float
property x_rad: float
property y_rad: float
class e2m2e.data.frames.eop.EopSample(mjd: 'float', x_rad: 'float', y_rad: 'float', ut1_utc: 'float', lod: 'float')[源代码]

基类:object

参数:
mjd: float
x_rad: float
y_rad: float
ut1_utc: float
lod: float
class e2m2e.data.frames.eop.EopFile(records)[源代码]

基类:object

EOP 文件解析与按 UTC MJD 查询。

参数:

records (tuple[EopRecord, ...])

classmethod from_file(path)[源代码]
参数:

path (str | Path)

返回类型:

EopFile

property start_mjd: float
property end_mjd: float
at_utc_mjd(utc_mjd, *, extrapolation='raise')[源代码]

按 GMAT 语义查询 UTC MJD 时刻的 EOP。

x/yUT1-UTC 线性插值,LOD 使用左侧记录值。

参数:
返回类型:

EopSample

e2m2e.data.frames.leap_seconds module

闰秒表(TAI−UTC)文件解析。

数据层(ADR 0011 迁移,源:core/coordinate/gmat_eop.py 的闰秒部分)。 只留**数据解析**;时间尺度转换(UTC→TAI→TT→TDB)在 EphemerisProvideralgorithm/coordinate/

class e2m2e.data.frames.leap_seconds.LeapSecondRecord(julian_date: 'float', offset1: 'float', offset2: 'float', offset3: 'float')[源代码]

基类:object

参数:
julian_date: float
offset1: float
offset2: float
offset3: float
class e2m2e.data.frames.leap_seconds.TaiUtcTable(records)[源代码]

基类:object

GMAT tai-utc.dat reader。

参数:

records (tuple[LeapSecondRecord, ...])

classmethod from_file(path)[源代码]
参数:

path (str | Path)

返回类型:

TaiUtcTable

tai_minus_utc(utc_mjd)[源代码]

返回 UTC MJD 时刻的 TAI-UTC 秒数。

参数:

utc_mjd (float)

返回类型:

float

utc_to_tai_mjd(utc_mjd)[源代码]

将 UTC MJD 转为 TAI MJD。

参数:

utc_mjd (float)

返回类型:

float

tai_to_utc_mjd(tai_mjd)[源代码]

将 TAI MJD 转为 UTC MJD。

参数:

tai_mjd (float)

返回类型:

float

e2m2e.data.frames.gmat_fixture module

GMAT 兼容 ITRF 所需的裁剪 EOP/闰秒数据资源。

资源随 e2m2e.data.frames 发布,既供数据解析测试使用,也供 algorithm.coordinate 的显式 GMAT-compatible 坐标轴提供默认输入。 这些文件是 IERS 公布物理数据的输入,不是其他软件的输出对照标准。

e2m2e.data.frames.gmat_fixture.committed_gmat_fixture_dir()[源代码]

返回随数据层发布的 GMAT 裁剪数据目录。

返回类型:

Path

e2m2e.data.frames.gmat_fixture.gmat_data_dir()[源代码]

返回 GMAT_DATA_DIR 指向的完整 GMAT data 目录。

返回类型:

Path | None

e2m2e.data.frames.gmat_fixture.gmat_fixture_path(name)[源代码]

返回随数据层发布的 GMAT 裁剪数据文件路径。

参数:

name (str)

返回类型:

Path

e2m2e.data.kernels package

e2m2e.data.kernels.manager module

SPICE 内核管理器:加载/缓存/校验。

数据层 SPICE 实现(ADR 0011 迁移,源:core/spice.py)。职责:内核 加载/卸载/缓存、UTC↔ET 时间转换、天体状态/位置查询、引力参数查询, 并实现 EphemerisProvider 接口(时间/状态/帧三类,见 provider.py)。

SPICE 内核文件说明:

  1. 闰秒内核.tls):提供 UTC ↔ ET 时间转换所需的闰秒表。自动 在被加载内核的同级目录、仓库内置 kernels/ 目录、 SPICE_KERNEL_DIR 环境变量指定的路径中按序搜索。

  2. 星历内核.bsp):包含天体位置/速度数据(如 JPL DE440)。 需要手动加载,可通过 SPICEManager.find_ephemeris_kernel() 搜索或 SPICEManager.load_kernel() 加载。

依赖方向:数据层只依赖外部库(numpy/spiceypy/scipy),不依赖 e2m2e 其他层。

class e2m2e.data.kernels.manager.SPICEManager[源代码]

基类:EphemerisProvider

SPICE 内核管理器:SPICE 星历数据提供者实现。

统一管理内核加载与天体状态查询:自动加载闰秒内核、提供星历查询接口 (位置/状态)、时间格式转换(UTC ↔ ET)以及天体引力参数查询。

使用流程:

mgr = SPICEManager()
kernel = mgr.find_ephemeris_kernel("/path/to/kernels")
mgr.load_kernel(kernel)
et = mgr.utc_to_et("2025-06-21T11:00:00")
state = mgr.get_body_state("MOON", et, "J2000", "EARTH")
mgr.unload_kernel(kernel)
变量:

_leapseconds_loaded (bool) -- 标记闰秒内核是否已加载,避免重复加载。

__init__()[源代码]

初始化 SPICE 管理器。

返回类型:

None

load_kernel(path)[源代码]

加载一个 SPICE 内核文件(.bsp / .bpc / .tf 等)。

加载前会自动确保闰秒内核已就绪。

抛出:

FileNotFoundError -- 当指定路径的文件不存在时。

参数:

path (str)

返回类型:

None

unload_kernel(path)[源代码]

卸载一个已加载的 SPICE 内核文件,释放相关资源。

参数:

path (str)

返回类型:

None

enable_ephem_cache(bodies, et_start, et_end, *, dt=3600.0, frame='J2000', observer='EARTH', frame_pairs=None, sxform_pairs=None)[源代码]

构建并启用预插值星历缓存(Python 层 + Rust 积分层)。

Python 侧 EphemCacheget_body_position/state;Rust 侧 (_integrators.enable_ephem_cache)给 compiled_stm/多重打靶 积分内循环的三次样条查表。两套缓存独立构建但同源(同网格采样), 保证 Rust 积分不逐次调 cspice(消除 DAFFRNOTFOUND 与每步 FFI 开销)。

参数:
  • bodies (list[str]) -- 需缓存的天体名列表(EARTH/MOON/SUN/行星)。

  • et_start/et_end -- 缓存覆盖的 ET 秒范围。

  • dt (float) -- 预采样网格步长(秒),默认 3600。

  • frame (str) -- Python 层缓存采样坐标系(J2000)。

  • observer (str) -- Python 层缓存采样原点(EARTH)。

  • frame_pairs (list[tuple[str, str]] | None) -- Rust 层帧旋转对((from, to))。GravityField 需 body-fixed→J2000(如 ("ITRF93","J2000")、("MOON_PA","J2000"))。 缺省注册 (frame, "J2000")。

  • sxform_pairs (list[tuple[str, str]] | None) -- Rust 层 6×6 状态变换对((from, to))。Lense-Thirring 需 body-fixed→J2000(如 ("ITRF93","J2000"))。可为空列表。

  • et_start (float)

  • et_end (float)

返回类型:

None

disable_ephem_cache()[源代码]

关闭预插值星历缓存(Python 层 + Rust 层),回退到逐步 SPICE 查询。

返回类型:

None

utc_to_et(utc_str)[源代码]

将 UTC 时间字符串转换为 Ephemeris Time(TDB 秒)。

SPICE 的 ET 即 TDB 时间尺度(ADR 0015:TDB 作动力学统一时间)。

参数:

utc_str (str)

返回类型:

float

utc_to_tdb(utc)[源代码]

UTC → TDB(ET 秒)。同 utc_to_et()

参数:

utc (str)

返回类型:

float

et_to_utc(et)[源代码]

将 Ephemeris Time(TDB 秒)转换为 UTC 时间字符串。

参数:

et (float)

返回类型:

str

get_body_state(target, et, frame, observer)[源代码]

查询目标天体相对于观察者的状态向量(位置 + 速度)。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

body_state(body, et, frame='J2000', observer='EARTH')[源代码]

EphemerisProvider 接口:天体状态(6,)。同 get_body_state()

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

get_body_position(target, et, frame, observer)[源代码]

查询目标天体相对于观察者的位置向量。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

body_position(body, et, frame='J2000', observer='EARTH')[源代码]

EphemerisProvider 接口:天体位置(3,)。同 get_body_position()

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

pxform(frame_from, frame_to, et)[源代码]

SPICE 帧旋转矩阵(EphemerisProvider 帧方法)。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

find_ephemeris_kernel(search_dir)[源代码]

在指定目录中按优先级搜索星历内核文件(.bsp)。

优先级:de440.bsp > de440s.bsp > de435.bsp > de438.bsp。

抛出:

FileNotFoundError -- 目录不存在或其中无匹配的内核文件。

参数:

search_dir (str)

返回类型:

str

get_gm(body)[源代码]

获取天体的引力参数 GM(km³/s²)。

优先从 data.constants.bodies 的 DE440 GM 表中取;若该天体没有 DE440 记录,则通过 SPICE 内核实时读取。

参数:

body (str)

返回类型:

float

e2m2e.data.kernels.provider module

星历数据提供者抽象:对上层屏蔽数据来源(SPICE/r2s2)。

ADR 0015:时间尺度并入 EphemerisProvider(不单独 TimeSystem 类)。三类 方法——时间(utc_to_tdb/et_to_utc/utc_to_tai/tai_to_tt/tt_to_tdb/ jd_tdb_to_et)、状态(body_position/body_state/body_rotation)、帧 (pxform),单点 + 批量。

实现: - SPICE 实现 = SPICEManagerdata/kernels/manager.py); - r2s2 实现 = data/frames/r2s2.py 的适配器(句柄管理 + TT↔TDB)。

批量方法(body_states/body_positions 等)为后续 Rust 注入数据预留接口, 当前为占位(ADR 0011:未实现能力保留占位 + NotImplementedError)。

class e2m2e.data.kernels.provider.EphemerisProvider[源代码]

基类:object

星历数据提供者:对上层屏蔽数据来源。

单点 + 批量两类方法;时间(utc_to_tdb/et_to_utc/utc_to_tai/tai_to_tt/ tt_to_tdb/jd_tdb_to_et)、状态(body_position/body_state/body_rotation)、 帧(pxform)三类。SPICE 和 r2s2 分别实现;Rust 侧"注入数据"(星历缓存 样条表)从批量查询构建。

utc_to_tdb(utc)[源代码]

UTC → TDB(ET 秒)。

参数:

utc (str)

返回类型:

float

et_to_utc(et)[源代码]

TDB(ET 秒)→ UTC。

参数:

et (float)

返回类型:

str

utc_to_tai(utc)[源代码]

UTC → TAI(秒)。

参数:

utc (str)

返回类型:

float

tai_to_tt(tai)[源代码]

TAI → TT(秒)。

参数:

tai (float)

返回类型:

float

tt_to_tdb(tt)[源代码]

TT → TDB(秒)。

参数:

tt (float)

返回类型:

float

jd_tdb_to_et(jd_tdb)[源代码]

JD(TDB) → ET 秒。

参数:

jd_tdb (float)

返回类型:

float

body_position(body, et, frame='J2000', observer='EARTH')[源代码]

天体位置(km,形状 (3,))。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

body_state(body, et, frame='J2000', observer='EARTH')[源代码]

天体状态(km, km/s,形状 (6,))。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

body_rotation(body, et, frame_from, frame_to)[源代码]

天体本体固定帧旋转矩阵(3×3)。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

pxform(frame_from, frame_to, et)[源代码]

帧旋转矩阵(3×3)。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

e2m2e.data.kernels.ephem_cache module

预插值星历缓存 — 积分前批量预采样天体位置,避免逐步调 SPICE。

ForceModel 满配直推的性能瓶颈在于每步每力调 SPICEManager.get_body_position / get_body_state——无缓存、每次跨 Python↔C 边界查 SPICE。本模块在积分前用 SPICE 在均匀网格上预采样所有 相关天体的 (R, V),建 scipy.interpolate.CubicSpline (C² 连续),之后 查询走样条插值(纯数值)。源:core/ephem_cache.py (ADR 0011 迁移, 数据层自足)。

为什么用三次样条而不是线性插值:线性插值 C⁰ 连续,网格点处导数不连续, 会让自适应积分器的误差估计器不断缩步长(实测 93 倍 RHS 调用)。三次样条 C² 连续消除此问题(经验来自 qiao 仓库 Python/crtbp/subfunction/ephfunc/ephem_table.py:10-12)。

class e2m2e.data.kernels.ephem_cache.EphemCache(bodies, pos_splines, vel_splines, et_start, et_end, frame, observer)[源代码]

基类:object

预插值星历缓存。

持有多个天体在 [et_start, et_end] 上的 (位置, 速度) 三次样条。 查询时纯数值插值,不碰 SPICE。

变量:
  • bodies -- 缓存覆盖的天体名列表(大写)。

  • et_end (et_start,) -- 缓存覆盖的 ET 秒范围(含 margin)。

  • frame -- 采样时用的坐标系(查询必须匹配)。

  • observer -- 采样时用的观察者(查询必须匹配)。

参数:
covers(body, et, frame, observer)[源代码]

查询是否在缓存覆盖范围内(天体名 + 时间 + 坐标系都匹配)。

参数:
返回类型:

bool

get_body_position(body, et)[源代码]

插值查询天体位置 (3,) km。调用前应先 covers() 判定。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

get_body_state(body, et)[源代码]

插值查询天体状态 (6,) [km, km/s]。调用前应先 covers() 判定。

参数:
返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

e2m2e.data.kernels.ephem_cache.build_ephem_cache(spice, bodies, et_start, et_end, *, dt=3600.0, frame='J2000', observer='EARTH', margin_steps=5)[源代码]

构建预插值星历缓存。

[et_start, et_end] (加两端 margin)上以 dt 步长均匀采样, 对每个天体在每个网格点调 spice.get_body_state (此时走 SPICE), 建 CubicSpline。

参数:
返回类型:

EphemCache

e2m2e.data.templates package

数据模板:轨道族种子、系统标准参数、摄动开关默认、力模型配置 schema、领域枚举。

实现状态:已迁移(ADR 0011 第 1 批)。

  • seed.py:轨道族种子参数(源 dfh/cr3bp_orbits.py 常量)。

  • systems.py:物理常量与系统标准参数(源 core/constants.py + core/cr3bp_system.py 参数)。

  • perturbations.py:摄动开关/DYB 默认(源 io/inputs_dac.py DEFAULT_*)。

  • design.py:design_orbit 星历修正方法的族级分派表。

  • force_config.py:力模型配置 schema(纯数据,源 core/forces/)。

  • enums.py:领域枚举(源 core/enums.py + mbse/data/enums.py)。

e2m2e.data.templates.systems module

地月系统标准参数(已迁移至 e2m2e.data.constants)。

本文件原为物理常量真值持有者,ADR 0022 阶段 3 已将其中的物理常数收编到 e2m2e/data/constants/ (单一来源)。为便于追溯,保留文件壳,不再定义 任何物理常量真值,也不再做 re-export shim。

历史说明:原 MU_EARTHR_EARTHAUKM_TO_MEARTH_MOON_DISTANCE_KMGDAYYEAR 等常量已迁移。 具体映射见 ADR 0022 或 e2m2e.data.constants 的导出表。

e2m2e.data.templates.force_config module

力模型配置 schema(纯数据)。

配置 JSON 是数据(可存盘、可版本化):{"version": 1, "forces": [...]},每条 {name, type, enabled, params}。构建逻辑(ForceModel.from_config/to_config) 在 algorithm/forces/ (ADR 0011,ADR 0004 的 schema 不变,只拆"schema 数据" 与"构建逻辑")。

实现状态:骨架。schema 定义待从 core/forces/force_config.py 迁入。

class e2m2e.data.templates.force_config.ForceConfig[源代码]

基类:TypedDict

力模型配置字典。

version: int
forces: list[ForceEntry]
class e2m2e.data.templates.force_config.ForceEntry[源代码]

基类:TypedDict

单条力配置。

name: str
type: str
enabled: bool
params: dict[str, Any]

e2m2e.data.templates.perturbations module

摄动开关默认值与 DYB 系数默认值。

数据模板(ADR 0011 迁移,源:io/inputs_dac.pyDEFAULT_* 常量)。 DFH 输入文件生成是开发期临时脚本,但默认值是通用契约,归数据层。

e2m2e.data.templates.perturbations.DEFAULT_PERTURBATION: dict[str, int] = {'atmosphere': 0, 'coupling': 1, 'earth_nonspherical': 1, 'moon_nonspherical': 1, 'planets': 1, 'relativity': 0, 'solar_radiation': 2, 'sun_body': 1, 'tide': 1}

摄动开关默认值(与 MATLAB fmt_perturb_block.m 一致)

e2m2e.data.templates.perturbations.DEFAULT_DYB: list[float] = [0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

DYB 系数默认值:DYB(1)=等效面质比 0.01 (m2/kg),其余为相对 DYB(1) 的比值

e2m2e.data.templates.seed module

轨道族种子参数与地月系统标准参数。

数据模板(ADR 0011 迁移,源:dfh/cr3bp_orbits.py 常量)。初猜/族行走 算法在 algorithm/family/

e2m2e.data.templates.seed.EARTH_MOON_MU = 0.012150585350562453

地月 CR3BP 参数(与 examples/、tests/conftest.py 的标准系统一致)。 自 ADR 0022 起统一使用 DE421 基准,废弃 1965 旧值。

e2m2e.data.templates.seed.MOON_RADIUS_KM: float = 1737.4

月球平均半径(km),NRHO 近月点高度的起算面

e2m2e.data.templates.enums module

领域枚举:轨道族类型、参考系、单位系统等。

枚举是数据,归 data/templates/(ADR 0011 迁移,源:core/enums.py + mbse/data/enums.py)。算法层/接口层引用此处;旧路径已删除。

class e2m2e.data.templates.enums.ReferenceFrame(*values)[源代码]

基类:Enum

参考坐标系

ROTATING = 'rotating'
INERTIAL = 'inertial'
BARYCENTRIC = 'barycentric'
PRIMARY_CENTERED = 'primary_centered'
SECONDARY_CENTERED = 'secondary_centered'
SYNODIC = 'synodic'
J2000 = 'J2000'
class e2m2e.data.templates.enums.UnitSystem(*values)[源代码]

基类:Enum

单位系统

DIMENSIONLESS = 'dimensionless'
SI = 'si'
class e2m2e.data.templates.enums.LibrationPoint(*values)[源代码]

基类:Enum

CR3BP 模型的五个平动点。

L1 = 1
L2 = 2
L3 = 3
L4 = 4
L5 = 5
class e2m2e.data.templates.enums.ProjectionPlane(*values)[源代码]

基类:Enum

投影平面

XY = 'xy'
XZ = 'xz'
YZ = 'yz'
class e2m2e.data.templates.enums.TransferType(*values)[源代码]

基类:Enum

转移类型

DIRECT = 'direct'
LGA = 'lga'
WSB = 'wsb'
EXTERNAL = 'external'
UNKNOWN = 'unknown'
class e2m2e.data.templates.enums.BoundaryMode(*values)[源代码]

基类:Enum

两层多重打靶的边界条件。

FIXED_ENDPOINTS = 'fixed_endpoints'
class e2m2e.data.templates.enums.ConvergenceState(*values)[源代码]

基类:Enum

算法最终状态。

ITERATING = 'iterating'
CONVERGED = 'converged'
DIVERGED = 'diverged'
STAGNATED = 'stagnated'
MAX_ITERATIONS = 'max_iterations'
INFEASIBLE = 'infeasible'
COLLISION = 'collision'
FAILED = 'failed'
class e2m2e.data.templates.enums.FailureCause(*values)[源代码]

基类:Enum

算法最终结局的稳定原因码。

NONE = 'none'
INTEGRATION_FAILED = 'integration_failed'
SINGULAR_JACOBIAN = 'singular_jacobian'
INVALID_PERIOD = 'invalid_period'
MAX_ITERATIONS_REACHED = 'max_iterations_reached'
STAGNATION_DETECTED = 'stagnation_detected'
DIVERGENCE_DETECTED = 'divergence_detected'
NO_INTERSECTION = 'no_intersection'
CONSTRAINT_VIOLATION = 'constraint_violation'
BODY_COLLISION = 'body_collision'
LEVEL1_CORRECTION_FAILED = 'level1_correction_failed'
BACKEND_FAILURE = 'backend_failure'
INVALID_INPUT = 'invalid_input'
UNKNOWN = 'unknown'
class e2m2e.data.templates.enums.OrbitFamilyType(*values)[源代码]

基类:Enum

轨道族类型

HALO = 'halo'
LYAPUNOV = 'lyapunov'
VERTICAL = 'vertical'
AXIAL = 'axial'
BUTTERFLY = 'butterfly'
DRAGONFLY = 'dragonfly'
DRO = 'dro'
DPO = 'dpo'
SPO = 'spo'
LPO = 'lpo'
TADPOLE = 'tadpole'
HORSESHOE = 'horseshoe'
RO = 'ro'
NRHO = 'nrho'
LYO = 'lyo'
class e2m2e.data.templates.enums.StabilityLabel(*values)[源代码]

基类:Enum

轨道稳定性标签

STABLE = 'stable'
UNSTABLE = 'unstable'
MARGINALLY_STABLE = 'marginally_stable'
HYPERBOLIC = 'hyperbolic'
ELLIPTIC = 'elliptic'
PARABOLIC = 'parabolic'
class e2m2e.data.templates.enums.BifurcationLabel(*values)[源代码]

基类:Enum

分岔类型标签

NONE = 'none'
PERIOD_DOUBLING = 'period_doubling'
SADDLE_NODE = 'saddle_node'
TORUS = 'torus'
PITCHFORK = 'pitchfork'
TRANSCRITICAL = 'transcritical'
SECONDARY_HOPF = 'secondary_hopf'
class e2m2e.data.templates.enums.TransferPhase(*values)[源代码]

基类:Enum

转移设计阶段(用于状态机图)

CONFIGURED = 'configured'
SEARCHING = 'searching'
CANDIDATES_FOUND = 'candidates_found'
OPTIMIZING = 'optimizing'
COMPLETE = 'complete'
FAILED = 'failed'

e2m2e.data.types package

通用数据类型:状态向量、时间类型、轨道容器、轨迹容器。

State/Epoch 是类型别名(单值 → 别名);Orbit/EphemerisTable/NominalOrbit 是 真容器类(多字段/多列 → 类)。算法层保持 numpy 不强制包装(ADR 0011)。

实现状态:已迁移(ADR 0011 第 1 批)。Orbit/OrbitFamilycore/orbit.py 迁入;EphemerisTableio/ephemeris.py 迁入; NominalOrbit 为新类型(FR1↔FR2 契约,插值器待 FR1 落地)。 文本格式序列化函数(parse/read/write)与容器同生命周期,也从此处导出。

e2m2e.data.types.epoch module

时间类型:UTC/TDB/TAI 等时间尺度的类型别名与约定。

TDB 作动力学统一时间 (ADR 0015):算法层/数值层内部统一用 ET(TDB) 或 JD_TDB;只有接口边界(api/Pydantic/输出格式)才转 UTC。

时间转换是 EphemerisProvider 的方法(不单独 TimeSystem 类):utc_to_tdb、 et_to_utc、utc_to_tai、tai_to_tt、tt_to_tdb、jd_tdb_to_et。

实现状态:骨架。类型别名已可用,转换待 EphemerisProvider 落定。

e2m2e.data.types.epoch.Epoch: TypeAlias = float | str

历元时间(通用别名,时间尺度由调用上下文约定)。

e2m2e.data.types.epoch.EpochUtc: TypeAlias = str | list[float] | tuple[float, ...]

UTC 历元(ISO 字符串或 [年,月,日,时,分,秒] 序列)。

e2m2e.data.types.epoch.EtSec

SPICE ET 秒(TDB 时间尺度)。

e2m2e.data.types.epoch.JdTdb

儒略日(TDB 时间尺度)。

e2m2e.data.types.state module

状态向量与轨道根数类型。

State 是 6 维状态向量 [x, y, z, vx, vy, vz] 的**类型别名** (numpy 数组), 分量顺序不可变更(CLAUDE.md 约定)。单值 → 别名,不强制包装类。

实现状态:骨架。类型别名已可用,轨道根数转换待实现。

e2m2e.data.types.state.State

航天器瞬时状态(CR3BP 无量纲或物理单位),形状 (6,)。

ndarray[tuple[Any, ...], dtype[float64]] 的别名

e2m2e.data.types.state.OrbitState

State (轨道状态别名)。

ndarray[tuple[Any, ...], dtype[float64]] 的别名

e2m2e.data.types.orbit module

Orbit 数据容器:单条轨道的状态序列与时间序列。

纯数据容器(ADR 0011 迁移,源:core/orbit.py):states(形状 (n_points, 6))+ times + metadata + 可选 system 绑定(解释单位/坐标 系)+ 手动设 period (不自动算,需要时由调用方设)。OrbitFamily 是轨道族容器,一并归数据层(多轨道集合也是数据)。

依赖方向:数据层不依赖算法层。system 是鸭子类型绑定(解释单位/坐标 系的算法层 System 实例);get_jacobi_constantshasattr 判断 能力,不 import 算法层类。

class e2m2e.data.types.orbit.Orbit(states, times, system=None)[源代码]

基类:object

单条轨道的数据容器与处理工具

Orbit 是 e2m2e 中最基本的轨道数据结构,用于存储、计算和持久化 一条 CR3BP 轨道的全部信息。

v4.0 重构:采用组合模式组织属性。

变量:
  • states -- 状态序列 [x, y, z, vx, vy, vz],形状为 (n, 6)

  • times -- 时间序列,形状为 (n,)

  • system -- 关联的 System 对象(算法层,鸭子类型绑定)

  • family_type (str | None) -- 轨道族类型

  • parameters (dict) -- 轨道参数字典

  • metadata (dict) -- 轨道元数据

参数:
  • states (npt.ArrayLike)

  • times (npt.ArrayLike)

  • system (Any)

VALID_COMPONENTS = ['x', 'y', 'z', 'vx', 'vy', 'vz']
__init__(states, times, system=None)[源代码]

初始化轨道对象

参数:
  • states (ArrayLike) -- 状态序列,形状 (n, 6)(6,)

  • times (ArrayLike) -- 时间序列,形状 (n,)

  • system (Any) -- System 对象(可选,鸭子类型绑定)

抛出:

ValueError -- 状态分量数不等于 6 或时间序列长度不一致

返回类型:

None

family_type: str | None
parameters: dict
metadata: dict
closure_error: float | None
property period: float | None

轨道周期(无量纲时间),由 x 方向零交叉检测估计或外部设置。

property amplitudes: dict

各方向振幅字典("x"/"y"/"z",半极差 (max - min) / 2)。

property extrema: dict

位置极值字典("x_max"/"x_min"/"y_max" …)。

property mean_state: ndarray | None

状态向量均值,形状 (6,)

property center: ndarray | None

轨道几何中心(位置均值),形状 (3,)

property is_periodic: bool

轨道是否被判定为周期轨道

property periodicity_error: float | None

周期性闭合误差范数(首尾状态差的无穷范数)

property state0: ndarray[tuple[Any, ...], dtype[float64]]

首状态。

compute_basic_properties()[源代码]

计算轨道的基本几何属性(均值、极值、振幅、中心、周期估计)。

返回类型:

None

save_to_file(filename)[源代码]

将轨道数据序列化保存到 JSON 文件(v3 格式兼容)

参数:

filename (str | Path)

返回类型:

None

classmethod load_from_file(filename, system=None, orbit_index=None)[源代码]

从 JSON 文件反序列化加载轨道数据(v3 格式兼容)

参数:
返回类型:

Orbit

copy()[源代码]

创建轨道的深拷贝

返回类型:

Orbit

class e2m2e.data.types.orbit.OrbitFamily(orbits=None, family_type=None, system=None)[源代码]

基类:object

轨道族容器

用于存储和管理多个 Orbit 对象组成的轨道族。

变量:
参数:
  • orbits (list[Orbit])

  • family_type (str | None)

  • system (Any)

__init__(orbits=None, family_type=None, system=None)[源代码]

初始化轨道族

参数:
  • orbits (list[Orbit] | None) -- 初始轨道列表,也可传入单条 Orbit 对象

  • family_type (str | None) -- 轨道族类型(如 "halo""lyapunov"

  • system (Any) -- 关联的 System 对象(用于计算 Jacobi 常数等)

抛出:

TypeError -- orbits 列表中包含非 Orbit 对象

返回类型:

None

orbits: list[Orbit]
metadata: dict[str, Any]
property states: ndarray[tuple[Any, ...], dtype[floating]]
property periods: ndarray[tuple[Any, ...], dtype[floating]]
property periodicity: str

族成员的周期语义:"periodic""quasi-periodic"

由族生成入口写入 metadata["periodicity"]"quasi-periodic" 表示成员是拟周期有界轨迹(如 Lissajous),无周期闭合语义, 不得按严格周期族消费(闭合误差、周期不变量等检查不适用)。 缺省 "periodic"

property is_quasi_periodic: bool

族成员是否为拟周期有界轨迹(非严格周期轨道)。

add_orbit(orbit)[源代码]

向轨道族添加一条轨道

参数:

orbit (Orbit)

返回类型:

None

get_states()[源代码]

获取所有轨道的初始状态,形状 (n_orbits, 6)

返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

get_periods()[源代码]

获取所有已知周期(period 不为 None 的轨道)

返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

get_jacobi_constants()[源代码]

计算所有轨道初始状态的 Jacobi 常数。

Jacobi 常数是 CR3BP 专有概念;非 CR3BP 系统(无 get_jacobi_constant 方法)返回空数组。数据层不依赖算法层类, 用鸭子类型判断能力。

返回类型:

ndarray[tuple[Any, ...], dtype[floating]]

save_to_file(filename)[源代码]

将轨道族序列化保存到 JSON 文件

参数:

filename (str | Path)

返回类型:

None

classmethod load_from_file(filename, system=None)[源代码]

从 JSON 文件反序列化加载轨道族

参数:
返回类型:

OrbitFamily

e2m2e.data.types.trajectory module

轨迹数据容器:EphemerisTable(通用星历容器)与 NominalOrbit(名义轨道契约)。

  • EphemerisTable:UTC + GCRS 位置 km/速度 m/s + 会合系位置,通用容器(ADR 0011 迁移,源:io/ephemeris.py)。文本格式 parse/read/write 函数与本容器同生命周期, 不作独立脚本。

  • NominalOrbit:FR1↔FR2 数据契约(ADR 0015,Gómez vol I §8.2.3):等间距历元 状态表 + Floquet 基 + 投影因子表 + 高次插值器。Floquet 基 + 投影因子由 FR1 预计算,控制全程插值不复算。

class e2m2e.data.types.trajectory.EphemerisTable(year, month, day, hour, minute, second, position_km, velocity_mps, synodic_position, raw_text='', times_jd_tdb=None)[源代码]

基类:object

通用星历表容器。

变量:
  • minute (year, month, day, hour,) -- 整型数组,形状 (n,)

  • second (numpy.ndarray) -- 秒(含小数),形状 (n,)

  • position_km (numpy.ndarray) -- GCRS 位置(km),形状 (n, 3)

  • velocity_mps (numpy.ndarray) -- GCRS 速度(m/s),形状 (n, 3)

  • synodic_position (numpy.ndarray) -- 地月会合系位置(无量纲),形状 (n, 3)

  • raw_text (str) -- 原始文件文本;程序生成(非读入)时为空串。

  • times_jd_tdb (numpy.ndarray | None) -- 历元 TDB 儒略日序列(形状 (n,)),由预报/设计链路 填充;读入的星历可能为 None。JD_TDB = 2451545.0 + ET/86400。

参数:
year: ndarray
month: ndarray
day: ndarray
hour: ndarray
minute: ndarray
second: ndarray
position_km: ndarray
velocity_mps: ndarray
synodic_position: ndarray
raw_text: str = ''
times_jd_tdb: ndarray | None = None
class e2m2e.data.types.trajectory.NominalOrbit(epochs, states, synodic_positions=None, floquet_basis=None, projection_factors=None, interpolator=None)[源代码]

基类:object

名义轨道:FR1(设计)→ FR2(保持)数据契约。

变量:
  • epochs (numpy.ndarray) -- 等间距历元(UTC)。

  • states (numpy.ndarray) -- 等间距历元状态表(GCRS,km, km/s,形状 (n, 6))。

  • synodic_positions (numpy.ndarray | None) -- 会合系位置(可选,绘图/特征点用)。

  • floquet_basis (numpy.ndarray | None) -- Floquet 基向量表(可选,特征点控制用)。

  • projection_factors (numpy.ndarray | None) -- 投影因子表(可选,开/关控制用)。

  • interpolator (Any) -- 高次插值器(Lagrange r=5~6)。

参数:
epochs: ndarray
states: ndarray
synodic_positions: ndarray | None = None
floquet_basis: ndarray | None = None
projection_factors: ndarray | None = None
interpolator: Any = None
state_at(t)[源代码]

任意时刻(秒)的标称状态(6 维),经插值器。

参数:

t (float)

返回类型:

ndarray

e2m2e.data.types.trajectory.parse_ephemeris(raw)[源代码]

解析 EPHEMERIDES_*.TXT 文本,返回 EphemerisTable

参数:

raw (str)

返回类型:

EphemerisTable

e2m2e.data.types.trajectory.read_ephemeris(path)[源代码]

从文件读入 EPHEMERIDES_*.TXT。

参数:

path (str | Path)

返回类型:

EphemerisTable

e2m2e.data.types.trajectory.write_ephemeris(table, path)[源代码]

按文本格式写出星历文件(CRLF 行尾,UTF-8 无 BOM),返回写入的文件路径。

参数:
返回类型:

Path

e2m2e.data.types.maneuver module

机动序列表容器。

通用数据容器(ADR 0011 迁移,源:io/maneuvers.pyManeuverTable)。文本格式序列化函数与本容器同生命周期, 算法层(站保)直接使用本容器与序列化函数。

class e2m2e.data.types.maneuver.ManeuverTable(mjd_tdb, delta_v_mps, raw_text='')[源代码]

基类:object

机动序列表容器。

变量:
  • mjd_tdb (numpy.ndarray) -- MJD 形式历元(TDB,天),形状 (n,)

  • delta_v_mps (numpy.ndarray) -- 机动脉冲大小(m/s),形状 (n,)

参数:
mjd_tdb: ndarray
delta_v_mps: ndarray
raw_text: str = ''
e2m2e.data.types.maneuver.parse_maneuvers(raw)[源代码]

解析 MANEUVERS.TXT 文本,返回 ManeuverTable

参数:

raw (str)

返回类型:

ManeuverTable

e2m2e.data.types.maneuver.read_maneuvers(path)[源代码]

从文件读入 MANEUVERS.TXT。

参数:

path (str | Path)

返回类型:

ManeuverTable

e2m2e.data.types.maneuver.write_maneuvers(table, path)[源代码]

把机动序列表写入 MANEUVERS.TXT,返回写入的文件路径。

参数:
返回类型:

Path

e2m2e.data.types.sk_statistic module

蒙特卡洛统计表容器。

通用数据容器(ADR 0011 迁移,源:io/sk_statistic.pySKStatistic)。文本格式序列化函数与本容器同生命周期, 算法层(站保)直接使用本容器与序列化函数。

class e2m2e.data.types.sk_statistic.SKStatistic(rows, num_failed, raw_text='')[源代码]

基类:object

SK_STATISTIC 统计表容器。

变量:
  • rows (numpy.ndarray) -- 数据行矩阵,形状 (n, k),k 为 3(无角动量)或 4/5 (含角动量);列含义见 COLUMNS 前 k 项,单位 m/s

  • num_failed (int | None) -- 蒙特卡洛失败次数;文件无末行文字时为 None

参数:
rows: ndarray
num_failed: int | None
raw_text: str = ''
property has_attitude: bool

是否含角动量管理(姿态 delta-V 列)。

e2m2e.data.types.sk_statistic.COLUMNS = ('run_index', 'total_delta_v', 'max_delta_v', 'attitude_delta_v', 'attitude_delta_v_independent')

数据行各列含义(列数随是否含角动量管理而取舍)

e2m2e.data.types.sk_statistic.parse_sk_statistic(raw)[源代码]

解析 SK_STATISTIC.TXT 文本,返回 SKStatistic

参数:

raw (str)

返回类型:

SKStatistic

e2m2e.data.types.sk_statistic.read_sk_statistic(path)[源代码]

从文件读入 SK_STATISTIC.TXT。

参数:

path (str | Path)

返回类型:

SKStatistic

e2m2e.data.types.sk_statistic.write_sk_statistic(stats, path)[源代码]

把统计表写入 SK_STATISTIC.TXT,返回写入的文件路径。

参数:
返回类型:

Path