クォータニオンの2次元ベクトルで回転と移動をあらわしてみる


クォータニオンの2次元ベクトルを作って回転と移動をあらわすことから始めてみます。

大きさが1のクォータニオンは回転をあらわすことができるので、2次元ベクトルの第1成分は回転をあらわすクォータニオンとしましょう。

また、クォータニオンのベクトル成分はベクトルとしてふるまうので、2次元ベクトルの第2成分を使って移動量を表現することにします。

回転角がゼロの回転をあらわすクォータニオンは 1 なので、回転せずに原点にある状態 \(s_0\)
$$ s_0 = \left(\begin{array}{c}1 \\ 0\end{array}\right) $$
というクォータニオンのベクトルであらわせます。

この状態に回転を作用させてみましょう。回転をクォータニオン \(r\) を使ってあらわすとすると、回転後の状態 \(s_r\) は
$$ s_r = r s_0 = \left(\begin{array}{c}r \\ 0\end{array}\right) $$
となるでしょう。

では \(s_0\) を移動させるにはどうしたらよいでしょう。移動量はクォータニオン \(t\) のベクトル成分であらわすことにします。回転の場合、現在の状態の回転量と移動量に回転を作用していいのですが、移動の場合、回転量は変化しないはずです。しかし、ベクトルの第2成分に \(t\) を足すというのでは線形変換になりません。線形変換とするためには2×2のクォータニオンの行列であらわす必要があります。そこで次のようにして移動後の状態 \(s_t\) を計算することにします。
$$ s_t = \left(\begin{array}{cc}1 & 0 \\ t & 1\end{array}\right) s_0 = \left(\begin{array}{c}1 \\ t\end{array}\right) $$

これで回転だけでなく、移動も線形変換で表現できるようになりました。次に回転後の状態 \(s_r\) を移動させて状態 \(s_{tr}\) を作ってみます。
$$ s_{tr} = \left(\begin{array}{cc}1 & 0 \\ t & 1\end{array}\right) s_r = \left(\begin{array}{c}r \\ tr\end{array}\right) $$
第2成分が \(t\) ではなく \(tr\) になりました。はたしてこれでいいのでしょうか? もうちょっと調べてみましょう。

次に移動後の状態 \(s_t\) に回転を作用させて状態 \(s_{rt}\) を作ってみます。
$$ s_{rt} = r s_t = \left(\begin{array}{c}r \\ rt\end{array}\right) $$
今度は第2成分が \(rt\) になってしまいました。でもちょっと変形すると、
$$ rt = (rt\overline{r})r = t’r $$
となって、\(t\) を \(r\) で回転させることで得られる \(t’\) の右側に \(r\) がかかるようになりました。移動の後に回転を作用させたのだから、移動量 \(t\) に回転が作用して \(t’\) になるのはつじつまが合います。

つまり、回転量が \(r\) で移動量が \(t\) の状態 \(s_{tr}\) は
$$ s_{tr} = \left(\begin{array}{c}r \\ tr\end{array}\right) $$
とあらわせると言えそうです。

そして、このようなクォータニオンの2次元ベクトルであらわされる状態に対して、回転 \(r\) と移動 \(t\) を作用させる(回転の後に移動する)演算子は
$$ \left(\begin{array}{cc}1 & 0 \\ t & 1\end{array}\right) r = \left(\begin{array}{cc}1 & 0 \\ 0 & 1\end{array}\right) r + \left(\begin{array}{cc}0 & 0 \\ 1 & 0\end{array}\right) tr $$
と書けます。

ところで、この演算子を状態 \((1,\ 0)\) に作用させれば \((r,\ tr)\) が得られるので、演算子そのものを状態と見なしても差し支えありません。そして、これがデュアルクォータニオンになります。

しかし、いちいち行列で書くのもめんどうなので、新しい数 \(\epsilon\) を導入します。これは行列
$$ \left(\begin{array}{cc} 0 & 0 \\ 1 & 0\end{array}\right) $$
と同じ性質、つまり \(\epsilon ^2 = 0\) という性質を持つこととします。

そして、デュアルクォータニオン \(d\) を
$$ d = r + \epsilon tr $$
と定義することにします。

確認のため、2つのデュアルクォータニオン
\begin{eqnarray*}
d_1 & = & r_1 + \epsilon t_1 r_1, \\
d_2 & = & r_2 + \epsilon t_2 r_2
\end{eqnarray*}
を合成してみましょう。
\begin{eqnarray*}
d_2 d_1 & = & r_2 r_1 + \epsilon (t_2 r_2 r_1 + r_2 t_1 r_1) \\
& = & r_2 r_1 + \epsilon (t_2 + r_2 t_1 \overline{r_2}) r_2 r_1
\end{eqnarray*}
このように回転量が \(r_2 r_1\) となり、移動量が \(t_2 + r_2 t_1 \overline{r_2}\) となっているので、きちんと合成されていることがわかります。

ところで \(\epsilon ^2 = 0\) なので、\(\epsilon\) を含む項は1次の項しか存在しません。そのため、
$$ \epsilon \rightarrow \lambda \epsilon $$
と再定義しても何の支障もないはずです。そして、一般的なデュアルクォータニオンは \(\lambda = \frac{1}{2}\) として次のように定義します。
$$ d = r + \frac{\epsilon}{2} tr $$
実際のところ \(\lambda\) は何でもよいのですが、このように定義する理由は次のページで説明します。

ここで、デュアルクォータニオンの大きさ(ノルム)を定義しておきましょう。\(d = r + \epsilon q\) としたとき、デュアルクォータニオン \(d\) の大きさ(ノルム)を |d| とすれば、
$$ |d|^2 = (r + \epsilon q)(\overline{r} + \epsilon \overline{q}) = |r|^2 + 2\epsilon r\cdot q $$
で定義され、
$$ |d| = \sqrt{|d|^2} = |r| + \epsilon \frac{r\cdot q}{|r|} $$
です。大きさを定義する方法はこれだけではないと思いますが、このように定義しておくと回転と移動をあらわすデュアルクォータニオンの大きさが1になるのです。

実際、\(q = tr,\ t = (0, \vec{t}), r = (r_w,\ \vec{r})\) であらわされる場合、
$$ tr = (0, \vec{t})(r_w, \vec{r}) = (-\vec{t}\cdot\vec{r}, r_w \vec{t} + \vec{t} \times \vec{r}) $$
から
$$ r\cdot q = r \cdot tr = -r_w \vec{t}\cdot\vec{r} + \vec{r} \cdot (r_w \vec{t} + \vec{t} \times \vec{r}) = 0 $$
となるので、\(r\) と \(q\) は直交することになり、\(|d| = |r|\) となります。さらに \(r\) が回転をあらわすクォータニオンであれば \(|r| = 1\) なので、回転と移動をあらわすデュアルクォータニオンは大きさが1のデュアルクォータニオンになります。

以上でデュアルクォータニオンを導出できましたが、回転 \(r\) と移動 \(t\) であらわしているだけなので、クォータニオンと3次元ベクトルで別々に回転と移動をあらわす場合と比べてメリットがないばかりか、余計なかけ算 \(tr\) がはいっていて面倒くさいだけのように思えてしまいます。それに、この表現ではどのように2つのデュアルクォータニオンを補間すればよいのか、いまいちわかりません。次のページでは別の方法を使って違う形式でデュアルクォータニオンを導出します。そして、その形式からデュアルクォータニオンのメリットを引き出していきたいと思います。

4 thoughts on “デュアルクォータニオン徹底解説

  • 2018/09/13 at 2:03 PM
    Permalink

    大変すばらしい解説、ありがとうございました。
    ロボット工学で良く出てくるので、すごい参考になりました。

    Reply
    • 2018/09/17 at 10:43 AM
      Permalink

      ロボット工学では良く使われるのですね。知りませんでした! コメントありがとうございます。

      Reply
  • 2018/11/12 at 5:39 AM
    Permalink

    いつも大変お世話になっております。
    3ページ目の
    回転と移動をあらわした行列 A は Z の指数関数で表現できます。
    A=eZ

    そして、この行列 A に対応したデュアルクォータニオン d は
    d=e^θ(axi+ayj+azk)+ϵ(vxi+vyj+vzk)

    で計算できます。
    の部分の質問なんですがこの文が書かれていたところの前に書かれていた文書のi,j,kとX,Y,Zの対応関係で出てきた1/2はどこに消えたのですか?

    Reply
    • 2018/11/12 at 11:48 AM
      Permalink

      ご指摘の通り、1/2が抜けていましたので修正いたしました。
      ありがとうございます!

      Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Anti Spam Code *