相対運動モデルとしてのCW方程式の利用
低軌道における宇宙機間の精密ドッキングを実現するには、相対位置・速度の高精度な予測と、外部摂動への適応制御が不可欠である。Clohessy-Wiltshire(CW)方程式は、円軌道上での追従機と目標機の相対運動を線形近似できるため、リアルタイム制御に適したモデルとして広く採用されている。
以下は、6次元状態ベクトル(x, y, z方向の位置および速度)を用いた離散化されたCWダイナミクスの実装例である:
import numpy as np
def relative_dynamics(state_vector, control_input, time_step):
orbital_freq = 0.00113 # 500km軌道における平均運動
system_matrix = np.array([
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1],
[3 * orbital_freq**2, 0, 0, 0, 2 * orbital_freq, 0],
[0, 0, 0, -2 * orbital_freq, 0, 0],
[0, 0, -orbital_freq**2, 0, 0, 0]
])
input_matrix = np.block([[np.zeros((3, 3))], [np.eye(3)]])
derivative = system_matrix @ state_vector + input_matrix @ control_input
updated_state = state_vector + derivative * time_step
return updated_state
このモデルでは、z軸方向に働く軌道曲率効果や、y軸との間に生じるコリオリ項が自然に表現されており、数値積分により1秒ごとの状態遷移をシミュレート可能である。
分散型MPCのアルゴリズム設計
集中型制御とは異なり、各宇宙機が自律的に最適入力を計算するためには、他機の将来行動を推定する仕組みが必要となる。以下の
AutonomousDockingControllerクラスは、有限時間ホライズンにわたる相互予測に基づいて最適推力系列を求める。
class AutonomousDockingController:
def __init__(self, prediction_horizon=10):
self.horizon = prediction_horizon
self.thrust_limit = 0.3 # 単位質量あたりの最大推力 [N/kg]
self.pos_weight = 0.5 # 相対位置誤差の重み
self.input_weight = 0.1 # 推力使用量の重み
def compute_optimal_trajectory(self, current_state, predicted_trajectory_of_target):
from scipy.optimize import minimize
def objective_function(flat_inputs):
thrust_sequence = flat_inputs.reshape((self.horizon, 3))
state = current_state.copy()
total_cost = 0.0
for t in range(self.horizon):
position_error = state[:3] - predicted_trajectory_of_target[t][:3]
total_cost += self.pos_weight * np.sum(position_error ** 2)
total_cost += self.input_weight * np.sum(thrust_sequence[t] ** 2)
state = relative_dynamics(state, thrust_sequence[t], 1.0)
return total_cost
initial_guess = np.zeros(3 * self.horizon)
constraints = {
'type': 'ineq',
'fun': lambda u: self.thrust_limit - np.linalg.norm(u.reshape((-1, 3)), axis=1)
}
result = minimize(objective_function, initial_guess,
constraints=constraints, method='SLSQP', options={'disp': False})
return result.x.reshape((self.horizon, 3)) if result.success else initial_guess.reshape((self.horizon, 3))
コスト関数は、ドッキング精度(相対距離の最小化)と燃料効率(推力のL2正則化)のトレードオフを表現しており、任務要件に応じて重み係数を調整することで柔軟な制御特性を得られる。
相互予測に基づく協調制御プロトコル
システム全体の収束を保証するためには、双方が同期的に自らの行動予測を交換し、逐次的に最適化を行う必要がある。以下のメインループは、2機間での反復的最適化によるドッキングシーケンスを模擬している。
# 制御器インスタンスの生成
chaser_controller = AutonomousDockingController()
target_controller = AutonomousDockingController()
# 初期状態:追従機が後方100mに位置
state_chaser = np.array([-100.0, 0.0, 0.0, 0.0, 0.0, 0.0])
state_target = np.zeros(6)
for iteration in range(150):
# 各機が相手の未来軌道を仮定(初期はゼロ推力で外挿)
estimated_target_path = [relative_dynamics(state_target, np.zeros(3), k) for k in range(10)]
optimal_thrust_chaser = chaser_controller.compute_optimal_trajectory(state_chaser, estimated_target_path)
estimated_chaser_path = [relative_dynamics(state_chaser, optimal_thrust_chaser[0], k) for k in range(10)]
optimal_thrust_target = target_controller.compute_optimal_trajectory(state_target, estimated_chaser_path)
# 実際のダイナミクスへ先頭の制御入力を適用
state_chaser = relative_dynamics(state_chaser, optimal_thrust_chaser[0], 1.0)
state_target = relative_dynamics(state_target, optimal_thrust_target[0], 1.0)
separation_distance = np.linalg.norm(state_chaser[:3] - state_target[:3])
if separation_distance < 0.5:
print("Docking achieved at step:", iteration)
break
この「予測→最適化→実行→再予測」のサイクルにより、通信遅延や局所的情報しか持たない環境下でも安定した接近が可能となる。
実環境における拡張考慮事項
実際の運用では、センサノイズ、推進系の応答遅れ、通信遅延などの影響を緩和するため、以下の改良が有効である:
- 安全距離制約の導入:衝突回避のため、相対距離が一定閾値未満になることを禁止する不等式制約を追加。
- ロバスト性向上:モデル誤差を考慮したmin-max MPCや、不確実性を確率分布として扱う確率論的MPCの適用。
- 通信効率の改善:予測軌道の完全送信ではなく、代表点やパラメータ化された軌道情報を交換する方式。
- 階層型クラスタリング:多数機編隊においては、グループ単位での分散制御と、内部の集中調整を組み合わせるハイブリッド構成。
特に、深宇宙ミッションでは片道通信遅延が数秒に及ぶため、より長い予測ホライズンと自己完結型の意思決定能力が求められる。そのような条件下では、強化学習によってMPCの重み係数やホライズン長をオンラインで調整するアプローチも検討されている。