今天上午,因为“家里蹲”大神在 SLAM 交流群里问了一下为什么 (E) 分解出来的 (R) 需要判断 (R) 的行列式,如果为 -1,就需要所有元素乘以 -1,以得到行列式为 +1 的 (R)。
旋转矩阵是将原基底下的坐标变换为新基底下的坐标,是一个线性变换的过程。
从二维旋转矩阵开始
二维旋转矩阵推导利用 (cos, sin) 和的分列式最简单。
[X_1 = (x_1, y_1) = (r cdot cosalpha, r cdot sinalpha)
]
[egin{align}
X_2 = (x_2, y_2) &= (r cdot cos(alpha + eta), r cdot sin(alpha + eta)) \
&= (r cdot cosalpha cdot coseta - r cdot sinalpha cdot sineta, \
& r cdot cosalpha cdot sineta + r cdot sinalpha cdot coseta) \
&=(coseta cdot x_1 - sineta cdot y_1, sineta cdot x_1 + coseta cdot y_1)
end{align}
]
[egin{bmatrix} x_2 \ y_2 end{bmatrix} = egin{bmatrix} coseta & -sineta \ sineta & coseta end{bmatrix} egin{bmatrix} x_1 \ y_1 end{bmatrix}
]
这就是一个线性变换的过程,将原基底下的坐标 (X_1) 变换到现基底下的坐标 (X_2)。
那么这两组基底分别是什么,原基底当然就是原坐标系 (xOy) 的两个轴的单位向量 ([e_1, e_2])。
现基地是下图中的 (x'Oy') 的两个轴的单位向量 ([e'_1, e'_2])。
由图中的角度可以得到现基底在原基底中的坐标:
[e'_1(coseta, -sineta) \
e'_2(sineta, coseta)
]
模为 1。
这个和旋转公式存在联系:
[X_2 = M X_1 \
M = egin{bmatrix} {e'_1}^T \ {e'_2}^T end{bmatrix}
]
于是从坐标分量的角度看:
[x_2 = {e'_1}^T X_1 = |e'_1| |X_1| cos(alpha + eta) = |X_1| cos(alpha + eta) \
y_2 = {e'_2}^T X_1 = |e'_1| |X_1| cos({pi over 2} - alpha - eta) = |X_1| cos({pi over 2} - alpha - eta)
]
这就是在原坐标系下的投影。
三维旋转矩阵的行列式
同样的道理,三维旋转矩阵也是一个线性变换,新基底在原基底中的坐标是 (R)。
如果 (R) 的行列式为 -1,等价于在正常的旋转变换的结果上,对每一个坐标乘以 -1,其结果是对原点成中心对称。
如果是二维的旋转矩阵,是什么情况呢?如果按照原点中心对称,仅仅是多旋转了 180 度,并不能表现为行列式为 -1。按照行列式计算的定义,因为是二维的,“负负”得正,行列式没有任何影响。
BTW,三维坐标系存在左手系和右手系,如果对三个轴上的坐标都乘以 -1,相当于三个轴的反方向都变成了正方向。但是这个时候左右手性(这好像是分子化学用词。。。)没有发生改变。如果是两个轴的反方向变成了正方向,左收系就变成了由右手系。一个轴反方向不会发生改变。于是,奇数轴反方向不会改变左右手性,偶数轴反方向会改变左右手性。