一、前言(线性变换)
该篇博客主要讲解一个 slam 中最基础的几个东西,那就是旋转矩阵,缩放矩阵以及偏移矩阵。本人会做一个比较细致的讲解。首先从二维平面开始引入,等大家略微了解之后,再扩展到三维。

在讲解之前,聊一下其他的东西,那就是线性变换。在学习线性代数的时候,如果矩阵 A左乘一个向



础,进行具体的分析。任何一个空间都是由一组基构成的,言外之意就是说,在这个空间的任何一点(向量),都可以由这组基以线性组合的方式得到。比如在二维中的xy 平面,其实他就是组基



矩阵乘法的意义,其实就是将一个向量,经过某个矩阵(函数)之后,输出为另外一个向量,就是说,变换就意味则,将原来的向量变换到另外一个地方。而线性变换,也就是在变换的基础上,再加一个条件,线性的,也就是原来的一条直线,在变换了之后还应该是直线。
下面我们来理解什么是线性变换。为了避免混淆,我们不用二维空间XY 的xy 基底,而是选用一组新的基底










这样我们可以很明显的看到,变换作用在基底的时候,系数是不会发生改变的,也就是这个向量关于基的线性组合方式是没有变化的,改变的是基底。换句话说,对于一个线性变换,我们只需要跟踪其基在变换前后的变化,便可以掌握整个空间的变化。


二、旋转矩阵
通过上面的介绍,可以知道,一个矩阵作用于一个向量的线性变换,可以看作是对其基做了线性变换。这样能够保证该向量相对于原基与新基做变换是一致的(系数不会改变)。那么我们现来聊聊三维空间的旋转。单我们描述一个物体的时候,其除了位置信息还有姿态信息,这里拿小猫举例: 小猫在二楼的房间面对着窗户。在二楼是位置信息,面对着窗户是姿态信息。后续我们研究的对象多为相机,相机也是同样的道理,其在三维空间内存在位置信息,也存在次态信息。假设我们把手机从空中抛到地上,其在落地期间,姿态(翻转)与位置(移动)都在发生变换。那么应该如何取描述手机在空中的变化呢?这里把位置与姿态统称为位姿,也就是后续主要的研究对象。




我们经常在实际场景中定义各种各样的坐标系。在机器人学中, 你会给每一个连杆和关节定 义它们的坐标系; 在 3D 作图时, 我们也会定义每一个长方体、圆柱体的坐标系。如果考虑运动 的机器人, 那么常见的做法是设定一个惯性坐标系 (或者叫世界坐标系), 可以认为它是固定不动的, 例如下图中的 xW , yW , zW定义的坐标系。




两个坐标系之间的运动由一个旋转加上一个平移组成, 这种运动称为刚体运动。相机运动就是一个刚体运动。刚体运动过程中, 同一个向量在各个坐标系下的长度和夹角都不会发生变化。 想象你把手机抛到空中, 在它落地摔碎之前 , 只可能有空间位置和姿态的不同, 而它自己的长 度、各个面的角度等性质不会有任何变化。手机并不会像橡皮那样一会儿被挤扁,一会儿被拉长。 此时, 我们说手机坐标系到世界坐标之间, 相差了一个欧氏变换 (Euclidean Transform )。




我们把中间的矩阵拿出来, 定义成一个矩阵R。这个矩阵由两组基之间的内积组成, 刻画了旋转前后同一个向量的坐标变换关系。只要旋转是一样的, 这个矩阵就是一样的。可以说, 矩阵 R描述了旋转本身。因此, 称为旋转矩阵(Rotation Matrix)。同时, 该矩阵各分量是两个坐标系基的 内积, 由于基向量的长度为 1, 所以实际上是各基向量夹角的余弦值。所以这个矩阵也叫方向余 弦矩阵 (Direction Cosine Matrix )。统一称它为旋转矩阵。
旋转矩阵有一些特别的性质。事实上, 它是一个行列式为 1 的正交矩阵(后面有证明过程)。反之, 行列式 为 1 的正交矩阵也是一个旋转矩阵。所以, 可以将 n维旋转矩阵的集合定义如下(下面的E表示基本矩阵):



SO(n) 是特殊正交群 ( Special Orthogonal Group ) 的意思。我们把“群” 的内容留到下一讲。 这个集合由 n 维空间的旋转矩阵组成, 特别地,SO(3) 就是指三维空间的旋转。通过旋转矩阵, 我们可以直接谈论两个坐标系之间的旋转变换,而不用再从基开始谈起。由于旋转矩阵为正交矩阵, 它的逆 (即转置) 描述了一个相反的旋转。按照上面的定义方式, 有



三、平移






四、欧式变换与齐次坐标




这样的形式在变换多次之后会显得很啰嗦。因此, 我们引人齐次坐标和变换矩阵, 重写式(6):



这是一个数学技巧: 我们在一个三维向量的末尾添加 1, 将其变成了四维向量, 称为齐次坐 标。对于这个四维向量, 我们可以把旋转和平移写在一个矩阵里, 使得整个关系变成线性关系。 该式中, 矩阵T 称为变换矩阵 (Transform Matrix)。



但是区分齐次和非齐次坐标的符号令我们感到厌烦, 因为此处只需要在向量末尾添加 1 或者去掉1, 在不引起歧义的情况下, 以后我们就直接把它写成b=Ta 的样子, 默认其中进行了 齐次坐标的转换。关于变换矩阵T , 它具有比较特别的结构: 左上角为旋转矩阵, 右侧为平移向量, 左下角为 0 向量, 右下角为 1。这种矩阵又称为特殊欧氏群 (Special Euclidean Group ):



与SO(3) 一样, 求解该矩阵的逆表示一个反向的变换:



同样, 我们用 T12这样的写法来表示从 2 到 1 的变换。并且, 为了保持符号的简洁, 在不引 起歧义的情况下, 以后不刻意区别齐次坐标与普通坐标的符号, 默认使用的是符合运算法则的那 一种。例如, 当我们写Ta 时, 使用的是齐次坐标 (不然没法计算)。而写Ra 时, 使用的是非 齐次坐标。如果写在一个等式中, 就假设齐次坐标到普通坐标的转换是已经做好了的一一因为齐次坐标和非齐次坐标之间的转换事实上非常容易, 而在C++ 程序中你可以使用运算符重载来完 成这个功能, 保证在程序中看到的运算是统一的。
回顾: 首先, 我们介绍了向量及其坐标表示, 并介绍了向量间的运算; 然后, 坐标系之间的 运动由欧氏变换描述, 它由平移和旋转组成。旋转可以由旋转矩阵SO(3) 描述, 而平移直接由一 个 R³向量描述。最后, 如果将平移和旋转放在一个矩阵中, 就形成了变换矩阵SE(3) 。


旋转矩阵性质证明
根据前面的(3)式,可以知道旋转矩阵就是两个基(正交矩阵)相乘。正交矩阵的定义比较简单:

只要满足以上公式,我们则认为 A为正交矩阵,简单的理解,就是矩阵 A每一行,各元的平方和为1,则为正交矩阵。通过如下推导(两边取行列式)我们可以知道正交矩阵 A的行列式 为±1。



前面说到旋转矩阵 的本质是两个 正交矩阵相乘,那么正交矩阵还有一个性质,那就是两个正交矩阵相乘,他们的结果依旧为正交矩阵,推导如下,设A,B 都为正交矩阵:



所以我们可以得到两个正交矩阵相乘仍为正交矩阵。那就这样就可以推导出来 旋转矩阵R为正交矩阵。


五、结语
该篇博客大部分来自于slam十四讲,有兴趣的朋友可以取阅读一下这本书。在 slam 中可以说是十分著名的一本书籍。