見出し画像

モーションにおける3次元回転 #2 〜方向余弦行列としての回転行列〜

前章「モーションにおける3次元回転 #1」で方向余弦行列について触れたが,モーションキャプチャで回転行列を計算する際,多くの場合,方向余弦行列を算出することになるため,ここで少し方向余弦について補足しておく.

前章では,正規直交基底とは直交する座標系の各軸に固定された3つの単位ベクトルで,回転行列はこの正規直交基底を並べたものであることを述べた(図1).

図1:正規直交基底と回転行列

図1の場合,直交する座標系の各$${XYZ}$$軸に固定された3つの単位ベクトル$${\bm{e}_X, \bm{e}_Y, \bm{e}_Z}$$が正規直交基底を構成し,これを絶対座標系$${xyz}$$からみた各成分($${e_{Xx}, e_{Xy},\dots}$$)で書き表すと,これらの成分が方向余弦に相当するため,回転行列を方向余弦行列と呼ぶこともある.

そこで,まずはこの方向余弦について説明していく.

図2:単位ベクトル i の方向余弦

図2に示した単位ベクトル$${\bm{i}}$$は3つの方向余弦を持つが,このうち$${x}$$方向の方向余弦$${i_x}$$とは,ベクトル$${\bm{i}}$$の座標系$${xyz}$$における$${x}$$成分を意味し,それは単位ベクトル$${\bm{i}}$$と$${x}$$軸方向の単位ベクトル(基底)$${\bm{e}_x}$$との内積

$${i_x = {{\bm{i}}}^T {\bm{e}}_x}$$

で計算される.

内積の記号について(補足)

ここでは,ベクトル$${\bm{b}}$$と$${\bm{c}}$$の内積

$${{\bm{b}}^T \bm{c}}$$

のように記述している.これは,右上付きの$${T}$$が行列の転置を意味し,ベクトル$${\bm{b}=\begin{bmatrix}b_x\\b_y\\b_z\end{bmatrix}}$$が縦ベクトルで記述されているとすると,その転置は$${{\bm{b}}^T = [b_x~b_y~b_z]}$$の横ベクトルとなり,$${{\bm{b}}^T \bm{c}}$$は

$${{{\bm{b}}^T \bm{c}}= \begin{bmatrix}b_x&b_y&b_z\end{bmatrix}\begin{bmatrix}c_x\\c_y\\c_z\end{bmatrix}= b_x c_x+b_y c_y+b_z c_z}$$

と計算できるので,$${{\bm{b}}^T \bm{c}}$$はベクトル$${\bm{b}, \bm{c}}$$の内積となっている.以後,内積はこの転置を使用した記述を用いる.

方向余弦の由来

少し遠回りしたが単位ベクトル$${\bm{i}}$$の$${x}$$軸成分である方向余弦$${i_x}$$は

$${i_x = {\bm{i}}^T \bm{e}_x}$$

のようにベクトル$${\bm{i}}$$と$${\bm{e}_x}$$の内積で計算されることを示したが,このとき,単位ベクトル$${\bm{i}}$$と$${x}$$軸のなす角度を$${\theta}$$とすると,同じく方向余弦$${i_x}$$は図2から幾何学的に

$${i_x = |\bm{i}| \cos \theta= \cos \theta}$$

と書ける.このため方向余弦$${i_x}$$とは,内積の定義から単位ベクトル$${\bm{i}}$$を$${\bm{e}_x}$$に投射した有効成分であるが,幾何学的には単位ベクトル$${\bm{i}}$$と$${\bm{e}_x}$$のなす角度$${\theta}$$の余弦($${\cos \theta}$$)と言い換えることができる.このことから,方向余弦の名称は三角関数の余弦関数$${\cos}$$に由来する.冒頭で述べたように,とくにモーションキャプチャで回転行列を計算する場合は,方向余弦行列の概念を使って計算することに相当するので,以下で具体的を取り上げる.

例1:前腕に固定された座標系の方向余弦行列(回転行列)

図3:前腕に固定された座標系の方向余弦行列

ここでは,ローカル座標系の回転行列(方向余弦行列)を計算することを考える.たとえば,図3の前腕に固定されたローカル座標系を設定し,その長軸方向に固定された正規直交基底のひとつの単位ベクトル$${\bm{i}}$$に注目する.その単位ベクトル$${\bm{i}}$$の絶対座標系$${xyz}$$における成分を

$${\bm{i}=\begin{bmatrix} i_x \\ i_y\\i_z \end{bmatrix}}$$

とし,他の単位ベクトル$${\bm{j, k}}$$についても

$${\bm{j}=\begin{bmatrix} j_x \\ j_y\\ j_z \end{bmatrix},~\bm{k}=\begin{bmatrix} k_x \\ k_y\\ k_z \end{bmatrix}}$$

のように表すときに,絶対座標系(モーションキャプチャ座標系)におけるローカル座標系の方向余弦行列は比較的簡単に算出可能であることは容易に想像できると思う.なぜなら,絶対座標系における前腕の方向余弦行列(回転行列)を算出する際には,もはや絶対座標系との内積を計算する必要がないからである.

したがって,モーションキャプチャで前腕に固定された軸ベクトルの単位ベクトル$${\bm{i}}$$を計算すれば,$${ i_x, i_y, i_z}$$が$${\bm{i}}$$の方向余弦(成分)に相当し,同様に$${ j_x, j_y, j_z}$$と$${k_x, k_y, k_z}$$と$${y,z}$$方向の方向余弦となり,前腕の絶対座標形から見た方向余弦行列(回転行列)

$${\bm{R}=\begin{bmatrix} i_x & j_x & k_x\\ i_y & j_y & k_y \\ i_z &j_z & k_z \end{bmatrix} }$$

を得る.このように,絶対座標系におけるローカル座標系の各軸の単位ベクトルの成分を単純に横に並べたものが,前腕の絶対座標系から見た方向余弦行列,すなわち回転行列となる.あとは,前腕に貼付した反射マーカからどのように前腕のローカル座標系,すなわち正規直交基底を構成するかを考えればよいだけとなる.このことについては,また別の機会に述べていくとするが,最低3点の反射マーカがあればそれを構成できることだけあらかじめ述べておく.

例2:他のローカル座標系から見た前腕の方向余弦行列(回転行列)

図4:ローカル座標系x'y'z'からみた前腕の方向余弦

例1では,たとえばモーションキャプチャ座標系(絶対座標系)から見た前腕の姿勢(回転行列,方向余弦行列)算出を想定していたが,ここでは,図4のようにモーションキャプチャで計測する状況に違いはないが,別のローカル座標系$${x'~y'~z'}$$(例えば,フォースプレートに固定された座標系)からみた,前腕の姿勢(回転行列,方向余弦行列)を取得することを考える.ただし,このローカル座標系は計測中に運動しても構わない.

これは,ベクトル$${\bm{i}}$$の,絶対座標系からローカル座標系$${x'~y'~z'}$$への座標変換に相当するが,ここでは,この座標変換を方向余弦の視点で説明する.

そこで,まず図5に示した座標系$${x'~y'~z'}$$から見た単位ベクトル$${\bm{i}}$$の各成分$${i'_x, i'_y, i'_z}$$,すなわち単位ベクトル$${\bm{i}}$$の座標系$${x'~y'~z'}$$に対する方向余弦の取得方法について考える.これができれば,次に$${{\bm{j}}, {\bm{k}}}$$の方向余弦を取得して,座標系$${x'~y'~z'}$$から見た前腕の回転行列全体を取得できる.

なお,このとき,ローカル座標系$${x'~y'~z'}$$の向き,すなわち絶対座標系から見たローカル座標系$${x'~y'~z'}$$の方向余弦行列(回転行列)も知っておく必要があり,モーションキャプチャによる計測を想定する場合なら,ローカル座標系$${x'~y'~z'}$$を定める反射マーカなどが必要となる.

さて,ローカル座標系$${x'~y'~z'}$$の各軸に固定された正規直交基底を$${\bm{e}'_x~\bm{e}'_y~ \bm{e}'_z}$$とすると,前腕に固定された単位ベクトル$${\bm{i}}$$の各$${x'~y'~z'}$$軸に対する各方向余弦$${i'_x, i'_y, i'_z}$$は,$${\bm{i}}$$と各単位ベクトル$${\bm{e}'_x~\bm{e}'_y~ \bm{e}'_z}$$との内積

$${i'_x = \bm{e}_x'^T  \bm{i},~ i'_y = \bm{e}_y'^T  \bm{i},~ i'_z =  \bm{e}_z'^T \bm{i}}$$

から計算され,同様に$${\bm{j}, \bm{k}}$$の方向も計算可能となる.

ここで,登場するベクトルの成分についてまとめておくと,前腕に固定された基底ベクトル$${\bm{i}, \bm{j}, \bm{k}}$$と,ローカル座標系の基底ベクトル$${\bm{e}'_x, \bm{e}'_y, \bm{e}'_z}$$の成分を

$${\bm{i}=\begin{bmatrix} i_x\\i_y\\i_z \end{bmatrix}, \bm{j}=\begin{bmatrix} j_x\\j_y\\j_z \end{bmatrix}, \bm{k}=\begin{bmatrix} k_x\\k_y\\k_z \end{bmatrix}}$$

$${{\bm{e}}_x'=\begin{bmatrix} e_{xx}\\e_{xy}\\e_{xz} \end{bmatrix}, {\bm{e}}_y'=\begin{bmatrix} e_{yx}\\e_{yy}\\e_{yz} \end{bmatrix}, {\bm{e}}_z'=\begin{bmatrix} e_{zx}\\e_{zy}\\e_{zz} \end{bmatrix}}$$

のように定義する.すると,ローカル座標系$${x'~y'~z'}$$の回転行列$${\bm{R}_{e'} }$$を

$${\bm{R}_{e'} = \begin{bmatrix}\vdots & \vdots & \vdots\\ {\bm{e}'}_x & {\bm{e}'}_y & {\bm{e}'}_z\\ \vdots & \vdots & \vdots \end{bmatrix}}$$

のように,また前腕に固定された座標系の回転行列$${\bm{R}_{ijl} }$$を

$${\bm{R}_{ijk} = \begin{bmatrix}\vdots & \vdots & \vdots\\ {\bm{i}} & {\bm{j}} & {\bm{k}}\\ \vdots & \vdots & \vdots \end{bmatrix}}$$

と定義すると,ローカル座標系$${x'~y'~z'}$$からみた前腕の方向余弦$${\bm{R}'}$$は

$${\bm{R}’=\begin{bmatrix} {{\bm{e}'}_{x}^T \bm{i}} &{\bm{e}'}_{x}^T {\bm{j}} & {\bm{e}'}_{z}^T {\bm{k}}\\ {\bm{e}'}_{y}^T {\bm{i}} & {\bm{e}'}_{y}^T {\bm{j}} & {\bm{e}'}_{y}^T {\bm{k}} \\ {\bm{e}'}_{z}^T {\bm{i}}^  & {\bm{e}'}_{z}^T {\bm{j}} & {\bm{e}'}_{z}^T {\bm{k}} \end{bmatrix} = \begin{bmatrix}\cdots & {\bm{e}'}_x^T & \cdots\\\cdots & {\bm{e}'}_y^T & \cdots\\\cdots & {\bm{e}'}_z^T & \cdots \end{bmatrix}  \begin{bmatrix}\vdots & \vdots & \vdots\\ {\bm{i}} & {\bm{j}} & {\bm{k}}\\ \vdots & \vdots & \vdots \end{bmatrix}=\bm{R}_{e'}^T ~\bm{R}_{ijk}}$$

とまとめることができる.ここで$${\bm{R}_{e'}^T}$$はローカル座標系の回転行列の転置であるが,これはローカル座標系への座標変換行列に相当する(後述する)ので,ローカル座標系$${x'~y'~z'}$$からみた前腕の方向余弦$${\bm{R}'}$$は,前腕の姿勢行列$${\bm{R}_{ijk}}$$をローカル座標系への座標変換していることを示している.

以上をまとめると,絶対座標系ではない異なるローカル座標系(ここでは$${x'y'z'}$$座標系)からみた,解析したい座標系(ここでは前腕の座標系)の回転行列を定めたいときは,両方の座標系の方向余弦行列(回転行列)をまず定めて,ローカル座標系の回転行列の転置をかければ(ローカル座標系に座標変換すれば)よいことを示している.



スポーツセンシング 公式note
スポーツセンシング 運動習慣獲得支援サービス「FitClip」
スポーツセンシング アスリートサポート事業


【解析・受託開発について】

スポーツセンシングでは、豊富な知見を持つ、研究者や各種エンジニアが研究・開発のお手伝いをしております。研究・開発でお困りの方は、ぜひスポーツセンシングにご相談ください。
【例】
 ・データ解析の代行
 ・受託開発
  (ハードウェア、組込みソフトウェア、PC/モバイルアプリ)
 ・測定システム構築に関するコンサルティング など
その他、幅広い分野をカバーしておりますので、まずはお気軽にお問い合わせください。

株式会社スポーツセンシング
【ホームページ】sports-sensing.com
【Facebook】sports.sensing
【Twitter】Sports_Sensing
【メール】support@sports-sensing.com