MATLABで回転行列を定義してオイラー角が複数あることを調べる

回転行列

\begin{align}
\boldsymbol{R}_{x}(\boldsymbol{η}) =
\begin{pmatrix}
1 & 0 & 0\\ 0 & \cos \phi & – \sin \phi \\
0 & \sin \phi & \cos \phi
\end{pmatrix}
\end{align}

\begin{align}
\textbf{R}_{y}(\boldsymbol{η}) =
\begin{pmatrix}
\cos \theta & 0 & \sin \theta \\
0 & 1 & 0\\
-\sin \theta & 0 & \cos \theta
\end{pmatrix}
\end{align}

\begin{align}
\textbf{R}_{z}(\boldsymbol{η}) =
\begin{pmatrix}
\cos \psi & -\sin \psi & 0 \\
\sin \psi & \cos \psi & 0 \\
0 & 0 & 1
\end{pmatrix}
\end{align}

を定義してオイラー角が複数あることを調べる。MATLABで次のような関数を実装し、

function [Rx,Ry,Rz] = symRot(eta2)
phi=eta2(1);
theta=eta2(2);
psi=eta2(3);


Rx=[...
    1   0           0;...
    0   cos(phi)    -sin(phi);...
    0   sin(phi)    cos(phi);...
];
Ry=[...
    cos(theta)  0          sin(theta);...
    0           1          0;...
    -sin(theta) 0          cos(theta);...
];

Rz=[...
    cos(psi)   -sin(psi)   0;...
    sin(psi)   cos(psi)    0;...
    0          0           1;...
];

end

シンボリック演算の機能を利用して

syms phi theta psi

[Rx,Ry,Rz]=symRot([phi theta psi])

とすると各回転行列が得られる。

例えばオイラー角の一つ

\begin{align}
\boldsymbol{R}_I^B (\boldsymbol{η}) =\boldsymbol{R}_z (\boldsymbol{η}) \boldsymbol{R}_y (\boldsymbol{η}) \boldsymbol{R}_x(\boldsymbol{η})
\end{align}

を計算すれば

\begin{align}
\boldsymbol{R}_I^B(\boldsymbol{η}) =
\begin{pmatrix}
\boldsymbol{C}_\psi \boldsymbol{C}_\theta & \boldsymbol{C}_\psi \boldsymbol{S}_\phi \boldsymbol{S}_\theta – \boldsymbol{C}_\phi \boldsymbol{S}_\psi & \boldsymbol{S}_\phi \boldsymbol{S}_\psi + \boldsymbol{C}_\phi \boldsymbol{C}_\psi \boldsymbol{S}_\theta\\
\boldsymbol{C}_\theta \boldsymbol{S}_\psi & \boldsymbol{C}_\phi \boldsymbol{C}_\psi + \boldsymbol{S}_\phi \boldsymbol{S}_\psi \boldsymbol{S}_\theta & \boldsymbol{C}_\phi \boldsymbol{S}_\psi \boldsymbol{S}_\theta – \boldsymbol{C}_\psi \boldsymbol{S}_\phi \\
-\boldsymbol{S}_\theta & \boldsymbol{C}_\theta \boldsymbol{S}_\phi & \boldsymbol{C}_\phi \boldsymbol{C}_\theta
\end{pmatrix}
\end{align}

を得る。

これを使えば掛ける順を変えれば回転行列の形が変化することを確認できる。

コメント

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