物体の姿勢表現
人工衛星でも,ロボットアームでも,3Dモデルでも何でもよいのだが,ある物体の姿勢を表したい,というのは,基準となる座標系に対してその物体に固定された座標系を何らかの形で表現したい,ということだ.つまり,異なる(ただし正規直交な)座標系の関係をどのようなパラメタと式を使って表現すると,分かりやすく効率的かという話である.一般的によく知られている方法として,以下の3つが挙げられる.
- Direct Cosine Matrix (DCM)
- Euler Angle (オイラー角)
- Quaternion (クオータニオン)
それぞれについて,もう少し詳しく説明していこう.
Direct Cosine Matrix(DCM)
DCMのアイデアは「座標基底ベクトルを並べたものを行列で変換して別の座標の基底を書き表そう.このときに使う変換行列(DCM)がまさに座標間の関係そのものだ」というものである.DCMまたは座標基底そのままだとパラメタが必要以上ある(正規直交な座標しか考えないので座標パラメタ全てをいつでも使えるように用意しておく必要がない)ので,数値計算する場合もこのまま使うとメモリや計算量が多くなってしまうのが難点である.一方で個人的には,座標基底をはっきりした形で操作するので,最も分かりやすい姿勢表現の方法だと思っている.
さて,DCMを用いるとFaからFbへの座標回転は次のように表される.今回もベクトリクスを使って座標を表すので,この表記方法については前記事(剛体の運動方程式)または参考文献を見てもらいたい.
Fb=CbaFa
⎣⎡b1b2b3⎦⎤=⎣⎡c11c21c31c12c22c32c13c23c33⎦⎤⎣⎡a1a2a3⎦⎤
転置すれば次のように表すこともできる.
FbT=FaTCbaT
[b1b2b3]=[a1a2a3]⎣⎡c11c12c13c21c22c23c31c32c33⎦⎤
このとき,DCMを(3)のように表すことにすると整合性が取れる.
Cba=Fb⋅FaT=⎣⎡b1⋅a1 b2⋅a1b3⋅a1 b1⋅a2b2⋅a2b3⋅a2b1⋅a3b2⋅a3b3⋅a3⎦⎤
ではある座標が角速度ベクトルωで回転しているとき,どのように座標を更新すればよいかを確認しておこう.あるベクトルrを単位ベクトルnの周りで微小な角度dφだけ回転させると,変化分はdr=(n×r)dφとなる.角速度ベクトルを用いて書けば次のようになる.
dr=(∣ω∣ω×r)∣ω∣dt=(ω×r)dt
このことを,座標系FbT=[b1 b2 b3]に適用してやれば座標の更新式が得られる.
dtdFbT=ω×FbT=(FbTω)×FbT
DCMの更新式を得るために,FaT=FbTCbaを時間微分する.
0=dtdFbT Cba+FbTdtdCba 0=(ωTFb)×FbTCba+ FbTdtdCba
右辺の1項目はωとCbaの各縦ベクトルをFbで外積を取ったものと考えれば次のように変形できる.
0=FbT(ω×Cba+dtdCba)
よってDCMの微分方程式が次のように得られる.
dtdCba+ω×Cba=0
これで,角速度ベクトルに従って座標系またはDCMを更新できるようになった.角速度ベクトルがどのように変化していくかを予測するのは運動方程式の仕事なので,前回の記事とあわせて剛体の運動を予測し記述する準備が整ったことになる.これと同じ機能を持つ微分方程式を,オイラー角・クォータニオンを用いても書くことが出来るのでこちらも確認しておこう.
オイラー角 / Euler Angle
オイラー角は回転する物に固定された軸の周りに3回回転させることで,任意の姿勢を表すものだ.パラメタが少なく,比較的イメージもしやすいので,ものの姿勢を表すのに使いやすい.一方で,後で述べるように特異点があるので,オイラー角の更新には注意を払う必要がある.あと個人的には,話しているうちにものを回しているんだか座標を回しているんだか,よく分からなくなる気がする.
回転軸の選び方・順序によってオイラー角はいくつも表現方法があるが,今回はYaw(Z) ψ, Pitch(Y) θ, Roll(X) φの順で回転させる,3-2-1(ZYX)オイラー角について紹介する.3-2-1オイラー角による回転行列は次のように表される.
C=C1(φ)C2(θ)C3(ψ)=⎣⎡1000cosφ−sinφ0sinφcosφ⎦⎤⎣⎡cosθ0sinθ010−sinθ0cosθ⎦⎤⎣⎡cosψ−sinψ0sinψcosψ0001⎦⎤=⎣⎡cosθcosψ−cosφsinψ+sinφsinθcosψsinφsinψ+cosφsinθcosψcosθsinψcosφcosψ+sinφsinθsinψ−sinφcosψ+cosφsinθsinψ−sinθsinφcosθcosφcosθ⎦⎤
cosθ=0であれば,DCMからオイラー角への変換は次のように行うことが出来る.
θ=arcsin(−c13)φ=arctan(c23,c33)ψ=arctan(c12,c11)−2π≤θ≤2π−π≤φ≤π−π≤ψ≤π
cosθ=0の場合はこの方法は使えない.仮にψ=0とすれば,sinθ=±1それぞれの場合について,オイラー角は次のように求められる.
[c21c31c22c32]=[−cosφsinψ+sinφcosψsinφsinψ+cosφcosψcosφcosψ+sinφsinψ−sinφcosφ+cosφsinψ]=[sin(φ−ψ)cos(φ−ψ)cos(φ−ψ)−sin(φ−ψ)]
φ=arcsin(−c32), θ=2π, ψ=0
[c21c31c22c32]=[−cosφsinψ−sinφcosψsinφsinψ−cosφcosψcosφcosψ−sinφsinψ−sinφcosφ−cosφsinψ]=[−sin(φ+ψ)cos(φ+ψ)cos(φ+ψ)−sin(φ+ψ)]
φ=arcsin(−c32), θ=−2π, ψ=0
このように,DCMの形で与えられたものをオイラー角で表す場合は,適当に変換すればよいのだが,オイラー角で姿勢を表していてcosθ=0に近づいてしまうと問題が生じる.これを確認するために,オイラー角の更新式を見てみよう.DCMが3-2-1オイラー角による回転行列からなる時,(5)は次のように変形できる.
ω×=−C˙CT=−(C˙1C2C3+C1C˙2C3+C1C2C˙3) C3TC2TC1T=−C˙1C1T−C1C˙2C2TC1T−C1C2C˙3C3TC2TC1T
1軸周りの回転を考えると(5)から以下の関係が得られる.
−C˙1C1T=(ψ˙i1)×, −C˙2C2T=(θ˙i2)×, −C˙3C3T=(φ˙i3)×i1=[100]T, i2=[010]T, i3=[001]T
これより次の関係が得られる.
ω×=−C˙CT=(ψ˙i1)×+C1(θ˙i2)×C1T+C1C2(φ˙i3)×(C1C2)TC1=(ψ˙i1)×+(C1θ˙i2)×+(C1C2φ˙i3)×
ちなみに最後の変形は次のように確認することが出来る.まず,基準座標系での外積を2つの形で表す.
u×v=FbTCba(ua×Cabvb)u×v=uaTCabFb×FbTvb=FbT(Cbaua)×vb
これらを比較すると,次の関係が成り立つことが分かる.
Cbaua×Cab=(Cbaua)×
ベクトル部分が一致するはずなので,
ω=ψ˙i1+C1θ˙i2+C1C2φ˙i3=S(ψ,θ)θ˙
S(ψ,θ)=⎣⎡1000cosψ−sinψ−sinθsinψcosθcosψcosθ⎦⎤, θ=⎣⎡ψθφ⎦⎤
(\ref{Hughes2004_2.3.24})に逆行列S−1をかけてやれば,オイラー角の更新式が得られる.
θ˙=S−1(ψ,θ)ω
S−1=⎣⎡100sinψtanθcosψcosθsinψ cosψtanθ−sinψcosθcosψ⎦⎤, θ=⎣⎡ψθφ⎦⎤
この式を見ると明らかなように,cosθ=0となると更新式が発散する.そのため,オイラー角を用いて姿勢の更新を行う場合は,物理的にシステムが特異点に陥らないことを保証する,計算上特異点を回避する,などの対策を考える必要がある.
クォータニオン / Quaternion
クォータニオンはDCMほどパラメタ数が多くなく,オイラー角のような特異点もないので,実用上便利に用いられる.ちなみに,本によって書き方の流儀(パラメタの順番)が違っていたりするのでよくよく確認したほうがよいのと,Euler Parameterと呼ばれることもあるので,混乱しないように気をつけよう.
まずクォータニオンの書き表し方と計算のルールについて確認する.
q≡q4+iq1+jq2+kq3
q4を実部またはスカラー部,残りの部分を虚部またはベクトル部と呼ぶことにする.ベクトル部に対応するように,q′=iq1+jq2+kq3と定めれば,(8)は次のように表すこともできる.
q=q4+q′
i,j,kの間には次の関係が成り立つ.
i2=j2=k2=−1ij=−ji=k, jk=−kj=i, ki=−ik=j
このルールに基づくとクォータニオン同士の掛け算は次のように表される.
qp=(q4+iq1+jq2+kq3)(p4+ip1+jp2+kp3)=(q4p4−q1p1−q2p2−q3p3)+i(q1p4+q4p1−q3p2+q2p3)+j(q2p4+q3p1−q4p2−q1p3)+k(q3p4−q2p1+q1p2−q4p3)
(\ref{eq:Werts1978_D-5})の形を用いて整理すれば
qp=(q4+q′)(p4+p′)=q4p4+q4p′+p4q′−q′⋅p′+q′×p′
ここまでは単純にクォータニオンのルールなので「そういうものです」ということにしておこう.ここからが「そんなもの考えて何がうれしいの?」と言う部分だ.このクォータニオンのルールに従うと,ベクトルrを単位ベクトルnの周りでθだけ回転させるようなクォータニオンというものを作ることが出来る.
q=cos2θ+nsin2θ
計算方法は以下のとおりだ.回転させたいのはベクトルrだが,計算上はスカラー成分ゼロのクォータニオンを考える.
r′=qrq∗=(cos2θ+nsin2θ)r(cos2θ−nsin2θ)=(−(n⋅r)sin2θ+rcos2θ+(n×r)sin2θ)(cos2θ−nsin2θ)=sin22θ(n⋅r)n+cos22θr+sin2θcos2θ(n×r)−cos2θsin2θ(r×n)−sin22θ(n× r)×n=sin22θ(n⋅r)n+cos22θr+2sin2θcos2θ(n×r)−sin22θ((n⋅n)r−(r⋅n)n)=2sin22θ(n⋅r)n+(cos22θ−sin22θ)r+sinθ(n× r)=(n⋅r)n+cosθ(r−(n⋅r)n)+sinθ(n×r)
式変形の結果を下図と見比べると,確かにベクトルの回転になっていることが分かると思う.
ベクトルをある方向に回転させるような変換は,基底を逆回転させることに対応するのでDCMはq∗Iqのように表すことができる.
C=⎣⎡q12−q22−q32+q422(q1q2−q3q4)2(q1q3+q2q4)2(q1q2+q3q4)−q12+q22−q32+q422(q2q3−q1q4)2(q1q3−q2q4)2(q2q3−q1q4)−q12−q22+q32+q42⎦⎤
DCMからクォータニオンは例えば次のように決めることが出来る.
q4=211+c11+c22+c33q1=4q41(c23−c32), q2=4q41(c31−c13), q3=4q41(c12−c21)
最後に角速度ベクトルωによるクォータニオンの更新式を導出しよう.ここで,座標系をクォータニオンpによって変換し,その後クォータニオンqによって変換するという手順を考える.
FcqFbpFa
あるベクトルrが基準座標系に固定されているものとして,各座標系においてどのようにパラメタ表示されるかというと
FcT(q∗p∗rpq)=FbT(p∗rp)=FaTr
式を見ると,pqというクォータニオンが2つの変換を合わせたクォータニオンになっていることが分かる.このとき,2つ目の変換qを軸n,角度dθの回転として,最終的な変換がどのように表されるかを考よう.
q=cos2dθ+i n1sin2dθ+j n2sin2dθ+k n3sin2dθ, where n=∣ω∣ω, ∣ω∣dt=dθ
地道に掛け算して,一次近似してやれば次のようになる.
pq≃(p4−p1n12dθ−p2n22dθ−p3n32dθ)+i(p1+p4n12dθ−p3n22dθ+p2n32dθ)+j(p2+p3n12dθ+p4n22dθ−p1n32dθ)+k(p3−p2n12dθ+p1n22dθ+p4n32dθ)=p+21(−p1ω1−p2ω2−p3ω3)+2i(p4ω1−p3ω2+p2ω3)+2j(p3ω1+p4ω2−p1ω3)+2k(−p2ω1+p1ω2+p4ω3)
行列の形で表せばクォータニオンの更新式は次のように表される.
dtd⎣⎡q1q2q3q4⎦⎤=21⎣⎡0−ω3ω2−ω1ω30−ω1−ω2−ω2ω10−ω3ω1ω2ω30⎦⎤⎣⎡q1q2q3q4⎦⎤
まとめと参考文献
DCM,オイラー角,クォータニオンによる姿勢の表現と更新式について一通り確認した.宇宙機の姿勢表現や3Dモデリングなどの分野ではクォータニオンがよく用いられるようだが,「姿勢表現はクォータニオンでないといけない」と言うものでもない.それぞれの方法を理解して,目的や状況に合わせて適切な方法を使えるのが一番だ.
最後に,この記事のDCMとオイラー角に関する部分はを参考に,クォータニオンに関する部分はを参考にしつつ書いている.どちらも宇宙機の姿勢運動に関する名著と呼ばれるものなので,より詳しく理解したい場合には参照してもらいたい.