Loading [MathJax]/jax/output/CommonHTML/jax.js
PR

IMUセンサーと四元数(クォーターニオン)

記事内に広告が含まれています。

 慣性センサーなど制御系で個人的に使用する式だけ抜き出したたんなる覚書です。

 まずクォーターニオン q を次のようにします。

q=qω+qxi+qyj+qzk=[qωqxqyqz]i2=j2=k2=ijk=1

 表現がq=[qxqyqzqw]Tとなっていたり、q=[q1q2q3q4]Tとかq=[q0q1q2q3]Tとなっていたりいろいろあり紛らわしいので明記しておきます。

スポンサーリンク

クォーターニオンの積

 クォーターニオン同士の積です。

q1q2=(ω1+x1i+y1j+z1k)(ω2+x2i+y2j+z2k)=(ω1ω2x1x2y1y2z1z2)+(ω1x2+ω2x1+y1z2z1y2)i+(ω1y2+ω2y1+z1x2x1z2)j+(ω1z2+ω2z1+x1y2y1x2)k

▲展開して各項でまとめるとこのようになります。

 ベクトル表記すると▼

q1q2=(ω1ω2v1v2,ω1v2+ω2v1+v1×v2)v1v2=x1x2+y1y2+z1z2(y1z2z1y2,z1x2x1z2,x1y2y1x2)

 内積と外積で実部、虚部に分けてすっきり表現できます。

オイラー角からクォーターニオン

 任意の軸(単位ベクトル)n=(nx,ny,nz)θ回転させるときのクォーターニオンは

q=[cosθ2nxsinθ2nysinθ2nzsinθ2]

で表現されます。

 xyzの各軸廻りはそれぞれ

qx=[cosθx2nxsinθx200]qy=[cosθy20nysinθy20]qz=[cosθz200nzsinθz2]

で表現され、クォーターニオンの積より、オイラー角(3軸回転xyz順)からクォーターニオンへの変換は、

qxqyqz=[sinθx2sinθy2sinθz2+cosθx2cosθy2cosθz2cosθx2sinθy2sinθz2+sinθx2cosθy2cosθz2sinθx2cosθy2sinθz2+cosθx2sinθy2cosθz2cosθx2cosθy2sinθz2+sinθx2sinθy2cosθz2]

 このように展開されます。

クォーターニオンから回転行列

 クォーターニオンから回転行列への変換です。ベクトルr=(rx,ry,rz)をクォーターニオンqで回転させると

r=qrq=(qω+qxi+qyj+qzk)(rxi+ryj+rzk)(qωqxiqyjqzk)

で表現されます。で頑張って展開して、対応するi,j,k成分で行列式の形でまとめ直すと

[rxryrz]=[q2ω+q2xq2yq2z2(qxqyqωqz)2(qωqy+qxqz)2(qωqz+qxqy)q2ωq2x+q2yq2z2(qyqzqωqx)2(qxqzqωqy)2(qyqz+qωqx)q2ωq2xq2y+q2z][rxryrz]

 となります。

 よく使いそうな式の単なる個人的な覚書です。

コメント

タイトルとURLをコピーしました