人工衛星の力学と制御に必要な数学の基礎:座標系・ベクトル

  • このエントリーをはてなブックマークに追加

 JAXAのリポジトリで無料公開されている「人工衛星の力学と制御 宇宙機ダイナミクス・姿勢制御技術ユニット」というPDFが気になりました。WATLABブログとの相性も良く、振動関係の実践的な知識も学べそうだと思い、記事にしながら勉強を進めていきます。ここでは基礎数学の章をまとめてみます。

こんにちは。wat(@watlablog)です。ここでは体系的に振動制御を学べそうなJAXAの資料から、数学の基礎部分をまとめてみます!

モチベーション

 ここ数年宇宙関係の書籍を読み漁っており、衛星の力学に興味を持ちました。どうやらこの分野には振動関係の知識が非常に役にたつそうです。この記事の筆者は振動分野の計算力学技術者1級ですが、これまで制御関係が弱かったと思うので、これを機に理解を深めたいところです。…と相棒のChatGPTに相談したところ、JAXAのリポジトリを紹介してもらいました。なんと以下リンク先のPDFは無料公開されています。
・人工衛星の力学と制御 宇宙機ダイナミクス・姿勢制御技術ユニット
 https://jaxa.repo.nii.ac.jp/records/6101

 数学の基礎から始まっているので、この資料に沿って勉強していけばこの分野に入門できると思いました。筆者の本業ではこのレベルまではやりませんが、振動現象の問題は周りで散見され、日々相談されることも多いので勉強してみようと思います。必要に応じてPythonで原理確認しつつ進めることで、理解を深めることができると考えます。

 本記事は、人工衛星の力学と制御を学ぶシリーズの第1回です。まずは数学の基礎から始めます。理論の詳しい説明は参考資料のPDFに譲り、この記事では数式を整理するとともに、Pythonで実装・検証した結果を紹介することを目的におきます。

 それでは早速はじめていきましょう。

座標系と座標

Advertisements

 古典力学では物体の運動を3次元ユークリッド空間(曲がっていない空間)で表現します。幾何学的な関係を記述するためには座標系を設定する必要があります。この記事では右手形のデカルト座標(直交座標)を用います。

Matplotlibで座標系を可視化してみよう!

Pythonコードを見る

 次のコードは参考文献[1]に載っている座標系をPython/Matplotlibで書くコードです。参考までに。

座標系

 3次元の軸方向を\(x, y, z\)ではなく\(1, 2, 3\)とおいた座標系\(F\)において、点\(P\)の位置は式(1)となります。

\[ \chi_F(P)=(p_1,p_2,p_3) \tag{1} \]

 参考文献[1]にこの表現はありませんが、ここで\(\chi_F(P)\)は写像を表現しており、式全体は「座標系\(F\)における点\(P\)の座標は\((p_1,p_2,p_3)\)である、と読みます。

ベクトル

 座標系の軸方向を表す単位ベクトル\(\vec e_1,\vec e_2,\vec e_3\)を基底ベクトルと呼びます。これらを並べた配列を\(\{\vec e\}\)(式(2))、ベクトル\(\vec p\) の座標成分を並べた列行列を \(\mathbf p\) (式(3))と表します。

\[ \{\vec e\} = \begin{Bmatrix} \vec e_1\\ \vec e_2\\ \vec e_3 \end{Bmatrix} = \begin{Bmatrix} \vec e_1 & \vec e_2 & \vec e_3 \end{Bmatrix}^{T} \tag{2} \]
\[ \mathbf p = \begin{bmatrix} p_1\\ p_2\\ p_3 \end{bmatrix} = \begin{bmatrix} p_1 & p_2 & p_3 \end{bmatrix}^{T} \tag{3} \]

 任意のベクトル \(\vec p\) は、基底ベクトルと座標成分を使って式(4)と表せます。

\[ \vec p = p_1\vec e_1+p_2\vec e_2+p_3\vec e_3 = \{\vec e\}^{T}\mathbf p = \mathbf p^{T}\{\vec e\} \tag{4} \]

 参考文献[1]では基底ベクトル配列を波括弧 \(\{\ \}\)、座標成分を角括弧 \([\ ]\) 、太字で書いたベクトルは成分を表すといった使い分けがされているようです。

例題1-1

 ここで参考文献[1]の例題1-1を解いてみます(問題文と図はPDFを確認してください)。

 まず、元の基底でベクトル \(\vec p\) を表すと、式(5)になります。

\[ \vec p=p_1\vec e_1+p_2\vec e_2 \tag{5} \]

 問題の図の角度に従うと、元の基底ベクトルは回転後の基底で次の図のように成分分解できます。

 そのため式(6)で元の基底ベクトルを表せます。

\[ \begin{aligned} \vec e_1&=\cos\theta\,\vec e'_1+\sin\theta\,\vec e'_2 \\ \vec e_2&=-\sin\theta\,\vec e'_1+\cos\theta\,\vec e'_2 \end{aligned} \tag{6} \]

 式(5)に式(6)を代入すると式(7)となります。これで答えとなります。

\[ \begin{aligned} \vec p &=p_1\left(\cos\theta\,\vec e'_1+\sin\theta\,\vec e'_2\right) +p_2\left(-\sin\theta\,\vec e'_1+\cos\theta\,\vec e'_2\right)\\ &=\left(\cos\theta\,p_1-\sin\theta\,p_2\right)\vec e'_1 +\left(\sin\theta\,p_1+\cos\theta\,p_2\right)\vec e'_2 \end{aligned} \tag{7} \]

ベクトルの内積

 任意の2つのベクトル \(\vec a,\vec b\) のなす角を \(\theta\) とすると、内積は式(8)で定義されます。

\[ \vec a\cdot\vec b = |\vec a|\,|\vec b|\cos\theta \tag{8} \]

 内積の結果はベクトルではなくスカラーとなり、幾何学的には、\(\vec a\) を \(\vec b\) の方向に射影した長さ \(|\vec a|\cos\theta\) に、\(|\vec b|\) を掛けた量です(式(9))。

\[ \vec a\cdot\vec b = \underbrace{|\vec a|\cos\theta}_{\vec b\text{ 方向への射影}} \,|\vec b| \tag{9} \]

 内積は「向きの揃い具合」を \(\cos\theta\) で表しつつ、2つの長さの積でスケールした量です。長さが同じなら、なす角が \(0^\circ\) に近いほど正に大きく、\(90^\circ\) で0、\(180^\circ\) に近いほど負に大きくなります。この辺の話は「Pythonでベクトルと関数の相関を計算してみる」等でやっているので、当WATLABブログではお馴染みですね。

ベクトルの外積

 外積 \(\vec a\times\vec b\) は、内積とは異なり、結果がベクトルになる演算です。大きさは式(10)と定まります。

\[ |\vec a\times\vec b| = |\vec a|\,|\vec b|\sin\theta \tag{10} \]

 向きは、外積ベクトルをその大きさで割った単位ベクトルとして式(11)で表せます。

\[ \hat{\vec n} = \frac{\vec a\times\vec b}{|\vec a\times\vec b|} \tag{11} \]

 そのため外積は式(12)と書くことができます。このベクトルの向きが \(\hat{\vec n}\) の向きです。なお、\(\vec a,\vec b\) が平行なら外積は零ベクトルなので、向きを定めることはできません。

\[ \vec a\times\vec b = |\vec a|\,|\vec b|\sin\theta\;\hat{\vec n} \tag{12} \]

直交基底ベクトル同士の関係

 ここでは、右手系の直交座標系を構成する基底ベクトル \(\vec e_1,\vec e_2,\vec e_3\) に、内積と外積を適用したときの関係を整理します。基底ベクトルは大きさが1で、互いに直交しています。

 まず、内積についてです。同じ基底ベクトル同士の内積は1、異なる基底ベクトルどうしの内積は0になります(式(13), 式(14))。

\[ \vec e_1\cdot\vec e_1 = \vec e_2\cdot\vec e_2 = \vec e_3\cdot\vec e_3 = 1 \tag{13} \]
\[ \vec e_1\cdot\vec e_2 = \vec e_2\cdot\vec e_3 = \vec e_3\cdot\vec e_1 = 0 \tag{14} \]

 次に、外積についてです。同じ基底ベクトル同士の外積は零ベクトルになります。異なる基底ベクトル同士の外積は、右手系の規則に従って、残りの基底ベクトルと同じ向きになります(式(15), 式(16))。

\[ \vec e_1\times\vec e_1 = \vec e_2\times\vec e_2 = \vec e_3\times\vec e_3 = \vec 0 \tag{15} \]
\[ \vec e_1\times\vec e_2=\vec e_3,\qquad \vec e_2\times\vec e_3=\vec e_1,\qquad \vec e_3\times\vec e_1=\vec e_2 \tag{16} \]

 外積の順序を逆にすると、向きが反対になるため符号が反転します(式(17))。

\[ \vec e_2\times\vec e_1=-\vec e_3,\qquad \vec e_3\times\vec e_2=-\vec e_1,\qquad \vec e_1\times\vec e_3=-\vec e_2 \tag{17} \]

 基底ベクトル同士の内積を各要素に並べると、式 (18) の行列になります。また、各組み合わせの外積を並べると、式 (19) のベクトル配列になります。

\[ \begin{aligned} \{\vec e\}\cdot\{\vec e\}^{T} &= \begin{Bmatrix} \vec e_1\\ \vec e_2\\ \vec e_3 \end{Bmatrix} \cdot \begin{Bmatrix} \vec e_1 & \vec e_2 & \vec e_3 \end{Bmatrix}\\ &= \begin{bmatrix} \vec e_1\cdot\vec e_1 & \vec e_1\cdot\vec e_2 & \vec e_1\cdot\vec e_3\\ \vec e_2\cdot\vec e_1 & \vec e_2\cdot\vec e_2 & \vec e_2\cdot\vec e_3\\ \vec e_3\cdot\vec e_1 & \vec e_3\cdot\vec e_2 & \vec e_3\cdot\vec e_3 \end{bmatrix}\\ &= \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} =\mathbf U_3 \end{aligned} \tag{18} \]
\[ \begin{aligned} \{\vec e\}\times\{\vec e\}^{T} &= \begin{Bmatrix} \vec e_1\\ \vec e_2\\ \vec e_3 \end{Bmatrix} \times \begin{Bmatrix} \vec e_1 & \vec e_2 & \vec e_3 \end{Bmatrix}\\ &= \begin{Bmatrix} \vec e_1\times\vec e_1 & \vec e_1\times\vec e_2 & \vec e_1\times\vec e_3\\ \vec e_2\times\vec e_1 & \vec e_2\times\vec e_2 & \vec e_2\times\vec e_3\\ \vec e_3\times\vec e_1 & \vec e_3\times\vec e_2 & \vec e_3\times\vec e_3 \end{Bmatrix}\\ &= \begin{Bmatrix} \vec 0 & \vec e_3 & -\vec e_2\\ -\vec e_3 & \vec 0 & \vec e_1\\ \vec e_2 & -\vec e_1 & \vec 0 \end{Bmatrix} \end{aligned} \tag{19} \]

スカラー三重積

 任意の3つのベクトル\(\vec a, \vec b, \vec c \) に関して、式(20)に示すスカラー三重積の関係があります。

\[ \vec a\cdot(\vec b\times\vec c) = \vec b\cdot(\vec c\times\vec a) = \vec c\cdot(\vec a\times\vec b) \tag{20} \]

 幾何学的には、まず \(\vec b\times\vec c\) の大きさが、\(\vec b\) と \(\vec c\) が張る平行四辺形の面積になります。さらに \(\vec a\) をその面に垂直な方向へ射影すると、平行六面体の高さが得られます。したがって、スカラー三重積の絶対値は「底面積×高さ」、つまり平行六面体の体積です。符号は、3つのベクトルの並び方によって決まります。

Pythonでスカラー三重積を体験しよう!

Pythonコードを見る

 スカラー三重積が持つ便利な特性、計算値は平行六面体の体積となる、という内容をPythonで検証してみましょう。次のコードを実行するとMatplotlibで可視化結果とともに計算結果も描画されます。

 こちらが実行結果です。スカラー三重積で計算された値と底面積×高さで計算された値は一致しました。

ベクトル三重積

 ベクトル三重積は、外積の結果にもう一度外積を適用する演算です。一般に、次の公式(21)で計算できます。

\[ \vec{a}\times(\vec{b}\times\vec{c}) = \vec{b}(\vec{a}\cdot\vec{c}) - \vec{c}(\vec{a}\cdot\vec{b}) \tag{21} \]

 右辺はベクトル \(\vec b,\vec c\) のスカラー倍どうしの差なので、結果もベクトルになります。この公式は、ベクトル三重積の計算を内積とベクトルのスカラー倍に分けて扱えるため便利です。

まとめ

 本記事では、人工衛星の力学と制御を学ぶための数学的準備として、座標系とベクトルの基礎を整理しました。内積はベクトルの向きの関係をスカラーで表し、外積は大きさと向きを持つベクトルを与えます。また、スカラー三重積の絶対値は、3つのベクトルがつくる平行六面体の体積に等しいことを、Pythonで可視化して確認しました。

 ベクトル三重積では、外積を含む式を内積とベクトルのスカラー倍に変形できます。これらの関係は、今後、座標変換や力学・制御の式を扱う際にも使われます。

参考文献

[1] JAXA, 人工衛星の力学と制御:宇宙機ダイナミクス・姿勢制御技術ユニット, 2006, JAXA-SP-05-025.

GitHub

 本記事のコードは以下のGitHubに置きました。
・GitHub:https://github.com/watlablog/python-spacecraft-dynamics

異分野を学ぶためにJAXAの資料を読み始めました!結構しっかりと、しかも専門的な知識を学べそうです!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*