e2m2e.core package

e2m2e 核心模块

包含三体问题系统定义、动力学方程、轨道数据结构和坐标变换的核心类。

Classes:

CR3BP_System: 圆型限制性三体问题系统 LibrationPoint: 平动点枚举 Dynamics: 通用动力学基类 CR3BP_Dynamics: CR3BP 动力学方程 Orbit: 轨道数据容器 OrbitFamily: 轨道族容器 CoordinateTransformation: 坐标系变换 ReferenceFrame: 参考坐标系枚举

Functions:

propagate_state_at_orbit_time: 沿轨道周期外推状态

class e2m2e.core.CR3BP_System(mu, primary, secondary)[源代码]

基类:object

圆型限制性三体问题系统

参数:
mu

质量参数 μ = m2/(m1+m2)

primary_body

主天体名称

secondary_body

次天体名称

L_points

平动点位置字典

L1

L1平动点坐标

L2

L2平动点坐标

L3

L3平动点坐标

L4

L4平动点坐标

L5

L5平动点坐标

characteristic_length

特征长度 (km)

characteristic_time

特征时间 (s)

characteristic_velocity

特征速度 (km/s)

mass_primary

主天体质量 (kg)

mass_secondary

次天体质量 (kg)

total_mass

总质量 (kg)

semi_major_axis

半长轴 (km)

orbital_period

轨道周期 (s)

mean_motion

平均角速度 (rad/s)

has_L_points

是否已计算平动点

EARTH_MOON_DISTANCE_KM = 384400.0
AU = 149597870.7
G = 6.6743e-20
DAY = 86400
YEAR = 31557600.0
KNOWN_SYSTEMS: dict[str, dict[str, str | float]] = {'earth_moon': {'distance': 384400.0, 'mu': 0.01215, 'period': 2360448.0, 'primary': 'Earth', 'secondary': 'Moon'}, 'sun_earth': {'distance': 149597870.7, 'mu': 3.0039e-06, 'period': 31557600.0, 'primary': 'Sun', 'secondary': 'Earth'}, 'sun_jupiter': {'distance': 777908927.64, 'mu': 0.0009535, 'period': 374273136.0, 'primary': 'Sun', 'secondary': 'Jupiter'}}
classmethod from_known_system(system_name)[源代码]

从已知系统创建CR3BP系统

参数:

system_name (str) -- 系统名称,如 "earth_moon", "sun_earth", "sun_jupiter"

返回:

CR3BP_System实例

抛出:

ValueError -- 系统名称不在已知系统中

返回类型:

CR3BP_System

__init__(mu, primary, secondary)[源代码]

初始化系统参数

参数:
  • mu (float) -- 质量参数 μ = m2/(m1+m2)

  • primary (str) -- 主天体名称

  • secondary (str) -- 次天体名称

返回类型:

None

set_characteristic_scales(distance, period)[源代码]

设置特征尺度

参数:
  • distance (float) -- 两天体之间的距离 (km)

  • period (float) -- 轨道周期 (s)

返回类型:

None

compute_libration_points()[源代码]

计算五个平动点

返回:

平动点位置字典,键为 LibrationPoint 枚举,值为坐标数组

返回类型:

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

get_libration_point(point)[源代码]

获取指定平动点

若尚未计算平动点,会自动调用 compute_libration_points()。

参数:

point (LibrationPoint) -- LibrationPoint枚举值

返回:

平动点坐标数组

抛出:

ValueError -- 平动点无效

返回类型:

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

get_jacobi_constant(state)[源代码]

计算Jacobi常数

参数:

state (ArrayLike) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

Jacobi常数

返回类型:

float

dimensionless_to_physical(state)[源代码]

无量纲化转物理单位

参数:

state (ArrayLike) -- 无量纲状态向量 [x, y, z, vx, vy, vz]

返回:

物理状态向量 [km, km/s]

抛出:

ValueError -- 系统未初始化特征尺度

返回类型:

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

physical_to_dimensionless(state)[源代码]

物理单位转无量纲化

参数:

state (ArrayLike) -- 物理状态向量 [x, y, z, vx, vy, vz] (km, km/s)

返回:

无量纲状态向量

抛出:

ValueError -- 系统未初始化特征尺度

返回类型:

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

compute_stability_index(L_point)[源代码]

计算平动点稳定性指标

通过线性化运动方程的特征值分析平动点稳定性。

参数:

L_point (LibrationPoint) -- LibrationPoint枚举值

返回:

稳定性指标字典,包含 is_stable、max_real_part、max_imag_part、 eigenvalues 和 linear_matrix

返回类型:

dict[str, Any]

info(mode='default')[源代码]

输出系统信息

参数:

mode (str) -- 信息模式,"default" 为基础信息,"all" 为详细信息

返回类型:

None

class e2m2e.core.LibrationPoint(*values)[源代码]

基类:Enum

平动点枚举

L1 = 1
L2 = 2
L3 = 3
L4 = 4
L5 = 5
class e2m2e.core.Dynamics(system)[源代码]

基类:object

通用天体系统动力学基类

采用 Template Method 模式:基类定义 propagate() 的算法骨架, 子类通过钩子方法提供具体的 ODE 函数和步长配置。

契约(对应 MBSE REQ-002): - propagate() 返回的 states 形状始终为 (n_points, 6) - stm``(如果存在)形状为 ``(n_points, 6, 6)

参数:

system (Any)

system

关联的系统对象

integrator

数值积分器类型

rtol

相对积分容差

atol

绝对积分容差

max_step

最大积分步长

last_trajectory

最近一次积分的轨迹 [t, y]

last_stm

最近一次积分的状态转移矩阵

cross_section_tolerance

截面检测容差

last_crossing

上次穿过截面的点和时间

initialized

初始化完成标志

DEFAULT_TOLERANCE = 1e-12
DEFAULT_MAX_STEP = 0.01
STATE_DIM = 6
STM_DIMENSION = 42
__init__(system)[源代码]

初始化动力学

参数:

system (Any) -- 系统对象(CR3BP_System 或 EphemerisSystem)

返回类型:

None

equations_of_motion(t, state)[源代码]

运动方程(子类需实现)

参数:
返回:

状态导数

抛出:

NotImplementedError -- 子类未实现此方法

返回类型:

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

propagate(initial_state, t_span, t_eval=None, with_stm=False, with_jacobi=False)[源代码]

传播轨迹(Template Method)

统一的传播入口,保证: - states 形状为 (n_points, 6)(REQ-002) - stm 形状为 (n_points, 6, 6)(当 with_stm=True 时) - time 数组单调递增

参数:
  • initial_state (ArrayLike) -- 初始状态向量

  • t_span (tuple[float, float]) -- 时间区间 [t0, tf]

  • t_eval (ArrayLike | None) -- 评估时间点数组(可选)

  • with_stm (bool) -- 是否计算状态转移矩阵

  • with_jacobi (bool) -- 是否沿轨迹逐点计算 Jacobi 常数

返回:

轨迹结果字典,包含 timestates 键; 当 with_stm=True 时额外包含 stm 键; 当 with_jacobi=True 时额外包含 jacobijacobi_error

返回类型:

dict[str, Any]

compute_jacobi_constant(state)[源代码]

计算能量常数(子类需实现)

参数:

state (ArrayLike) -- 状态向量

返回:

能量常数

抛出:

NotImplementedError -- 子类未实现此方法

返回类型:

float

check_cross_section(state, plane, value)[源代码]

检查是否穿过指定截面

参数:
  • state (ArrayLike) -- 状态向量

  • plane (str) -- 截面平面 ('x', 'y', 'z')

  • value (float) -- 平面值

返回:

是否穿过截面

抛出:

ValueError -- 无效的平面参数

返回类型:

bool

class e2m2e.core.CR3BP_Dynamics(system)[源代码]

基类:Dynamics

CR3BP动力学方程

封装了CR3BP的动力学模型,提供状态传播、状态转移矩阵计算、 Jacobi常数计算等核心功能。支持6维状态向量(位置+速度)和 42维增广状态向量(状态+状态转移矩阵)的数值积分。

CR3BP 运动方程(旋转坐标系中):

ẍ - 2ẏ = ∂Ω/∂x ÿ + 2ẋ = ∂Ω/∂y z̈ = ∂Ω/∂z

其中 Ω 为伪势能(见 equations_of_motion 方法的详细注释), 等号左侧的 2ẏ、-2ẋ 项为科里奥利力(Coriolis),伪势能中 已包含离心力项 x²/2 + y²/2。

参数:

system (CR3BP_System)

__init__(system)[源代码]

初始化CR3BP动力学

参数:

system (CR3BP_System) -- CR3BP_System对象,包含质量参数μ等系统常数

返回类型:

None

jacobi_history: list[float]
jacobi_error: float
equations_of_motion(t, state)[源代码]

6维状态向量的运动方程

实现 CR3BP 在旋转坐标系中的运动方程。旋转坐标系以两个主天体的 公共质心为原点,与主天体同步旋转(角速度 ω = 1),因此两个主天体 在坐标系中固定不动。

在旋转坐标系中,运动方程为:

ẍ - 2ẏ = ∂Ω/∂x (x 方向:离心力 + 引力 + 科里奥利力) ÿ + 2ẋ = ∂Ω/∂y (y 方向:离心力 + 引力 + 科里奥利力) z̈ = ∂Ω/∂z (z 方向:仅引力,无科里奥利力)

伪势能 Ω = (x² + y²)/2 + (1-μ)/r₁ + μ/r₂,其偏导数为:

∂Ω/∂x = x - (1-μ)(x+μ)/r₁³ - μ(x-1+μ)/r₂³ ∂Ω/∂y = y - (1-μ)y/r₁³ - μy/r₂³ ∂Ω/∂z = - (1-μ)z/r₁³ - μz/r₂³

因此加速度各项的物理含义:
  • "x" / "y" 项:离心力(伪势能中的二次项贡献)

  • "(1-μ)(x+μ)/r₁³" 等:较大天体(如地球)的引力加速度

  • "μ(x-1+μ)/r₂³" 等:较小天体(如月球)的引力加速度

  • "2vy" / "-2vx":科里奥利力(旋转坐标系中的虚拟力)

参数:
  • t (float) -- 时间(旋转坐标系中,CR3BP方程不显含时间,即自治系统)

  • state (ndarray[tuple[Any, ...], dtype[floating]]) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

状态导数 [vx, vy, vz, ax, ay, az]

返回类型:

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

compute_jacobian_A(state)[源代码]

计算 CR3BP 状态方程的雅可比矩阵 A(t)

A(t) 是 6x6 矩阵,满足 dΦ/dt = A(t)·Φ。 结构为:

0₃ₓ₃ I₃ₓ₃ | 位置方程的雅可比:∂(v)/∂(r,v) = [0, I]
U_ij Ω | 速度方程的雅可比:∂(a)/∂(r,v) = [U, Ω]

此方法提取自 equations_with_stm,供 Continuation 等模块复用(REQ-103)。

参数:

state (ndarray[tuple[Any, ...], dtype[floating]]) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

6x6 雅可比矩阵 A

返回类型:

ndarray

equations_with_stm(t, augmented_state)[源代码]

42维增广状态向量的运动方程(包含状态转移矩阵)

同时积分状态向量和状态转移矩阵(STM),满足 dΦ/dt = A(t)·Φ。

状态转移矩阵 Φ(t, t₀) 将初始状态的微小扰动映射到当前时刻:

δx(t) = Φ(t, t₀) · δx(t₀)

通过将 Φ 拉伸为 36 维向量并与 6 维状态拼接为 42 维增广状态, 可以用标准的 ODE 积分器同时求解轨道和 STM。

参数:
返回:

增广状态导数

返回类型:

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

propagate_orbit_state_at_time(orbit, t, integration_dt=0.01)[源代码]

从轨道首点状态积分到给定时刻对应的相位(周期轨道上对周期取模)

利用周期轨道的周期性,将目标时间对周期取模后从轨道起始状态 重新积分,得到该相位处的精确状态。

参数:
  • orbit (Orbit) -- 周期轨道数据(须含 statestimes、有效 period

  • t (float) -- 与轨道 times 一致的时间坐标(绝对时间)

  • integration_dt (float) -- 构造 t_eval 的步长

返回:

积分末端状态 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 轨道无状态或周期无效

返回类型:

npt.NDArray[np.floating]

compute_state_transition_matrix(initial_state, t)[源代码]

计算状态转移矩阵

参数:
  • initial_state (ArrayLike) -- 初始状态向量

  • t (float) -- 积分终止时间

返回:

状态转移矩阵 (6x6)

返回类型:

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

compute_jacobi_constant(state)[源代码]

计算Jacobi常数

参数:

state (ArrayLike) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

Jacobi常数

返回类型:

float

class e2m2e.core.CR3BP_SRP_Dynamics(system, area=1.0, mass=1000.0, Cr=1.5, non_lambertian_front=0.038, non_lambertian_back=0.004, specular_reflection=0.975, nreflection_coeff=0.999, emission_front=0.8, emission_back=0.2, P_srp=4.56e-06)[源代码]

基类:CR3BP_Dynamics

带太阳辐射压的 CR3BP 动力学

在标准 CR3BP 运动方程基础上添加太阳辐射压扰动力。 SRP 力模型基于 EXOSIMS 实现,支持非完美反射表面的光学系数。

参数:
area

航天器截面积 (m²)

mass

航天器质量 (kg)

Cr

反射系数 (1=完全吸收, 2=完全反射)

b1

漫反射光学系数

b2

镜面反射光学系数

b3

非朗伯光学系数

beta

SRP 加速度系数 (solar sail parameter)

P_srp

太阳辐射压常数 (N/m² at 1 AU)

示例

>>> from e2m2e.core.system import CR3BP_System
>>> from e2m2e.core.srp_dynamics import CR3BP_SRP_Dynamics
>>> system = CR3BP_System.from_known_system("earth_moon")
>>> dynamics = CR3BP_SRP_Dynamics(system, area=100.0, mass=1000.0)
>>> result = dynamics.propagate([0.8, 0, 0, 0, 0.6, 0], (0, 1))
DEFAULT_NON_LAMBERTIAN_FRONT = 0.038
DEFAULT_NON_LAMBERTIAN_BACK = 0.004
DEFAULT_SPECULAR_REFLECTION = 0.975
DEFAULT_NREFLECTION_COEFF = 0.999
DEFAULT_EMISSION_FRONT = 0.8
DEFAULT_EMISSION_BACK = 0.2
DEFAULT_P_SRP = 4.56e-06
__init__(system, area=1.0, mass=1000.0, Cr=1.5, non_lambertian_front=0.038, non_lambertian_back=0.004, specular_reflection=0.975, nreflection_coeff=0.999, emission_front=0.8, emission_back=0.2, P_srp=4.56e-06)[源代码]

初始化 SRP 动力学

参数:
  • system (CR3BP_System) -- CR3BP_System 对象

  • area (float) -- 航天器截面积 (m²)

  • mass (float) -- 航天器质量 (kg)

  • Cr (float) -- 反射系数 (1=完全吸收, 2=完全反射)

  • non_lambertian_front (float) -- 前表面非朗伯系数

  • non_lambertian_back (float) -- 后表面非朗伯系数

  • specular_reflection (float) -- 镜面反射因子

  • nreflection_coeff (float) -- 反射系数

  • emission_front (float) -- 前表面发射系数

  • emission_back (float) -- 后表面发射系数

  • P_srp (float) -- 太阳辐射压常数 (N/m² at 1 AU)

返回类型:

None

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

基类:object

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

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

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

参数:
  • states (npt.ArrayLike)

  • times (npt.ArrayLike)

  • system (CR3BP_System | None)

states

状态序列 [x, y, z, vx, vy, vz],形状为 (n, 6)

times

时间序列,形状为 (n,)

system

关联的 CR3BP_System 对象

family_type

轨道族类型

parameters

轨道参数字典

metadata

轨道元数据

jacobi_constants

Jacobi 常数序列

stability_indices

稳定性指标(由外部算法填充)

VALID_FAMILY_TYPES = ['halo', 'lyapunov', 'vertical', 'axial', 'butterfly', 'dragonfly']
VALID_COMPONENTS = ['x', 'y', 'z', 'vx', 'vy', 'vz']
__init__(states, times, system=None)[源代码]

初始化轨道对象

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

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

  • system (CR3BP_System | None) -- CR3BP_System 对象(可选)

抛出:

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

返回类型:

None

property period: float | None
property amplitudes: dict
property extrema: dict
property mean_state: ndarray | None
property center: ndarray | None
property is_periodic: bool
property periodicity_error: float | None
property monodromy_matrix: ndarray | None
property eigenvalues: ndarray | None
property stability: str | None
property lyapunov_exponents: ndarray | None
compute_basic_properties()[源代码]

计算轨道的基本几何与物理属性

自动计算: 1. Jacobi 常数序列(当 system 不为 None) 2. 平均状态向量 3. 位置极值与振幅 4. 轨道中心 5. 周期估计(零交叉检测)

返回类型:

None

compute_monodromy_matrix(dynamics)[源代码]

计算轨道的单值矩阵(Monodromy Matrix)

参数:

dynamics (CR3BP_Dynamics) -- CR3BP_Dynamics 对象

返回:

单值矩阵 (6, 6)

抛出:

ValueError -- 轨道周期未知

返回类型:

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

compute_stability(dynamics)[源代码]

计算轨道的稳定性指标

参数:

dynamics (CR3BP_Dynamics) -- CR3BP_Dynamics 对象

返回:

稳定性分析结果字典

返回类型:

dict[str, Any]

get_period()[源代码]
返回类型:

float | None

get_amplitude(direction)[源代码]

获取指定方向的轨道振幅

参数:

direction (str)

返回类型:

float

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.core.OrbitFamily(orbits=None, family_type=None, system=None)[源代码]

基类:object

轨道族容器

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

参数:
orbits

Orbit 对象列表

family_type

轨道族类型

system

关联的 CR3BP_System 对象

metadata

轨道族元数据

orbits: list[Orbit]
property states: ndarray[tuple[Any, ...], dtype[floating]]
property periods: ndarray[tuple[Any, ...], dtype[floating]]
add_orbit(orbit)[源代码]
参数:

orbit (Orbit)

返回类型:

None

get_states()[源代码]
返回类型:

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

get_periods()[源代码]
返回类型:

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

get_jacobi_constants()[源代码]
返回类型:

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

save_to_file(filename)[源代码]
参数:

filename (str | Path)

返回类型:

None

classmethod load_from_file(filename, system=None)[源代码]
参数:
返回类型:

OrbitFamily

e2m2e.core.propagate_state_at_orbit_time(orbit, t, dynamics, integration_dt=0.01)[源代码]

委托 CR3BP_Dynamics.propagate_orbit_state_at_time(),便于顶层导入兼容

参数:
  • orbit (Any) -- 周期轨道数据

  • t (float) -- 目标时间(绝对时间)

  • dynamics (CR3BP_Dynamics) -- CR3BP动力学对象

  • integration_dt (float) -- 积分步长

返回:

积分末端状态

返回类型:

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

class e2m2e.core.CoordinateTransformation(system)[源代码]

基类:object

坐标系变换器

在CR3BP系统的不同参考系之间进行状态向量变换,支持旋转系/惯性系、 质心系/天体中心系之间的转换,并内置旋转矩阵缓存机制。

参数:

system (CR3BP_System)

system

关联的CR3BP_System对象

mu

系统的质量参数

rotation_matrices

旋转矩阵缓存,键为时间,值为3x3旋转矩阵

rotation_matrix_derivatives

旋转矩阵导数缓存

initialized

初始化完成标志

VELOCITY_TRANSFORM_INCLUDE_CORIOLIS = True
CACHE_ROTATION_MATRICES = True
MAX_CACHE_SIZE = 1000
__init__(system)[源代码]

初始化变换器

参数:

system (CR3BP_System) -- CR3BP_System对象,提供质量参数等信息

返回类型:

None

compute_rotation_matrix(time)[源代码]

计算给定时刻的旋转矩阵及其导数

参数:

time (float) -- 时间(无量纲)

返回:

3x3旋转矩阵

返回类型:

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

rotating_to_inertial(state, time)[源代码]

将状态向量从旋转系转换到惯性系

参数:
  • state (ArrayLike) -- 旋转系状态向量 [x, y, z, vx, vy, vz]

  • time (float) -- 时间(无量纲)

返回:

惯性系状态向量 [x, y, z, vx, vy, vz]

返回类型:

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

inertial_to_rotating(state, time)[源代码]

将状态向量从惯性系转换到旋转系

参数:
  • state (ArrayLike) -- 惯性系状态向量 [x, y, z, vx, vy, vz]

  • time (float) -- 时间(无量纲)

返回:

旋转系状态向量 [x, y, z, vx, vy, vz]

返回类型:

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

barycentric_to_primary(state)[源代码]

将状态向量从质心系转换到主天体中心系

参数:

state (ArrayLike) -- 质心系状态向量 [x, y, z, vx, vy, vz]

返回:

主天体中心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

primary_to_barycentric(state)[源代码]

将状态向量从主天体中心系转换到质心系

参数:

state (ArrayLike) -- 主天体中心系状态向量 [x, y, z, vx, vy, vz]

返回:

质心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

barycentric_to_secondary(state)[源代码]

将状态向量从质心系转换到次天体中心系

参数:

state (ArrayLike) -- 质心系状态向量 [x, y, z, vx, vy, vz]

返回:

次天体中心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

secondary_to_barycentric(state)[源代码]

将状态向量从次天体中心系转换到质心系

参数:

state (ArrayLike) -- 次天体中心系状态向量 [x, y, z, vx, vy, vz]

返回:

质心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

transform(state, from_frame, to_frame, time=0.0)[源代码]

通用坐标变换接口

参数:
  • state (ArrayLike) -- 状态向量 [x, y, z, vx, vy, vz]

  • from_frame (ReferenceFrame | str) -- 源参考系(ReferenceFrame枚举或字符串)

  • to_frame (ReferenceFrame | str) -- 目标参考系(ReferenceFrame枚举或字符串)

  • time (float) -- 时间(仅对涉及旋转系/惯性系的变换需要)

返回:

变换后的状态向量 [x, y, z, vx, vy, vz]

抛出:

NotImplementedError -- 不支持指定的坐标系变换组合时抛出

返回类型:

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

class e2m2e.core.SynodicJ2000Transformation(cr3bp_system, spice)[源代码]

基类:object

CR3BP synodic坐标系与J2000惯性坐标系之间的转换器。

该类提供了CR3BP归一化synodic坐标系与J2000惯性坐标系之间的双向转换, 使用SPICE获取月球瞬时状态来构建旋转矩阵,支持单个状态和批量转换。

参数:

cr3bp_system (CR3BP_System)

cr3bp_system

CR3BP系统对象,提供质量参数等信息

spice

SPICEManager对象,用于获取天体状态

__init__(cr3bp_system, spice)[源代码]

初始化转换器

参数:
  • cr3bp_system (CR3BP_System) -- CR3BP系统对象

  • spice -- SPICEManager对象

返回类型:

None

synodic_to_j2000(state_syn, t_syn, et0)[源代码]

将状态从synodic坐标系转换到J2000惯性坐标系

参数:
  • state_syn (ArrayLike) -- synodic坐标系状态向量 [x, y, z, vx, vy, vz](无量纲)

  • t_syn (float) -- synodic时间(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

J2000坐标系状态向量 [x, y, z, vx, vy, vz](km, km/s)

返回类型:

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

j2000_to_synodic(state_j2000, t_syn, et0)[源代码]

将状态从J2000惯性坐标系转换到synodic坐标系

参数:
  • state_j2000 (ArrayLike) -- J2000坐标系状态向量 [x, y, z, vx, vy, vz](km, km/s)

  • t_syn (float) -- synodic时间(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

synodic坐标系状态向量 [x, y, z, vx, vy, vz](无量纲)

返回类型:

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

batch_synodic_to_j2000(states_syn, t_syn_arr, et0)[源代码]

批量将状态从synodic坐标系转换到J2000惯性坐标系

参数:
  • states_syn (ArrayLike) -- synodic坐标系状态数组,形状 (N, 6)(无量纲)

  • t_syn_arr (ArrayLike) -- synodic时间数组,形状 (N,)(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

J2000坐标系状态数组,形状 (N, 6)(km, km/s)

返回类型:

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

batch_j2000_to_synodic(states_j2000, t_syn_arr, et0)[源代码]

批量将状态从J2000惯性坐标系转换到synodic坐标系

参数:
  • states_j2000 (ArrayLike) -- J2000坐标系状态数组,形状 (N, 6)(km, km/s)

  • t_syn_arr (ArrayLike) -- synodic时间数组,形状 (N,)(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

synodic坐标系状态数组,形状 (N, 6)(无量纲)

返回类型:

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

class e2m2e.core.ReferenceFrame(*values)[源代码]

基类:Enum

参考系枚举

ROTATING

旋转系

INERTIAL

惯性系

BARYCENTRIC

质心系

PRIMARY_CENTERED

主天体中心系

SECONDARY_CENTERED

次天体中心系

SYNODIC

会合系(同旋转系)

ROTATING = 'rotating'
INERTIAL = 'inertial'
BARYCENTRIC = 'barycentric'
PRIMARY_CENTERED = 'primary_centered'
SECONDARY_CENTERED = 'secondary_centered'
SYNODIC = 'synodic'
class e2m2e.core.SPICEManager[源代码]

基类:object

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

标记闰秒内核是否已加载,避免重复加载。

Type:

bool

__init__()[源代码]

初始化 SPICE 管理器。

返回类型:

None

load_kernel(path)[源代码]

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

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

参数:

path (str) -- 内核文件的路径。

抛出:

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

返回类型:

None

unload_kernel(path)[源代码]

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

参数:

path (str) -- 之前通过 load_kernel 加载的内核文件路径。

返回类型:

None

utc_to_et(utc_str)[源代码]

将 UTC 时间字符串转换为 Ephemeris Time(历书时,单位秒)。

参数:

utc_str (str) -- ISO 格式的 UTC 时间字符串,如 "2024-01-01T00:00:00"

返回:

对应的 ET 值(秒)。

返回类型:

float

et_to_utc(et)[源代码]

将 Ephemeris Time(历书时)转换为 UTC 时间字符串。

参数:

et (float) -- 历书时(秒)。

返回:

ISO 格式的 UTC 时间字符串。

返回类型:

str

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

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

参数:
  • target (str) -- 目标天体名称或 NAIF ID,如 "MOON"

  • et (float) -- 历书时(秒)。

  • frame (str) -- 参考坐标系名称,如 "J2000""ECLIPJ2000"

  • observer (str) -- 观察者天体名称或 NAIF ID,如 "EARTH"

返回:

长度为 6 的 NumPy 数组,前 3 个元素为位置 (km),后 3 个为速度 (km/s)。

返回类型:

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

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

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

参数:
  • target (str) -- 目标天体名称或 NAIF ID。

  • et (float) -- 历书时(秒)。

  • frame (str) -- 参考坐标系名称。

  • observer (str) -- 观察者天体名称或 NAIF ID。

返回:

长度为 3 的 NumPy 数组,表示位置 (km)。

返回类型:

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

find_ephemeris_kernel(search_dir)[源代码]

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

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

参数:

search_dir (str) -- 要搜索的目录路径。

返回:

找到的第一个 .bsp 内核文件的绝对路径。

抛出:

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

返回类型:

str

get_gm(body)[源代码]

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

优先从本地缓存字典中查找;若未命中,则通过 SPICE 内核实时读取。

参数:

body (str) -- 天体名称(如 "EARTH""MOON")或 NAIF ID。

返回:

该天体的 GM 值(km³/s²)。

返回类型:

float

class e2m2e.core.EphemerisSystem(bodies, spice, origin='EARTH', frame='J2000')[源代码]

基类:object

星历系统,管理一组天体的星历查询。

封装 SPICE 工具包,为轨道设计流程提供统一的天体数据访问层。 支持自定义参考原点和坐标框架。

参数:
bodies

天体名称列表,如 ["EARTH", "MOON", "SUN"]。

spice

SPICE 管理器实例,负责底层星历数据读取。

origin

参考原点天体名称,默认为 "EARTH"。

frame

坐标系名称,默认为 "J2000"。

__init__(bodies, spice, origin='EARTH', frame='J2000')[源代码]

初始化星历系统。

参数:
  • bodies (list[str]) -- 需要纳入计算的天体名称列表。

  • spice (SPICEManager) -- 已完成内核加载的 SPICE 管理器实例。

  • origin (str) -- 参考原点天体,所有位置矢量将相对于此天体计算。

  • frame (str) -- 参考坐标系名称,用于确定位置矢量的坐标框架。

返回类型:

None

get_body_position(body, et)[源代码]

获取天体相对于原点的位置向量。

自动使用初始化时设定的 frame 和 origin。

参数:
  • body (str) -- 天体名称,如 "MOON"、"SUN"。

  • et (float) -- 历书时(秒)。

返回:

位置向量,形状 (3,),单位 km。

返回类型:

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

get_body_state(body, et)[源代码]

获取天体相对于原点的状态向量。

自动使用初始化时设定的 frame 和 origin。

参数:
  • body (str) -- 天体名称,如 "MOON"、"SUN"。

  • et (float) -- 历书时(秒)。

返回:

状态向量,形状 (6,),前 3 元素为位置 [km],后 3 元素为速度 [km/s]。

返回类型:

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

get_gm(body)[源代码]

获取天体的引力参数 GM。

参数:

body (str) -- 天体名称。

返回:

GM 值,单位 km³/s²。

返回类型:

float

get_gm_values()[源代码]

获取所有管理天体的引力常数 (GM) 值。

返回:

与 self.bodies 顺序对应的 GM 值数组,单位通常为 km³/s²。

返回类型:

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

class e2m2e.core.EphemerisDynamics(system)[源代码]

基类:Dynamics

星历 N 体动力学类,提供运动方程、STM 变分方程与轨道传播功能。

参数:

system (EphemerisSystem) -- 星历系统配置,包含天体列表、SPICE 内核接口、参考系与原点天体等信息。

integrator

SciPy 积分器名称,默认 ``"DOP853"``(8 阶 Runge-Kutta)。

rtol

相对积分容差。

atol

绝对积分容差。

max_step

积分器最大步长(秒)。

MIN_DISTANCE = 1e-06
equations_of_motion(t, state)[源代码]

计算受限 N 体问题的运动方程右端项(加速度)。

对每个天体分别处理: - 原点天体:中心引力 -μ₀ r/|r|³ - 摄动天体:第三体摄动 -μᵢ [(r-rᵢ)/|r-rᵢ|³ + rᵢ/|rᵢ|³]

第二项为间接项(扣除摄动天体对原点的引力)。

参数:
  • t (float) -- 历元时刻(ephemeris seconds past J2000),用于查询天体星历位置。

  • state (ndarray[tuple[Any, ...], dtype[floating]]) -- 航天器状态向量,形状 (6,),前 3 个元素为位置 [km], 后 3 个元素为速度 [km/s]。

返回:

状态导数向量,形状 (6,),即 [v, a]

返回类型:

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

compute_jacobian_A(t, state)[源代码]

计算星历 N 体状态方程的雅可比矩阵 A(t)。

A = | 0₃ₓ₃ I₃ₓ₃ |
U₃ₓ₃ 0₃ₓ₃ |

其中 U = ∂a/∂r 是加速度对位置的偏导数 (3x3)。 N 体问题中无速度相关力,因此 ∂a/∂v = 0。

参数:
返回:

雅可比矩阵,形状 (6, 6)

返回类型:

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

equations_with_stm(t, augmented_state)[源代码]

计算含状态转移矩阵 (STM) 的增广运动方程右端项。

增广状态向量布局:[r(3), v(3), Φ(36)],共 42 维。 其中 Φ 为 6×6 状态转移矩阵按行展平。

参数:
返回:

增广状态导数向量,形状 (42,),即 [v, a, dΦ/dt_flat]

返回类型:

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

Submodules

e2m2e.core.system module

三体问题系统模块

包含 CR3BP_System 类,用于定义和操作圆型限制性三体问题系统。

class e2m2e.core.system.LibrationPoint(*values)[源代码]

基类:Enum

平动点枚举

L1 = 1
L2 = 2
L3 = 3
L4 = 4
L5 = 5
class e2m2e.core.system.CR3BP_System(mu, primary, secondary)[源代码]

基类:object

圆型限制性三体问题系统

参数:
mu

质量参数 μ = m2/(m1+m2)

Type:

float

primary_body

主天体名称

Type:

str

secondary_body

次天体名称

Type:

str

L_points

平动点位置字典

Type:

dict[e2m2e.core.system.LibrationPoint, numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]]] | None

L1

L1平动点坐标

Type:

numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]] | None

L2

L2平动点坐标

Type:

numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]] | None

L3

L3平动点坐标

Type:

numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]] | None

L4

L4平动点坐标

Type:

numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]] | None

L5

L5平动点坐标

Type:

numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]] | None

characteristic_length

特征长度 (km)

Type:

float | None

characteristic_time

特征时间 (s)

Type:

float | None

characteristic_velocity

特征速度 (km/s)

Type:

float | None

mass_primary

主天体质量 (kg)

Type:

float | None

mass_secondary

次天体质量 (kg)

Type:

float | None

total_mass

总质量 (kg)

Type:

float | None

semi_major_axis

半长轴 (km)

Type:

float | None

orbital_period

轨道周期 (s)

Type:

float | None

mean_motion

平均角速度 (rad/s)

Type:

float | None

has_L_points

是否已计算平动点

Type:

bool

EARTH_MOON_DISTANCE_KM = 384400.0
AU = 149597870.7
G = 6.6743e-20
DAY = 86400
YEAR = 31557600.0
KNOWN_SYSTEMS: dict[str, dict[str, str | float]] = {'earth_moon': {'distance': 384400.0, 'mu': 0.01215, 'period': 2360448.0, 'primary': 'Earth', 'secondary': 'Moon'}, 'sun_earth': {'distance': 149597870.7, 'mu': 3.0039e-06, 'period': 31557600.0, 'primary': 'Sun', 'secondary': 'Earth'}, 'sun_jupiter': {'distance': 777908927.64, 'mu': 0.0009535, 'period': 374273136.0, 'primary': 'Sun', 'secondary': 'Jupiter'}}
classmethod from_known_system(system_name)[源代码]

从已知系统创建CR3BP系统

参数:

system_name (str) -- 系统名称,如 "earth_moon", "sun_earth", "sun_jupiter"

返回:

CR3BP_System实例

抛出:

ValueError -- 系统名称不在已知系统中

返回类型:

CR3BP_System

__init__(mu, primary, secondary)[源代码]

初始化系统参数

参数:
  • mu (float) -- 质量参数 μ = m2/(m1+m2)

  • primary (str) -- 主天体名称

  • secondary (str) -- 次天体名称

返回类型:

None

primary_body: str
secondary_body: str
mu: float
characteristic_length: float | None
characteristic_time: float | None
characteristic_velocity: float | None
L_points: dict[LibrationPoint, ndarray[tuple[Any, ...], dtype[floating]]] | None
L1: ndarray[tuple[Any, ...], dtype[floating]] | None
L2: ndarray[tuple[Any, ...], dtype[floating]] | None
L3: ndarray[tuple[Any, ...], dtype[floating]] | None
L4: ndarray[tuple[Any, ...], dtype[floating]] | None
L5: ndarray[tuple[Any, ...], dtype[floating]] | None
mass_primary: float | None
mass_secondary: float | None
total_mass: float | None
semi_major_axis: float | None
orbital_period: float | None
mean_motion: float | None
has_L_points: bool
is_initialized: bool
set_characteristic_scales(distance, period)[源代码]

设置特征尺度

参数:
  • distance (float) -- 两天体之间的距离 (km)

  • period (float) -- 轨道周期 (s)

返回类型:

None

compute_libration_points()[源代码]

计算五个平动点

返回:

平动点位置字典,键为 LibrationPoint 枚举,值为坐标数组

返回类型:

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

get_libration_point(point)[源代码]

获取指定平动点

若尚未计算平动点,会自动调用 compute_libration_points()。

参数:

point (LibrationPoint) -- LibrationPoint枚举值

返回:

平动点坐标数组

抛出:

ValueError -- 平动点无效

返回类型:

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

get_jacobi_constant(state)[源代码]

计算Jacobi常数

参数:

state (ArrayLike) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

Jacobi常数

返回类型:

float

dimensionless_to_physical(state)[源代码]

无量纲化转物理单位

参数:

state (ArrayLike) -- 无量纲状态向量 [x, y, z, vx, vy, vz]

返回:

物理状态向量 [km, km/s]

抛出:

ValueError -- 系统未初始化特征尺度

返回类型:

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

physical_to_dimensionless(state)[源代码]

物理单位转无量纲化

参数:

state (ArrayLike) -- 物理状态向量 [x, y, z, vx, vy, vz] (km, km/s)

返回:

无量纲状态向量

抛出:

ValueError -- 系统未初始化特征尺度

返回类型:

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

compute_stability_index(L_point)[源代码]

计算平动点稳定性指标

通过线性化运动方程的特征值分析平动点稳定性。

参数:

L_point (LibrationPoint) -- LibrationPoint枚举值

返回:

稳定性指标字典,包含 is_stable、max_real_part、max_imag_part、 eigenvalues 和 linear_matrix

返回类型:

dict[str, Any]

info(mode='default')[源代码]

输出系统信息

参数:

mode (str) -- 信息模式,"default" 为基础信息,"all" 为详细信息

返回类型:

None

e2m2e.core.dynamics module

三体问题动力学模块

包含通用 Dynamics 基类和 CR3BP_Dynamics 类,用于计算和积分圆型限制性三体问题的动力学方程。

物理背景

在圆型限制性三体问题 (CR3BP) 中,两个主天体(如地球和月球)绕其公共质心做圆周运动, 第三体(航天器)质量小到不影响两个主天体的运动。采用以质心为原点的旋转坐标系, 使得两个主天体固定在 x 轴上。

坐标系约定:
  • 原点:系统质心

  • x 轴:从质心指向较大天体(质量 1-μ)的方向

  • 较大天体位于 x = -μ,较小天体(质量 μ)位于 x = 1-μ

  • y 轴在轨道平面内垂直于 x 轴

  • z 轴与 x-y 平面正交

所有量均采用无量纲化单位(距离单位 DU = 主天体间距,时间单位 TU 使主天体角速度为 1)。

重构说明 (v4.0 MBSE)

采用 Template Method 模式统一传播逻辑: - 基类 Dynamics 拥有 propagate() 模板方法 - 子类覆写 _get_eom_func()_get_max_step() 钩子方法 - 结果提取逻辑统一在基类中,保证 states 形状始终为 (n_points, 6)

class e2m2e.core.dynamics.Dynamics(system)[源代码]

基类:object

通用天体系统动力学基类

采用 Template Method 模式:基类定义 propagate() 的算法骨架, 子类通过钩子方法提供具体的 ODE 函数和步长配置。

契约(对应 MBSE REQ-002): - propagate() 返回的 states 形状始终为 (n_points, 6) - stm``(如果存在)形状为 ``(n_points, 6, 6)

参数:

system (Any)

system

关联的系统对象

integrator

数值积分器类型

Type:

str

rtol

相对积分容差

Type:

float

atol

绝对积分容差

Type:

float

max_step

最大积分步长

Type:

float

last_trajectory

最近一次积分的轨迹 [t, y]

Type:

tuple[numpy.ndarray, numpy.ndarray] | None

last_stm

最近一次积分的状态转移矩阵

cross_section_tolerance

截面检测容差

last_crossing

上次穿过截面的点和时间

initialized

初始化完成标志

DEFAULT_TOLERANCE = 1e-12
DEFAULT_MAX_STEP = 0.01
STATE_DIM = 6
STM_DIMENSION = 42
__init__(system)[源代码]

初始化动力学

参数:

system (Any) -- 系统对象(CR3BP_System 或 EphemerisSystem)

返回类型:

None

integrator: str
rtol: float
atol: float
max_step: float
last_trajectory: tuple[ndarray, ndarray] | None
equations_of_motion(t, state)[源代码]

运动方程(子类需实现)

参数:
返回:

状态导数

抛出:

NotImplementedError -- 子类未实现此方法

返回类型:

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

propagate(initial_state, t_span, t_eval=None, with_stm=False, with_jacobi=False)[源代码]

传播轨迹(Template Method)

统一的传播入口,保证: - states 形状为 (n_points, 6)(REQ-002) - stm 形状为 (n_points, 6, 6)(当 with_stm=True 时) - time 数组单调递增

参数:
  • initial_state (ArrayLike) -- 初始状态向量

  • t_span (tuple[float, float]) -- 时间区间 [t0, tf]

  • t_eval (ArrayLike | None) -- 评估时间点数组(可选)

  • with_stm (bool) -- 是否计算状态转移矩阵

  • with_jacobi (bool) -- 是否沿轨迹逐点计算 Jacobi 常数

返回:

轨迹结果字典,包含 timestates 键; 当 with_stm=True 时额外包含 stm 键; 当 with_jacobi=True 时额外包含 jacobijacobi_error

返回类型:

dict[str, Any]

compute_jacobi_constant(state)[源代码]

计算能量常数(子类需实现)

参数:

state (ArrayLike) -- 状态向量

返回:

能量常数

抛出:

NotImplementedError -- 子类未实现此方法

返回类型:

float

check_cross_section(state, plane, value)[源代码]

检查是否穿过指定截面

参数:
  • state (ArrayLike) -- 状态向量

  • plane (str) -- 截面平面 ('x', 'y', 'z')

  • value (float) -- 平面值

返回:

是否穿过截面

抛出:

ValueError -- 无效的平面参数

返回类型:

bool

class e2m2e.core.dynamics.CR3BP_Dynamics(system)[源代码]

基类:Dynamics

CR3BP动力学方程

封装了CR3BP的动力学模型,提供状态传播、状态转移矩阵计算、 Jacobi常数计算等核心功能。支持6维状态向量(位置+速度)和 42维增广状态向量(状态+状态转移矩阵)的数值积分。

CR3BP 运动方程(旋转坐标系中):

ẍ - 2ẏ = ∂Ω/∂x ÿ + 2ẋ = ∂Ω/∂y z̈ = ∂Ω/∂z

其中 Ω 为伪势能(见 equations_of_motion 方法的详细注释), 等号左侧的 2ẏ、-2ẋ 项为科里奥利力(Coriolis),伪势能中 已包含离心力项 x²/2 + y²/2。

参数:

system (CR3BP_System)

__init__(system)[源代码]

初始化CR3BP动力学

参数:

system (CR3BP_System) -- CR3BP_System对象,包含质量参数μ等系统常数

返回类型:

None

jacobi_history: list[float]
jacobi_error: float
equations_of_motion(t, state)[源代码]

6维状态向量的运动方程

实现 CR3BP 在旋转坐标系中的运动方程。旋转坐标系以两个主天体的 公共质心为原点,与主天体同步旋转(角速度 ω = 1),因此两个主天体 在坐标系中固定不动。

在旋转坐标系中,运动方程为:

ẍ - 2ẏ = ∂Ω/∂x (x 方向:离心力 + 引力 + 科里奥利力) ÿ + 2ẋ = ∂Ω/∂y (y 方向:离心力 + 引力 + 科里奥利力) z̈ = ∂Ω/∂z (z 方向:仅引力,无科里奥利力)

伪势能 Ω = (x² + y²)/2 + (1-μ)/r₁ + μ/r₂,其偏导数为:

∂Ω/∂x = x - (1-μ)(x+μ)/r₁³ - μ(x-1+μ)/r₂³ ∂Ω/∂y = y - (1-μ)y/r₁³ - μy/r₂³ ∂Ω/∂z = - (1-μ)z/r₁³ - μz/r₂³

因此加速度各项的物理含义:
  • "x" / "y" 项:离心力(伪势能中的二次项贡献)

  • "(1-μ)(x+μ)/r₁³" 等:较大天体(如地球)的引力加速度

  • "μ(x-1+μ)/r₂³" 等:较小天体(如月球)的引力加速度

  • "2vy" / "-2vx":科里奥利力(旋转坐标系中的虚拟力)

参数:
  • t (float) -- 时间(旋转坐标系中,CR3BP方程不显含时间,即自治系统)

  • state (ndarray[tuple[Any, ...], dtype[floating]]) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

状态导数 [vx, vy, vz, ax, ay, az]

返回类型:

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

compute_jacobian_A(state)[源代码]

计算 CR3BP 状态方程的雅可比矩阵 A(t)

A(t) 是 6x6 矩阵,满足 dΦ/dt = A(t)·Φ。 结构为:

0₃ₓ₃ I₃ₓ₃ | 位置方程的雅可比:∂(v)/∂(r,v) = [0, I]
U_ij Ω | 速度方程的雅可比:∂(a)/∂(r,v) = [U, Ω]

此方法提取自 equations_with_stm,供 Continuation 等模块复用(REQ-103)。

参数:

state (ndarray[tuple[Any, ...], dtype[floating]]) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

6x6 雅可比矩阵 A

返回类型:

ndarray

equations_with_stm(t, augmented_state)[源代码]

42维增广状态向量的运动方程(包含状态转移矩阵)

同时积分状态向量和状态转移矩阵(STM),满足 dΦ/dt = A(t)·Φ。

状态转移矩阵 Φ(t, t₀) 将初始状态的微小扰动映射到当前时刻:

δx(t) = Φ(t, t₀) · δx(t₀)

通过将 Φ 拉伸为 36 维向量并与 6 维状态拼接为 42 维增广状态, 可以用标准的 ODE 积分器同时求解轨道和 STM。

参数:
返回:

增广状态导数

返回类型:

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

propagate_orbit_state_at_time(orbit, t, integration_dt=0.01)[源代码]

从轨道首点状态积分到给定时刻对应的相位(周期轨道上对周期取模)

利用周期轨道的周期性,将目标时间对周期取模后从轨道起始状态 重新积分,得到该相位处的精确状态。

参数:
  • orbit (Orbit) -- 周期轨道数据(须含 statestimes、有效 period

  • t (float) -- 与轨道 times 一致的时间坐标(绝对时间)

  • integration_dt (float) -- 构造 t_eval 的步长

返回:

积分末端状态 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 轨道无状态或周期无效

返回类型:

npt.NDArray[np.floating]

compute_state_transition_matrix(initial_state, t)[源代码]

计算状态转移矩阵

参数:
  • initial_state (ArrayLike) -- 初始状态向量

  • t (float) -- 积分终止时间

返回:

状态转移矩阵 (6x6)

返回类型:

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

compute_jacobi_constant(state)[源代码]

计算Jacobi常数

参数:

state (ArrayLike) -- 状态向量 [x, y, z, vx, vy, vz]

返回:

Jacobi常数

返回类型:

float

e2m2e.core.dynamics.propagate_state_at_orbit_time(orbit, t, dynamics, integration_dt=0.01)[源代码]

委托 CR3BP_Dynamics.propagate_orbit_state_at_time(),便于顶层导入兼容

参数:
  • orbit (Any) -- 周期轨道数据

  • t (float) -- 目标时间(绝对时间)

  • dynamics (CR3BP_Dynamics) -- CR3BP动力学对象

  • integration_dt (float) -- 积分步长

返回:

积分末端状态

返回类型:

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

e2m2e.core.srp_dynamics module

太阳辐射压动力学模块

实现 CR3BP 框架下的太阳辐射压 (SRP) 扰动。 基于 EXOSIMS 的 equationsOfMotion_CRTBP 实现,采用光学系数模型。

物理背景

太阳辐射压是光子撞击航天器表面产生的力。对于非完美反射表面, SRP 力可分解为径向和切向分量,由光学系数 b1, b2, b3 决定。

光学系数模型(来自 EXOSIMS):
  • b1 = 0.5 * (1 - s * p):漫反射分量

  • b2 = s * p:镜面反射分量

  • b3 = 0.5 * (Bf * (1-s) * p + (1-p) * (ef*Bf - eb*Bb) / (ef + eb)):非朗伯分量

其中:
  • s: 镜面反射因子

  • p: 反射系数

  • Bf, Bb: 前/后表面非朗伯系数

  • ef, eb: 前/后表面发射系数

引用

  • EXOSIMS ObservatoryL2Halo.equationsOfMotion_CRTBP

  • Vallado, D. A. (2013). Fundamentals of Astrodynamics and Applications.

class e2m2e.core.srp_dynamics.CR3BP_SRP_Dynamics(system, area=1.0, mass=1000.0, Cr=1.5, non_lambertian_front=0.038, non_lambertian_back=0.004, specular_reflection=0.975, nreflection_coeff=0.999, emission_front=0.8, emission_back=0.2, P_srp=4.56e-06)[源代码]

基类:CR3BP_Dynamics

带太阳辐射压的 CR3BP 动力学

在标准 CR3BP 运动方程基础上添加太阳辐射压扰动力。 SRP 力模型基于 EXOSIMS 实现,支持非完美反射表面的光学系数。

参数:
area

航天器截面积 (m²)

mass

航天器质量 (kg)

Cr

反射系数 (1=完全吸收, 2=完全反射)

b1

漫反射光学系数

b2

镜面反射光学系数

b3

非朗伯光学系数

beta

SRP 加速度系数 (solar sail parameter)

P_srp

太阳辐射压常数 (N/m² at 1 AU)

示例

>>> from e2m2e.core.system import CR3BP_System
>>> from e2m2e.core.srp_dynamics import CR3BP_SRP_Dynamics
>>> system = CR3BP_System.from_known_system("earth_moon")
>>> dynamics = CR3BP_SRP_Dynamics(system, area=100.0, mass=1000.0)
>>> result = dynamics.propagate([0.8, 0, 0, 0, 0.6, 0], (0, 1))
DEFAULT_NON_LAMBERTIAN_FRONT = 0.038
DEFAULT_NON_LAMBERTIAN_BACK = 0.004
DEFAULT_SPECULAR_REFLECTION = 0.975
DEFAULT_NREFLECTION_COEFF = 0.999
DEFAULT_EMISSION_FRONT = 0.8
DEFAULT_EMISSION_BACK = 0.2
DEFAULT_P_SRP = 4.56e-06
__init__(system, area=1.0, mass=1000.0, Cr=1.5, non_lambertian_front=0.038, non_lambertian_back=0.004, specular_reflection=0.975, nreflection_coeff=0.999, emission_front=0.8, emission_back=0.2, P_srp=4.56e-06)[源代码]

初始化 SRP 动力学

参数:
  • system (CR3BP_System) -- CR3BP_System 对象

  • area (float) -- 航天器截面积 (m²)

  • mass (float) -- 航天器质量 (kg)

  • Cr (float) -- 反射系数 (1=完全吸收, 2=完全反射)

  • non_lambertian_front (float) -- 前表面非朗伯系数

  • non_lambertian_back (float) -- 后表面非朗伯系数

  • specular_reflection (float) -- 镜面反射因子

  • nreflection_coeff (float) -- 反射系数

  • emission_front (float) -- 前表面发射系数

  • emission_back (float) -- 后表面发射系数

  • P_srp (float) -- 太阳辐射压常数 (N/m² at 1 AU)

返回类型:

None

e2m2e.core.orbit module

轨道数据模块

本模块定义了圆型限制性三体问题(CR3BP)中轨道数据的表示与处理逻辑, 是 e2m2e 四层架构中 core 层的核心组件之一。

重构说明 (v4.0 MBSE)

采用组合模式重构 Orbit 类: - 核心数据(states, times, system)直接持有 - 计算属性(period, amplitudes, extrema, center 等)通过 property 代理 - 稳定性属性(monodromy_matrix, eigenvalues, stability 等)通过 property 代理 - 删除所有未使用的保留字段

(radius, shape, orientation, is_quasi_periodic, is_chaotic, segments, segment_indices)

  • 保持 v3 JSON 格式向后兼容

主要类:

Orbit: 单条轨道的数据容器,支持属性计算、序列化/反序列化和稳定性分析。 OrbitFamily: 轨道族容器,用于存储和管理多条同族轨道。

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

基类:object

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

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

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

参数:
  • states (npt.ArrayLike)

  • times (npt.ArrayLike)

  • system (CR3BP_System | None)

states

状态序列 [x, y, z, vx, vy, vz],形状为 (n, 6)

times

时间序列,形状为 (n,)

system

关联的 CR3BP_System 对象

family_type

轨道族类型

Type:

str | None

parameters

轨道参数字典

Type:

dict

metadata

轨道元数据

Type:

dict

jacobi_constants

Jacobi 常数序列

Type:

numpy.ndarray | None

stability_indices

稳定性指标(由外部算法填充)

Type:

dict | None

VALID_FAMILY_TYPES = ['halo', 'lyapunov', 'vertical', 'axial', 'butterfly', 'dragonfly']
VALID_COMPONENTS = ['x', 'y', 'z', 'vx', 'vy', 'vz']
__init__(states, times, system=None)[源代码]

初始化轨道对象

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

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

  • system (CR3BP_System | None) -- CR3BP_System 对象(可选)

抛出:

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

返回类型:

None

jacobi_constants: ndarray | None
stability_indices: dict | None
family_type: str | None
parameters: dict
metadata: dict
property period: float | None
property amplitudes: dict
property extrema: dict
property mean_state: ndarray | None
property center: ndarray | None
property is_periodic: bool
property periodicity_error: float | None
property monodromy_matrix: ndarray | None
property eigenvalues: ndarray | None
property stability: str | None
property lyapunov_exponents: ndarray | None
compute_basic_properties()[源代码]

计算轨道的基本几何与物理属性

自动计算: 1. Jacobi 常数序列(当 system 不为 None) 2. 平均状态向量 3. 位置极值与振幅 4. 轨道中心 5. 周期估计(零交叉检测)

返回类型:

None

compute_monodromy_matrix(dynamics)[源代码]

计算轨道的单值矩阵(Monodromy Matrix)

参数:

dynamics (CR3BP_Dynamics) -- CR3BP_Dynamics 对象

返回:

单值矩阵 (6, 6)

抛出:

ValueError -- 轨道周期未知

返回类型:

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

compute_stability(dynamics)[源代码]

计算轨道的稳定性指标

参数:

dynamics (CR3BP_Dynamics) -- CR3BP_Dynamics 对象

返回:

稳定性分析结果字典

返回类型:

dict[str, Any]

get_period()[源代码]
返回类型:

float | None

get_amplitude(direction)[源代码]

获取指定方向的轨道振幅

参数:

direction (str)

返回类型:

float

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.core.orbit.OrbitFamily(orbits=None, family_type=None, system=None)[源代码]

基类:object

轨道族容器

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

参数:
orbits

Orbit 对象列表

Type:

list[e2m2e.core.orbit.Orbit]

family_type

轨道族类型

system

关联的 CR3BP_System 对象

metadata

轨道族元数据

orbits: list[Orbit]
property states: ndarray[tuple[Any, ...], dtype[floating]]
property periods: ndarray[tuple[Any, ...], dtype[floating]]
add_orbit(orbit)[源代码]
参数:

orbit (Orbit)

返回类型:

None

get_states()[源代码]
返回类型:

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

get_periods()[源代码]
返回类型:

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

get_jacobi_constants()[源代码]
返回类型:

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

save_to_file(filename)[源代码]
参数:

filename (str | Path)

返回类型:

None

classmethod load_from_file(filename, system=None)[源代码]
参数:
返回类型:

OrbitFamily

e2m2e.core.coordinate module

坐标变换模块

包含CoordinateTransformation类,用于在不同参考系之间转换轨道状态。

class e2m2e.core.coordinate.ReferenceFrame(*values)[源代码]

基类:Enum

参考系枚举

ROTATING

旋转系

INERTIAL

惯性系

BARYCENTRIC

质心系

PRIMARY_CENTERED

主天体中心系

SECONDARY_CENTERED

次天体中心系

SYNODIC

会合系(同旋转系)

ROTATING = 'rotating'
INERTIAL = 'inertial'
BARYCENTRIC = 'barycentric'
PRIMARY_CENTERED = 'primary_centered'
SECONDARY_CENTERED = 'secondary_centered'
SYNODIC = 'synodic'
class e2m2e.core.coordinate.CoordinateTransformation(system)[源代码]

基类:object

坐标系变换器

在CR3BP系统的不同参考系之间进行状态向量变换,支持旋转系/惯性系、 质心系/天体中心系之间的转换,并内置旋转矩阵缓存机制。

参数:

system (CR3BP_System)

system

关联的CR3BP_System对象

mu

系统的质量参数

rotation_matrices

旋转矩阵缓存,键为时间,值为3x3旋转矩阵

Type:

dict[float, numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]]]

rotation_matrix_derivatives

旋转矩阵导数缓存

Type:

dict[float, numpy.ndarray[tuple[Any, ...], numpy.dtype[numpy.floating]]]

initialized

初始化完成标志

VELOCITY_TRANSFORM_INCLUDE_CORIOLIS = True
CACHE_ROTATION_MATRICES = True
MAX_CACHE_SIZE = 1000
__init__(system)[源代码]

初始化变换器

参数:

system (CR3BP_System) -- CR3BP_System对象,提供质量参数等信息

返回类型:

None

rotation_matrices: dict[float, ndarray[tuple[Any, ...], dtype[floating]]]
rotation_matrix_derivatives: dict[float, ndarray[tuple[Any, ...], dtype[floating]]]
compute_rotation_matrix(time)[源代码]

计算给定时刻的旋转矩阵及其导数

参数:

time (float) -- 时间(无量纲)

返回:

3x3旋转矩阵

返回类型:

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

rotating_to_inertial(state, time)[源代码]

将状态向量从旋转系转换到惯性系

参数:
  • state (ArrayLike) -- 旋转系状态向量 [x, y, z, vx, vy, vz]

  • time (float) -- 时间(无量纲)

返回:

惯性系状态向量 [x, y, z, vx, vy, vz]

返回类型:

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

inertial_to_rotating(state, time)[源代码]

将状态向量从惯性系转换到旋转系

参数:
  • state (ArrayLike) -- 惯性系状态向量 [x, y, z, vx, vy, vz]

  • time (float) -- 时间(无量纲)

返回:

旋转系状态向量 [x, y, z, vx, vy, vz]

返回类型:

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

barycentric_to_primary(state)[源代码]

将状态向量从质心系转换到主天体中心系

参数:

state (ArrayLike) -- 质心系状态向量 [x, y, z, vx, vy, vz]

返回:

主天体中心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

primary_to_barycentric(state)[源代码]

将状态向量从主天体中心系转换到质心系

参数:

state (ArrayLike) -- 主天体中心系状态向量 [x, y, z, vx, vy, vz]

返回:

质心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

barycentric_to_secondary(state)[源代码]

将状态向量从质心系转换到次天体中心系

参数:

state (ArrayLike) -- 质心系状态向量 [x, y, z, vx, vy, vz]

返回:

次天体中心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

secondary_to_barycentric(state)[源代码]

将状态向量从次天体中心系转换到质心系

参数:

state (ArrayLike) -- 次天体中心系状态向量 [x, y, z, vx, vy, vz]

返回:

质心系状态向量 [x, y, z, vx, vy, vz]

抛出:

ValueError -- 系统未初始化(mu为None)时抛出

返回类型:

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

transform(state, from_frame, to_frame, time=0.0)[源代码]

通用坐标变换接口

参数:
  • state (ArrayLike) -- 状态向量 [x, y, z, vx, vy, vz]

  • from_frame (ReferenceFrame | str) -- 源参考系(ReferenceFrame枚举或字符串)

  • to_frame (ReferenceFrame | str) -- 目标参考系(ReferenceFrame枚举或字符串)

  • time (float) -- 时间(仅对涉及旋转系/惯性系的变换需要)

返回:

变换后的状态向量 [x, y, z, vx, vy, vz]

抛出:

NotImplementedError -- 不支持指定的坐标系变换组合时抛出

返回类型:

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

class e2m2e.core.coordinate.SynodicJ2000Transformation(cr3bp_system, spice)[源代码]

基类:object

CR3BP synodic坐标系与J2000惯性坐标系之间的转换器。

该类提供了CR3BP归一化synodic坐标系与J2000惯性坐标系之间的双向转换, 使用SPICE获取月球瞬时状态来构建旋转矩阵,支持单个状态和批量转换。

参数:

cr3bp_system (CR3BP_System)

cr3bp_system

CR3BP系统对象,提供质量参数等信息

spice

SPICEManager对象,用于获取天体状态

__init__(cr3bp_system, spice)[源代码]

初始化转换器

参数:
  • cr3bp_system (CR3BP_System) -- CR3BP系统对象

  • spice -- SPICEManager对象

返回类型:

None

synodic_to_j2000(state_syn, t_syn, et0)[源代码]

将状态从synodic坐标系转换到J2000惯性坐标系

参数:
  • state_syn (ArrayLike) -- synodic坐标系状态向量 [x, y, z, vx, vy, vz](无量纲)

  • t_syn (float) -- synodic时间(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

J2000坐标系状态向量 [x, y, z, vx, vy, vz](km, km/s)

返回类型:

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

j2000_to_synodic(state_j2000, t_syn, et0)[源代码]

将状态从J2000惯性坐标系转换到synodic坐标系

参数:
  • state_j2000 (ArrayLike) -- J2000坐标系状态向量 [x, y, z, vx, vy, vz](km, km/s)

  • t_syn (float) -- synodic时间(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

synodic坐标系状态向量 [x, y, z, vx, vy, vz](无量纲)

返回类型:

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

batch_synodic_to_j2000(states_syn, t_syn_arr, et0)[源代码]

批量将状态从synodic坐标系转换到J2000惯性坐标系

参数:
  • states_syn (ArrayLike) -- synodic坐标系状态数组,形状 (N, 6)(无量纲)

  • t_syn_arr (ArrayLike) -- synodic时间数组,形状 (N,)(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

J2000坐标系状态数组,形状 (N, 6)(km, km/s)

返回类型:

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

batch_j2000_to_synodic(states_j2000, t_syn_arr, et0)[源代码]

批量将状态从J2000惯性坐标系转换到synodic坐标系

参数:
  • states_j2000 (ArrayLike) -- J2000坐标系状态数组,形状 (N, 6)(km, km/s)

  • t_syn_arr (ArrayLike) -- synodic时间数组,形状 (N,)(TU,无量纲)

  • et0 (float) -- 参考历元的SPICE ephemeris time(秒)

返回:

synodic坐标系状态数组,形状 (N, 6)(无量纲)

返回类型:

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

e2m2e.core.ephemeris_dynamics module

星历动力学模型 —— 在多体 N 体引力场中传播航天器轨道。

本模块实现 EphemerisDynamics,它继承自 Dynamics,利用 SPICE 星历数据提供的高精度天体位置与引力参数,计算多体引力加速度、 状态转移矩阵 (STM) 并完成数值积分传播。

核心物理模型

采用 受限 N 体问题 (Restricted N-Body Problem) 建模:

  1. system.origin 为坐标原点(通常是主天体,如地球)。

  2. 原点天体对航天器施加中心引力加速度。

  3. 其余天体(如月球、太阳等)对航天器施加第三体摄动加速度, 同时扣除其对原点天体的引力加速度(即间接项),以保持坐标原点 位于原点天体而非质心。

加速度公式(以原点天体 P₀ 为中心):

a = - μ₀ r / |r|³
  • Σᵢ μᵢ [ (r - rᵢ) / |r - rᵢ|³ + rᵢ / |rᵢ|³ ]

重构说明 (v4.0 MBSE)

  • 调用 super().__init__() (REQ-005)

  • 覆写 _get_eom_func()_get_max_step() 钩子方法

  • propagate() 继承自基类,states 形状统一为 (n_points, 6) (REQ-002)

  • stm 形状统一为 (n_points, 6, 6)

引用

  • Battin, R. H. An Introduction to the Methods of Astrodynamics.

  • Gurfil, P., & Seidelmann, P. K. Celestial Mechanics and Astrodynamics.

class e2m2e.core.ephemeris_dynamics.EphemerisDynamics(system)[源代码]

基类:Dynamics

星历 N 体动力学类,提供运动方程、STM 变分方程与轨道传播功能。

参数:

system (EphemerisSystem) -- 星历系统配置,包含天体列表、SPICE 内核接口、参考系与原点天体等信息。

integrator

SciPy 积分器名称,默认 ``"DOP853"``(8 阶 Runge-Kutta)。

Type:

str

rtol

相对积分容差。

Type:

float

atol

绝对积分容差。

Type:

float

max_step

积分器最大步长(秒)。

Type:

float

MIN_DISTANCE = 1e-06
equations_of_motion(t, state)[源代码]

计算受限 N 体问题的运动方程右端项(加速度)。

对每个天体分别处理: - 原点天体:中心引力 -μ₀ r/|r|³ - 摄动天体:第三体摄动 -μᵢ [(r-rᵢ)/|r-rᵢ|³ + rᵢ/|rᵢ|³]

第二项为间接项(扣除摄动天体对原点的引力)。

参数:
  • t (float) -- 历元时刻(ephemeris seconds past J2000),用于查询天体星历位置。

  • state (ndarray[tuple[Any, ...], dtype[floating]]) -- 航天器状态向量,形状 (6,),前 3 个元素为位置 [km], 后 3 个元素为速度 [km/s]。

返回:

状态导数向量,形状 (6,),即 [v, a]

返回类型:

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

compute_jacobian_A(t, state)[源代码]

计算星历 N 体状态方程的雅可比矩阵 A(t)。

A = | 0₃ₓ₃ I₃ₓ₃ |
U₃ₓ₃ 0₃ₓ₃ |

其中 U = ∂a/∂r 是加速度对位置的偏导数 (3x3)。 N 体问题中无速度相关力,因此 ∂a/∂v = 0。

参数:
返回:

雅可比矩阵,形状 (6, 6)

返回类型:

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

equations_with_stm(t, augmented_state)[源代码]

计算含状态转移矩阵 (STM) 的增广运动方程右端项。

增广状态向量布局:[r(3), v(3), Φ(36)],共 42 维。 其中 Φ 为 6×6 状态转移矩阵按行展平。

参数:
返回:

增广状态导数向量,形状 (42,),即 [v, a, dΦ/dt_flat]

返回类型:

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

e2m2e.core.ephemeris_system module

星历系统模块。

提供天体位置、引力常数等星历信息的统一查询接口, 底层通过 SPICE 工具包获取数据。

class e2m2e.core.ephemeris_system.EphemerisSystem(bodies, spice, origin='EARTH', frame='J2000')[源代码]

基类:object

星历系统,管理一组天体的星历查询。

封装 SPICE 工具包,为轨道设计流程提供统一的天体数据访问层。 支持自定义参考原点和坐标框架。

参数:
bodies

天体名称列表,如 ["EARTH", "MOON", "SUN"]。

spice

SPICE 管理器实例,负责底层星历数据读取。

origin

参考原点天体名称,默认为 "EARTH"。

frame

坐标系名称,默认为 "J2000"。

__init__(bodies, spice, origin='EARTH', frame='J2000')[源代码]

初始化星历系统。

参数:
  • bodies (list[str]) -- 需要纳入计算的天体名称列表。

  • spice (SPICEManager) -- 已完成内核加载的 SPICE 管理器实例。

  • origin (str) -- 参考原点天体,所有位置矢量将相对于此天体计算。

  • frame (str) -- 参考坐标系名称,用于确定位置矢量的坐标框架。

返回类型:

None

get_body_position(body, et)[源代码]

获取天体相对于原点的位置向量。

自动使用初始化时设定的 frame 和 origin。

参数:
  • body (str) -- 天体名称,如 "MOON"、"SUN"。

  • et (float) -- 历书时(秒)。

返回:

位置向量,形状 (3,),单位 km。

返回类型:

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

get_body_state(body, et)[源代码]

获取天体相对于原点的状态向量。

自动使用初始化时设定的 frame 和 origin。

参数:
  • body (str) -- 天体名称,如 "MOON"、"SUN"。

  • et (float) -- 历书时(秒)。

返回:

状态向量,形状 (6,),前 3 元素为位置 [km],后 3 元素为速度 [km/s]。

返回类型:

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

get_gm(body)[源代码]

获取天体的引力参数 GM。

参数:

body (str) -- 天体名称。

返回:

GM 值,单位 km³/s²。

返回类型:

float

get_gm_values()[源代码]

获取所有管理天体的引力常数 (GM) 值。

返回:

与 self.bodies 顺序对应的 GM 值数组,单位通常为 km³/s²。

返回类型:

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

e2m2e.core.spice module

SPICE 工具封装模块。

本模块对 spiceypy(NASA SPICE 工具包的 Python 绑定)进行二次封装, 提供天体星历查询、时间转换、以及内核文件管理等常用功能, 使其更易于在轨道设计流程中使用。

SPICE 内核文件说明

SPICE 内核是 NASA NAIF 提供的数据文件,包含天体星历、姿态、时间转换等信息。 本模块使用两类内核:

  1. **闰秒内核**(.tls):提供 UTC ↔ ET 时间转换所需的闰秒表。 模块会自动在 kernels/ 目录和 SPICE_KERNEL_DIR 环境变量指定的路径中 搜索并加载 .tls 文件,无需手动操作。

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

支持的星历内核(按推荐优先级):

文件名

说明

de440.bsp

JPL DE440(推荐,覆盖 1550–2650 年)

de440s.bsp

JPL DE440 精简版(覆盖 1849–2150 年)

de435.bsp

JPL DE435(覆盖 1550–2650 年)

de438.bsp

JPL DE438(覆盖 1550–2650 年)

内核文件获取:从 NASA NAIF 下载, 或设置 SPICE_KERNEL_DIR 环境变量指向已下载的内核目录。

典型用法

手动指定路径加载:

from e2m2e.core import SPICEManager

mgr = SPICEManager()
mgr.load_kernel("path/to/de440.bsp")

et = mgr.utc_to_et("2024-01-01T00:00:00")
state = mgr.get_body_state("MOON", et, "J2000", "EARTH")
mgr.unload_kernel("path/to/de440.bsp")

自动搜索内核文件:

from e2m2e.core import SPICEManager

mgr = SPICEManager()
kernel = mgr.find_ephemeris_kernel("/path/to/kernels")
mgr.load_kernel(kernel)

# ... 使用完毕后卸载
mgr.unload_kernel(kernel)
class e2m2e.core.spice.SPICEManager[源代码]

基类:object

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

标记闰秒内核是否已加载,避免重复加载。

Type:

bool

__init__()[源代码]

初始化 SPICE 管理器。

返回类型:

None

load_kernel(path)[源代码]

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

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

参数:

path (str) -- 内核文件的路径。

抛出:

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

返回类型:

None

unload_kernel(path)[源代码]

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

参数:

path (str) -- 之前通过 load_kernel 加载的内核文件路径。

返回类型:

None

utc_to_et(utc_str)[源代码]

将 UTC 时间字符串转换为 Ephemeris Time(历书时,单位秒)。

参数:

utc_str (str) -- ISO 格式的 UTC 时间字符串,如 "2024-01-01T00:00:00"

返回:

对应的 ET 值(秒)。

返回类型:

float

et_to_utc(et)[源代码]

将 Ephemeris Time(历书时)转换为 UTC 时间字符串。

参数:

et (float) -- 历书时(秒)。

返回:

ISO 格式的 UTC 时间字符串。

返回类型:

str

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

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

参数:
  • target (str) -- 目标天体名称或 NAIF ID,如 "MOON"

  • et (float) -- 历书时(秒)。

  • frame (str) -- 参考坐标系名称,如 "J2000""ECLIPJ2000"

  • observer (str) -- 观察者天体名称或 NAIF ID,如 "EARTH"

返回:

长度为 6 的 NumPy 数组,前 3 个元素为位置 (km),后 3 个为速度 (km/s)。

返回类型:

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

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

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

参数:
  • target (str) -- 目标天体名称或 NAIF ID。

  • et (float) -- 历书时(秒)。

  • frame (str) -- 参考坐标系名称。

  • observer (str) -- 观察者天体名称或 NAIF ID。

返回:

长度为 3 的 NumPy 数组,表示位置 (km)。

返回类型:

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

find_ephemeris_kernel(search_dir)[源代码]

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

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

参数:

search_dir (str) -- 要搜索的目录路径。

返回:

找到的第一个 .bsp 内核文件的绝对路径。

抛出:

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

返回类型:

str

get_gm(body)[源代码]

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

优先从本地缓存字典中查找;若未命中,则通过 SPICE 内核实时读取。

参数:

body (str) -- 天体名称(如 "EARTH""MOON")或 NAIF ID。

返回:

该天体的 GM 值(km³/s²)。

返回类型:

float