manvaのエンジニアリング魂

エンジニアリング・ものづくり・DIYをもっと身近にするためのブログ。インスピレーションを刺激します。

一番わかりやすい座標変換の説明

ロボット工学で座標変換をよく使うが、結構混乱しがちだ。
例えば、

  • 同次変換行列はなぜ右からかけるのか
  • 絶対座標系の回転と相対座標系の回転はなぜかける順番が逆になるのか

など、答えは「知っている」ものの、なぜそうなるのか、きちんと理解して説明できる人は意外に少ないのではないだろうか。教科書を見返してみても、結構ややこしい。私が一番わかりやすく説明できる気がするので書いてみる。

簡単のため、2次元の回転で説明するが、3次元の回転や、並進を含めた「同次変換」でも同様である。
まず、回転行列の使い方が複数あるので整理しておく。

回転行列の使い方①:ベクトルの回転

最も基本的な使い方は、ある座標系\Sigmaの中での、ベクトルxの回転である。

回転行列によるベクトルの回転

角度\thetaだけ回転させる回転行列R(\theta)を用いて、回転後のベクトルx'は次式で求められる。

x'=R(\theta)x
R(\theta)=\begin{bmatrix}
\cos\theta & -\sin\theta \\
\sin\theta & \cos\theta \\
\end{bmatrix}
この回転行列R(\theta)は、左からかけるとベクトルが\thetaだけ回転するように作った行列であることを覚えておく。絶対座標系で回転させるには、回転行列を左からかける。

回転行列の使い方②:座標系自体を表す

座標系の軸をベクトルと考えれば、座標系も同じ使い方で回転させることができる。

回転行列による座標系の回転

座標系\Sigmaを、X軸、Y軸の向きを表す単位ベクトルを並べた行列で

と表すと、回転後の座標系\Sigma'
\Sigma'=R(\theta)\Sigma
で求められ、回転後のX軸、Y軸の向きを表す単位ベクトルを並べた行列として表される。\Sigma単位行列なので、回転行列R(\theta)自体が、回転後の座標系の座標軸の向きを表していると見ることができる。
(3次元の場合も同様に、回転行列は回転後のX軸、Y軸、Z軸の向きを表す単位ベクトルを並べた行列である)。

回転行列の使い方③:ベクトルの座標変換

もう一つの使い方は、座標変換である。ある座標系\Sigmaで、Xで表されるベクトルがあるとする。座標系\Sigmaのみを回転行列R(\theta)で角度\thetaだけ回転させると、回転後の座標系\Sigma'ではベクトルX-\thetaだけ回転したベクトルX'の位置に見える。

したがって、回転「後」の座標系\Sigma'で表したベクトルX'を回転「前」の座標系で表したベクトルXに変換するために回転行列R(\theta)が使える。

回転行列による座標変換

つまり、

X=R(\theta)X'
である。

座標系の変換

\Sigma_0\Sigma_1\Sigma_2の3つの座標系がある場合に、上記③の使い方の応用で、「座標系」を座標変換する。座標系\Sigma_1は、絶対座標系\Sigma_0を回転行列 {}_0R_1で回転させたものであるとする。

\Sigma_1={}_0R_1\Sigma_0
上記③と同様に、回転「後」の座標系\Sigma_1から見た\Sigma_2(これを\Sigma_2'とする)を、回転「前」の座標系\Sigma_0から見た\Sigma_2に変換するために上記の回転行列 {}_0R_1 が使える。
つまり、
\Sigma_2={}_0R_1\Sigma_2'\tag{1}
である。

絶対座標系\Sigma_0単位行列であり、上記使い方②のように、それぞれの座標系自体が回転行列で表せる。

\Sigma_1={}_0R_1\Sigma_0={}_0R_1
\Sigma_2={}_0R_2\Sigma_0={}_0R_2\tag{2}
また、\Sigma_2'\Sigma_1に対する相対的な回転で表せる。これを {}_1R_2とすると
\Sigma_2'={}_1R_2\tag{3}
である。

したがって、(1)(2)(3)式より

{}_0R_2={}_0R_1 \; {}_1R_2
となる。相対座標での回転を表す回転行列 {}_1R_2 を右からかけると合成した回転行列が求められることがわかる。
また、これらの回転行列が左からかけると絶対座標で回転させるように作られた行列であることを思い出すと、絶対座標系で {}_1R_2 だけ回転させた後に絶対座標系で {}_0R_1 だけ回転させることと、絶対座標系で {}_0R_1 だけ回転させた後に、相対座標系で(つまり回転後の軸回りに) {}_1R_2 だけ回転させることは同じ結果になることがわかる。(2次元だと回転軸が1つしかないので意識しなくて良いのだが、3次元の場合は、どの座標系のどの軸まわりに回転させたかを考える必要がある。回転行列 {}_1R_2\Sigma_1 座標系の軸まわりの回転を表している)。
座標系の数がもっと増えても同様である。

ロボット工学では、ロボットアームの各リンクとともに動く「リンク座標系」を定義する。リンク座標系で表した位置が、絶対座標系でどのように表されるか、を求めたいことが多いが、このときに座標系を相対回転させる行列をそのまま順に右からかけていくのは上記のような理屈による。