【人工衛星】三軸姿勢制御の仕組みをわかりやすく解説

人工衛星は、三軸姿勢制御と呼ばれる制御をされることが多いです。

三軸姿勢制御とは、人工衛星のロール、ピッチ、ヨー軸周りの回転運動を独立に制御する方式のことです。地球観測衛星や通信衛星など、アンテナやカメラを常に特定の方向に向ける必要がある衛星では、この三軸姿勢制御が不可欠です。

本記事の内容

  • 三軸姿勢制御の概要と座標系の定義
  • オイラーの回転運動方程式の導出
  • リアクションホイールによる姿勢制御の原理
  • Pythonでの姿勢制御シミュレーション

人工衛星の座標系

三軸姿勢制御を理解するには、まず座標系を明確に定義する必要があります。

軌道座標系(LVLH座標系)

軌道座標系(Local Vertical Local Horizontal, LVLH)は、衛星の重心を原点とし、以下のように定義されます。

  • $x$ 軸: 速度方向(進行方向)
  • $y$ 軸: 軌道面に垂直な方向(軌道角運動量方向)
  • $z$ 軸: 地球中心方向(天底方向)

機体座標系

機体座標系は、衛星の構体に固定された座標系です。姿勢が理想状態のとき、軌道座標系と一致します。

ロール・ピッチ・ヨー

軌道座標系に対する機体座標系の回転を、ロール($\phi$)、ピッチ($\theta$)、ヨー($\psi$)の3つの角度で表現します。

  • ロール ($\phi$): $x$ 軸(進行方向)周りの回転
  • ピッチ ($\theta$): $y$ 軸(軌道面法線方向)周りの回転
  • ヨー ($\psi$): $z$ 軸(天底方向)周りの回転

オイラーの回転運動方程式

剛体としての人工衛星の回転運動は、オイラーの運動方程式で記述されます。

角運動量 $\bm{L}$ は、慣性モーメントテンソル $\bm{I}$ と角速度ベクトル $\bm{\omega}$ を用いて次のように表されます。

$$ \bm{L} = \bm{I} \bm{\omega} $$

ここで、トルクの法則から、

$$ \bm{T} = \frac{d\bm{L}}{dt} = \bm{I} \dot{\bm{\omega}} + \bm{\omega} \times (\bm{I} \bm{\omega}) $$

が成り立ちます。$\bm{T}$ は外部トルクです。

衛星の主慣性軸と機体座標軸が一致している場合、慣性モーメントテンソルは対角行列となり、

$$ \bm{I} = \begin{pmatrix} I_x & 0 & 0 \\ 0 & I_y & 0 \\ 0 & 0 & I_z \end{pmatrix} $$

と書けます。このとき、各軸の運動方程式は以下のようになります。

$$ \begin{align} I_x \dot{\omega}_x – (I_y – I_z) \omega_y \omega_z &= T_x \\ I_y \dot{\omega}_y – (I_z – I_x) \omega_z \omega_x &= T_y \\ I_z \dot{\omega}_z – (I_x – I_y) \omega_x \omega_y &= T_z \end{align} $$

右辺の $(I_y – I_z)\omega_y \omega_z$ などの項はジャイロスコピックカップリング項と呼ばれ、各軸の回転運動が互いに干渉することを表しています。

微小角度近似による線形化

姿勢角が十分小さい場合($\phi, \theta, \psi \ll 1$)、角速度は姿勢角の時間微分で近似できます。

$$ \omega_x \approx \dot{\phi}, \quad \omega_y \approx \dot{\theta}, \quad \omega_z \approx \dot{\psi} $$

さらに、角速度の積の項(2次の微小量)を無視すると、各軸が独立した線形方程式になります。

$$ \begin{align} I_x \ddot{\phi} &= T_x \\ I_y \ddot{\theta} &= T_y \\ I_z \ddot{\psi} &= T_z \end{align} $$

これが三軸姿勢制御の基本方程式です。各軸が独立しているため、それぞれにPD制御器などを個別に設計できます。

リアクションホイールによる制御

リアクションホイール(Reaction Wheel, RW)は、角運動量保存の法則を利用した姿勢制御アクチュエータです。

衛星本体とリアクションホイールの全系の角運動量は保存されるため、

$$ \bm{L}_{\text{total}} = \bm{I}_{\text{sat}} \bm{\omega}_{\text{sat}} + \bm{I}_{\text{rw}} \bm{\omega}_{\text{rw}} = \text{const.} $$

ここで、リアクションホイールの角速度を変化させると、衛星本体の角速度が変化します。制御トルクは次のように表されます。

$$ T_{\text{ctrl}} = -I_{\text{rw}} \dot{\omega}_{\text{rw}} $$

PD制御器の設計

各軸にPD制御器を適用します。例えばロール軸の場合、

$$ T_x = -K_p \phi – K_d \dot{\phi} $$

ここで、$K_p$ は比例ゲイン、$K_d$ は微分ゲインです。

閉ループの運動方程式は、

$$ I_x \ddot{\phi} + K_d \dot{\phi} + K_p \phi = 0 $$

これは減衰付き調和振動子の方程式であり、$K_p > 0$, $K_d > 0$ のとき安定です。

固有振動数 $\omega_n$ と減衰比 $\zeta$ は次のように与えられます。

$$ \omega_n = \sqrt{\frac{K_p}{I_x}}, \quad \zeta = \frac{K_d}{2\sqrt{I_x K_p}} $$

Pythonでの姿勢制御シミュレーション

三軸姿勢制御のPDコントローラをPythonでシミュレーションしてみましょう。

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

# 衛星の慣性モーメント [kg*m^2]
Ix = 50.0
Iy = 60.0
Iz = 70.0

# PD制御ゲイン
# 目標: 固有振動数 0.05 rad/s, 減衰比 0.7
omega_n = 0.05  # rad/s
zeta = 0.7

Kp_x = Ix * omega_n**2
Kd_x = 2 * zeta * omega_n * Ix
Kp_y = Iy * omega_n**2
Kd_y = 2 * zeta * omega_n * Iy
Kp_z = Iz * omega_n**2
Kd_z = 2 * zeta * omega_n * Iz

def attitude_dynamics(t, state):
    """三軸姿勢制御の運動方程式(非線形)"""
    phi, theta, psi, wx, wy, wz = state

    # PD制御トルク
    Tx = -Kp_x * phi - Kd_x * wx
    Ty = -Kp_y * theta - Kd_y * wy
    Tz = -Kp_z * psi - Kd_z * wz

    # オイラーの回転運動方程式
    dwx = (Tx + (Iy - Iz) * wy * wz) / Ix
    dwy = (Ty + (Iz - Ix) * wz * wx) / Iy
    dwz = (Tz + (Ix - Iy) * wx * wy) / Iz

    return [wx, wy, wz, dwx, dwy, dwz]

# 初期条件: 各軸10度の姿勢誤差
phi0 = np.radians(10)
theta0 = np.radians(-5)
psi0 = np.radians(8)
state0 = [phi0, theta0, psi0, 0.0, 0.0, 0.0]

# シミュレーション時間
t_span = (0, 300)
t_eval = np.linspace(0, 300, 3000)

# 数値積分
sol = solve_ivp(attitude_dynamics, t_span, state0, t_eval=t_eval, method='RK45')

# 結果の可視化
fig, axes = plt.subplots(2, 1, figsize=(10, 8))

# 姿勢角の時間履歴
axes[0].plot(sol.t, np.degrees(sol.y[0]), label='Roll (phi)')
axes[0].plot(sol.t, np.degrees(sol.y[1]), label='Pitch (theta)')
axes[0].plot(sol.t, np.degrees(sol.y[2]), label='Yaw (psi)')
axes[0].set_xlabel('Time [s]')
axes[0].set_ylabel('Attitude Angle [deg]')
axes[0].set_title('Three-Axis Attitude Control Simulation')
axes[0].legend()
axes[0].grid(True)

# 角速度の時間履歴
axes[1].plot(sol.t, np.degrees(sol.y[3]), label='omega_x')
axes[1].plot(sol.t, np.degrees(sol.y[4]), label='omega_y')
axes[1].plot(sol.t, np.degrees(sol.y[5]), label='omega_z')
axes[1].set_xlabel('Time [s]')
axes[1].set_ylabel('Angular Velocity [deg/s]')
axes[1].legend()
axes[1].grid(True)

plt.tight_layout()
plt.show()

このシミュレーションでは、初期姿勢誤差としてロール10度、ピッチ-5度、ヨー8度を与え、PD制御器によってゼロに収束する様子を確認できます。減衰比 $\zeta = 0.7$ は適度なオーバーシュートと速い収束を両立する値です。

まとめ

本記事では、人工衛星の三軸姿勢制御について解説しました。

  • 三軸姿勢制御は、ロール・ピッチ・ヨーの3自由度を独立に制御する方式である
  • オイラーの回転運動方程式が姿勢運動の基本方程式となる
  • 微小角度近似により各軸が独立な線形系として扱え、PD制御器を個別に設計できる
  • リアクションホイールは角運動量保存則を利用した代表的なアクチュエータである
  • 制御ゲインは、固有振動数と減衰比から系統的に設計できる

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