宇宙機姿勢クォータニオンシミュレーター 戻る
宇宙工学

宇宙機姿勢クォータニオンシミュレーター

宇宙機・航空機・ロボットの3次元姿勢を表す「クォータニオン q=(w,x,y,z)」を、ロール/ピッチ/ヨーの Euler角と任意軸まわりの回転から合成し、リアルタイムに4成分・ノルム・等価 Euler角を計算します。gimbal lock を回避し、姿勢決定制御系 (ADCS) で標準的に使われる Hamilton 規約の四元数を直感的に学べます。

パラメータ設定
ロール φ
°
機体 X 軸(前後)まわりの回転
ピッチ θ
°
機体 Y 軸(左右)まわりの回転。±90° で gimbal lock
ヨー ψ
°
機体 Z 軸(上下)まわりの回転
回転軸 n_x
回転軸 n_y
回転軸 n_z
軸ベクトルは自動的に単位ベクトルに正規化されます
回転角 α
°
軸-角度クォータニオンの回転量
計算結果
クォータニオン w
クォータニオン x
クォータニオン y
クォータニオン z
ノルム |q|
合成 Euler (φ,θ,ψ) °
3D 宇宙機モデル — 姿勢・回転軸の可視化

機体は入力姿勢に従って回転し、太陽電池パネルと機軸(X=赤・Y=緑・Z=青)の方向が変化します。黄色のベクトルは軸-角度回転の単位軸 n、扇形は回転角 α を表します。

クォータニオン4成分
軸-角度 α 掃引 — 合成姿勢の Euler角変化
理論・主要公式

$$q = \cos\tfrac{\alpha}{2} + \sin\tfrac{\alpha}{2}\bigl(n_x\,i + n_y\,j + n_z\,k\bigr),\quad q_1\,q_2 = (\text{rotation composition})$$

単位ベクトル n=(n_x,n_y,n_z) の周りに角度 α だけ回転するクォータニオン。クォータニオン乗算は非可換 (q1·q2 ≠ q2·q1)。

$$q_{ZYX} = \begin{pmatrix} c_r c_p c_y + s_r s_p s_y \\ s_r c_p c_y - c_r s_p s_y \\ c_r s_p c_y + s_r c_p s_y \\ c_r c_p s_y - s_r s_p c_y \end{pmatrix},\quad c_\ast=\cos\tfrac{\ast}{2},\,s_\ast=\sin\tfrac{\ast}{2}$$

Tait-Bryan ZYX 順序(ヨー→ピッチ→ロール)で組み立てた Euler→四元数変換。φ:ロール、θ:ピッチ、ψ:ヨー。

$$|q| = \sqrt{w^2 + x^2 + y^2 + z^2} = 1,\qquad q^{-1} = q^* / |q|^2,\qquad q^* = (w,-x,-y,-z)$$

単位クォータニオン条件と逆元(共役 q*)。実機では毎ステップ q ← q/|q| で再正規化する。

クォータニオンによる宇宙機姿勢表現

🙋
宇宙機の姿勢って、ロール・ピッチ・ヨーの3つで決まりますよね。なんでわざわざ4成分のクォータニオンなんて使うんですか?3つで足りるのに余分じゃないですか?
🎓
いい質問だね。確かに自由度は3つだから、Euler角3つでも姿勢は記述できる。でも実用上は「gimbal lock」という致命的な問題があるんだ。例えばピッチが ±90°ちょうどになると、ロール軸とヨー軸が同じ向きになって、ロールとヨーの区別がつかなくなる。アポロ計画でも実際にこの問題が起きていて、宇宙飛行士が「Christmas tree!」(コンソールに警告ランプが一斉点灯)と叫ぶ場面があったほど。クォータニオンは1次元余分に持つことで、この特異点を物理的に消してしまえるんだ。
🙋
なるほど、特異点回避が一番大事なんですね。でもクォータニオンって複素数の親戚みたいなもので、i²=−1 とか出てきて難しそう…直感的に何を表しているんですか?
🎓
ざっくり言うと、q=(cos(α/2), sin(α/2)·n) は「軸 n まわりに角度 α だけ回転する操作」を1個の数にパックしたものだよ。半角 α/2 が出てくるのが最初はギョッとするけど、これはクォータニオンがベクトル v に作用するとき v' = q·v·q* と「左右からはさむ」形になるから。両側から効くので、回転角が二重に効かないように半角にしてある。だから q と −q(符号反転)は同じ回転を表すんだ。これを「二重被覆」と呼ぶよ。左パネルで「回転軸=(0,0,1)、回転角=90°」にすると、q_axis = (cos45°, 0, 0, sin45°) = (0.707, 0, 0, 0.707) になっているのが確認できるね。
🙋
2つの回転を組み合わせるのに「乗算」を使うんですよね。これも普通の掛け算とは違うんですか?
🎓
クォータニオン乗算は Hamilton が1843年に発見した非可換な代数で、q1·q2 ≠ q2·q1 になる。回転の順序を入れ替えると結果が違うのと同じ意味だね。本ツールでは「Euler角で作った姿勢クォータニオン q_euler」と「軸-角度で作った q_axis」を q_total = q_euler · q_axis で合成している。例えばスタートラッカーから読んだ絶対姿勢に、リアクションホイールの差分回転を加える、というような使い方だ。Quaternion SLAM や姿勢推定の拡張カルマンフィルタ(EKF/UKF)でも、状態遷移はこの乗算で書かれているよ。
🙋
右上の「ノルム |q|」が 1 になっているか気にする必要があるとのことですが、なぜ 1 から外れると問題なんですか?
🎓
単位クォータニオン |q|=1 だけが純粋な「回転」を表すんだ。ノルムが 1.05 になると、回転+5%の拡大、みたいに余計な相似変換が混入してしまう。Hubble 宇宙望遠鏡や ISS の姿勢決定系では、毎制御周期(数十Hz〜数百Hz)でクォータニオンを再正規化 q ← q/|q| するか、誤差クォータニオン定式化(multiplicative EKF, MEKF)で誤差の蓄積自体を抑える。数値積分で角速度から姿勢を更新するときは特に注意で、Runge-Kutta 4次でも 1秒で 10⁻⁶ オーダーのノルム誤差が出るから、長時間運用では補正必須なんだ。
🙋
「合成 Euler」がリアルタイムで出るのも便利ですね。でも下の「α 掃引」グラフを見ると、α を増やすとピッチが急に飛ぶ場所がありますね。これも gimbal lock ですか?
🎓
よく気づいたね、それは Euler角への逆変換に特有の問題で「pitch=±90° の近傍で atan2 の分母が 0 に近づき、ロールとヨーが交換可能になる」ためなんだ。クォータニオン側では何も特異なことは起きていなくて、4成分は滑らかに変化している。これがまさに「クォータニオンで姿勢を積分して、表示のときだけ Euler角に変換する」べき理由だよ。NASA・JAXA・ESA の宇宙機 ADCS は全てこの方針で設計されている。

よくある質問

クォータニオンは4成分 (w,x,y,z) で3D回転を一意に表現でき、Euler角の特異点である gimbal lock(ピッチ ±90°でロールとヨーが縮退する現象)を完全に回避できます。さらに2つの回転の合成が単一の乗算で済み、補間(SLERP)が等角速度で滑らかになるため、姿勢決定制御系(ADCS)・スタートラッカー・MEMS IMU 融合・ロボットアームの軌道計画など、姿勢を時間連続で扱う全ての場面で標準的に用いられます。
Tait-Bryan ZYX 順序(ヨー→ピッチ→ロール)で、cy=cos(ψ/2), sy=sin(ψ/2), cp=cos(θ/2), sp=sin(θ/2), cr=cos(φ/2), sr=sin(φ/2) と置くと、q_w=cr·cp·cy+sr·sp·sy, q_x=sr·cp·cy−cr·sp·sy, q_y=cr·sp·cy+sr·cp·sy, q_z=cr·cp·sy−sr·sp·cy となります。φ=ロール、θ=ピッチ、ψ=ヨー。JPL/Hamilton の符号慣習(i²=j²=k²=ijk=−1)に従い、本ツールも Hamilton 規約で実装しています。
単位クォータニオン |q|=1 のみが純粋な回転を表します。数値積分やセンサーフュージョン(拡張カルマンフィルタ)で時間とともにノルムが 1 から逸脱すると、回転行列に変換した際にスケーリング成分が混入し、ベクトルの長さが変わってしまいます。本ツールでは |q|−1| > 0.01 で warn を出します。実機の ADCS では毎ステップ q ← q/|q| で正規化(renormalization)するか、誤差クォータニオン定式化で誤差の蓄積自体を抑える設計が標準です。
単位ベクトル n=(n_x,n_y,n_z) の周りに角度 α だけ回転するクォータニオンは q=(cos(α/2), sin(α/2)·n_x, sin(α/2)·n_y, sin(α/2)·n_z) です。物理的意味が直感的で、Rodrigues の回転公式と直接対応します。半角 α/2 が現れるのは、クォータニオン q がベクトル v に作用するとき v' = q·v·q* と「左右からはさむ」形になるため、回転が二重に効くことを補正する必要があるからです。これにより q と −q が同じ回転を表す「二重被覆」が生じます。

実世界での応用

宇宙機・人工衛星の姿勢決定制御系 (ADCS):ISS、Hubble、JWST、Starlink 衛星群、はやぶさ2・SLIM 等の月惑星探査機まで、現代の宇宙機の姿勢推定・制御は例外なくクォータニオン基底です。スタートラッカーから絶対姿勢クォータニオン q_ref を得て、ジャイロからの角速度を q̇ = ½·q·ω で積分し、誤差クォータニオン δq でリアクションホイールやスラスタへの指令を生成します。Euler角は人間が表示を読むときの変換用途のみで、計算は全てクォータニオン領域で行います。

ドローン・UAV の姿勢制御:DJI・Skydio・PX4・ArduPilot などの民生・産業ドローン用フライトコントローラは、MEMS IMU(加速度計+ジャイロ+磁気センサ)の融合に Mahony フィルタや MEKF を採用し、内部状態としてクォータニオンを保持します。アクロバット飛行で機体が垂直上昇から背面飛行に遷移する瞬間、Euler角ベースだとピッチ ±90° で制御が破綻しますが、クォータニオン基底なら何の特異性もなく連続的に姿勢を追跡できます。

3DCG・ゲームエンジン・VR/AR:Unity・Unreal Engine・Blender などのリアルタイム 3D アプリは、内部の Transform 回転を必ずクォータニオンで保持します。キャラクターアニメーションのキーフレーム補間は SLERP(球面線形補間)で行い、等角速度の滑らかな回転を実現します。Oculus Quest や HTC Vive などの VR ヘッドセットも、6DoF トラッキングからのヘッド姿勢をクォータニオンで配信し、レンダリングパイプラインの最後でビュー行列に変換します。

ロボット工学・モーションキャプチャ:産業用ロボットアーム(FANUC・KUKA・ABB)の軌道計画、人型ロボット(Atlas, ASIMO 系)のバランス制御、Vicon や OptiTrack のモーションキャプチャの剛体姿勢出力など、関節角や剛体姿勢を補間・微分する場面では Euler角の特異点を避けてクォータニオンで処理します。逆運動学のヤコビアン計算でも、回転部分の自由度を3で扱う際にクォータニオンの接空間(角速度ベクトル)を経由するのが標準です。

よくある誤解と注意点

まず最大の混乱が、クォータニオンの「符号慣習」です。Hamilton 規約(ij=k)と JPL 規約(ij=−k)の2つが存在し、両者でクォータニオン乗算の符号が逆になります。3DCG・ゲーム業界・Eigen ライブラリは Hamilton、NASA JPL の宇宙機 ADCS 系コードは JPL 規約が多く、ライブラリを混在させると姿勢が反対に回転します。本ツールは Hamilton 規約で実装しています。さらに格納順序にも (w,x,y,z) と (x,y,z,w) の2流派があり、Eigen は (x,y,z,w)、ROS の tf2 は (x,y,z,w)、本ツールと多くの教科書は (w,x,y,z) です。コードを移植する際は必ず両方を確認してください。

次に、「クォータニオンは特異点がない」を「逆変換にも特異点がない」と誤解すること。クォータニオン q 自身は4次元単位球面 S³ 上に滑らかに分布し、特異点はありません。しかし q から Euler角への逆変換 (asin, atan2) には ピッチ = ±90° で atan2(0,0) の不定領域が現れ、ロールとヨーが交換可能になります。本ツールでも pitchOut の計算で |sinp| ≥ 1 をクランプしているのはこのためです。だからこそ「姿勢の積分と制御はクォータニオン領域で行い、Euler角に変換するのは人間が表示を読むときだけ」という設計原則が生まれました。

最後に、「単位クォータニオンであり続けると思い込む」こと。数値計算では Runge-Kutta 4次積分でも、1秒あたり 10⁻⁶ 程度のノルム誤差が必ず蓄積します。フィードバックで補正しないと、数時間後にはノルムが 0.999 や 1.001 になり、姿勢推定にバイアスが入ります。実機では各ステップで q ← q/|q| を実行するか、誤差クォータニオン定式化(MEKF)で誤差自体を 0 周辺の小さな量として扱います。本ツールは入力された Euler角と軸-角度から閉形式で計算するためノルムは数値誤差レベルで 1.0001 程度ですが、長時間の積分系では必ず正規化処理を入れてください。

使い方ガイド

  1. Roll・Pitch・Yaw(度)を入力するか、軸ベクトル(X/Y/Z成分)と回転角度を指定します
  2. シミュレーターが自動的にEuler角からクォータニオン(w,x,y,z)に変換し、ノルム|q|を検証します
  3. 出力されたクォータニオン値と合成Euler角を確認し、gimbal lock(ピッチ90°付近)の挙動を観察します
  4. 軸-角度表現による別ルートでの計算結果と比較し、SLERP補間の基礎を理解します

具体的な計算例

国際宇宙ステーション(ISS)の太陽電池パネル駆動を想定:Roll=30°、Pitch=45°、Yaw=60°を入力。クォータニオンはq=(0.8315, 0.2391, 0.3865, 0.3536)で、ノルム|q|=1.0000となり正規化済み。また回転軸(0, 1, 0)・回転角87.28°からも同じクォータニオンが得られ、軸-角度とEuler角の等価性が確認できます。合成Euler角φ=30.0°、θ=45.0°、ψ=60.0°と一致します。

実務での注意点