コンテンツにスキップ

座標変換

ベクトル量(磁場、位置)は、スキーマに座標系を持っています。たとえばLMAGのmagnetic_fieldはMOON_ME、 magnetic_field_gseはGSEです。別の座標系への変換はtransform()で明示し、 SPICEカーネルなど変換に使った条件をFrameContextにまとめて来歴に残します。

変換する

# 変換元と変換先の両方の座標系を定義するカーネル(ここではメタカーネル)を渡す
frames = spn.FrameContext(spice_kernels=("kernels/kaguya.tm",))

b = spn.kaguya.lmag.magnetic_field.load(time)        # MOON_ME
b_sc = b.transform("SELENE_M_SPACECRAFT", context=frames)
b_sc.metadata["operations"]                           # 変換元・変換先・バックエンド・カーネルの記録

時刻ごとの3成分ベクトルの配列を直接変換することもできます。

frames.transform_vectors(
    [[1.0, 0.0, 0.0]],
    times=["2008-01-01T00:00:00"],
    source_frame="MOON_ME",
    target_frame="SELENE_M_SPACECRAFT",
)

Viewから作る場合はview.frame_context()で、Viewに設定したSPICEカーネル・時刻系・バックエンドを使います。

変換の規則

  • 同じ座標系への変換は恒等変換として記録だけを残します。
  • 異なる座標系への変換は、現在spiceypy(SPICE)で行います。時刻カーネルと、変換元・変換先を定義する フレームカーネル・天体暦をspice_kernelsに渡してください。足りない場合は推定で補わずFrameTransformErrorで止まります。 SSEやGSEはNAIFの汎用カーネルに含まれないため、それらを定義するフレームカーネルが別に必要です。
  • GSE・GSM・SMの間の変換はspacepyで行う予定で、まだ実装していません。 frames.plan("GSE", "GSM")のstatusは"planned"になり、変換を試みるとFrameTransformErrorになります。

frames.plan(source, target)は、実行せずに選ばれるバックエンドと状態(applied、implemented、planned)を返します。 frames.metadata()は、環境にインストールされているバックエンド(available_backends)と、 SOPRANが実装済みとして扱うもの(implemented_backends)を分けて返します。

バックエンドは通常指定しません。研究上固定したい場合だけ、FrameContext(default_backend="spiceypy")や project.view(..., backend={"frames": "spiceypy"})で指定します。

SPICEカーネルの入手

KAGUYAのorbit.szaは、カーネルを渡さずdownloadがneverでない場合、NAIFの汎用カーネル (うるう秒、月の座標系、DE421)を自動で取得してStoreのraw/spice/kernels/に置きます。 それ以外の変換では、利用者がカーネルを用意してFrameContextへ渡します。 KAGUYAの姿勢を含むカーネルはsopran.missions.kaguya.selene_spice_kernels(store, time)で取得できます。

主な座標系

名前 意味
MOON_ME 月固定のMean Earth/Polar Axis系
SSE 月中心のSelenocentric Solar Ecliptic系
GSE 地球中心のGeocentric Solar Ecliptic系
GSM 地球中心のGeocentric Solar Magnetospheric系
SELENE_M_SPACECRAFT KAGUYA(SELENE)の機体座標系。PACEの視線方向の基準