ロボットアームによる衛星捕獲 — Canadarm2とJEMRMSの技術

宇宙ステーションに補給船が接近してきました。あと10メートル。推進剤は残りわずかで、微小な姿勢外乱に晒されながら漂っています。ここで補給船のエンジンをふかして自力で結合する――という方法もありますが、実は国際宇宙ステーション(ISS)では多くの補給船がロボットアームに「掴まれて」接続されるという方法を採用しています。この「掴む」技術は、宇宙空間特有のきわめて難しい工学的課題を解決した成果です。

地上では物を掴むことは日常的な動作ですが、微小重力環境で秒速数センチメートルで接近する数トンの物体を掴むとなると、話はまったく変わります。掴んだ瞬間に力が大きすぎれば相手を弾き飛ばし、小さすぎれば取り逃がす。しかもISS本体への衝撃を最小限に抑えなければなりません。

ロボットアームによる衛星捕獲技術を理解すると、以下のような応用に直結します。

  • 軌道上サービス(On-Orbit Servicing): 故障衛星の修理・燃料補給のためにロボットアームで衛星を掴むミッション(OSAM-1など)
  • 宇宙デブリ除去: ESA ClearSpace-1に代表される、非協力物体をロボットアームで捕獲して除去するミッション
  • 月面ゲートウェイ: 月周回有人拠点に搭載されるCanadarm3は、Canadarm2の技術を発展させた次世代アーム
  • 軌道上組立: 将来の大型宇宙望遠鏡や宇宙太陽光発電システムの軌道上組み立てにはロボットアームが不可欠

本記事の内容

  • 宇宙で「掴む」ことの技術的課題
  • Canadarm2の仕様と設計思想(7自由度、17.6 m、LEE)
  • JEMRMS(きぼうロボットアーム)の仕様と特徴
  • バーシング vs ドッキングの違い
  • 補給船捕獲(Dragon, Cygnus)のシーケンス
  • 運用上の制約(速度制限、力制限、Keep-Out Zone)
  • 安全設計(Force Moment Accommodation、衝突検知)
  • 将来のアーム技術(ERA、中国天和のアーム、Canadarm3)
  • Pythonで捕獲シーケンスの相対軌道シミュレーション

前提知識

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

宇宙で「掴む」ことの技術的課題

地上との根本的な違い

地上でロボットアームが物を掴む場合、重力が物体を安定させる味方になります。テーブルの上のコップは置いてあるだけで静止しており、アームはただ近づいて指を閉じればよいのです。ところが宇宙空間では、この「当たり前」が全て崩れます。

微小重力環境の特殊性として、まず対象物体が固定されていません。補給船は軌道力学に従って自由に漂っており、ほんのわずかな外力でも並進・回転運動が生じます。太陽輻射圧、大気抵抗の残余成分、さらには自身の姿勢制御スラスタの噴射による反作用など、さまざまな外乱が作用しています。

接触時のインパクト問題

宇宙空間で最も注意すべきは、接触時の力学です。地上では物体を掴む際、物体は台や床との摩擦で「逃げない」のですが、微小重力では掴もうとした瞬間の力がそのまま相手を加速させてしまいます。ニュートンの第3法則(作用・反作用の法則)が直接的に効いてくるのです。

掴む力 $F$ が対象物体(質量 $m$)に作用すると、物体は

$$ a = \frac{F}{m} $$

の加速度で「逃げて」いきます。例えば、質量 $m = 5{,}000$ kg の補給船に $F = 50$ N の力を与えると

$$ a = \frac{50}{5000} = 0.01 \, \text{m/s}^2 $$

これは一見小さいですが、1秒間で1 cm/sの速度変化が生じます。ISSの繊細な太陽電池パネルの近くでこのような動きが起きれば、深刻な事態になりかねません。

掴む vs 掴まれる — 設計思想の違い

宇宙での「掴む」問題に対し、工学的には2つの根本的に異なるアプローチがあります。

  1. 能動的結合(ドッキング): 接近する側が能動的にメカニズムを作動させて結合する。相手側は受動的な受け口を持つだけ。
  2. 受動的捕獲(バーシング): 接近する側は所定位置で待機し、ステーション側のロボットアームが掴みに行く。

ISSでは、有人宇宙船(ソユーズ、クルードラゴン)は主にドッキング方式、無人補給船(旧ドラゴン、シグナス)はバーシング方式を採用してきました。この使い分けの理由は、のちほど詳しく解説します。

宇宙特有の制約一覧

宇宙での捕獲を難しくする制約を整理すると、以下のようになります。

制約 内容 影響
微小重力 物体が固定されない 接触力がそのまま並進・回転に変換される
真空環境 潤滑剤が蒸発する 特殊な低揮発性グリースが必要
温度変動 $-150\,^\circ\text{C}$ 〜 $+150\,^\circ\text{C}$ 熱膨張によるアライメント誤差
通信遅延 地上からの操作に数秒の遅延 リアルタイム操作が困難
電力制約 太陽電池の発電能力に依存 アームの動作速度・トルクに制限
放射線 電子機器の劣化・単粒子反転 冗長設計と放射線耐性部品が必要

これらの制約を全て克服し、確実に補給船を掴むために開発されたのが、Canadarm2とJEMRMSです。次に、まずカナダが開発したCanadarm2の設計と仕様を詳しく見ていきましょう。

Canadarm2の仕様と設計思想

開発の背景

Canadarm2(正式名称: Space Station Remote Manipulator System, SSRMS)は、カナダ宇宙庁(CSA)が開発し、MDA社が製造したISSの主力ロボットアームです。2001年4月にSTS-100ミッションで打ち上げられ、ISSに取り付けられました。

Canadarm2の前身は、スペースシャトルのCanadarm(SRMS)です。Canadarmはシャトルのペイロードベイに固定された5.5自由度のアームで、ハッブル宇宙望遠鏡の放出・回収など歴史的なミッションに活躍しました。しかし、ISSの組み立てと長期運用には、より大きく、より柔軟で、より多機能なアームが必要でした。

基本仕様

Canadarm2の主要なスペックは以下の通りです。

パラメータ
全長 17.6 m(ブーム2本、各7.3 m + 関節部)
質量 1,800 kg
自由度 7 DOF(3-1-3構成)
最大可搬質量 116,000 kg
先端位置精度 $\pm\,2$ cm(位置)、$\pm\,0.5^\circ$(姿勢)
最大先端速度 無積載時 37 cm/s、最大積載時 1.5 cm/s
エンドエフェクタ LEE(Latching End Effector)
設計寿命 15年(軌道上で交換可能)

ここで注目すべきは、最大可搬質量が116トンという数字です。ISSの主要モジュール(例えばきぼう与圧部は約15トン)を軽々と扱える能力を持ちますが、その移動速度は最大積載時にわずか1.5 cm/sです。これは「カタツムリのような遅さ」ですが、宇宙空間で100トン超の物体を動かすことを考えれば、この慎重さは合理的です。運動量 $p = mv$ を考えると、116,000 kg を 1.5 cm/s で動かしたときの運動量は

$$ p = 116{,}000 \times 0.015 = 1{,}740 \, \text{kg} \cdot \text{m/s} $$

この運動量がISS全体(約420,000 kg)に伝わった場合、ISS本体は

$$ \Delta v_{\text{ISS}} = \frac{1{,}740}{420{,}000} \approx 0.004 \, \text{m/s} $$

の速度変化を受けます。ISSの姿勢制御系(CMG)がこの外乱を吸収できる範囲に収まるよう、速度が制限されているのです。

7自由度の意味 — 3-1-3構成

Canadarm2は7自由度(7 DOF)を持ちます。人間の腕が7自由度(肩3 + 肘1 + 手首3)であるのと同じ構成で、3-1-3構成と呼ばれます。

$$ \underbrace{\text{Shoulder: roll, yaw, pitch}}_{\text{3 DOF}} \;\;+\;\; \underbrace{\text{Elbow: pitch}}_{\text{1 DOF}} \;\;+\;\; \underbrace{\text{Wrist: roll, yaw, pitch}}_{\text{3 DOF}} $$

空間中で物体の位置と姿勢を完全に指定するには6自由度(3並進 + 3回転)が必要です。つまりCanadarm2は冗長自由度を1つ持つことになります。

この冗長性は極めて重要です。冗長自由度があると、エンドエフェクタの位置・姿勢を固定したまま肘の位置を変えられるため、ISSの構造物や太陽電池パネルとの干渉を避けながら作業できます。ロボット工学の用語では、逆運動学の解が無限に存在することに対応します。

$n = 7$ 自由度のアームで $m = 6$ 次元の作業空間を制御する場合、ヤコビ行列 $\bm{J} \in \mathbb{R}^{6 \times 7}$ は行数より列数が多い「横長」行列になります。逆運動学の速度レベルの解は

$$ \dot{\bm{q}} = \bm{J}^{\dagger} \dot{\bm{x}} + (\bm{I}_7 – \bm{J}^{\dagger}\bm{J}) \bm{z} $$

で与えられます。ここで $\bm{J}^{\dagger}$ は $\bm{J}$ の擬似逆行列(Moore-Penrose疑似逆行列)、$\dot{\bm{q}}$ は関節角速度ベクトル、$\dot{\bm{x}}$ は先端の目標速度、$\bm{z}$ は任意のベクトルです。

第2項 $(\bm{I}_7 – \bm{J}^{\dagger}\bm{J}) \bm{z}$ は零空間射影と呼ばれ、エンドエフェクタの動きに影響を与えずに関節を動かすことができます。Canadarm2はこの零空間運動を利用して、障害物回避や関節リミット回避を行います。

LEE(Latching End Effector)— 宇宙の「手」

Canadarm2の最も特徴的な要素は、両端に装備されたLEE(Latching End Effector)です。LEEは直径約35 cmの円筒形で、対象のグラプルフィクスチャ(Grapple Fixture)を掴むメカニズムです。

LEEの捕獲プロセスは3段階で進みます。

  1. スネア(Snare): グラプルフィクスチャのピンにワイヤーを引っ掛ける。4本のスネアワイヤーがピンを取り囲む
  2. リトラクト(Retract): ワイヤーを引き込んで、ピンをLEE内部に引き寄せる。この段階でソフトキャプチャが完了
  3. リジダイズ(Rigidize): 機械的なラッチを閉じて剛結合を確立する。電力・データ・映像信号の接続もこの段階で行われる

このスネア方式の巧妙さは、完全な位置合わせが不要な点にあります。グラプルフィクスチャのピンがLEEの開口部(直径約20 cm)の範囲内にあれば、ワイヤーがピンを「捕まえて」中心に引き込みます。許容される位置誤差は $\pm\,10$ cm程度、姿勢誤差は $\pm\,10^\circ$ 程度です。これは、宇宙空間での位置決め精度を考えると非常に実用的な許容範囲です。

「歩く」ロボットアーム — インチワーム移動

Canadarm2の最も革新的な機能はインチワーム移動(End-over-end locomotion)です。Canadarm2の両端にはLEEが装備されており、ISS外面に配置されたPDGF(Power Data Grapple Fixture)を掴み替えることで、尺取り虫のようにISS上を移動できます。

これにより、Canadarm2はISS上の任意の場所で作業が可能です。前身のCanadarmがシャトルのペイロードベイに固定されていたのとは対照的に、Canadarm2は「ISS全体が作業場」になります。

Canadarm2の仕様と設計思想を理解したところで、次は日本が開発した「きぼう」のロボットアーム、JEMRMSの特徴を見ていきましょう。Canadarm2とは異なる設計思想が採用されています。

JEMRMSの仕様と特徴

きぼうロボットアームとは

JEMRMS(Japanese Experiment Module Remote Manipulator System)は、JAXA(宇宙航空研究開発機構)が開発したISS日本実験棟「きぼう」専用のロボットアームシステムです。2008年のSTS-124ミッションで打ち上げられました。

Canadarm2がISS全体をカバーする大型のユーティリティアームであるのに対し、JEMRMSは「きぼう」の曝露部(船外実験プラットフォーム)での精密作業に特化した設計です。最大の特徴は、主アーム(Main Arm)と小型微細アーム(Small Fine Arm, SFA)の2本構成であることです。

主アーム(Main Arm)

主アームの仕様は以下の通りです。

パラメータ
全長 約10 m
質量 約780 kg
自由度 6 DOF
最大可搬質量 7,000 kg
先端位置精度 $\pm\,50$ mm
最大先端速度 約60 mm/s

Canadarm2と比べると一回り小型ですが、きぼう曝露部の実験ペイロード(最大約500 kg)を扱うには十分な能力です。6自由度で冗長性はありませんが、作業空間がきぼう周辺に限定されるため、Canadarm2ほどの障害物回避の柔軟性は必要ないという割り切りです。

小型微細アーム(SFA)— 宇宙の精密ハンド

JEMRMSの真価は小型微細アーム(SFA)にあります。SFAは主アームの先端に取り付けて使う「手先のアーム」で、2つのアームを直列に接続することで「腕+手」のような階層構造を実現しています。

パラメータ
全長 約1.9 m
質量 約190 kg
自由度 6 DOF
先端位置精度 $\pm\,10$ mm
先端力制御 対応(力覚センサ搭載)

SFAの先端位置精度 $\pm\,10$ mmは、Canadarm2の $\pm\,20$ mmを大きく上回ります。さらに6軸力覚センサを搭載しており、エンドエフェクタにかかる力とモーメントをリアルタイムで計測できます。

主アーム + SFAの組み合わせは、ロボット工学ではマクロ・マイクロマニピュレータ方式と呼ばれます。主アームが大まかな位置決め(マクロ動作)を担当し、SFAが精密な作業(マイクロ動作)を行うという役割分担です。制御工学的には、これは帯域分離の原理に基づいています。

低周波の大振幅運動(主アーム)と高周波の微細運動(SFA)を分離することで、各アームの制御帯域を最適化できます。主アームのバンド幅を $\omega_{\text{macro}}$、SFAのバンド幅を $\omega_{\text{micro}}$ とすると

$$ \omega_{\text{macro}} \ll \omega_{\text{micro}} $$

の関係が成り立ち、両者の動特性が干渉しません。これは音楽でいえば、ウーファー(低音スピーカー)とツイーター(高音スピーカー)の分担に似ています。

Canadarm2との比較

両アームの設計思想の違いを比較すると、その背景にある運用コンセプトの違いが見えてきます。

項目 Canadarm2 JEMRMS
設計思想 汎用・大型・移動可能 専用・精密・固定
自由度 7 DOF(冗長) 主アーム6 DOF + SFA 6 DOF
可搬質量 116,000 kg 7,000 kg
移動方式 インチワーム移動 きぼう船外に固定
精密性 $\pm\,20$ mm $\pm\,10$ mm(SFA使用時)
力制御 限定的 SFAに6軸力覚センサ
主用途 モジュール組立、補給船捕獲 船外実験ペイロード交換
開発国 カナダ 日本

Canadarm2は「何でもできる万能選手」、JEMRMSは「精密作業のスペシャリスト」と言えるでしょう。ISSという巨大な宇宙ステーションの運用には、この異なる特性を持つ2系統のアームが相互に補完し合って機能しています。

ここまでで2つのアームシステムの特徴がわかりました。次に、実際にこれらのアームを使った捕獲作業で重要な概念である「バーシング」と「ドッキング」の違いを明確にしておきましょう。

バーシング vs ドッキングの違い

2つの結合方式

ISSへの宇宙船の結合方式には、ドッキング(Docking)バーシング(Berthing)の2種類があります。この2つは表面的には「宇宙船がISSにくっつく」という同じ結果をもたらしますが、技術的にはまったく異なるプロセスです。

ドッキングは、接近する宇宙船が自らの推進力で直接ISSの結合ポートに結合する方式です。宇宙船側のドッキングメカニズム(プローブ&ドローグ、またはIDS: International Docking System Standard準拠のリング)が能動的に結合を行います。

一方、バーシングは、接近する宇宙船がISS近傍の所定位置(キャプチャポイント)で停止し、ISSのロボットアーム(Canadarm2)に掴まれてからCBM(Common Berthing Mechanism)ポートに装着される方式です。

技術的な比較

特性 ドッキング バーシング
接近側の推進 最終接触まで能動制御 キャプチャポイントで停止
結合の主導 接近する宇宙船 ISS側(ロボットアーム+クルー)
ポートの大きさ 約80 cm径(IDS規格) 約130 cm × 130 cm(CBM)
気密接続 即座に可能 ボルト締結後に可能
結合時間 数分 数時間(ロボットアーム操作+ボルト締結)
衝撃 比較的大きい($V_{\text{contact}} \sim 0.1$ m/s) 小さい(アームが制御)
有人宇宙船の帰還 自力で離脱可能 アームで取り外し後に離脱
自律性 高い(GNC自律制御) 中程度(アーム操作に人間介入)

バーシングの利点

バーシング方式がISS補給で多用された理由は、主に以下の3つです。

第一に、CBMポートの大きさです。 バーシングで使用されるCBMは、ドッキングポートよりはるかに大きな開口部(約130 cm × 130 cm)を持ちます。これにより、科学実験ラック(ISPRラック: 約107 cm幅)のような大型貨物をISSに搬入できます。ドッキングポートでは物理的に通過できないサイズの貨物が、バーシングでは扱えるのです。

第二に、結合時の衝撃が小さいことです。 ドッキングでは最終接触速度が約0.1 m/sに達することがありますが、バーシングではロボットアームが緩やかに宇宙船を運ぶため、CBM結合時の衝撃は極めて小さくなります。これはISSの微小重力実験環境への影響を最小化する上で重要です。

第三に、宇宙船側の設計が簡素化されることです。 ドッキングでは宇宙船側に精密な相対航法センサ、接近制御アルゴリズム、ドッキングメカニズムが必要ですが、バーシングでは宇宙船はキャプチャポイントで静止するだけでよく、残りはISS側のロボットアームが担当します。

ドッキングの利点

一方、ドッキングには以下の利点があります。

有人宇宙船には必須です。 緊急時にクルーが速やかに離脱する必要がある有人宇宙船は、ロボットアーム操作を待っていられません。ドッキングであれば、宇宙船は自力で即座に離脱できます。

時間効率が高いのも利点です。バーシングがアーム操作とボルト締結に数時間を要するのに対し、ドッキングは結合まで数分で完了します。

ロボットアームの可用性に依存しません。 ロボットアームが故障した場合でも、ドッキング方式の宇宙船はISSに結合できます。

方式の選択 — 歴史的変遷

興味深いことに、ISSの補給方式は時代とともに変化してきました。SpaceX Dragon(初代、2012〜2020年)はバーシング方式でしたが、Dragon 2(2020年〜)はドッキング方式に移行しています。これは、宇宙船側のGNC(航法・誘導・制御)技術が進歩し、精密な自律ドッキングが信頼性高く実現できるようになったためです。

宇宙船 方式 ポート 期間
ソユーズ ドッキング ロシア区画 2000年〜
プログレス ドッキング ロシア区画 2000年〜
ATV(ESA) ドッキング ロシア区画 2008〜2015年
HTV(こうのとり) バーシング CBM 2009〜2020年
Dragon(初代) バーシング CBM 2012〜2020年
Cygnus バーシング CBM 2013年〜
クルードラゴン ドッキング IDA 2020年〜
Dragon 2(貨物) ドッキング IDA 2020年〜
スターライナー ドッキング IDA 2024年〜
HTV-X ドッキング/バーシング 両対応 2025年〜

ドッキングとバーシングの違いが明確になったところで、次はバーシング方式の核心部分 — ロボットアームによる補給船捕獲シーケンスを詳しく見ていきましょう。

補給船捕獲のシーケンス

捕獲運用の全体像

補給船(ここではCygnus/旧Dragon等のバーシング方式の宇宙船を想定)の捕獲は、数日間にわたるランデブーの最終段階として行われます。補給船が地球低軌道(LEO)でISSに接近するプロセスは、大きく4つのフェーズに分けられます。

Phase 1: 遠方接近(Far Approach) — 打ち上げ後、補給船はフェージング軌道を経て、ISSの後方(V-bar方向)または下方(R-bar方向)から接近を開始します。この段階では地上管制が主導し、相対距離は数十km〜数kmです。

Phase 2: 近傍接近(Proximity Operations) — 相対距離が約250 m以内になると、近傍運用フェーズに入ります。補給船はISSとの相対航法(RGPS: Relative GPS)により精密な軌道制御を行います。

Phase 3: 最終接近(Final Approach) — 約30 m地点からキャプチャポイント(約10 m)へ向けた最終接近です。ISS側のLIDAR(Light Detection And Ranging)と補給船のレトロリフレクタによる精密相対航法が行われます。

Phase 4: 捕獲(Capture) — キャプチャポイントで補給船が「フリードリフト」(スラスタを停止した自由漂流状態)に入り、Canadarm2で掴みます。

キャプチャポイントでの条件

捕獲が許可される条件(Go for Capture)は非常に厳密に定義されています。補給船は以下の条件を全て同時に満たす必要があります。

パラメータ 許容範囲
相対位置誤差 $\Delta r < 0.1$ m
相対速度 $\|\Delta \bm{v}\| < 0.01$ m/s(10 mm/s)
姿勢誤差 $< 5^\circ$
姿勢角速度 $< 0.15^\circ$/s

特に注目すべきは相対速度の条件です。$\|\Delta \bm{v}\| < 0.01$ m/s は、1秒あたり1 cm以下の接近速度を意味します。人間の歩行速度(約1.4 m/s)と比較すると、140分の1の速さです。この「超低速」で近づいてきた補給船を、Canadarm2のLEEで掴むのです。

フリードリフトとその意味

捕獲直前に補給船のスラスタを停止する「フリードリフト」は、バーシング方式における安全上の核心概念です。

なぜスラスタを停止するのでしょうか? その理由は2つあります。

  1. スラスタプルームからのISS保護: 補給船のスラスタ噴射はガスを排出し、ISSの太陽電池パネルやセンサを汚染・損傷する可能性があります
  2. 予測可能な運動の確保: スラスタが停止した物体の運動は軌道力学のみで記述でき、完全に予測可能です。スラスタが動作していると、誤噴射のリスクがあります

フリードリフト中の補給船の運動は、CW方程式(Clohessy-Wiltshire方程式)で記述されます。円軌道上のISS基準のLVLH座標系(Local Vertical, Local Horizontal)における相対運動方程式は

$$ \begin{cases} \ddot{x} – 2n\dot{z} = 0 \\ \ddot{y} + n^2 y = 0 \\ \ddot{z} + 2n\dot{x} – 3n^2 z = 0 \end{cases} $$

ここで $n = \sqrt{\mu/a^3}$ は軌道角速度(ISSの場合 $n \approx 0.00113$ rad/s)、$x$ は進行方向、$y$ は軌道面法線方向、$z$ は地球中心方向です。

この方程式系の解析解を用いると、フリードリフト開始時の状態 $(\bm{r}_0, \dot{\bm{r}}_0)$ から任意時刻の位置・速度を予測できます。地上およびISS上の管制官はこの予測を用いて、フリードリフト中に補給船がキャプチャエンベロープ内に留まることを確認します。

捕獲の瞬間 — オペレータの技量

Canadarm2による捕獲は、ISS内のクルー(Robotics Officer)がラップトップのインターフェースを用いて手動操作で行います。ロボティクスワークステーション(RWS)には2つのハンドコントローラ(THC: Translational Hand Controller、RHC: Rotational Hand Controller)が装備されており、それぞれアームの並進と回転を制御します。

捕獲操作の手順は以下の通りです。

  1. プリポジション: アームの先端(LEE)をキャプチャポイント近傍に事前配置する
  2. Go for Capture確認: 補給船の状態が捕獲条件を満たしていることを、Mission Control Center(MCC)と確認する
  3. フリードリフト開始: 補給船のスラスタを停止する指令を送信する
  4. LEEアプローチ: オペレータがLEEを補給船のグラプルフィクスチャに接近させる
  5. スネア: LEEのスネアワイヤーを作動させ、グラプルフィクスチャを捕獲する
  6. リトラクト: ピンを引き込み、ソフトキャプチャを確立する
  7. リジダイズ: ラッチを閉じて剛結合を確立する

ステップ4〜5の操作は約2分以内に完了する必要があります。これはフリードリフト中の補給船が軌道力学的なドリフトにより、キャプチャエンベロープから逸脱するまでの時間的余裕です。この短い時間窓の中で、オペレータは的確にアームを操作してグラプルフィクスチャを掴まなければなりません。

捕獲後のバーシング

捕獲が完了すると、次はCanadarm2でCBMポートまで補給船を運ぶ工程に入ります。

アームのジョイントを慎重に動かし、補給船をCBMポートの正面に位置決めします。CBMの結合は以下の手順で行われます。

  1. 第1段階(First Stage Capture): CBM同士を接触させ、キャプチャラッチ(4本)で仮固定する
  2. 第2段階(Second Stage Capture): 16本のボルトを順次締め込み、CBMフランジ同士を密着させる。ボルトの締め付けトルクは段階的に上げていき、均一な面圧を確保する
  3. 気密確認: ボルト締結後、CBM間の気密をリークテストで確認する
  4. ベスティブル(前室)の加圧と開放: 気密確認後、ベスティブルを加圧し、ハッチを開放する

ボルト16本の締め込みだけで約2時間を要します。合計するとキャプチャからハッチオープンまで約6〜8時間かかるのが通例です。

捕獲シーケンスの全体像がつかめたところで、次にこの運用を安全に行うための制約条件を数値で確認していきましょう。

運用上の制約

速度制限

Canadarm2の運動速度は、搬送する質量に応じて厳密に制限されます。この制限は、ISSの姿勢制御系(CMG: Control Moment Gyroscope)が吸収できる角運動量の上限から導かれています。

ISSの4基のCMGの総角運動量容量は約 $H_{\text{CMG}} \approx 14{,}000$ N$\cdot$m$\cdot$s です。アームの運動がISSに与えるトルク $\bm{\tau}$ が累積的にCMGの角運動量を消費するため、アームの動作速度を制限してCMGの飽和を防ぐ必要があります。

搬送質量 $m_{\text{payload}}$ とアームの先端速度 $v_{\text{tip}}$ の関係は、おおまかに以下のように制限されます。

$$ v_{\text{tip,max}} = \frac{v_0}{1 + m_{\text{payload}} / m_{\text{ref}}} $$

ここで $v_0 \approx 0.37$ m/s は無積載時の最大速度、$m_{\text{ref}}$ は基準質量(アームの等価質量に関連するパラメータ)です。この式は単純化したモデルですが、積載質量が増えるほど許容速度が減少するという基本的関係を表しています。

力制限

捕獲時にアームが対象物体に加えてよい力にも上限があります。

状態 最大力 最大モーメント
ソフトキャプチャ時 $\leq 25$ N $\leq 10$ N$\cdot$m
通常搬送時 $\leq 30$ N $\leq 30$ N$\cdot$m
リジダイズ後 $\leq 450$ N $\leq 500$ N$\cdot$m

ソフトキャプチャ時の力制限 25 N は非常に小さい値です。地上で言えば約2.5 kgの物体を持ち上げる力に相当します。5,000 kg の補給船を掴む瞬間に加えられる力がたった25 N — この制約の厳しさが、宇宙での捕獲技術の難しさを物語っています。

Keep-Out Zone と Approach Corridor

ISSの周囲には、安全のために複数の空間的制約が設定されています。

Keep-Out Sphere(KOS) は、ISS中心から半径200 mの球面です。この境界内に入る全ての宇宙機は、ISSのフライトディレクターの許可が必要です。

Approach Corridor は、補給船がKOS内で通過を許可された狭い通路です。V-bar接近の場合、ISS進行方向後方の円錐形通路(半頂角約 $\pm\,10^\circ$、ISSの速度ベクトル軸周り)内を飛行する必要があります。

Approach Ellipsoid は、最終接近フェーズでの許容領域を規定します。キャプチャポイント周囲の楕円体で、進行方向 $\pm\,1$ m、他軸 $\pm\,0.5$ m 程度のサイズです。

これらの空間的制約は、万が一補給船が制御不能になった場合でも、ISSとの衝突を回避するためのバッファとして機能します。補給船がApproach Corridorを逸脱した場合、即座にRetreat(退避)コマンドが発行され、補給船はアボート軌道に遷移します。

照明条件

見落とされがちですが、照明条件も重要な運用制約です。ISSは約90分で地球を1周するため、約45分の昼間と45分の夜間が交互に訪れます。

捕獲操作は、オペレータがカメラ映像で対象を視認する必要があるため、原則として軌道昼間に実施されます。さらに、太陽の方向によってはカメラがグレアで見えなくなるため、太陽の位置も考慮した捕獲窓(Capture Window)が計画されます。

運用上の制約条件がわかったところで、次にこれらの制約を守りつつ安全に捕獲を行うための、アーム自身の安全設計メカニズムを見ていきましょう。

安全設計

Force Moment Accommodation(FMA)

Canadarm2の安全設計で最も重要な機能がForce Moment Accommodation(FMA)、すなわち力/モーメント順応制御です。

FMAの基本思想は、アームが予期しない外力を受けた場合に「力に逆らわず、柔軟に逃げる」ことです。これは制御工学でいうインピーダンス制御の一種で、アームの先端を「仮想的なバネ・ダンパ系」として振る舞わせます。

インピーダンス制御の基本方程式は

$$ \bm{M}_d (\ddot{\bm{x}} – \ddot{\bm{x}}_d) + \bm{D}_d (\dot{\bm{x}} – \dot{\bm{x}}_d) + \bm{K}_d (\bm{x} – \bm{x}_d) = \bm{F}_{\text{ext}} $$

で表されます。ここで $\bm{M}_d$, $\bm{D}_d$, $\bm{K}_d$ はそれぞれ目標インピーダンスの慣性・減衰・剛性行列、$\bm{x}_d$ は目標位置、$\bm{x}$ は実際の位置、$\bm{F}_{\text{ext}}$ は外力です。

この式が意味するのは、外力 $\bm{F}_{\text{ext}}$ が加わったとき、アーム先端が $\bm{M}_d$, $\bm{D}_d$, $\bm{K}_d$ で定義される仮想的な質量-バネ-ダンパ系と同じ応答を示すということです。

FMAが有効な場面を具体的に考えてみましょう。捕獲した補給船をCBMポートに運ぶ途中で、何らかの理由(ISS姿勢変動、アーム経路計算の誤差等)で補給船がISS構造物に接触しそうになったとします。接触力が検知されると、FMAはその力の方向にアームを「逃がし」ます。

剛性パラメータを $K_d = 100$ N/m と設定した場合、50 N の外力に対するアーム先端の変位は

$$ \Delta x = \frac{F_{\text{ext}}}{K_d} = \frac{50}{100} = 0.5 \, \text{m} $$

つまり、50 Nの接触力が生じてもアーム先端は50 cm「逃げる」ため、構造物への損傷を防ぐことができます。

衝突検知と自動停止

Canadarm2には各関節のモータ電流を常時監視する衝突検知システムが搭載されています。

通常の動作中、各関節のモータトルク $\tau_i$ は動力学モデルから予測される値 $\hat{\tau}_i$ に近い値を示します。予測値と実測値の差(残差)

$$ e_i = \tau_i – \hat{\tau}_i $$

が閾値 $\epsilon_i$ を超えた場合、衝突が発生したと判定してアームを即座に停止させます。

$$ |e_i| > \epsilon_i \quad \Rightarrow \quad \text{Emergency Stop} $$

この仕組みはモデルベース衝突検知と呼ばれ、外部にセンサを追加することなく、モータ電流の情報だけで衝突を検知できる点が利点です。ただし、動力学モデルの精度(摩擦、ケーブルの張力、温度変化による剛性変動等のモデリング誤差)が検知感度を左右するため、閾値 $\epsilon_i$ の設定には入念なチューニングが必要です。

冗長系設計

宇宙で使用されるロボットアームは、単一故障でミッションが失敗しないよう冗長設計が施されています。Canadarm2の冗長化の例を挙げます。

制御コンピュータ: メインとバックアップの2系統。メインが故障した場合、バックアップに自動切換え。

モータドライバ: 各関節に2系統のモータドライバ。一方が故障しても他方で関節を駆動可能。

エンコーダ: 各関節に複数のポジションエンコーダ。一方の値が異常な場合、他方の値を使用。

LEE: アームの両端にLEEが装備されているため、一方のLEEが故障しても他方で捕獲が可能。

電力経路: 複数のPDGF経由で給電可能。一つのPDGF接続が失われても、インチワーム移動で別のPDGFに接続できる。

Safe Mode — 最悪の事態への備え

全ての冗長系が機能しなくなる最悪のシナリオに備え、Canadarm2にはSafe Modeが定義されています。

Safe Modeでは全関節のブレーキが作動し、アームは現在の姿勢で完全に固定されます。これにより、制御システムが完全に失われた場合でも、アームがISS構造物と衝突するリスクを排除します。

また、Safe Modeから復旧できない場合に備え、アームの各リンクにはEVA(船外活動)による手動操作インターフェースが設けられています。宇宙飛行士がアームの外側に取り付けられた手動解放機構を操作することで、故障したアームを安全な位置に移動させたり、捕獲した物体を解放したりできます。

安全設計の仕組みがわかったところで、次は現在と将来のロボットアーム技術について視野を広げてみましょう。ISS以外の宇宙ステーションやミッションでは、どのようなアームが使われているのでしょうか。

将来のアーム技術

ESA ERA(European Robotic Arm)

ERA(European Robotic Arm)は、ESA(欧州宇宙機関)が開発し、2021年にISSのロシア区画「ナウカ」モジュールに設置されたロボットアームです。

パラメータ
全長 11.3 m
質量 630 kg
自由度 7 DOF
最大可搬質量 8,000 kg
先端位置精度 $\pm\,5$ mm

ERAの最大の特徴は、Canadarm2と同様のインチワーム移動能力に加え、事前プログラムされた自律動作が可能な点です。Canadarm2がクルーのリアルタイム操作を基本とするのに対し、ERAは地上からアップリンクされた動作シーケンスを自律的に実行できます。

中国天和のロボットアーム

中国宇宙ステーション「天宮」の天和コアモジュールには、全長約10 mの大型ロボットアームが搭載されています。

パラメータ
全長 約10 m
自由度 7 DOF
最大可搬質量 25,000 kg
先端位置精度 $\pm\,45$ mm

Canadarm2と同様の7自由度・インチワーム移動方式を採用していますが、可搬質量25トンは天宮ステーションの設計に合わせた値です(ISSより小型のモジュールを扱う)。天和アームは2021年から軌道上で運用されており、問天実験棟・夢天実験棟の取り付けに使用されました。

Canadarm3 — 月周回有人拠点へ

Canadarm3は、NASAが主導する月周回有人拠点Gatewayのために開発中の次世代ロボットアームです。CSAが開発を担当しており、Canadarm2の運用経験を踏まえた大幅な改良が盛り込まれています。

特徴 Canadarm2 Canadarm3
搭載先 ISS(LEO) Gateway(月周回NRHO)
自律性 手動操作中心 高度な自律動作
通信遅延 $\sim 0.5$ s(地上からの操作) $\sim 3$ s(地球-月間遅延)
クルー常駐 常時 間欠的(年数回の有人滞在)
メンテナンス EVAで修理可能 自己メンテナンス能力が必要

Canadarm3の最大の技術的挑戦は自律性です。Gatewayにはクルーが常駐しないため(年に数回の有人滞在のみ)、アームは大部分の時間を自律的に動作する必要があります。また、地球-月間の通信遅延(約3秒の往復遅延)は、Canadarm2のようなリアルタイム遠隔操作を困難にします。

このため、Canadarm3には以下の自律機能が計画されています。

  • 自律外部点検: ステーション外部をカメラで撮影し、微小デブリの衝突痕や熱劣化を自動検出する
  • 自律捕獲: 接近する宇宙船のグラプルフィクスチャを自動認識し、捕獲シーケンスを自律実行する
  • 経路計画: 障害物を検出し、干渉のない経路を自動生成する
  • 自己故障診断: 関節の劣化や異常を自動検出し、地上に報告する

軌道上サービス(OOS)のためのアーム

将来の重要な応用として、軌道上サービス(On-Orbit Servicing, OOS)があります。故障衛星の修理、燃料補給、部品交換などを軌道上で行うミッションで、ロボットアームは中核技術です。

NASAのOSAM-1(On-orbit Servicing, Assembly, and Manufacturing 1)ミッションでは、燃料補給用のロボットアームが計画されていました。ターゲット衛星はOOS用に設計されていない「非協力対象」であるため、グラプルフィクスチャがない物体を安全に掴むための新技術が必要です。

非協力対象の捕獲では、以下の技術的課題が生じます。

  1. 把持点の自動認識: 機械学習ベースのビジョンシステムにより、衛星の構造物から把持可能な部位(アポジモータのノズルリング、ランチアダプタリング等)を自動認識する
  2. 相対運動推定: 回転する対象の姿勢角速度と慣性テンソルをリアルタイム推定し、衝撃のない捕獲タイミングを計算する
  3. 力制御の高度化: 構造的強度が不明な非協力対象を壊さずに掴むため、繊細な力制御が不可欠

これらの将来技術は、宇宙デブリ除去にも直結します。次の記事で扱う「宇宙デブリ除去のためのロボティクス」では、非協力対象の捕獲問題をさらに深く掘り下げます。

ここまでの理論と運用の知識を踏まえて、最後にPythonを使って補給船の相対軌道とロボットアームによる捕獲シーケンスをシミュレーションしてみましょう。

Pythonによる捕獲シーケンスのシミュレーション

CW方程式による相対軌道の計算

まず、ISSに対する補給船の相対運動をCW方程式で計算します。最終接近フェーズにおいて、V-bar方向(ISS進行方向後方)から接近する補給船の軌道を可視化してみましょう。

CW方程式の解析解は以下の通りです。初期状態 $(x_0, y_0, z_0, \dot{x}_0, \dot{y}_0, \dot{z}_0)$ に対して、時刻 $t$ での状態は

$$ \begin{aligned} x(t) &= \left(4 – 3\cos nt\right)x_0 + \frac{\sin nt}{n}\dot{x}_0 + \frac{2}{n}(1 – \cos nt)\dot{z}_0 \\ z(t) &= \frac{2}{n}(\cos nt – 1)\dot{x}_0 + \left(6x_0 + \frac{4\dot{z}_0}{n}\right)\sin nt + \left(1 – \frac{3\dot{x}_0}{n} t\right) \cdot 0 + z_0 \cos nt \end{aligned} $$

ただし上記は簡略形であり、正確な行列形式で実装します。CW方程式の状態遷移行列 $\bm{\Phi}(t)$ を用いて

$$ \begin{pmatrix} \bm{r}(t) \\ \dot{\bm{r}}(t) \end{pmatrix} = \bm{\Phi}(t) \begin{pmatrix} \bm{r}_0 \\ \dot{\bm{r}}_0 \end{pmatrix} $$

と書けます。以下のコードで状態遷移行列を実装します。

import numpy as np
import matplotlib.pyplot as plt

def cw_state_transition_matrix(n, t):
    """
    CW方程式の状態遷移行列 Phi(t) を計算する
    n: 軌道角速度 [rad/s]
    t: 時間 [s]
    戻り値: 6x6 状態遷移行列
    """
    nt = n * t
    c = np.cos(nt)
    s = np.sin(nt)

    Phi = np.zeros((6, 6))

    # 位置-位置ブロック (3x3)
    Phi[0, 0] = 4 - 3 * c
    Phi[0, 2] = 6 * (s - nt)
    Phi[1, 1] = c
    Phi[2, 0] = 6 * n * (c - 1)  # これは速度ブロックではなく...
    # 正しい行列要素を設定し直す
    Phi = np.zeros((6, 6))

    # rr ブロック
    Phi[0, 0] = 4 - 3 * c
    Phi[0, 2] = 0
    Phi[1, 1] = c
    Phi[2, 0] = 6 * (nt - s)
    Phi[2, 2] = 1

    # rv ブロック
    Phi[0, 3] = s / n
    Phi[0, 5] = 2 * (1 - c) / n
    Phi[1, 4] = s / n
    Phi[2, 3] = -2 * (1 - c) / n
    Phi[2, 5] = (4 * s - 3 * nt) / n

    # vr ブロック
    Phi[3, 0] = 3 * n * s
    Phi[4, 1] = -n * s
    Phi[5, 0] = -6 * n * (1 - c)

    # vv ブロック
    Phi[3, 3] = c
    Phi[3, 5] = 2 * s
    Phi[4, 4] = c
    Phi[5, 3] = -2 * s
    Phi[5, 5] = 4 * c - 3

    return Phi

この状態遷移行列の各ブロックの意味を確認しておきましょう。左上3×3ブロックが「初期位置が現在位置に与える影響」、右上3×3ブロックが「初期速度が現在位置に与える影響」を表します。$x$ 軸(ラジアル方向)と $z$ 軸(進行方向)が結合していることが行列のオフダイゴナル要素に現れており、これがCW方程式の特徴的な「楕円的ドリフト」を生み出します。

V-bar接近シミュレーション

次に、V-bar方向から接近する補給船の最終接近フェーズをシミュレーションします。補給船は30 m後方からキャプチャポイント(10 m後方)に向かって接近します。

import numpy as np
import matplotlib.pyplot as plt

def cw_stm(n, t):
    """CW方程式の6x6状態遷移行列"""
    nt = n * t
    c, s = np.cos(nt), np.sin(nt)
    Phi = np.zeros((6, 6))
    # 位置ブロック
    Phi[0, 0] = 4 - 3*c;  Phi[0, 3] = s/n;       Phi[0, 5] = 2*(1-c)/n
    Phi[1, 1] = c;         Phi[1, 4] = s/n
    Phi[2, 0] = 6*(nt-s);  Phi[2, 2] = 1
    Phi[2, 3] = -2*(1-c)/n; Phi[2, 5] = (4*s - 3*nt)/n
    # 速度ブロック
    Phi[3, 0] = 3*n*s;     Phi[3, 3] = c;         Phi[3, 5] = 2*s
    Phi[4, 1] = -n*s;      Phi[4, 4] = c
    Phi[5, 0] = -6*n*(1-c); Phi[5, 3] = -2*s;     Phi[5, 5] = 4*c - 3
    return Phi

# ISSの軌道パラメータ
mu = 3.986004418e14       # 地球の重力パラメータ [m^3/s^2]
alt_iss = 408e3           # ISS高度 [m]
R_earth = 6.371e6         # 地球半径 [m]
a_iss = R_earth + alt_iss # ISS軌道半径 [m]
n_iss = np.sqrt(mu / a_iss**3)  # 軌道角速度 [rad/s]

print(f"ISS軌道角速度: n = {n_iss:.6f} rad/s")
print(f"ISS軌道周期: T = {2*np.pi/n_iss:.1f} s = {2*np.pi/n_iss/60:.1f} min")

# 初期状態: V-bar方向30m後方、接近速度 0.03 m/s
# LVLH座標: x=ラジアル(天頂方向), y=軌道面法線, z=進行方向
x0 = np.array([0.0, 0.0, -30.0, 0.0, 0.0, 0.03])

# 時間設定 (0 ~ 800秒)
t_span = np.linspace(0, 800, 2000)

# 軌道を計算
trajectory = np.zeros((len(t_span), 6))
for i, t in enumerate(t_span):
    Phi = cw_stm(n_iss, t)
    trajectory[i] = Phi @ x0

# プロット: z-x平面(進行方向 vs ラジアル方向)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左: 相対軌道 (z-x平面)
ax1 = axes[0]
ax1.plot(trajectory[:, 2], trajectory[:, 0], 'b-', linewidth=1.5, label='Chaser trajectory')
ax1.plot(0, 0, 'rs', markersize=12, label='ISS (origin)')
ax1.plot(x0[2], x0[0], 'go', markersize=8, label='Start (30 m behind)')
ax1.plot(-10, 0, 'k^', markersize=10, label='Capture point (10 m)')
ax1.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
ax1.axvline(x=0, color='gray', linestyle='--', alpha=0.5)
ax1.set_xlabel('Along-track z [m]', fontsize=12)
ax1.set_ylabel('Radial x [m]', fontsize=12)
ax1.set_title('V-bar Approach Trajectory (LVLH Frame)', fontsize=13)
ax1.legend(fontsize=10)
ax1.set_xlim(-35, 5)
ax1.set_ylim(-2, 2)
ax1.grid(True, alpha=0.3)
ax1.set_aspect('equal')

# 右: 距離と速度の時間変化
ax2 = axes[1]
distance = np.sqrt(trajectory[:, 0]**2 + trajectory[:, 1]**2 + trajectory[:, 2]**2)
speed = np.sqrt(trajectory[:, 3]**2 + trajectory[:, 4]**2 + trajectory[:, 5]**2)

color1 = 'tab:blue'
ax2.set_xlabel('Time [s]', fontsize=12)
ax2.set_ylabel('Distance [m]', fontsize=12, color=color1)
ax2.plot(t_span, distance, color=color1, linewidth=1.5, label='Distance')
ax2.tick_params(axis='y', labelcolor=color1)
ax2.axhline(y=10, color=color1, linestyle=':', alpha=0.5, label='Capture point (10 m)')

ax2b = ax2.twinx()
color2 = 'tab:red'
ax2b.set_ylabel('Relative speed [m/s]', fontsize=12, color=color2)
ax2b.plot(t_span, speed, color=color2, linewidth=1.5, label='Speed')
ax2b.tick_params(axis='y', labelcolor=color2)
ax2b.axhline(y=0.01, color=color2, linestyle=':', alpha=0.5, label='Capture limit (0.01 m/s)')

ax2.set_title('Distance and Speed vs Time', fontsize=13)
ax2.grid(True, alpha=0.3)

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

上のグラフから、V-bar接近の特徴がよく読み取れます。

  1. 左図(軌道): 補給船は進行方向後方($z = -30$ m)からほぼ直線的にISSに接近しています。V-bar接近ではラジアル方向($x$ 軸)の偏差がごくわずかで、これはV-bar方向が相対運動の「安定な」方向であることを反映しています。
  2. 右図(距離・速度): 距離が単調に減少し、約670秒でキャプチャポイント(10 m)に到達します。初期の接近速度 0.03 m/s は、CW方程式の結合項の影響でわずかに変化しますが、ほぼ一定です。この緩やかな接近こそ、安全なバーシングの基盤です。

フリードリフトの時間窓シミュレーション

次に、キャプチャポイント(10 m後方)でフリードリフトに入った補給船が、捕獲許容範囲(キャプチャエンベロープ)内にどの程度留まるかをシミュレーションします。

import numpy as np
import matplotlib.pyplot as plt

def cw_stm(n, t):
    """CW方程式の6x6状態遷移行列"""
    nt = n * t
    c, s = np.cos(nt), np.sin(nt)
    Phi = np.zeros((6, 6))
    Phi[0, 0] = 4 - 3*c;  Phi[0, 3] = s/n;       Phi[0, 5] = 2*(1-c)/n
    Phi[1, 1] = c;         Phi[1, 4] = s/n
    Phi[2, 0] = 6*(nt-s);  Phi[2, 2] = 1
    Phi[2, 3] = -2*(1-c)/n; Phi[2, 5] = (4*s - 3*nt)/n
    Phi[3, 0] = 3*n*s;     Phi[3, 3] = c;         Phi[3, 5] = 2*s
    Phi[4, 1] = -n*s;      Phi[4, 4] = c
    Phi[5, 0] = -6*n*(1-c); Phi[5, 3] = -2*s;     Phi[5, 5] = 4*c - 3
    return Phi

mu = 3.986004418e14
alt_iss = 408e3
R_earth = 6.371e6
a_iss = R_earth + alt_iss
n_iss = np.sqrt(mu / a_iss**3)

# キャプチャポイントでのフリードリフト
# 理想: 完全に静止 (残留速度 = 0)
# 現実: わずかな残留速度がある
np.random.seed(42)

# 3つのケースをシミュレーション
cases = {
    'Ideal (v_res = 0)':         [0.0, 0.0, -10.0, 0.0, 0.0, 0.0],
    'Nominal (v_res = 3 mm/s)':  [0.0, 0.0, -10.0, 0.001, 0.0, 0.002],
    'Off-nominal (v_res = 8 mm/s)': [0.0, 0.0, -10.0, 0.003, 0.002, 0.007],
}

t_drift = np.linspace(0, 300, 1000)  # 5分間

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

colors = ['#2196F3', '#FF9800', '#F44336']

for idx, (label, x0) in enumerate(cases.items()):
    x0 = np.array(x0)
    traj = np.zeros((len(t_drift), 6))
    for i, t in enumerate(t_drift):
        Phi = cw_stm(n_iss, t)
        traj[i] = Phi @ x0

    # z-x平面(進行方向 vs ラジアル方向)
    axes[0].plot(traj[:, 2], traj[:, 0], color=colors[idx],
                 linewidth=1.5, label=label)

    # 初期位置からの変位
    delta_r = np.sqrt((traj[:, 0]-x0[0])**2 + (traj[:, 1]-x0[1])**2 + (traj[:, 2]-x0[2])**2)
    axes[1].plot(t_drift, delta_r * 100, color=colors[idx],
                 linewidth=1.5, label=label)  # cm単位

    # 相対速度の推移
    speed = np.sqrt(traj[:, 3]**2 + traj[:, 4]**2 + traj[:, 5]**2)
    axes[2].plot(t_drift, speed * 1000, color=colors[idx],
                 linewidth=1.5, label=label)  # mm/s単位

# 左: 軌道
axes[0].set_xlabel('Along-track z [m]', fontsize=11)
axes[0].set_ylabel('Radial x [m]', fontsize=11)
axes[0].set_title('Free-drift Trajectories', fontsize=12)
axes[0].legend(fontsize=8)
axes[0].grid(True, alpha=0.3)

# 中: 位置ドリフト
axes[1].set_xlabel('Time [s]', fontsize=11)
axes[1].set_ylabel('Drift from initial position [cm]', fontsize=11)
axes[1].set_title('Position Drift During Free-drift', fontsize=12)
axes[1].axhline(y=10, color='green', linestyle='--', alpha=0.7, label='LEE tolerance (10 cm)')
axes[1].legend(fontsize=8)
axes[1].grid(True, alpha=0.3)

# 右: 速度変化
axes[2].set_xlabel('Time [s]', fontsize=11)
axes[2].set_ylabel('Relative speed [mm/s]', fontsize=11)
axes[2].set_title('Speed During Free-drift', fontsize=12)
axes[2].axhline(y=10, color='green', linestyle='--', alpha=0.7, label='Capture speed limit (10 mm/s)')
axes[2].legend(fontsize=8)
axes[2].grid(True, alpha=0.3)

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

# 数値情報の出力
print("=== フリードリフト解析結果 (120秒後) ===")
for label, x0 in cases.items():
    x0 = np.array(x0)
    Phi = cw_stm(n_iss, 120.0)
    state = Phi @ x0
    drift = np.sqrt((state[0]-x0[0])**2 + (state[1]-x0[1])**2 + (state[2]-x0[2])**2)
    speed = np.sqrt(state[3]**2 + state[4]**2 + state[5]**2)
    print(f"  {label}:")
    print(f"    位置ドリフト: {drift*100:.1f} cm")
    print(f"    速度: {speed*1000:.2f} mm/s")

上のシミュレーション結果から、フリードリフト中の挙動について3つの重要な知見が得られます。

  1. 理想ケース(残留速度ゼロ): 位置ドリフトはほぼゼロで、CW方程式の結合項による微小な動きのみです。このケースでは捕獲の時間窓は事実上無制限です。
  2. 標準ケース(残留速度3 mm/s): 120秒後には数十cmのドリフトが生じ、LEEの許容範囲($\pm$10 cm)を超えてきます。オペレータは120秒以内に捕獲を完了する必要があります。
  3. 異常ケース(残留速度8 mm/s): ドリフトが速く、約60秒で許容範囲を逸脱します。このような状態では「No Go for Capture」と判定され、補給船のスラスタを再点火して状態修正を行うか、退避させます。

このシミュレーションは、フリードリフトの品質(残留速度の大きさ)が捕獲の成否を直接決定することを定量的に示しています。

ロボットアーム先端の到達可能領域の可視化

最後に、Canadarm2の関節構成を簡略化した2次元モデルで、先端の到達可能領域(ワークスペース)を可視化してみましょう。実際のCanadarm2は3次元の7自由度ですが、概念理解のために2リンクの平面アームで冗長性のない基本的なケースを確認します。

import numpy as np
import matplotlib.pyplot as plt

# 2リンク平面ロボットアーム(簡易Canadarm2モデル)
L1 = 7.3   # リンク1の長さ [m] (Canadarm2のブーム長)
L2 = 7.3   # リンク2の長さ [m]

def forward_kinematics(theta1, theta2):
    """2リンクアームの順運動学"""
    x_elbow = L1 * np.cos(theta1)
    y_elbow = L1 * np.sin(theta1)
    x_tip = x_elbow + L2 * np.cos(theta1 + theta2)
    y_tip = y_elbow + L2 * np.sin(theta1 + theta2)
    return x_elbow, y_elbow, x_tip, y_tip

# 関節角度の範囲
theta1_range = np.linspace(-np.pi, np.pi, 200)
theta2_range = np.linspace(-np.pi * 0.85, np.pi * 0.85, 200)  # 肘の制限

# ワークスペースの計算
workspace_x = []
workspace_y = []
for t1 in theta1_range:
    for t2 in theta2_range:
        _, _, x_tip, y_tip = forward_kinematics(t1, t2)
        workspace_x.append(x_tip)
        workspace_y.append(y_tip)

workspace_x = np.array(workspace_x)
workspace_y = np.array(workspace_y)

# 捕獲シーケンスの姿勢変化
# 3つの姿勢: プリポジション → 接近 → 捕獲
capture_configs = [
    {'theta1': np.radians(30), 'theta2': np.radians(-40),
     'label': '(1) Pre-position', 'color': '#2196F3'},
    {'theta1': np.radians(20), 'theta2': np.radians(-25),
     'label': '(2) Approach', 'color': '#FF9800'},
    {'theta1': np.radians(10), 'theta2': np.radians(-10),
     'label': '(3) Capture', 'color': '#4CAF50'},
]

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 左: ワークスペース
ax1 = axes[0]
ax1.scatter(workspace_x, workspace_y, s=0.1, alpha=0.3, c='lightblue')
ax1.add_patch(plt.Circle((0, 0), L1 + L2, fill=False, color='gray',
                          linestyle='--', alpha=0.5, label=f'Max reach ({L1+L2:.1f} m)'))
ax1.add_patch(plt.Circle((0, 0), abs(L1 - L2), fill=False, color='gray',
                          linestyle=':', alpha=0.5, label=f'Min reach ({abs(L1-L2):.1f} m)'))
ax1.plot(0, 0, 'ks', markersize=10, label='Base (PDGF)')

# 捕獲シーケンスの姿勢を描画
for config in capture_configs:
    xe, ye, xt, yt = forward_kinematics(config['theta1'], config['theta2'])
    ax1.plot([0, xe, xt], [0, ye, yt], '-o', color=config['color'],
             linewidth=2.5, markersize=6, label=config['label'])
    ax1.plot(xt, yt, 's', color=config['color'], markersize=10)

ax1.set_xlabel('x [m]', fontsize=12)
ax1.set_ylabel('y [m]', fontsize=12)
ax1.set_title('2-Link Arm Workspace and Capture Sequence', fontsize=13)
ax1.legend(fontsize=9, loc='upper left')
ax1.set_xlim(-17, 17)
ax1.set_ylim(-17, 17)
ax1.set_aspect('equal')
ax1.grid(True, alpha=0.3)

# 右: 捕獲時の速度楕円体(マニピュラビリティ)
ax2 = axes[1]

# マニピュラビリティ楕円を各姿勢で計算
for config in capture_configs:
    t1, t2 = config['theta1'], config['theta2']
    xe, ye, xt, yt = forward_kinematics(t1, t2)

    # ヤコビ行列 (2x2)
    J = np.array([
        [-L1*np.sin(t1) - L2*np.sin(t1+t2), -L2*np.sin(t1+t2)],
        [ L1*np.cos(t1) + L2*np.cos(t1+t2),  L2*np.cos(t1+t2)]
    ])

    # マニピュラビリティ楕円: J*J^T の固有値・固有ベクトル
    JJT = J @ J.T
    eigenvalues, eigenvectors = np.linalg.eigh(JJT)

    # 楕円のパラメータ
    angle = np.arctan2(eigenvectors[1, 0], eigenvectors[0, 0])
    width = 2 * np.sqrt(eigenvalues[0]) * 0.5  # スケーリング
    height = 2 * np.sqrt(eigenvalues[1]) * 0.5

    # マニピュラビリティ指標
    w = np.sqrt(np.linalg.det(JJT))

    # 楕円を描画
    theta_ellipse = np.linspace(0, 2*np.pi, 100)
    ellipse_x = width/2 * np.cos(theta_ellipse)
    ellipse_y = height/2 * np.sin(theta_ellipse)
    R = np.array([[np.cos(angle), -np.sin(angle)],
                  [np.sin(angle),  np.cos(angle)]])
    ellipse_pts = R @ np.vstack([ellipse_x, ellipse_y])

    ax2.plot(ellipse_pts[0] + xt, ellipse_pts[1] + yt,
             color=config['color'], linewidth=2,
             label=f"{config['label']} (w={w:.1f})")
    ax2.plot(xt, yt, 'o', color=config['color'], markersize=8)

ax2.set_xlabel('x [m]', fontsize=12)
ax2.set_ylabel('y [m]', fontsize=12)
ax2.set_title('Manipulability Ellipsoids at Each Pose', fontsize=13)
ax2.legend(fontsize=9)
ax2.grid(True, alpha=0.3)
ax2.set_aspect('equal')

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

このシミュレーションから、ロボットアームの運動学的な性質が視覚的に理解できます。

  1. 左図(ワークスペース): 2リンクアームの到達可能領域はドーナツ状です。最大到達距離 $L_1 + L_2 = 14.6$ m、最小到達距離 $|L_1 – L_2| = 0$ m(リンク長が等しいため)の間が作業領域です。捕獲シーケンスの3姿勢が、プリポジション(青)からアプローチ(橙)、キャプチャ(緑)へと先端が移動する様子がわかります。
  2. 右図(マニピュラビリティ楕円): 各姿勢でのマニピュラビリティ楕円のサイズと形状が異なります。楕円が大きいほど、その方向に先端を速く動かせることを意味します。マニピュラビリティ指標 $w = \sqrt{\det(\bm{J}\bm{J}^T)}$ が大きい姿勢ほど、アーム先端の運動自由度が高く、捕獲操作に有利です。アームが伸びきった姿勢ではマニピュラビリティが低下するため、捕獲ポイントの設定にはこの特性が考慮されます。

捕獲時のインパクトダイナミクスのシミュレーション

最後に、LEEが補給船のグラプルフィクスチャに接触した瞬間の力学をシミュレーションします。インピーダンス制御によるFMAの効果を確認しましょう。

import numpy as np
import matplotlib.pyplot as plt

def simulate_capture_impact(M_d, D_d, K_d, m_chaser, v_contact, dt=0.001, t_end=5.0):
    """
    捕獲時のインパクトダイナミクスをシミュレーション
    LEE(インピーダンス制御)とチェイサー(自由質点)の接触

    M_d, D_d, K_d: インピーダンスパラメータ
    m_chaser: チェイサー質量 [kg]
    v_contact: 接触時の相対速度 [m/s]
    """
    n_steps = int(t_end / dt)
    t = np.zeros(n_steps)
    x_lee = np.zeros(n_steps)       # LEE変位
    v_lee = np.zeros(n_steps)       # LEE速度
    x_chaser = np.zeros(n_steps)    # チェイサー変位
    v_chaser = np.zeros(n_steps)    # チェイサー速度
    F_contact = np.zeros(n_steps)   # 接触力

    # 初期条件: チェイサーが速度 v_contact で接近
    v_chaser[0] = v_contact

    for i in range(1, n_steps):
        t[i] = t[i-1] + dt

        # 接触判定 (チェイサーがLEEに到達)
        if x_chaser[i-1] <= x_lee[i-1]:
            # 接触中: インピーダンス制御の反力
            delta_x = x_lee[i-1] - x_chaser[i-1]  # 貫入量
            delta_v = v_lee[i-1] - v_chaser[i-1]

            # インピーダンス制御による反力 (LEE側)
            F = K_d * delta_x + D_d * delta_v
            F_contact[i] = abs(F)

            # LEEの運動 (インピーダンスモデル)
            a_lee = F / M_d
            v_lee[i] = v_lee[i-1] + a_lee * dt
            x_lee[i] = x_lee[i-1] + v_lee[i] * dt

            # チェイサーの運動 (自由質点)
            a_chaser = -F / m_chaser
            v_chaser[i] = v_chaser[i-1] + a_chaser * dt
            x_chaser[i] = x_chaser[i-1] + v_chaser[i] * dt
        else:
            # 非接触: 各自自由運動
            v_lee[i] = v_lee[i-1]
            x_lee[i] = x_lee[i-1] + v_lee[i] * dt
            v_chaser[i] = v_chaser[i-1]
            x_chaser[i] = x_chaser[i-1] + v_chaser[i] * dt

    return t, x_lee, v_lee, x_chaser, v_chaser, F_contact

# パラメータ設定
m_chaser = 5000.0    # 補給船の質量 [kg]
v_contact = 0.005    # 接触時の相対速度 [m/s] (5 mm/s)

# 3つのインピーダンス設定を比較
impedance_cases = {
    'Soft (K=50, D=500)': {'M_d': 100, 'D_d': 500, 'K_d': 50},
    'Medium (K=200, D=1000)': {'M_d': 100, 'D_d': 1000, 'K_d': 200},
    'Stiff (K=800, D=2000)': {'M_d': 100, 'D_d': 2000, 'K_d': 800},
}

fig, axes = plt.subplots(1, 3, figsize=(16, 5))
colors = ['#4CAF50', '#FF9800', '#F44336']

for idx, (label, params) in enumerate(impedance_cases.items()):
    t, x_lee, v_lee, x_chaser, v_chaser, F_contact = simulate_capture_impact(
        params['M_d'], params['D_d'], params['K_d'],
        m_chaser, v_contact, dt=0.001, t_end=3.0
    )

    # 接触力
    axes[0].plot(t, F_contact, color=colors[idx], linewidth=1.5, label=label)

    # LEEの変位
    axes[1].plot(t, x_lee * 100, color=colors[idx], linewidth=1.5, label=label)

    # 相対速度
    rel_v = v_chaser - v_lee
    axes[2].plot(t, rel_v * 1000, color=colors[idx], linewidth=1.5, label=label)

# 接触力
axes[0].set_xlabel('Time [s]', fontsize=11)
axes[0].set_ylabel('Contact Force [N]', fontsize=11)
axes[0].set_title('Contact Force During Capture', fontsize=12)
axes[0].axhline(y=25, color='red', linestyle='--', alpha=0.7, label='Force limit (25 N)')
axes[0].legend(fontsize=8)
axes[0].grid(True, alpha=0.3)

# LEE変位
axes[1].set_xlabel('Time [s]', fontsize=11)
axes[1].set_ylabel('LEE Displacement [cm]', fontsize=11)
axes[1].set_title('LEE Compliance (Displacement)', fontsize=12)
axes[1].legend(fontsize=8)
axes[1].grid(True, alpha=0.3)

# 相対速度
axes[2].set_xlabel('Time [s]', fontsize=11)
axes[2].set_ylabel('Relative Velocity [mm/s]', fontsize=11)
axes[2].set_title('Relative Velocity (Chaser - LEE)', fontsize=12)
axes[2].legend(fontsize=8)
axes[2].grid(True, alpha=0.3)

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

# 数値サマリー
print("=== 捕獲インパクト解析結果 ===")
print(f"チェイサー質量: {m_chaser} kg, 接触速度: {v_contact*1000:.1f} mm/s")
for label, params in impedance_cases.items():
    t, x_lee, v_lee, x_chaser, v_chaser, F_contact = simulate_capture_impact(
        params['M_d'], params['D_d'], params['K_d'],
        m_chaser, v_contact, dt=0.001, t_end=3.0
    )
    print(f"\n  {label}:")
    print(f"    最大接触力: {np.max(F_contact):.1f} N")
    print(f"    最大LEE変位: {np.max(np.abs(x_lee))*100:.2f} cm")
    print(f"    速度収束時間 (< 1 mm/s): ", end="")
    rel_v = np.abs(v_chaser - v_lee)
    converged = np.where(rel_v[100:] < 0.001)[0]
    if len(converged) > 0:
        print(f"{t[converged[0]+100]:.2f} s")
    else:
        print("未収束")

このシミュレーションは、FMA(Force Moment Accommodation)のインピーダンスパラメータが捕獲の成否に直接影響することを明確に示しています。

  1. 接触力(左図): Soft設定では最大接触力が25 N以下に収まり、力制限をクリアしています。一方、Stiff設定では瞬間的に25 Nを超えるピークが生じます。インピーダンスを柔らかく設定するほど接触力が低減されますが、その代わりLEEの変位が大きくなります。
  2. LEE変位(中央図): Soft設定ではLEEが数cm変位して衝撃を吸収しています。これは地上でいえば「キャッチャーのミットが後ろに下がる」のと同じ原理です。ミットが硬ければボールの衝撃がそのまま手に伝わり、柔らかければ衝撃が分散されます。
  3. 相対速度の収束(右図): 適切なダンピング(Medium設定)では相対速度が素早くゼロに収束します。Soft設定では収束が遅く、振動的な挙動が残る可能性があります。運用上は、力制限を満たしつつ速やかに収束する「ちょうどよい」インピーダンス設定が求められます。

まとめ

本記事では、ISSのロボットアーム(Canadarm2、JEMRMS)による衛星捕獲技術を体系的に解説しました。

  • 宇宙での捕獲の困難さ: 微小重力・真空・温度変動・通信遅延という環境制約の中で、ニュートン力学が直接的に効く自由浮遊物体を掴む技術的挑戦
  • Canadarm2: 7自由度・17.6 m・可搬質量116トンの大型汎用アーム。LEEのスネア方式とインチワーム移動が特徴的な設計
  • JEMRMS: 主アーム + 小型微細アームのマクロ・マイクロマニピュレータ構成。6軸力覚センサによる精密力制御が強み
  • バーシング vs ドッキング: CBMの大きな開口部と低衝撃がバーシングの利点、迅速性と自律性がドッキングの利点。近年はドッキング方式への移行が進行中
  • 捕獲シーケンス: フリードリフト中の時間窓はわずか数分。残留速度の品質が成否を決定する
  • 安全設計: インピーダンス制御(FMA)による柔軟な接触力管理、モデルベース衝突検知、冗長系設計が多層的に安全を確保
  • 将来技術: Canadarm3(Gateway向け高自律アーム)、非協力対象の捕獲技術が次の技術的フロンティア

ロボットアームによる衛星捕獲は、軌道力学、ロボット運動学、制御工学、安全工学が統合された宇宙工学の結晶です。今後のデブリ除去や軌道上サービスの発展により、この技術の重要性はますます高まっていくでしょう。

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