概要
以下の内容の個人的まとめ。
- 四元数(クォータニオン)を用いたプロクルステス問題の解法
- 回転行列の最適補正
- その周辺の話題
参考資料
3次元回転に関して丁寧に解説されている本
金谷健一著 「3次元回転 ーパラメータKさんとリー代数による最適化」共立出版
こちらの本は非常に丁寧に書かれているので、ご購入されるとよいと思います。
以下ではこの本のことを回転本といいます。
四元数を用いたプロクルステス問題の解法を示した論文
B.K.P.Horn Closed-form solution of absolute orientation using unit quaternions
1. 四元数(クォータニオン)を用いたプロクルステス問題の解法
1.1 回転行列を用いたプロクルステス問題
剛体の回転を考える。剛体上のNこの観測点に関して、
図を入れる
回転行列 ${\rm \bf R}$ を用いたプロクルステス問題を考える。
J = \frac{1}{2} \sum^{N}_{\alpha = 1} \| {\bf a}_{\alpha}' - {\bf R}{\bf a}_{\alpha} \|^2 \rightarrow min \tag{1.1.1}
これを展開して
\begin{eqnarray}
J &=& \frac{1}{2} \sum^{N}_{\alpha = 1} \| {\bf a}_{\alpha}' - {\bf R}{\bf a}_{\alpha} \|^2 \tag{1.1.2} \\
&=& \frac{1}{2} \sum^{N}_{\alpha = 1} \| {\bf a}_{\alpha}'\|^2 - \sum^{N}_{\alpha = 1} \langle {\bf R}{\bf a}_\alpha , {\bf a}_{\alpha}' \rangle + \frac{1}{2} \sum^{N}_{\alpha = 1} \| {\bf a}_{\alpha} \|^2 \tag{1.1.3} \\
\end{eqnarray}
1項目と3項目はconstなので J を最小化するには2項目の
K = \sum^{N}_{\alpha = 1} \langle {\bf R}{\bf a}_\alpha , {\bf a}_{\alpha}' \rangle \tag{1.1.4}
を最大化させればいい。
1.2 四元数によるプロクルステス問題の表記
回転行列 ${\bf R}$ は四元数 $q = q_0 + q_1i + q_2j + q_3k$ を用いて
{\bf R} =
\begin{pmatrix}
q_0^2+q_1^2-q_2^2-q_3^2 & 2(q_1q_2 - q_0q_3) & 2(q_1q_3 + q_0q_2) \\
2(q_2q_1 + q_0q_3) & q_0^2 - q_1^2 + q_2^2 - q_3^2 & 2(q_2q_3 - q_0q_1) \\
2(q_3q_1 - q_0q_2) & 2(q_3q_2 + q_0q_1) & q_0^2-q_1^2-q_2^2+q_3^2
\end{pmatrix} \tag{1.2.1}
とかけるので、(1.1.4)式 K 内の ${\bf R}{\bf a}_{\alpha}$ は
{\bf a}_{\alpha} =
\begin{pmatrix}
a_{\alpha (1)} \\
a_{\alpha (2)} \\
a_{\alpha (3)}
\end{pmatrix}\tag{1.2.2}
を用いて
\begin{eqnarray}
{\bf R}{\bf a}_{\alpha} &=& \begin{pmatrix}
q_0^2+q_1^2-q_2^2-q_3^2 & 2(q_1q_2 - q_0q_3) & 2(q_1q_3 + q_0q_2) \\
2(q_2q_1 + q_0q_3) & q_0^2 - q_1^2 + q_2^2 - q_3^2 & 2(q_2q_3 - q_0q_1) \\
2(q_3q_1 - q_0q_2) & 2(q_3q_2 + q_0q_1) & q_0^2-q_1^2-q_2^2+q_3^2
\end{pmatrix}
\begin{pmatrix}
a_{\alpha (1)} \\
a_{\alpha (2)} \\
a_{\alpha (3)}
\end{pmatrix} \\
&=&
\begin{pmatrix}
(q_0^2+q_1^2-q_2^2-q_3^2) a_{\alpha (1)}+2(q_1q_2 - q_0q_3)a_{\alpha (2)}+2(q_1q_3 + q_0q_2) a_{\alpha (3)} \\
2(q_2q_1 + q_0q_3) a_{\alpha (1)}+(q_0^2 - q_1^2 + q_2^2 - q_3^2) a_{\alpha (2)} + 2(q_2q_3 - q_0q_1) a_{\alpha (3)} \\
2(q_3q_1 - q_0q_2) a_{\alpha (1)} + 2(q_3q_2 + q_0q_1) a_{\alpha (2)} + (q_0^2-q_1^2-q_2^2+q_3^2 )a_{\alpha (3)}
\end{pmatrix}\tag{1.2.3}
\end{eqnarray}
となるので、$\langle {\bf R}{\bf a}_\alpha , {\bf a}_{\alpha}' \rangle$ は
\begin{eqnarray}
\langle {\bf R}{\bf a}_\alpha , {\bf a}_{\alpha}' \rangle &=&
\begin{pmatrix}
(q_0^2+q_1^2-q_2^2-q_3^2) a_{\alpha (1)}+2(q_1q_2 - q_0q_3)a_{\alpha (2)}+2(q_1q_3 + q_0q_2) a_{\alpha (3)} \\
2(q_2q_1 + q_0q_3) a_{\alpha (1)}+(q_0^2 - q_1^2 + q_2^2 - q_3^2) a_{\alpha (2)} + 2(q_2q_3 - q_0q_1) a_{\alpha (3)} \\
2(q_3q_1 - q_0q_2) a_{\alpha (1)} + 2(q_3q_2 + q_0q_1) a_{\alpha (2)} + (q_0^2-q_1^2-q_2^2+q_3^2 )a_{\alpha (3)}
\end{pmatrix} \ast
\begin{pmatrix}
a_{\alpha (1)}' \\
a_{\alpha (2)}' \\
a_{\alpha (3)}'
\end{pmatrix} \\ \tag{1.2.4}
&=& \ \
(q_0^2+q_1^2-q_2^2-q_3^2) a_{\alpha (1)}a_{\alpha (1)}'+2(q_1q_2 - q_0q_3)a_{\alpha (2)}a_{\alpha (1)}'+2(q_1q_3 + q_0q_2) a_{\alpha (3)}a_{\alpha (1)}' \\
\ \ &+& 2(q_2q_1 + q_0q_3) a_{\alpha (1)}a_{\alpha (2)}'+(q_0^2 - q_1^2 + q_2^2 - q_3^2) a_{\alpha (2)}a_{\alpha (2)}' + 2(q_2q_3 - q_0q_1) a_{\alpha (3)}a_{\alpha (2)}' \\
\ \ &+& 2(q_3q_1 - q_0q_2) a_{\alpha (1)}a_{\alpha (3)}' + 2(q_3q_2 + q_0q_1) a_{\alpha (2)}a_{\alpha (3)}' + (q_0^2-q_1^2-q_2^2+q_3^2 )a_{\alpha (3)}a_{\alpha (3)}'
\end{eqnarray}
となる。ここで*は内積。よって (1.1.4) のKは
\begin{eqnarray}
K &=& \sum^{N}_{\alpha = 1} \langle {\bf R}{\bf a}_\alpha , {\bf a}_{\alpha}' \rangle \\
&=& \sum^{N}_{\alpha = 1} \{
(q_0^2+q_1^2-q_2^2-q_3^2) a_{\alpha (1)}a_{\alpha (1)}'+2(q_1q_2 - q_0q_3)a_{\alpha (2)}a_{\alpha (1)}' \\ &+& 2(q_1q_3 + q_0q_2) a_{\alpha (3)}a_{\alpha (1)}' + 2(q_2q_1 + q_0q_3) a_{\alpha (1)}a_{\alpha (2)}' \\ &+& (q_0^2 - q_1^2 + q_2^2 - q_3^2) a_{\alpha (2)}a_{\alpha (2)}' + 2(q_2q_3 - q_0q_1) a_{\alpha (3)}a_{\alpha (2)}' \\
&+& 2(q_3q_1 - q_0q_2) a_{\alpha (1)}a_{\alpha (3)}' + 2(q_3q_2 + q_0q_1) a_{\alpha (2)}a_{\alpha (3)}' \\ &+& (q_0^2-q_1^2-q_2^2+q_3^2 )a_{\alpha (3)}a_{\alpha (3)}' \}\tag{1.2.5}
\end{eqnarray}
\begin{eqnarray}
K &=& \sum^{N}_{\alpha = 1} \{
q_0^2 (a_{\alpha (1)}a_{\alpha (1)}' + a_{\alpha (2)}a_{\alpha (2)}' + a_{\alpha (3)}a_{\alpha (3)}) +
q_1^2 (a_{\alpha (1)}a_{\alpha (1)}' - a_{\alpha (2)}a_{\alpha (2)}' - a_{\alpha (3)}a_{\alpha (3)}) \\
&+& q_2^2 (- a_{\alpha (1)}a_{\alpha (1)}' + a_{\alpha (2)}a_{\alpha (2)}' - a_{\alpha (3)}a_{\alpha (3)})
+ q_3^2 (- a_{\alpha (1)}a_{\alpha (1)}' - a_{\alpha (2)}a_{\alpha (2)}' + a_{\alpha (3)}a_{\alpha (3)}) \\
&+& 2q_0q_1(a_{\alpha (2)}a_{\alpha (3)}' - a_{\alpha (3)}a_{\alpha (2)}')
+ 2q_0q_2(-a_{\alpha (1)}a_{\alpha (3)}' + a_{\alpha (3)}a_{\alpha (1)}') \\
&+& 2q_0q_3(a_{\alpha (1)}a_{\alpha (2)}' - a_{\alpha (2)}a_{\alpha (1)}')
+ 2q_1q_2(a_{\alpha (1)}a_{\alpha (2)} + a_{\alpha (2)}a_{\alpha (1)}') \\
&+& 2q_1q_3(a_{\alpha (1)}a_{\alpha (3)} + a_{\alpha (3)}a_{\alpha (1)})
+ 2q_2q_3(a_{\alpha (2)}a_{\alpha (3)} + a_{\alpha (3)}a_{\alpha (2)})
\} \tag{1.2.6}
\end{eqnarray}
ごちゃごちゃしてきたので回転本やHornの論文の表記に従って、
N_{ij} = \sum_{\alpha=1}^{N} a_{\alpha (i)}a_{\alpha (j)} \tag{1.2.7}
とすると、
\begin{eqnarray}
K &=&
q_0^2 (N_{1,2} + N_{2,2} + N_{3,3}) + q_1^2 (N_{1,1} - N_{2,2} - N_{3,3}) \\
&+& q_2^2 (- N_{1,1} + N_{2,2} - N_{3,3}) + q_3^2 (- N_{1,1} - N_{2,2} + N_{3,3}) \\
&+& 2q_0q_1(N_{2,3} - N_{3,2}) + 2q_0q_2(-N_{1,3} + N_{3,1}) \\
&+& 2q_0q_3(N_{1,2} - N_{2,1}) + 2q_1q_2(N_{1,2} + N_{2,1}) \\
&+& 2q_1q_3(N_{1,3} + N_{3,1}) + 2q_2q_3(N_{2,3} + N_{3,2}) \tag{1.2.8}
\end{eqnarray}
そうすると、$q_x$ に関して二次式となっているので、これのまとめ方として
{\bf q}{\bf q}^{\top}{\bf \tilde{N}} \tag{1.2.9}
とか
\langle {\bf q}, {\bf \tilde{N}}{\bf q} \rangle \tag{1.2.10}
といったものが想像できる。
\tilde{N} =
\begin{pmatrix}
N_{1,2} + N_{2,2} + N_{3,3} & \cdots & \cdots & \cdots \\
\cdots & N_{1,2} - N_{2,2} - N_{3,3} & \cdots & \cdots \\
\cdots & \cdots & - N_{1,2} + N_{2,2} - N_{3,3} & \cdots \\
\cdots & \cdots & \cdots & -N_{1,2} - N_{2,2} + N_{3,3}
\end{pmatrix} \tag{1.2.11}
となればいいだろう。
それ以外の成分に関しては、例えば $q_0q_1$ の係数は この行列の(0, 1)成分と(1, 0)成分に対応するので、
\tilde{N} =
\begin{pmatrix}
\cdots & N_{2,3} - N_{3,2} & \cdots & \cdots \\
N_{2,3} - N_{3,2} & \cdots & \cdots & \cdots \\
\cdots & \cdots & \cdots & \cdots \\
\cdots & \cdots & \cdots & \cdots
\end{pmatrix} \tag{1.2.12}
とすれば足して2倍となってちょうどいい。そうすると、(1.2.8)式の $q_iq_j \left( i\neq j \right)$ となる6つの項は $\tilde{N}$ の非対角成分と対応する。
よって、求める行列は
\tilde{N} =
\begin{pmatrix}
N_{1,2} + N_{2,2} + N_{3,3} & N_{2,3} - N_{3,2} & -N_{1,3} + N_{3,1} & N_{1,2} - N_{2,1} \\
N_{2,3} - N_{3,2} & N_{1,1} - N_{2,2} - N_{3,3} & N_{1,2} + N_{2,1} & N_{1,3} + N_{3,1} \\
-N_{1,3} + N_{3,1} & N_{1,2} + N_{2,1} & - N_{1,1} + N_{2,2} - N_{3,3} & N_{2,3} + N_{3,2} \\
N_{1,2} - N_{2,1} & N_{1,3} + N_{3,1} & N_{2,3} + N_{3,2} & -N_{1,1} - N_{2,2} + N_{3,3}
\end{pmatrix} \tag{1.2.13}
とわかる。これにより求める最大化問題は
K = \langle {\bf q}, {\bf \tilde{N}}{\bf q} \rangle \rightarrow max \tag{1.2.14}
となる。
${\bf q}$ は4次元だが、わかりやすく3次元で考えてみる。
さらに、同じ向きの中ではより大きさが増大する方がよい。
なので、結局、${\bf q}$ は $\tilde{N}$ の固有ベクトルの中で最大固有値に対応するものがよさげ。 -> 証明は?
回転行列の最適補正
プロクルステス問題を解いて回転行列を得たとしても、誤差のためにそれらが正しい回転行列・・つまりその列ベクトルが正規直交系をなしている・・・とは限らない。
今、
\| {\bf A} \|_F = \sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n} A_{ij}^2} \tag{2.1}
よって、問題の定式化をすると
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
{\bf R} = \argmin_{R} \| {\bf R} - \hat{\bf R} \|_F^2 \tag{2.2}
という感じか。後の計算のため2乗とした。具体的にはフロベニウスノルムの2乗がtransposeとの積のトレースとなることを用いる。
\| {\bf A} \|_F^2 = {\rm tr} ({\bf A}{\bf A}^\top ) = {\rm tr} ({\bf A}^\top {\bf A} )
そうすると(2.2)式は
\begin{eqnarray}
\| {\bf R} - \hat{\bf R} \|_F^2 &=& {\rm tr}(({\bf R} - \hat{\bf R})({\bf R} - \hat{\bf R})^{\top}) \tag{2.3} \\
&=& {\rm tr}(({\bf R} - \hat{\bf R})({\bf R}^{\top} - \hat{\bf R}^{\top})) \tag{2.4} \\
&=& {\rm tr}({\bf R}{\bf R}^\top - {\bf R}\hat{\bf R}^\top - \hat{\bf R}{\bf R}^{\top} + \hat{\bf R} \hat{\bf R}^\top) \tag{2.5} \\
&=& {\rm tr}({\bf R}{\bf R}^\top) - {\rm tr}({\bf R}\hat{\bf R}^\top) - {\rm tr}(\hat{\bf R}{\bf R}^{\top}) + {\rm tr}(\hat{\bf R} \hat{\bf R}^\top) \tag{2.6} \\
&=& {\rm tr}{\bf I} - {\rm tr}({\bf R}\hat{\bf R}^\top) - {\rm tr}({\bf R}\hat{\bf R}^\top)^\top + {\rm tr}(\hat{\bf R} \hat{\bf R}^\top) \tag{2.7} \\
&=& 3 - 2{\rm tr}({\bf R}\hat{\bf R}^\top) + \|\hat{\bf R}\|_F^2 \tag{2.8} \\
\end{eqnarray}
となる。
(2.3)式から(2.4)式へは引いてからtransposeしてもtransposeして引いても同じとなる性質、(2.5)式から(2.6)式へは足したり引いたりしてtraceを求めてもtrace求めて足したり引いても同じとなる性質、(2.7)式から(2.8)式へはtransposeしてもtraceは変わらない性質及びフロベニウスノルムの2乗がtransposeとの積のtraceとなる性質をそれぞれ用いた。
(2.8)式において、3項目はconst。よって(2.8)式を最小化することは2項目を最大化させること。つまり求める ${\bf R}$ は
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
{\bf R} = \argmax_{R} {\rm tr}({\bf R} \hat{\bf R}^\top) \tag{2.9}
これは $\hat{\bf R}$ の特異値分解を
\hat{\bf R} = {\bf U \Sigma V}^\top
として
{\bf R} = {\bf U}
\begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 &0 & | {\bf UV} |
\end{pmatrix}
{\bf V}^\top
となる。(途中過程は回転本第四章の3など参照されたし)
個人的な疑問
前節で書いた四元数を用いてプロクルステス問題を解いた場合、得られる四元数のノルムが1となるよう各要素 $q_0, q_1, q_2, q_3$ を補正したのではダメなのか?それを求めて(1.1.2)式で回転行列に変換した方が早そうだが。。。