Halo 轨道

Halo 轨道是围绕共线平动点(L1 或 L2)的三维周期轨道,从地球看呈"光环"状。

初始猜测

Richardson 三阶解析近似为 Halo 轨道提供初始猜测:

from e2m2e.algorithm.family.halo_initial_guess import compute_halo_initial_guess

# L1 Halo,z 方向振幅 0.001(小振幅种子,Richardson 近似精度高)
guess = compute_halo_initial_guess(mu=system.mu, z_amplitude=0.001, L=1, halo_class=0)

print(f"x0 = {guess['x0']}")
print(f"vy0 = {guess['vy0']}")
print(f"半周期 = {guess['T_half']}")

halo_class 区分 Halo 族的分支:

  • 0:北族 Halo(z0 > 0)

  • 1:南族 Halo(z0 < 0)

L 选择平动点:1 为 L1,2 为 L2。

微分修正

用 Halo 专用策略将解析近似精化为精确周期轨道:

from e2m2e.algorithm.solver import DifferentialCorrection
from e2m2e.data.types.orbit import Orbit
import numpy as np

# 1. 组装初始状态
initial_state = np.array([
    guess["x0"], 0.0, 0.001,
    0.0, guess["vy0"], 0.0,
])

# 2. Halo 微分修正策略
corrector = DifferentialCorrection(dynamics)
corrector.setup_halo_orbit_fixed_z0(z0=0.001, libration_point=1)

initial_guess = Orbit(
    states=initial_state.reshape(1, -1),
    times=np.array([0.0]),
    system=system,
)
initial_guess.period = guess["T_half"] * 2

# 3. 执行修正
halo_result = corrector.iterate_correction(initial_guess=initial_guess)
halo = halo_result.orbit  # 修正后的轨道(None 表示失败)
if halo is not None:
    print(f"Halo 周期: {halo.period:.6f}")

轨道族生成

从修正后的种子 Halo 出发,用延拓法生成一族 Halo 轨道:

# 1. 先生成种子轨道(种子宜取小振幅,Richardson 近似精度高,由延拓放大)
seed_orbit = continuation.generate_halo_seed_orbit(
    libration_point=1,
    amplitude_z=0.001,
    halo_class=0,        # 0=北族,1=南族
)

# 2. 从种子出发做自然参数延拓,返回 Orbit 列表
family = continuation.generate_halo_family(
    seed_orbit,
    n_orbits=50,
    z_range=(0.001, 0.15),   # z 振幅范围
)

print(f"生成 {len(family)} 条 Halo 轨道")

NRHO(近直线晕轨道)

高振幅 Halo 轨道呈现近直线形态(NRHO),是月球 Gateway 空间站的典型轨道构型。 通过增大 z 振幅(如 amplitude_z > 0.1)即可生成。

参考

  • Richardson D L. Analytical construction of a periodic solution about the collinear points[J]. Celestial Mechanics, 1980, 22(3): 303-320.

  • Howell K C. Three-dimensional, periodic, 'halo' orbits in the restricted three-body problem[D]. Stanford University, 1983.