今天上午,因為“家里蹲”大神在 SLAM 交流群里問了一下為什么 \(E\) 分解出來的 \(R\) 需要判斷 \(R\) 的行列式,如果為 -1,就需要所有元素乘以 -1,以得到行列式為 +1 的 \(R\)。
旋轉矩陣是將原基底下的坐標變換為新基底下的坐標,是一個線性變換的過程。
從二維旋轉矩陣開始
二維旋轉矩陣推導利用 \(cos, sin\) 和的分列式最簡單。

\[X_1 = (x_1, y_1) = (r \cdot cos\alpha, r \cdot sin\alpha) \]
\[\begin{align} X_2 = (x_2, y_2) &= (r \cdot cos(\alpha + \beta), r \cdot sin(\alpha + \beta)) \\ &= (r \cdot cos\alpha \cdot cos\beta - r \cdot sin\alpha \cdot sin\beta, \\ & r \cdot cos\alpha \cdot sin\beta + r \cdot sin\alpha \cdot cos\beta) \\ &=(cos\beta \cdot x_1 - sin\beta \cdot y_1, sin\beta \cdot x_1 + cos\beta \cdot y_1) \end{align} \]
\[\begin{bmatrix} x_2 \\ y_2 \end{bmatrix} = \begin{bmatrix} cos\beta & -sin\beta \\ sin\beta & cos\beta \end{bmatrix} \begin{bmatrix} x_1 \\ y_1 \end{bmatrix} \]
這就是一個線性變換的過程,將原基底下的坐標 \(X_1\) 變換到現基底下的坐標 \(X_2\)。
那么這兩組基底分別是什么,原基底當然就是原坐標系 \(xOy\) 的兩個軸的單位向量 \([e_1, e_2]\)。
現基地是下圖中的 \(x'Oy'\) 的兩個軸的單位向量 \([e'_1, e'_2]\)。

由圖中的角度可以得到現基底在原基底中的坐標:
\[e'_1(cos\beta, -sin\beta) \\ e'_2(sin\beta, cos\beta) \]
模為 1。
這個和旋轉公式存在聯系:
\[X_2 = M X_1 \\ M = \begin{bmatrix} {e'_1}^T \\ {e'_2}^T \end{bmatrix} \]
於是從坐標分量的角度看:
\[x_2 = {e'_1}^T X_1 = |e'_1| |X_1| cos(\alpha + \beta) = |X_1| cos(\alpha + \beta) \\ y_2 = {e'_2}^T X_1 = |e'_1| |X_1| cos({\pi \over 2} - \alpha - \beta) = |X_1| cos({\pi \over 2} - \alpha - \beta) \]
這就是在原坐標系下的投影。
三維旋轉矩陣的行列式
同樣的道理,三維旋轉矩陣也是一個線性變換,新基底在原基底中的坐標是 \(R\)。
如果 \(R\) 的行列式為 -1,等價於在正常的旋轉變換的結果上,對每一個坐標乘以 -1,其結果是對原點成中心對稱。
如果是二維的旋轉矩陣,是什么情況呢?如果按照原點中心對稱,僅僅是多旋轉了 180 度,並不能表現為行列式為 -1。按照行列式計算的定義,因為是二維的,“負負”得正,行列式沒有任何影響。
BTW,三維坐標系存在左手系和右手系,如果對三個軸上的坐標都乘以 -1,相當於三個軸的反方向都變成了正方向。但是這個時候左右手性(這好像是分子化學用詞。。。)沒有發生改變。如果是兩個軸的反方向變成了正方向,左收系就變成了由右手系。一個軸反方向不會發生改變。於是,奇數軸反方向不會改變左右手性,偶數軸反方向會改變左右手性。