この記事はSSSRC Advent calender 2023 12日目の記事として書かれています.
お久しぶりです.B4の鳴海です.
アメブロを書くのは,去年のアドカレ以来です.
今年は書く予定はなかったのですが,バーベキューで皆々様にご迷惑をお掛けしたということで書くことになりました.
悪いのはこの人↓(涼しげに書いてますね(#°Д°))
まあそんなことは置いておいて...
僕は姿勢を表すクォータニオンについて書こうかなと.
オイラーパラメータという言い方もありますが,ここではクォータニオンということにします.
衛星の姿勢系はもちろん,熱系,COLOURSの電装系,飛翔シミュレーションでクォータニオンを使うとのことで,そうした人たちのお勉強のきっかけになればなと.
あんまり厳密なことは言っていないので,この記事を入り口にお勉強してもらえれば嬉しいです.
本記事は↓の二番煎じです.
姿勢ってなんだ?
「姿勢って何ですか?」 意外と難しいこの質問.皆さんは答えられますでしょうか?
簡単に言えば,姿勢とは物体の向いている方向のことです.
ただ方向というには何かしら2つの基準が必要で,「基準Aから基準Bがこうなってる」と言わないといけません.
卑近な例(スマホのコンパス):磁北とスマホの基準軸から,自分が向いている方向がわかる
その基準Aとなるのが慣性座標で,動かない,絶対的な座標系です.
基準Bとして物体に引っ付いた座標系(機体軸)を用意しておけば,慣性軸(基準A)に対して機体軸(基準B)がどうなってるかはわかりそうです.
基準Aに対して基準Bがどこを向いているかを表すには,座標の変換(回転)を使えば良さげです.
「慣性軸をこうこう回転させたら,機体軸に一致するぜ!」っていうので,物体の方向表せるよねってことです.
つまり姿勢は「慣性系を機体軸に一致させるための座標変換」ということができます.
これをもって,物体の向いている方向を定量的に表すことができます.
姿勢:慣性軸をどう座標変換したら機体軸になるか?
(飛行機の制御屋さんに怒られそうな図っすね...(;´Д`)ゴメン)
「姿勢=座標変換」と先ほどは一口に言いました.
ただ!
慣性座標を機体座標に一致させるような座標変換って1通りじゃないんですよね〜ここが面白い.
なかでもよく使われるのが,「オイラー角」と,今回の主役の「クォータニオン」です.
姿勢表現 〜オイラー角〜
まずはオイラー角から.
オイラー角の気持ちは,「軸まわりの回転で姿勢表現しようぜ!」です.
オイラー角:軸周りに3回回して姿勢表現
「z軸周りにΨ回して,y軸周りにΘ回して,x軸周りにΦ回して」と3回回して姿勢表現しているっていうのが上図の意味です.この3つの角をまとめて,オイラー角と言います.
(「Φ:ロール角,Θ:ピッチ角,Ψ:ヨー角」という言葉,一度は聞いたことがある人も多いのでは?)
このオイラー角,物理的なイメージがしやすいことが利点ですが,気を付けるべきことも多く...
- 回転変換は可換でないので,回す順番を気にしないと\(^o^)/オワル
上の説明ではz-y-xの順に回していますが,オイラー角を表記するときは,
のように(ベクトルじゃないけど)ベクトル表現で書かれます.
こう書かれると回転の順番の情報は消えるのでちゃんと,回す順番を頭の中に叩き込んでおかないといけません.回転の順番をミスると,姿勢も\(^o^)/になります.
(回す順番を数えたら,オイラー角は12通りもある)
- ジンバルロックが起りうる
オイラー角を用いる場合,数学的な性質上ジンバルロックが起こる可能性があります.
ジンバルロックとは特定の状況で,回転の自由度が3から2に落ちてしまう現象のことです.
これが大問題で,これが起こると\(^o^)/になります.
オイラー角のこうした問題を解決してくれるのが,クォータニオンです.
(航空機は,オイラー角のわかりやすさ&ジンバルロックが起こる状況はまずないことから,オイラー角が主流です)
姿勢表現 〜クォータニオン〜
本命のクォータニオンを.
クォータニオンの気持ちは,「任意軸回転で姿勢表現しようぜ!」です.
クォータニオン:回転軸周りに1回回して姿勢表現
クォータニオンの定義と計算
「なんで角度が半分なんや!!!!」と言う人はとりあえず認めてあげてください.数学的にそういうもんです...
<計算の中身とかもうちょっとちゃんと知りたかったら,これ.三電さんの資料.https://www.mesw.co.jp/business/report/pdf/mss_18_07.pdf>
- クォータニオンのノルム
姿勢を表すクォータニオンは定義からわかるようにノルムは1になります.
(一般的なクォータニオンにはノルムの条件はないです)
この式をいい感じに使って整理されてる式もあります.見た目に騙されないでください.
- 共役クォータニオン
共役クォータニオンは,複素数と同じノリでベクトル部の符号を変えるだけです.
またまた,複素数と同じノリで次の式が成り立ちます.カンタンだね.
- クォータニオン同士の積
クォータニオン(q)と(p)の積は次のようになります.回転の合成とかで使います.
- クォータニオンとベクトルの積
クォータニオン(q)とベクトル(a)の積は次のようになります.これは,後々紹介するキネマティクス方程式でよく使います.
- 回転の表現
ベクトルの回転(左図) 座標軸の回転(右図)
クォータニオンのすごいところ(計算誤差,球面線形補間)
クォータニオンの計算結果,見た目変な部分(特に回転)もありますね.
ただ,オイラー角と違ってジンバルロックを起こさないという利点があります.
クォータニオンを使うメリットはそれだけにとどまらず,計算誤差,補間の点でも利点があるそうです.
- 計算誤差
どうやら,クォータニオンを使ってシミュレーションを回すと計算誤差が溜まりにくいそうです.(当方,体感はしていない)
ノルムを1にする正規化が鍵らしいですね.キネマティクス方程式からクォータニオンを更新する際に正規化を行うんですが,それで計算誤差の影響を小さくできているとか.すごいなあ...
↓そのことについて言及してるやつ
- 球面線形補間(slerp : spherical liner interpolation)
補間とは「2つのデータ間を適当に補う」ということです.
シミュレーションやセンサー値で飛び飛びのクォータニオンを取得したとき,変な動きにならないようなめらか~に間を補いたいときがあります.
加速度等のデータならば,以下のように線形補間を使うことが多いと思います.
クォータニオンでも同じようには...できないんですね.
というのも,姿勢クォータニオンのノルムは1であるという話をしましたが,「普通」に線形補間するとノルムの情報が失われるからなんですね.
そこで出てくるのが球面線形補間(slerp)で,次のようにかけます.
上のような補間を考えることで,ノルム1という条件を崩すことなく,ある程度楽に,ある程度滑らかな補間ができるってわけです.
ここでΔqは差分とか,(補間じゃないけど制御だと...)偏差とかいいます.差だからと言って,クォータニオン同士を引き算しないでね!!!
↓slerpを使って補間してるプログラム,グラフィックスがある↓オイラー角の線形補間とslerpを数値的に比べてる
↓slerpを使うときの注意点を述べてる
3-2-1 オイラー角への変換
ここまで散々クォータニオンをプッシュしてきたわけですが,クォータニオンにも悪いところはあます.なんつったって
これに尽きるでしょう.
例えば,次のクォータニオンが与えられたとして「ああ,こういう姿勢ね」ってすぐわかる人はいないでしょう.いたら変態.
そうしたときは,クォータニオンではなくオイラー角を使って,
と書いた方が姿勢はパッとわかります.
なので,姿勢データをわかりやすくするために,オイラー角で書きたい!と思うこともあるでしょう.
クォータニオンを3-2-1オイラー角に変換する式をまとめておきます.(ジンバルロック無視)
↓回転行列,クォータニオン,オイラー角間の関係がまとめてあるサイト.3-2-1以外もある
キネマティクス(運動学)方程式
運動のシミュレーションを組むとき,ダイナミクス(運動方程式)はもちろんキネマティクス(運動学)も必要です.具体的な流れは次の通り...
力,トルクから変位,姿勢を求めるためのブロック線図
↓上の図はここに書いてあるやつをパク参考にした
並進運動のキネマティクスはここでは無視して(というか意識しなくてもわかるはず),回転運動のみ考えます.
「キネマティクス = ωとqの関係」なので...
これがキネマティクス方程式というやつです.
ただ...先ほども述べたようにこれはノルムの条件を満たしません!!!
なので次のように正規化して,姿勢クォータニオンを逐次更新していきます.
まとめ
(自分の研究ではクォータニオンを使わないんですが)COLOURSでロケットの飛翔シミュレーションをつくるためにクォータニオンを勉強しました.
その共有ってことで今回,クォータニオンの紹介をしました.
(より詳しく知りたいならこのPDFを見てください.数学的側面からクォータニオンを眺めてたりして面白いです
http://www.jp.square-enix.com/tech/library/pdf/CEDEC2021_SQEX_IMI_Quaternion_20210827_public.pdf)
シミュレーションで使うネオアームストロングサイロケットの運動の図
(もちろん,シミュレーションはMatlab/Simulinkで書きました!!Mathworkさん,ありがとう!!!)
くだくだとクォータニオンについて説明してきましたが,2点ほど気がついたとこが,
- アメブロでクォータニオンなんて説明するもんじゃねえな〜(#クォータニオンなんてねえし)
- クォータニオンなんぞ姿勢を表す「道具」なんで,シミュレーションとか組んでみんと使えるようにならんな〜