2021年1月19日 星期二

實作 SO(3) 指數映射

前文我們介紹了李代數、李群、以及指數映射。這篇文章簡介如何用 PyTorch 實作 SO(3) 的指數映射。

回顧 SO(3) 的指數映射

SO(3) 的指數映射是將李代數 so(3) 中的三維向量 \(\phi\) 轉換成對應的李群 R,R 可以看做是一個旋轉矩陣,因此指數映射可以看成一個函數將 \(\phi \in \mathbb{R}^3 \) 轉換成 \(R \in \mathbb{R}^{3 \times 3}\)。

從前文的結論中可以得到當李代數的三維向量為 \(\phi\) 時(\(\phi = \theta n\)),對應的指數映射為: \[ cos\ \theta I + (1-cos\ \theta)nn^T + sin\ \theta n^{\wedge} \] 而從前文中我們知道以下等式: \[ n^{\wedge}n^{\wedge}= nn^T-I \] 把其代入第一式可以得到: \[ cos\ \theta I + (1-cos\ \theta) (n^{\wedge}n^{\wedge} + I) + sin \theta\ n^{\wedge} \\ = I + (1-cos\ \theta)\ n^{\wedge}n^{\wedge} + sin \theta\ n^{\wedge} \] 將 \(n\) 代換成 \(\frac{\phi}{\theta}\) 後可得到: \[ I + \frac{(1-cos\ \theta)}{\theta^2} \phi^{\wedge}\phi^{\wedge} + \frac{sin \theta}{\theta}\phi^{\wedge} \] 

實作 SO(3) 指數映射的細節

以下參考此 PyTorch 的實作:https://github.com/vinits5/learning3d/blob/master/ops/so3.py

  1. 函數的輸入 \(\phi\) 為三維的向量。
  2. \(\phi^{\wedge}\) 是將三維的向量利用 hat operator 轉換成一個 \(3 \times 3\) 的矩陣。
  3. sinc 函數 \(\frac{sin \theta}{\theta}\) 以及 sinc2 函數 \(\frac{1 - cos \theta}{\theta^2}\) 利用泰勒展開式的近似來實作:https://github.com/vinits5/learning3d/blob/master/ops/sinc.py

沒有留言:

張貼留言