人工衛星の角運動量管理 — ホイールと外部トルクによるバランス

人工衛星が地球を周回しているとき、衛星には常にさまざまな外乱トルクが作用しています。重力傾度トルク、太陽輻射圧トルク、空気抵抗トルク、地磁場との相互作用によるトルクなど、これらは小さいながらも蓄積すると衛星の姿勢を大きく乱します。

ここで素朴な疑問が浮かびます。衛星には限られた推進剤しか搭載できないのに、何年にもわたって姿勢を維持し続けることができるのはなぜでしょうか?

答えは角運動量の管理戦略にあります。衛星内部のリアクションホイールで瞬時の姿勢制御を行い、蓄積した余分な角運動量を磁気トルカやスラスタで定期的に宇宙空間に排出する — この二段構えの仕組みが、現代の衛星姿勢制御の基盤です。

角運動量管理を理解すると、以下のような実践的な問題に取り組めるようになります。

  • 衛星のミッション寿命設計: ホイールの角運動量容量から、アンローディング頻度と推進剤消費量を見積もれます
  • 姿勢制御系のアーキテクチャ設計: モーメンタムバイアス方式とゼロモーメンタム方式の選択判断ができます
  • 外乱トルクの補償戦略: どの外乱をどのアクチュエータで対処するかを体系的に設計できます

本記事の内容

  • 衛星全系の角運動量保存則
  • 内部トルク(ホイール)と外部トルク(スラスタ・磁気トルカ)の役割分担
  • モーメンタムバイアス方式の原理と特徴
  • ゼロモーメンタム方式との比較
  • 角運動量の蓄積問題
  • アンローディングの方法(磁気トルカ・スラスタ)
  • Pythonによる角運動量蓄積とアンローディングのシミュレーション

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

衛星全系の角運動量 — 保存則と分配

衛星を「系」として見る

衛星は単一の剛体ではなく、衛星本体(バス)と内部に搭載されたリアクションホイール(RW)などの回転体を含む「系」です。この系全体の角運動量がどのように振る舞うかを理解することが、角運動量管理の出発点です。

身近な例で考えてみましょう。氷の上でスケーターが腕を広げた状態から腕を縮めると、回転が速くなります。これは角運動量保存の例ですが、スケーターの体内で角運動量が「腕」から「胴体」に再分配されたとも解釈できます。衛星の角運動量管理も、本質的にはこれと同じ原理に基づいています。

全系の角運動量

衛星本体の角運動量を $\bm{H}_{\text{body}}$、搭載されたホイール群の角運動量の合計を $\bm{H}_{\text{wheel}}$ とすると、衛星全系の角運動量は

$$ \bm{H}_{\text{total}} = \bm{H}_{\text{body}} + \bm{H}_{\text{wheel}} $$

と表されます。ここで、

$$ \bm{H}_{\text{body}} = \bm{I}_{\text{body}} \bm{\omega} $$

は衛星本体の慣性テンソル $\bm{I}_{\text{body}}$ と衛星の角速度 $\bm{\omega}$ から決まり、

$$ \bm{H}_{\text{wheel}} = \sum_{i=1}^{n} I_{w,i} \Omega_i \hat{\bm{a}}_i $$

は各ホイール $i$ の回転軸方向の単位ベクトル $\hat{\bm{a}}_i$、ホイールの軸まわり慣性モーメント $I_{w,i}$、ホイール角速度 $\Omega_i$ から決まります。

角運動量変化則

慣性座標系での全系の角運動量変化は外部トルクのみによって決まります。

$$ \begin{equation} \frac{d\bm{H}_{\text{total}}}{dt} = \bm{N}_{\text{ext}} \end{equation} $$

ここで $\bm{N}_{\text{ext}}$ は衛星に作用する外部トルクの合計です。

極めて重要な点: ホイールが衛星本体に及ぼすトルクは内部トルクであり、系全体の角運動量を変化させることはできません。ホイールのトルクは角運動量を本体とホイールの間で交換するだけです。ニュートンの第3法則により、ホイールが本体に及ぼすトルクと本体がホイールに及ぼすトルクは等大逆向きだからです。

内部トルクと外部トルクの分離

この性質に基づき、姿勢制御で使うアクチュエータは2種類に大別されます。

内部トルクアクチュエータ(角運動量交換装置):

  • リアクションホイール(RW)
  • モーメンタムホイール(MW)
  • コントロールモーメントジャイロ(CMG)

これらは系全体の角運動量を変えずに、本体の姿勢(角速度)を制御します。高精度で応答が速いのが利点ですが、角運動量を蓄積するという限界があります。

外部トルクアクチュエータ:

  • スラスタ(ガスジェット)
  • 磁気トルカ(MTQ)
  • ソーラーセイル

これらは系全体の角運動量を変化させることができます。蓄積した角運動量を宇宙空間に排出(アンローディング)するために使われます。ただし、精度や応答速度では内部トルクに劣ります。

この2種類を組み合わせた「内部トルクで精密制御 + 外部トルクで角運動量排出」が、現代の衛星姿勢制御の基本戦略です。

これを具体的にどう実現するかを見るために、まず衛星本体とホイールの角運動量交換の数学的な定式化に進みましょう。

角運動量交換の数学的定式化

衛星本体のダイナミクス

衛星本体のオイラー方程式にホイールのトルクを加えると、次のようになります。

$$ \bm{I}_{\text{body}} \dot{\bm{\omega}} + \bm{\omega} \times (\bm{I}_{\text{body}} \bm{\omega}) = \bm{N}_{\text{ext}} – \dot{\bm{H}}_{\text{wheel}} – \bm{\omega} \times \bm{H}_{\text{wheel}} $$

右辺の第2項 $-\dot{\bm{H}}_{\text{wheel}}$ はホイール角運動量の変化、つまりホイールが本体に及ぼす反作用トルクです。第3項 $-\bm{\omega} \times \bm{H}_{\text{wheel}}$ はジャイロスコピック結合項で、ホイールの角運動量と衛星の回転の相互作用です。

制御トルクとしてのホイールトルク

ホイールが本体に及ぼす制御トルクは

$$ \bm{N}_{\text{ctrl}} = -\dot{\bm{H}}_{\text{wheel}} $$

です。ホイールを加速すると、反作用として本体にはホイールの加速方向と逆向きのトルクが生じます。

$$ \bm{N}_{\text{ctrl}} = -\sum_{i=1}^{n} I_{w,i} \dot{\Omega}_i \hat{\bm{a}}_i $$

たとえば、+X軸方向に配置されたホイールの回転速度を増加させると($\dot{\Omega} > 0$)、衛星本体には -X軸方向のトルクが作用して、本体は -X方向に角加速されます。

全系の角運動量バランス

全系の角運動量変化をまとめると、

$$ \dot{\bm{H}}_{\text{body}} + \dot{\bm{H}}_{\text{wheel}} = \bm{N}_{\text{ext}} $$

外部トルク $\bm{N}_{\text{ext}} = \bm{0}$ のとき、

$$ \dot{\bm{H}}_{\text{body}} = -\dot{\bm{H}}_{\text{wheel}} $$

つまり、ホイールの角運動量変化と本体の角運動量変化は常に等大逆向きです。本体の姿勢を変えたいとき、その分だけホイールに角運動量を移す(または引き取る)ことで実現します。

この等式が示すのは、ホイールは「角運動量の貯蔵庫」であるということです。衛星本体の姿勢を変えるたびに、ホイールの角運動量が対応して変化します。しかしホイールには物理的な回転速度の上限(飽和速度)があるため、ホイールに蓄積できる角運動量には限界があります。

次にこの限界を管理する2つの代表的な方式を見ていきましょう。

モーメンタムバイアス方式

基本原理

モーメンタムバイアス方式は、1つまたは複数のモーメンタムホイール(MW)を一定角速度で回転させ、大きな角運動量を維持する方式です。この方式はジャイロスコープの安定性原理を利用しています。

大きな角運動量 $\bm{H}_{\text{bias}}$ を持つシステムは、外乱トルクに対してジャイロスコピックな剛性(gyroscopic stiffness)を示します。地球ゴマが倒れずに立ち続けるのと同じ原理で、衛星も角運動量ベクトルの方向を宇宙空間で維持しようとします。

1軸モーメンタムバイアス

最もシンプルな構成は、ピッチ軸(Y軸)に1つのモーメンタムホイールを配置する方式です。

$$ \bm{H}_{\text{bias}} = H_0 \hat{\bm{y}} $$

ピッチ軸方向に大きな角運動量バイアス $H_0$ があるとき、ロール軸・ヨー軸の運動方程式は次のように結合します。

$$ I_x \dot{\omega}_x – H_0 \omega_z \approx N_x $$

$$ I_z \dot{\omega}_z + H_0 \omega_x \approx N_z $$

$H_0 \omega_z$ と $H_0 \omega_x$ はジャイロスコピック結合項です。$H_0$ が十分大きいとき、これらの項が外乱トルクによる角速度変化を抑制し、受動的にロール・ヨー方向の安定性を提供します。

モーメンタムバイアスの利点と欠点

利点:

  • 構成が単純(ホイール1本でロール・ヨーの受動安定化が可能)
  • 地球指向に適している(軌道周期に同期した運動モードを利用)
  • 低コスト・高信頼

欠点:

  • 大角度のマヌーバが苦手(大きな角運動量があるため、姿勢変更に大きなトルクが必要)
  • ピッチ制御は別途必要(ホイール速度を微調整して制御)
  • ジャイロスコピック効果により、ロールとヨーが結合する

この方式は、静止軌道の通信衛星など、主に地球指向を維持するミッションで広く使われてきました。

一方、三軸自由に姿勢を変更したい場合や、高精度のポインティングが必要な場合には、次に紹介するゼロモーメンタム方式が適しています。

ゼロモーメンタム方式

基本原理

ゼロモーメンタム方式は、ホイール全体の角運動量がほぼゼロ(名目状態でホイール速度がゼロまたは低速)の状態で、リアクションホイール(RW)を能動的に制御して姿勢を維持する方式です。

$$ \bm{H}_{\text{wheel}} \approx \bm{0} \quad (\text{名目状態}) $$

モーメンタムバイアス方式とは異なり、ジャイロスコピックな受動安定性は利用しません。代わりに、各軸のRWに個別のフィードバック制御(典型的にはPD制御)をかけることで、全3軸を能動的に安定化します。

モーメンタムバイアス方式との比較

特性 モーメンタムバイアス ゼロモーメンタム
ホイール構成 MW 1本 + 必要に応じてRW RW 3本 + 冗長1本(計4本が典型)
安定化方式 ジャイロスコピック(受動的) フィードバック制御(能動的)
ロール・ヨー結合 結合する 独立制御可能
大角度マヌーバ 困難 容易
ポインティング精度 中程度 高精度
典型的用途 静止衛星、地球指向 地球観測衛星、科学衛星

現代の高性能衛星では、ゼロモーメンタム方式が主流です。特にリモートセンシング衛星では、さまざまな方向にセンサを向ける必要があるため、三軸自由にマヌーバできるゼロモーメンタム方式が適しています。

どちらの方式を選択しても、外部トルクによる角運動量の蓄積は避けられません。次に、この蓄積問題とその解決策であるアンローディングを詳しく見ていきます。

角運動量の蓄積問題

外部外乱トルクの種類

宇宙空間で衛星に作用する主な外乱トルクは以下の通りです。

重力傾度トルク:

$$ \bm{N}_{\text{gg}} = \frac{3\mu}{r^3} \hat{\bm{r}} \times (\bm{I} \hat{\bm{r}}) $$

ここで $\mu$ は地球の重力定数、$r$ は軌道半径、$\hat{\bm{r}}$ は地球中心から衛星への単位ベクトル、$\bm{I}$ は衛星の慣性テンソルです。衛星の慣性モーメントが異方的であるときに生じます。

太陽輻射圧トルク:

$$ \bm{N}_{\text{srp}} = \bm{r}_{\text{cp/cm}} \times \bm{F}_{\text{srp}} $$

太陽光の輻射圧が衛星表面に作用する力のモーメントです。圧力中心と重心のオフセットに比例します。

空気抵抗トルク(低軌道):

$$ \bm{N}_{\text{aero}} = \bm{r}_{\text{ca/cm}} \times \bm{F}_{\text{drag}} $$

低軌道衛星では希薄大気の抵抗力がトルクを生じます。空力中心と重心のオフセットに比例します。

残留磁気トルク:

$$ \bm{N}_{\text{mag}} = \bm{m}_{\text{residual}} \times \bm{B} $$

衛星内部の残留磁気モーメントと地磁場の相互作用によるトルクです。

典型的な外乱トルクの大きさ

低地球軌道(LEO)の小型衛星(数百kg級)を想定すると、

外乱トルク 典型的な大きさ
重力傾度 $10^{-6}$ ~ $10^{-4}$ Nm
太陽輻射圧 $10^{-6}$ ~ $10^{-5}$ Nm
空気抵抗 $10^{-6}$ ~ $10^{-4}$ Nm
残留磁気 $10^{-6}$ ~ $10^{-5}$ Nm

これらは非常に小さいトルクですが、軌道を周回し続けるとホイールに角運動量が蓄積していきます。

蓄積の数学的記述

全系の角運動量変化則より、

$$ \dot{\bm{H}}_{\text{total}} = \bm{N}_{\text{ext,dist}} $$

姿勢制御系がホイールで外乱を吸収すると、

$$ \dot{\bm{H}}_{\text{wheel}} \approx -\bm{N}_{\text{ext,dist}} $$

ここで衛星本体の姿勢は制御により一定に保たれている($\dot{\bm{H}}_{\text{body}} \approx 0$)と仮定しています。

1軌道周期 $T_{\text{orb}}$ にわたって蓄積する角運動量は、

$$ \Delta \bm{H}_{\text{wheel}} = -\int_0^{T_{\text{orb}}} \bm{N}_{\text{ext,dist}} \, dt $$

外乱トルクが周期的であれば1軌道の平均は小さくなりますが、非周期的成分(セキュラー成分)があると角運動量は蓄積し続けます。たとえば太陽輻射圧トルクは軌道面と太陽方向の関係で一定方向に偏ることがあり、1日あたり $0.01$ ~ $1$ Nms のオーダーで角運動量が蓄積します。

ホイールの最大回転速度 $\Omega_{\max}$ に達すると、それ以上の角運動量を吸収できなくなります(ホイール飽和)。飽和したホイールは姿勢制御の能力を失い、衛星は姿勢喪失の危機に陥ります。

この問題を解決するのがアンローディングです。次のセクションで、その具体的な方法を見ていきましょう。

アンローディング — 蓄積した角運動量の排出

アンローディングの基本原理

アンローディング(momentum unloading, desaturation)とは、ホイールに蓄積した余分な角運動量を外部トルクを使って宇宙空間に排出し、ホイールの回転速度を名目値付近に戻す操作です。

アンローディング中は以下の等式が成り立ちます。

$$ \dot{\bm{H}}_{\text{total}} = \bm{N}_{\text{ext,unload}} $$

$$ \dot{\bm{H}}_{\text{body}} + \dot{\bm{H}}_{\text{wheel}} = \bm{N}_{\text{ext,unload}} $$

姿勢を維持したまま($\dot{\bm{H}}_{\text{body}} \approx 0$)、ホイールの角運動量を減少させるには、

$$ \dot{\bm{H}}_{\text{wheel}} = \bm{N}_{\text{ext,unload}} $$

つまり、ホイールの蓄積角運動量とは逆方向の外部トルクを加える必要があります。

磁気トルカによるアンローディング

磁気トルカ(MTQ)は磁気双極子モーメント $\bm{m}$ を生成し、地磁場 $\bm{B}$ との相互作用でトルクを発生します。

$$ \bm{N}_{\text{mag}} = \bm{m} \times \bm{B} $$

制約: 磁気トルカは地磁場に平行な方向のトルクを発生できません。$\bm{N}_{\text{mag}}$ は常に $\bm{B}$ に垂直な面内にしか生成できないためです。

アンローディング制御則の一例として、蓄積角運動量 $\bm{H}_{\text{wheel}}$ に比例した制御があります。

$$ \bm{m} = -k \frac{\bm{H}_{\text{wheel}} \times \bm{B}}{|\bm{B}|^2} $$

ここで $k > 0$ はゲインです。この制御則は、磁場方向の制約を考慮しつつ、蓄積角運動量を減少させるトルクを生成します。

磁気トルカのアンローディングは消耗品を使わない(電力のみ)という大きな利点がありますが、地磁場方向に依存するため完全な3軸制御はできず、軌道に沿って地磁場方向が変化する中で平均的に角運動量を排出する戦略が必要です。

スラスタによるアンローディング

スラスタ(ガスジェット)は任意の方向にトルクを発生できるため、磁気トルカの方向制約がありません。

$$ \bm{N}_{\text{thruster}} = \sum_i \bm{r}_i \times F_i \hat{\bm{n}}_i $$

ここで $\bm{r}_i$ はスラスタ位置、$F_i$ は推力、$\hat{\bm{n}}_i$ は噴射方向です。

スラスタによるアンローディングは、ホイールの蓄積角運動量が閾値を超えたときにパルス状に実行されるのが一般的です。

$$ \bm{N}_{\text{unload}} = -k_p (\bm{H}_{\text{wheel}} – \bm{H}_{\text{ref}}) $$

利点: 任意方向にトルク生成可能、即座にアンローディング完了

欠点: 推進剤を消費する(ミッション寿命に直結)、推力の不連続性(パルス制御)

2つの方式の使い分け

特性 磁気トルカ スラスタ
推進剤消費 なし(電力のみ) あり
トルク方向 磁場に垂直方向のみ 任意方向
トルク大きさ 小($10^{-4}$ ~ $10^{-2}$ Nm) 大($10^{-2}$ ~ $10$ Nm)
応答速度 遅い(数軌道かけて排出) 速い(数分で完了)
適用軌道 LEO(地磁場が強い) 全軌道

LEOの小型衛星では磁気トルカが主流、GEOの大型衛星ではスラスタが主流ですが、両者を組み合わせて使用する衛星も多くあります。

理論的な枠組みを整えたところで、Pythonで角運動量の蓄積とアンローディングをシミュレーションしてみましょう。

Pythonによる角運動量管理シミュレーション

シミュレーション設定

LEO衛星を想定し、一定の外乱トルクによるホイール角運動量の蓄積と、磁気トルカによるアンローディングをシミュレーションします。

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# 衛星パラメータ
I_body = np.diag([20.0, 25.0, 15.0])  # 衛星本体の慣性テンソル [kg m^2]
I_wheel = 0.05  # 各ホイールの慣性モーメント [kg m^2]
omega_max = 6000 * 2 * np.pi / 60  # ホイール最大回転速度 [rad/s] (6000 rpm)
H_max = I_wheel * omega_max  # ホイール最大角運動量 [Nms]

# 外乱トルク (一定と仮定)
N_dist = np.array([2e-5, 5e-5, 1e-5])  # [Nm]

# 軌道パラメータ
T_orb = 5400  # 軌道周期 [s] (90分)
omega_orb = 2 * np.pi / T_orb

print(f"ホイール最大角運動量: {H_max:.3f} Nms")
print(f"ホイール最大回転速度: {omega_max:.1f} rad/s ({omega_max*60/(2*np.pi):.0f} rpm)")
print(f"外乱トルク: {N_dist} Nm")
print(f"1軌道あたりの角運動量蓄積:")
for i, axis in enumerate(['X', 'Y', 'Z']):
    dH = abs(N_dist[i]) * T_orb
    print(f"  {axis}軸: {dH:.4f} Nms")
    print(f"  飽和までの軌道数: {H_max/dH:.1f} 周")
# ケース1: アンローディングなし(角運動量蓄積のみ)
def dynamics_no_unload(t, state):
    """アンローディングなしの角運動量蓄積"""
    Hw = state[:3]  # ホイール角運動量 [Nms]
    # 外乱トルクをホイールが吸収
    dHw = -N_dist  # ホイールは外乱を打ち消す方向に角運動量を蓄積
    return np.concatenate([dHw])

# 10軌道分のシミュレーション
t_sim = 10 * T_orb
t_span = (0, t_sim)
t_eval = np.linspace(0, t_sim, 5000)

state0 = np.zeros(3)  # 初期ホイール角運動量 = 0
sol_no_unload = solve_ivp(dynamics_no_unload, t_span, state0,
                           t_eval=t_eval, rtol=1e-10, atol=1e-12)

fig, axes = plt.subplots(2, 1, figsize=(12, 8))

# ホイール角運動量
for i, (label, color) in enumerate(zip(['X', 'Y', 'Z'], ['#e74c3c', '#2ecc71', '#3498db'])):
    axes[0].plot(sol_no_unload.t / T_orb, sol_no_unload.y[i],
                label=f'$H_{{w,{label}}}$', color=color, linewidth=1.5)

axes[0].axhline(y=H_max, color='gray', linestyle='--', alpha=0.7, label=f'Saturation (+{H_max:.2f} Nms)')
axes[0].axhline(y=-H_max, color='gray', linestyle='--', alpha=0.7, label=f'Saturation (-{H_max:.2f} Nms)')
axes[0].set_xlabel('Orbits')
axes[0].set_ylabel('Wheel angular momentum [Nms]')
axes[0].set_title('Wheel momentum accumulation (no unloading)')
axes[0].legend(loc='upper right')
axes[0].grid(True, alpha=0.3)

# ホイール速度 (rpm)
for i, (label, color) in enumerate(zip(['X', 'Y', 'Z'], ['#e74c3c', '#2ecc71', '#3498db'])):
    omega_wheel = sol_no_unload.y[i] / I_wheel  # rad/s
    rpm = omega_wheel * 60 / (2 * np.pi)
    axes[1].plot(sol_no_unload.t / T_orb, rpm,
                label=f'$\\Omega_{{w,{label}}}$', color=color, linewidth=1.5)

axes[1].axhline(y=6000, color='gray', linestyle='--', alpha=0.7)
axes[1].axhline(y=-6000, color='gray', linestyle='--', alpha=0.7)
axes[1].set_xlabel('Orbits')
axes[1].set_ylabel('Wheel speed [rpm]')
axes[1].set_title('Wheel speed accumulation (no unloading)')
axes[1].legend(loc='upper right')
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('momentum_accumulation.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、外乱トルクによるホイール角運動量の線形蓄積が明確に確認できます。一定外乱トルクの下では角運動量は時間に比例して増加し、Y軸のホイールが最も速く蓄積しています(外乱トルクが最大のため)。このままではY軸ホイールが約6軌道で飽和に達し、姿勢制御能力を失ってしまいます。アンローディングなしでは衛星の運用は持続不可能であることが数値的にも裏付けられました。

磁気トルカによるアンローディング

次に、地磁場モデルを簡易的に導入し、磁気トルカによるアンローディングをシミュレーションします。

# 簡易地磁場モデル(ダイポール近似、LVLH座標系)
B0 = 3e-5  # 地磁場の大きさ [T] (LEO, 高度500km)
inclination = np.radians(51.6)  # 軌道傾斜角(ISS相当)

def magnetic_field(t):
    """簡易地磁場モデル(LVLH座標系、ダイポール近似)"""
    theta = omega_orb * t  # 軌道位置角
    # ダイポール磁場のLVLH成分(簡易モデル)
    Bx = -B0 * np.sin(inclination) * np.sin(theta)
    By = B0 * np.cos(inclination)
    Bz = -2 * B0 * np.sin(inclination) * np.cos(theta)
    return np.array([Bx, By, Bz])

def mtq_unload_control(Hw, B, k_unload):
    """磁気トルカのアンローディング制御則"""
    B_norm_sq = np.dot(B, B)
    if B_norm_sq < 1e-20:
        return np.zeros(3)
    m_cmd = -k_unload * np.cross(Hw, B) / B_norm_sq
    # 磁気モーメントの飽和制限
    m_max = 5.0  # Am^2
    m_mag = np.linalg.norm(m_cmd)
    if m_mag > m_max:
        m_cmd = m_cmd * m_max / m_mag
    return m_cmd
# ケース2: 磁気トルカによる連続アンローディング
k_unload = 1e4  # アンローディングゲイン

def dynamics_with_unload(t, state):
    """磁気トルカアンローディング付きの角運動量ダイナミクス"""
    Hw = state[:3]

    # 地磁場
    B = magnetic_field(t)

    # 磁気トルカ制御
    m_cmd = mtq_unload_control(Hw, B, k_unload)
    N_mtq = np.cross(m_cmd, B)

    # ホイール角運動量の変化 = -外乱 + MTQトルク
    dHw = -N_dist + N_mtq

    return np.concatenate([dHw])

# 30軌道分のシミュレーション
t_sim_long = 30 * T_orb
t_span_long = (0, t_sim_long)
t_eval_long = np.linspace(0, t_sim_long, 15000)

state0_unload = np.zeros(3)
sol_unload = solve_ivp(dynamics_with_unload, t_span_long, state0_unload,
                        t_eval=t_eval_long, rtol=1e-10, atol=1e-12)

fig, axes = plt.subplots(2, 1, figsize=(12, 8))

# ホイール角運動量(アンローディングあり vs なし)
for i, (label, color) in enumerate(zip(['X', 'Y', 'Z'], ['#e74c3c', '#2ecc71', '#3498db'])):
    axes[0].plot(sol_unload.t / T_orb, sol_unload.y[i],
                label=f'$H_{{w,{label}}}$ (with MTQ)', color=color, linewidth=1.2)

axes[0].axhline(y=H_max, color='gray', linestyle='--', alpha=0.5)
axes[0].axhline(y=-H_max, color='gray', linestyle='--', alpha=0.5)
axes[0].set_xlabel('Orbits')
axes[0].set_ylabel('Wheel angular momentum [Nms]')
axes[0].set_title('Wheel momentum with MTQ unloading (30 orbits)')
axes[0].legend(loc='upper right')
axes[0].grid(True, alpha=0.3)

# 磁気トルカの出力
N_mtq_history = np.zeros((3, len(t_eval_long)))
for j, t in enumerate(t_eval_long):
    Hw = sol_unload.y[:3, j]
    B = magnetic_field(t)
    m = mtq_unload_control(Hw, B, k_unload)
    N_mtq_history[:, j] = np.cross(m, B)

for i, (label, color) in enumerate(zip(['X', 'Y', 'Z'], ['#e74c3c', '#2ecc71', '#3498db'])):
    axes[1].plot(sol_unload.t / T_orb, N_mtq_history[i] * 1e3,
                label=f'$N_{{MTQ,{label}}}$', color=color, linewidth=0.8, alpha=0.8)

axes[1].set_xlabel('Orbits')
axes[1].set_ylabel('MTQ torque [mNm]')
axes[1].set_title('Magnetic torquer output')
axes[1].legend(loc='upper right')
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('momentum_unloading.png', dpi=150, bbox_inches='tight')
plt.show()

シミュレーション結果から、磁気トルカによるアンローディングの効果と特性が読み取れます。

  1. 角運動量の収束: アンローディングなしでは線形に蓄積し続けたホイール角運動量が、磁気トルカの作用により一定範囲内に収束しています。数軌道の過渡応答の後、定常状態に落ち着きます。定常状態でもホイール角運動量はゼロにはならず、外乱トルクと磁気トルカの平均的な釣り合いで決まる残留値を持ちます。
  2. 周期的変動: 地磁場が軌道に沿って変化するため、磁気トルカの出力も軌道周期で変動します。磁場方向に制約があるため、常に理想的なトルクが出せるわけではなく、角運動量にも軌道周期の変動が残ります。
  3. 飽和の回避: 最も重要な結果として、ホイール飽和が回避されています。アンローディングなしでは6軌道で飽和に達していたY軸ホイールも、飽和限界(灰色破線)のはるか手前で安定しています。

ゲイン調整とパフォーマンス解析

アンローディングゲインを変えた場合の角運動量蓄積量を比較します。

gains = [1e3, 5e3, 1e4, 5e4]
fig, ax = plt.subplots(figsize=(12, 5))

for k in gains:
    def dynamics_k(t, state, k_val=k):
        Hw = state[:3]
        B = magnetic_field(t)
        m_cmd = mtq_unload_control(Hw, B, k_val)
        N_mtq = np.cross(m_cmd, B)
        dHw = -N_dist + N_mtq
        return np.concatenate([dHw])

    sol_k = solve_ivp(dynamics_k, t_span_long, np.zeros(3),
                       t_eval=t_eval_long, rtol=1e-10, atol=1e-12)
    Hw_norm = np.sqrt(sol_k.y[0]**2 + sol_k.y[1]**2 + sol_k.y[2]**2)
    ax.plot(sol_k.t / T_orb, Hw_norm, label=f'k = {k:.0e}', linewidth=1.2)

ax.axhline(y=H_max, color='gray', linestyle='--', alpha=0.5, label=f'Saturation ({H_max:.2f} Nms)')
ax.set_xlabel('Orbits')
ax.set_ylabel('Total wheel momentum |Hw| [Nms]')
ax.set_title('Effect of unloading gain on momentum accumulation')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('unloading_gain_comparison.png', dpi=150, bbox_inches='tight')
plt.show()

ゲイン比較の結果から、以下の知見が得られます。

  1. ゲインが低い($k = 10^3$)場合: アンローディング能力が外乱トルクの蓄積速度に追いつかず、角運動量がゆっくり蓄積します。十分な軌道数の後に飽和に達する可能性があります。
  2. ゲインを上げるほど定常角運動量は小さくなる: $k = 5 \times 10^4$ では数軌道で定常状態に達し、角運動量は飽和限界のごく一部に抑えられています。
  3. ゲインの上限: 実際にはゲインを際限なく上げることはできません。磁気トルカの最大磁気モーメント(今回は5 Am$^2$)で制限されるためです。また、高すぎるゲインは制御の安定性やノイズ増幅の問題を引き起こす可能性があります。

このように、アンローディングゲインはホイール容量、磁気トルカ能力、外乱トルクの大きさ、制御安定性のバランスで設計されます。

角運動量バジェット — ミッション設計への応用

角運動量バジェットとは

衛星のミッション設計では、「どれだけの角運動量を蓄積し、どう排出するか」を定量的に計画する角運動量バジェットが不可欠です。

基本的な設計手順は以下の通りです。

  1. 外乱トルクの推定: 軌道環境(高度、傾斜角)と衛星形状から各外乱トルクを計算
  2. 1軌道あたりの蓄積量の算出: 周期成分とセキュラー成分を分離
  3. ホイール容量の決定: 蓄積量 + マージンからホイールの角運動量容量を設定
  4. アンローディング頻度の決定: ホイール容量とアンローディング能力からアンローディング間隔を設計
  5. 推進剤バジェット(スラスタの場合): ミッション寿命にわたる推進剤消費量を見積もる

定量的な見積もり

今回のシミュレーションのパラメータで見積もると、

  • 1軌道の角運動量蓄積: $|\bm{N}_{\text{dist}}| \cdot T_{\text{orb}} \approx 5.7 \times 10^{-5} \times 5400 \approx 0.31$ Nms
  • ホイール容量: $H_{\max} = 31.4$ Nms
  • アンローディングなしの場合の飽和時間: 約100軌道(6.25日)

磁気トルカでの連続アンローディングにより、蓄積を飽和の10%以下に抑えられることをシミュレーションで確認しました。これにより推進剤を消費せずに長期運用が可能になります。

まとめ

本記事では、人工衛星の角運動量管理について体系的に解説しました。

  • 全系の角運動量保存: 衛星全体の角運動量変化は外部トルクのみで決まり、ホイール等の内部トルクは角運動量を交換するだけで、系全体の角運動量は変えられません
  • 内部トルクと外部トルクの役割分担: ホイール(RW, MW, CMG)で高精度な姿勢制御を行い、磁気トルカやスラスタで角運動量を排出する二段構えが基本戦略です
  • モーメンタムバイアス方式とゼロモーメンタム方式: ジャイロスコピック安定性を利用する前者と、能動フィードバック制御の後者はミッション要求に応じて選択されます
  • 角運動量の蓄積問題: 外乱トルクによりホイール角運動量が蓄積し、飽和するとアクチュエータとして機能しなくなるため、定期的なアンローディングが不可欠です
  • 磁気トルカによるアンローディング: LEOでは消耗品不要の磁気トルカが有効であり、適切なゲイン設定で角運動量を飽和限界以下に維持できることをシミュレーションで確認しました

次のステップとして、以下の記事も参考にしてください。