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_sources (dict[str, ConstantSource])
mean_radius_km (float | None)
mean_radius_source (ConstantSource | None)
gravity_ref_radius_km (float | None)
gravity_ref_radius_source (ConstantSource | None)
flattening (float | None)
flattening_source (ConstantSource | None)
naif_id (int | None)
rotation_rate_iers_rad_s (float | None)
rotation_rate_iers_source (ConstantSource | None)
rotation_rate_gmat_rad_s (float | None)
rotation_rate_gmat_source (ConstantSource | None)
- gm_sources: dict[str, ConstantSource]
- mean_radius_source: ConstantSource | None = None
- gravity_ref_radius_source: ConstantSource | None = None
- flattening_source: ConstantSource | None = None
- rotation_rate_iers_source: ConstantSource | None = None
- rotation_rate_gmat_source: ConstantSource | None = None
- 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,可直接作为元数据值使用)。
- 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
不含时间星历,会在构造时报错。
e2m2e.data.frames.spice_frames module
SPICE 帧旋转查询。
数据层(ADR 0011 迁移,源:core/spice.py 帧查询部分 / 既有
standard_axes 中的 pxform 用法)。SPICE 帧定义(PCK/FK)由
SPICEManager 加载内核提供;本模块只做帧旋转矩阵查询,转换**算法**
在 algorithm/coordinate/。
e2m2e.data.frames.eop module
地球定向参数(EOP)文件解析(GMAT C04 格式)。
数据层(ADR 0011 迁移,源:core/coordinate/gmat_eop.py 的 EOP 部分 +
core/coordinate/gmat_data.py 的 CoordinateDataError)。只留**数据
解析**;EOP → ITRF 的转换算法在 algorithm/coordinate/。
GMAT C04 EOP reader:只消费 mjd, x, y, UT1-UTC, LOD;后续
dPsi/dEps 字段保留在原文件中但不进入当前 native ITRF 链路。
- 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- 参数:
- class e2m2e.data.frames.eop.EopSample(mjd: 'float', x_rad: 'float', y_rad: 'float', ut1_utc: 'float', lod: 'float')[源代码]
基类:
object
e2m2e.data.frames.leap_seconds module
闰秒表(TAI−UTC)文件解析。
数据层(ADR 0011 迁移,源:core/coordinate/gmat_eop.py 的闰秒部分)。
只留**数据解析**;时间尺度转换(UTC→TAI→TT→TDB)在
EphemerisProvider 与 algorithm/coordinate/。
- class e2m2e.data.frames.leap_seconds.LeapSecondRecord(julian_date: 'float', offset1: 'float', offset2: 'float', offset3: 'float')[源代码]
基类:
object
e2m2e.data.frames.gmat_fixture module
GMAT 兼容 ITRF 所需的裁剪 EOP/闰秒数据资源。
资源随 e2m2e.data.frames 发布,既供数据解析测试使用,也供
algorithm.coordinate 的显式 GMAT-compatible 坐标轴提供默认输入。
这些文件是 IERS 公布物理数据的输入,不是其他软件的输出对照标准。
e2m2e.data.kernels package
e2m2e.data.kernels.manager module
SPICE 内核管理器:加载/缓存/校验。
数据层 SPICE 实现(ADR 0011 迁移,源:core/spice.py)。职责:内核
加载/卸载/缓存、UTC↔ET 时间转换、天体状态/位置查询、引力参数查询,
并实现 EphemerisProvider 接口(时间/状态/帧三类,见
provider.py)。
SPICE 内核文件说明:
闰秒内核 (
.tls):提供 UTC ↔ ET 时间转换所需的闰秒表。自动 在被加载内核的同级目录、仓库内置kernels/目录、SPICE_KERNEL_DIR环境变量指定的路径中按序搜索。星历内核 (
.bsp):包含天体位置/速度数据(如 JPL DE440)。 需要手动加载,可通过SPICEManager.find_ephemeris_kernel()搜索或SPICEManager.load_kernel()加载。
依赖方向:数据层只依赖外部库(numpy/spiceypy/scipy),不依赖 e2m2e 其他层。
- class e2m2e.data.kernels.manager.SPICEManager[源代码]
-
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) -- 标记闰秒内核是否已加载,避免重复加载。
- load_kernel(path)[源代码]
加载一个 SPICE 内核文件(.bsp / .bpc / .tf 等)。
加载前会自动确保闰秒内核已就绪。
- 抛出:
FileNotFoundError -- 当指定路径的文件不存在时。
- 参数:
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 侧
EphemCache拦get_body_position/state;Rust 侧 (_integrators.enable_ephem_cache)给compiled_stm/多重打靶 积分内循环的三次样条查表。两套缓存独立构建但同源(同网格采样), 保证 Rust 积分不逐次调 cspice(消除 DAFFRNOTFOUND 与每步 FFI 开销)。- 参数:
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
- utc_to_et(utc_str)[源代码]
将 UTC 时间字符串转换为 Ephemeris Time(TDB 秒)。
SPICE 的 ET 即 TDB 时间尺度(ADR 0015:TDB 作动力学统一时间)。
- utc_to_tdb(utc)[源代码]
UTC → TDB(ET 秒)。同
utc_to_et()。
- body_state(body, et, frame='J2000', observer='EARTH')[源代码]
EphemerisProvider 接口:天体状态(6,)。同
get_body_state()。
- body_position(body, et, frame='J2000', observer='EARTH')[源代码]
EphemerisProvider 接口:天体位置(3,)。同
get_body_position()。
- find_ephemeris_kernel(search_dir)[源代码]
在指定目录中按优先级搜索星历内核文件(.bsp)。
优先级:de440.bsp > de440s.bsp > de435.bsp > de438.bsp。
- 抛出:
FileNotFoundError -- 目录不存在或其中无匹配的内核文件。
- 参数:
search_dir (str)
- 返回类型:
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 实现 = SPICEManager (data/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 侧"注入数据"(星历缓存 样条表)从批量查询构建。
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 -- 采样时用的观察者(查询必须匹配)。
- 参数:
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.pyDEFAULT_*)。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_EARTH、R_EARTH、AU、KM_TO_M、
EARTH_MOON_DISTANCE_KM、G、DAY、YEAR 等常量已迁移。
具体映射见 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 迁入。
e2m2e.data.templates.perturbations module
摄动开关默认值与 DYB 系数默认值。
数据模板(ADR 0011 迁移,源:io/inputs_dac.py 的 DEFAULT_* 常量)。
DFH 输入文件生成是开发期临时脚本,但默认值是通用契约,归数据层。
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.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)[源代码]
基类:
EnumCR3BP 模型的五个平动点。
- 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'
e2m2e.data.types package
通用数据类型:状态向量、时间类型、轨道容器、轨迹容器。
State/Epoch 是类型别名(单值 → 别名);Orbit/EphemerisTable/NominalOrbit 是 真容器类(多字段/多列 → 类)。算法层保持 numpy 不强制包装(ADR 0011)。
实现状态:已迁移(ADR 0011 第 1 批)。Orbit/OrbitFamily 自
core/orbit.py 迁入;EphemerisTable 自 io/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.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,)。
e2m2e.data.types.orbit module
Orbit 数据容器:单条轨道的状态序列与时间序列。
纯数据容器(ADR 0011 迁移,源:core/orbit.py):states(形状
(n_points, 6))+ times + metadata + 可选 system 绑定(解释单位/坐标
系)+ 手动设 period (不自动算,需要时由调用方设)。OrbitFamily
是轨道族容器,一并归数据层(多轨道集合也是数据)。
依赖方向:数据层不依赖算法层。system 是鸭子类型绑定(解释单位/坐标
系的算法层 System 实例);get_jacobi_constants 用 hasattr 判断
能力,不 import 算法层类。
- class e2m2e.data.types.orbit.Orbit(states, times, system=None)[源代码]
基类:
object单条轨道的数据容器与处理工具
Orbit 是 e2m2e 中最基本的轨道数据结构,用于存储、计算和持久化 一条 CR3BP 轨道的全部信息。
v4.0 重构:采用组合模式组织属性。
- 变量:
- 参数:
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
- class e2m2e.data.types.orbit.OrbitFamily(orbits=None, family_type=None, system=None)[源代码]
基类:
object轨道族容器
用于存储和管理多个 Orbit 对象组成的轨道族。
- 变量:
orbits (list[e2m2e.data.types.orbit.Orbit]) -- Orbit 对象列表
family_type -- 轨道族类型
system -- 关联的 System 对象
- 参数:
- property periodicity: str
族成员的周期语义:
"periodic"或"quasi-periodic"。由族生成入口写入
metadata["periodicity"]。"quasi-periodic"表示成员是拟周期有界轨迹(如 Lissajous),无周期闭合语义, 不得按严格周期族消费(闭合误差、周期不变量等检查不适用)。 缺省"periodic"。
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通用星历表容器。
- 变量:
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。
- 参数:
- 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)。
- 参数:
- e2m2e.data.types.trajectory.parse_ephemeris(raw)[源代码]
解析 EPHEMERIDES_*.TXT 文本,返回
EphemerisTable。- 参数:
raw (str)
- 返回类型:
e2m2e.data.types.maneuver module
机动序列表容器。
通用数据容器(ADR 0011 迁移,源:io/maneuvers.py 的
ManeuverTable)。文本格式序列化函数与本容器同生命周期,
算法层(站保)直接使用本容器与序列化函数。
- 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,)
- 参数:
- e2m2e.data.types.maneuver.parse_maneuvers(raw)[源代码]
解析 MANEUVERS.TXT 文本,返回
ManeuverTable。- 参数:
raw (str)
- 返回类型:
e2m2e.data.types.sk_statistic module
蒙特卡洛统计表容器。
通用数据容器(ADR 0011 迁移,源:io/sk_statistic.py 的
SKStatistic)。文本格式序列化函数与本容器同生命周期,
算法层(站保)直接使用本容器与序列化函数。
- class e2m2e.data.types.sk_statistic.SKStatistic(rows, num_failed, raw_text='')[源代码]
基类:
objectSK_STATISTIC 统计表容器。
- 变量:
rows (numpy.ndarray) -- 数据行矩阵,形状
(n, k),k 为 3(无角动量)或 4/5 (含角动量);列含义见COLUMNS前 k 项,单位 m/snum_failed (int | None) -- 蒙特卡洛失败次数;文件无末行文字时为
None
- 参数:
- 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)
- 返回类型: