「点の移動・回転」の版間の差分
(座標変換の順問題) |
(→3次元の回転: 順番の修正) |
||
(1人の利用者による、間の3版が非表示) | |||
37行: | 37行: | ||
</math><br> | </math><br> | ||
を回転行列といったりする。この行列は正規直交行列(<math>R^\text{T} R = R R^\text{T} = I</math>)で<math>\text{det}(R) = 1</math>になる。 | を回転行列といったりする。この行列は正規直交行列(<math>R^\text{T} R = R R^\text{T} = I</math>)で<math>\text{det}(R) = 1</math>になる。 | ||
− | |||
<br style="clear: both" /> | <br style="clear: both" /> | ||
74行: | 73行: | ||
= 逆問題を解く = | = 逆問題を解く = | ||
− | 今までは、移動量や回転角が与えられた場合に点がどう動くかを見てきた。ここでは反対に移動前後の点の組<math>\left \{ (x_i, x^\prime_i) \right \}_i</math> | + | 今までは、移動量や回転角が与えられた場合に点がどう動くかを見てきた。ここでは反対に移動前後の点の組<math>\left \{ (x_i, x^\prime_i) \right \}_i</math>が与えられた時に、平行移動量および回転角(・回転軸)を求めることを考える。 |
+ | |||
+ | 要するに、次式を満たす<math>R, \boldsymbol{t}</math>を求める。<br> | ||
+ | <math> | ||
+ | \boldsymbol{x}_i = R \boldsymbol{x}^\prime_i + \boldsymbol{t} | ||
+ | </math><br> | ||
+ | 実際には誤差なんかがあって等式は成り立たなくなるだろうから、できるだけ等しくなるような値を求める事にする。 | ||
+ | |||
+ | == 重心に関する運動 == | ||
+ | とりあえず、<math>\boldsymbol{x}_i</math>の重心<math>\bar{\boldsymbol{x}}</math>を計算してみる。<br> | ||
+ | <math> | ||
+ | \begin{align} | ||
+ | \bar{\boldsymbol{x}} &= \frac{1}{n} \sum_i^n \boldsymbol{x}_i \\ | ||
+ | &= \frac{1}{n} \sum_i^n R \boldsymbol{x}^\prime_i + \boldsymbol{t} \\ | ||
+ | &= R \bar{\boldsymbol{x}}^\prime + \boldsymbol{t} | ||
+ | \end{align} | ||
+ | </math> | ||
+ | |||
+ | 重心を原点にとって<math>\left( \boldsymbol{y}_i, \boldsymbol{y}^\prime_i \right)</math>とすると、<br> | ||
+ | <math> | ||
+ | \begin{align} | ||
+ | \boldsymbol{y}_i &= \boldsymbol{x}_i - \bar{\boldsymbol{x}} \\ | ||
+ | &= \left( R \boldsymbol{x}^\prime_i + \boldsymbol{t} \right) - \left( R \bar{\boldsymbol{x}}^\prime + \boldsymbol{t} \right) \\ | ||
+ | &= R \left( \boldsymbol{x}^\prime_i - \bar{\boldsymbol{x}}^\prime \right) \\ | ||
+ | &= R \boldsymbol{y}^\prime_i | ||
+ | \end{align} | ||
+ | </math><br> | ||
+ | となるから、これから回転<math>R</math>が求められそうだ。 | ||
+ | |||
+ | 回転が分かれば平行移動成分は次式で計算できる。<br> | ||
+ | <math> | ||
+ | \boldsymbol{t} = \bar{\boldsymbol{x}} - R \bar{\boldsymbol{x}}^\prime | ||
+ | </math><br> | ||
+ | 特に<math>\bar{\boldsymbol{x}}^\prime = \boldsymbol{0}</math>なら回転と無関係に平行移動成分が分かる。 | ||
+ | |||
+ | というわけで、ここからは回転を求める事に精を出す。 | ||
+ | |||
+ | == 2次元の回転 == | ||
+ | 誤差の定義は色々考えられるが、ここではベクトルの内積は同じベクトル同士を掛けた時が最大というのを使って次式を用いる。<br> | ||
+ | <math> | ||
+ | e = \sum_i \boldsymbol{y}_i^\text{T} R \boldsymbol{y}^\prime_i \longrightarrow \max | ||
+ | </math><br> | ||
+ | これは長いベクトルの方が誤差に表れやすいため、そういうベクトルを重視する人向けの誤差である。 | ||
+ | |||
+ | <math> | ||
+ | R = | ||
+ | \begin{bmatrix} | ||
+ | c & -s \\ | ||
+ | s & c | ||
+ | \end{bmatrix} | ||
+ | </math><br> | ||
+ | とおいて<math>e</math>を未知数<math>c, s</math>に付いて書き直すと以下の式を得る。<br> | ||
+ | <math> | ||
+ | e = \sum_i | ||
+ | \begin{bmatrix} | ||
+ | y_{1i} y^\prime_{1i} + y_{2i} y^\prime_{2i} & y_{2i} y^\prime_{1i} - y_{1i} y^\prime_{2i} | ||
+ | \end{bmatrix} | ||
+ | \begin{bmatrix} | ||
+ | c \\ | ||
+ | s | ||
+ | \end{bmatrix} | ||
+ | </math> | ||
+ | |||
+ | この式が<math>c^2 + s^2 = 1</math>の下で最大になるのは当然次の時。<br> | ||
+ | <math> | ||
+ | \begin{bmatrix} | ||
+ | c \\ s | ||
+ | \end{bmatrix} | ||
+ | = \frac{\boldsymbol{u}}{|\boldsymbol{u}|} | ||
+ | </math><br> | ||
+ | <math> | ||
+ | \boldsymbol{u} = | ||
+ | \begin{bmatrix} | ||
+ | \sum_i \boldsymbol{y}_i \cdot \boldsymbol{y}^\prime_i \\ | ||
+ | -\sum_i \boldsymbol{y}_i \times \boldsymbol{y}^\prime_i | ||
+ | \end{bmatrix} | ||
+ | </math> | ||
+ | |||
+ | |||
+ | == 3次元の回転 == | ||
+ | まあ、2次元の時と同じ。大きさが1の複素数<math>c + is</math>の代わりに、大きさが1のクォータニオン<math>\boldsymbol{q}</math>を使うだけ。 | ||
+ | |||
+ | クォータニオンの成分を<br> | ||
+ | <math> | ||
+ | \boldsymbol{q} = \left( s; \boldsymbol{v} \right) | ||
+ | </math><br> | ||
+ | とすると、回転は次式で表される。<br> | ||
+ | <math> | ||
+ | \boldsymbol{y}_i = 2 \boldsymbol{v} \left( \boldsymbol{v} \cdot \boldsymbol{y}^\prime_i \right) + \left ( 2 s^2 - 1 \right) \boldsymbol{y}^\prime_i + 2 s \left( \boldsymbol{v} \times \boldsymbol{y}^\prime_i \right) | ||
+ | </math> | ||
+ | |||
+ | で、内積が最大になるようにする、と。<br> | ||
+ | <math> | ||
+ | e = \sum_i \left( 2 \left( \boldsymbol{v} \cdot \boldsymbol{y}_i \right) \left( \boldsymbol{v} \cdot \boldsymbol{y}^\prime_i \right) + \left ( 2 s^2 - 1 \right) \left( \boldsymbol{y}_i \cdot \boldsymbol{y}^\prime_i \right) + 2 s \, \boldsymbol{y}_i {\cdot} \left( \boldsymbol{v} \times \boldsymbol{y}^\prime_i \right) \right) \longrightarrow \max | ||
+ | </math> | ||
+ | |||
+ | <math>1 = s^2 + \boldsymbol{v}^\text{T} \boldsymbol{v}</math>に注意して適当に整理する。<br> | ||
+ | <math> | ||
+ | \begin{align} | ||
+ | e &= | ||
+ | \begin{bmatrix} | ||
+ | s & v_1 & v_2 & v_3 | ||
+ | \end{bmatrix} | ||
+ | \sum_i \left( | ||
+ | \begin{bmatrix} | ||
+ | 0 & \boldsymbol{0}^\text{T} \\ | ||
+ | \boldsymbol{0} & \boldsymbol{y}_i {\boldsymbol{y}^\prime_i}^\text{T} + \left( \boldsymbol{y}_i {\boldsymbol{y}^\prime_i}^\text{T} \right)^\text{T} | ||
+ | \end{bmatrix} + | ||
+ | \left( \boldsymbol{y}_i \cdot \boldsymbol{y}^\prime \right) | ||
+ | \begin{bmatrix} | ||
+ | 1 & \boldsymbol{0}^\text{T} \\ | ||
+ | \boldsymbol{0} & -I | ||
+ | \end{bmatrix} + | ||
+ | \begin{bmatrix} | ||
+ | 0 & \left( -\boldsymbol{y}_i \times \boldsymbol{y}^\prime_i \right)^\text{T} \\ | ||
+ | -\boldsymbol{y}_i \times \boldsymbol{y}^\prime_i & O | ||
+ | \end{bmatrix} | ||
+ | \right) | ||
+ | \begin{bmatrix} | ||
+ | s \\ v_1 \\ v_2 \\ v_3 | ||
+ | \end{bmatrix} \\ | ||
+ | &= | ||
+ | \boldsymbol{q}^\text{T} | ||
+ | \left( \sum_i | ||
+ | \begin{bmatrix} | ||
+ | y_{1i} y^\prime_{1i} + y_{2i} y^\prime_{2i} + y_{3i} y^\prime_{3i} & y_{3i} y^\prime_{2i} - y_{2i} y^\prime_{3i} & y_{1i} y^\prime_{3i} - y_{3i} y^\prime_{1i} & y_{2i} y^\prime_{1i} - y_{1i} y^\prime_{2i} \\ | ||
+ | y_{3i} y^\prime_{2i} - y_{2i} y^\prime_{3i} & y_{1i} y^\prime_{1i} - y_{2i} y^\prime_{2i} - y_{3i} y^\prime_{3i} & y_{1i} y^\prime_{2i} + y_{2i} y^\prime_{1i} & y_{1i} y^\prime_{3i} + y_{3i} y^\prime_{1i} \\ | ||
+ | y_{1i} y^\prime_{3i} - y_{3i} y^\prime_{1i} & y_{1i} y^\prime_{2i} + y_{2i} y^\prime_{1i} & -y_{1i} y^\prime_{1i} + y_{2i} y^\prime_{2i} - y_{3i} y^\prime_{3i} & y_{2i} y^\prime_{3i} + y_{3i} y^\prime_{2i} \\ | ||
+ | y_{2i} y^\prime_{1i} - y_{1i} y^\prime_{2i} & y_{1i} y^\prime_{3i} + y_{3i} y^\prime_{1i} & y_{3i} y^\prime_{2i} + y_{2i} y^\prime_{3i} & -y_{1i} y^\prime_{1i} - y_{2i} y^\prime_{2i} + y_{3i} y^\prime_{3i} | ||
+ | \end{bmatrix} | ||
+ | \right) | ||
+ | \boldsymbol{q} \\ | ||
+ | &= \boldsymbol{q}^\text{T} M \boldsymbol{q} | ||
+ | \end{align} | ||
+ | </math> | ||
+ | |||
+ | ということで、<math>M</math>の最大固有値に対応する(単位)固有ベクトルを求めればよい。<math>|\boldsymbol{q}| = 1</math>っていうのがこの辺で役に立つね。ちなみに、固有ベクトルには符号の不定性があって<math>\pm \boldsymbol{q}</math>になるけど、どっちを使っても同じ回転になる。なので、好きな方を採用すべし。 | ||
− | + | この計算は[http://scholar.google.co.jp/scholar?as_q=Closed-form+solution+of+absolute+orientation+using+unit+quaternions&num=10&btnG=Scholar+%E6%A4%9C%E7%B4%A2&as_epq=&as_oq=&as_eq=&as_occt=any&as_sauthors=Horn&as_publication=&as_ylo=&as_yhi=&hl=ja Hornの方法]と多分同じ。 |
2011年1月9日 (日) 13:54時点における最新版
目次 |
座標系
3次元空間を表す(直交)座標系は二種類あるらしい。右手系と左手系。えーと、親指の付け根に原点をとって、親指、人差し指、中指にそれぞれ、、軸を割り当てるとが右回りになるのが右手系、左回りになるのが左手系。 図から分かるように、この二つの座標系はどんなに回転させても一致しないので無駄な努力はしない事。右手系と左手系の変換は適当な軸一つまたは三軸全ての符号を反転させればよい。ただし、二つの座標系を一緒に扱うと混乱するだけなので、どちらか一方に統一した方が賢い。まぜるな危険。 ここでは特に断らない限り右手系を用いる事にする。
3次元の回転は「どれだけ回したか」の他に「どの軸周りに回したか」というのも必要。なので、回転軸と回転角を適当に定める必要がある。 ここでは図に示すように、右手系は右ネジの向き、左手系は左ネジの向きに軸と回転方向をとる。こうすると2次元の回転方向と(z軸周りの)回転方向が同じになるため、何かと考えやすいはず。
2次元の点の移動と回転
いわゆる座標変換の話。ここで注意するのは、どの座標系からどの座標系への変換なのか、計算して出てきた座標はどの座標系で表されているかという事。ここでは、固定されている座標系から見て原点がにあって回転している座標系で表現されている点を、もとの固定されている座標系で表すとどうなるか、というのをやる。言い換えると、「ある点が原点周りに回転して、平行移動しました。この点はどこでしょう」という問題。
まあ、これは図を見たまんまで。とすると、成分はもとの座標系で、はになって平行移動するので、次式になる。
このとき、
を回転行列といったりする。この行列は正規直交行列()でになる。
複素数を使った回転の表現
2次元の原点周りの回転は、大きさ1の複素数を使っても表現できる。
ただしは虚数単位とする。
で、何が言いたいかというと、「大きさが1」という条件は使いやすいので、覚えておくと良い事あるかもよってこと。
3次元の座標変換
2次元の場合と同じ。原点周りの回転、平行移動とすると次式になる。
ただし、は行列式の値が1の3x3正規直交行列である。
ちなみに、のものは擬回転と呼ぶ事があり、これは回転の他に右手系・左手系を一方から他方に変換する作用も持つ。 つまり、右手系の話しかしていない時にこのような行列が出てきた場合は、何かがおかしいってこと。
逆問題を解く
今までは、移動量や回転角が与えられた場合に点がどう動くかを見てきた。ここでは反対に移動前後の点の組が与えられた時に、平行移動量および回転角(・回転軸)を求めることを考える。
要するに、次式を満たすを求める。
実際には誤差なんかがあって等式は成り立たなくなるだろうから、できるだけ等しくなるような値を求める事にする。
重心に関する運動
とりあえず、の重心を計算してみる。
重心を原点にとってとすると、
となるから、これから回転が求められそうだ。
回転が分かれば平行移動成分は次式で計算できる。
特になら回転と無関係に平行移動成分が分かる。
というわけで、ここからは回転を求める事に精を出す。
2次元の回転
誤差の定義は色々考えられるが、ここではベクトルの内積は同じベクトル同士を掛けた時が最大というのを使って次式を用いる。
これは長いベクトルの方が誤差に表れやすいため、そういうベクトルを重視する人向けの誤差である。
とおいてを未知数に付いて書き直すと以下の式を得る。
この式がの下で最大になるのは当然次の時。
3次元の回転
まあ、2次元の時と同じ。大きさが1の複素数の代わりに、大きさが1のクォータニオンを使うだけ。
クォータニオンの成分を
とすると、回転は次式で表される。
で、内積が最大になるようにする、と。
に注意して適当に整理する。
ということで、の最大固有値に対応する(単位)固有ベクトルを求めればよい。っていうのがこの辺で役に立つね。ちなみに、固有ベクトルには符号の不定性があってになるけど、どっちを使っても同じ回転になる。なので、好きな方を採用すべし。
この計算はHornの方法と多分同じ。