
以下内容为高翔《视觉SLAM十四讲》第二版的学习笔记
上一讲介绍了三维世界中刚体运动的描述方式,包括旋转矩阵,旋转向量,欧拉角,四元数等,但SLAM中不仅需要位姿的表示,还需要位姿的优化,其核心问题是什么样的相机位姿最有可能观察到这样的观测数据,解决这类问题往往建模为优化问题,再求解最优的R,t使误差最小化。话虽如此,旋转矩阵自身有正交矩阵和行列式为1的约束,在优化中会带来许多附加的问题,为了解决这个问题,引入李群和李代数的概念。之前已经讨论了这两个特殊的群
群是一种集合加上一种运算的代数结构,记集合A,运算·,集合内元素为a,则群满足
上面四个性质分别称为封闭性,结合性,幺元和逆
可以看出,旋转矩阵的集合与矩阵乘法运算构成群,变换矩阵的集合与矩阵乘法也构成群。
李群是指具有连续(光滑)性质的群,不同于类似整数群这样离散的群。旋转矩阵群和变换矩阵群表示着n维空间连续运动的结构,显然其不是离散的而是连续光滑的,也属于李群的范畴。
现在我们可以发现,对R求一次导就是左乘一个对应的三维向量φ的反对称矩阵
这一步可以看出三维向量φ反映了R的导数性质。
此时再联立上述的式子
这一结果说明了在t=0附近,R可以由三维向量φ的反对称矩阵经过指数运算计算出来,但到目前为止,这个exp符号如何计算(毕竟这是矩阵的指数)、三维向量φ有什么性质我们还是不清楚的,因此还要继续深入对李代数的理解。
李代数的定义比较复杂,由一个集合V,一个数域F和一个二元运算符[](称为李括号)组成。
上面的性质分别称为封闭性,双线性,自反性和雅可比等价。为了便于理解,一个简单的李代数例子是三维空间集合V,实数域R和叉积组成了一个李代数,读者可以自行验证上面的四条性质是否符合。下面主要展开李代数so(3)和se(3)的性质。
李代数的引入一节中的φ就是一种李代数,且
其二元运算符为
上面这个反反对称运算符为从三维方阵到三维向量的映射,与反对称运算符对应的映射相反。
so(3)的元素定义为三维向量或者三维反对称矩阵(这两者本身是一一对应的)
se(3)是由一个平移(与前述的变换矩阵中的平移含义并不一致)和一个so(3)三维向量组成的六维向量,反对称符号表示的转换为一由六维向量到四维方阵的映射,而不是表示向量的反对称矩阵
其二元运算符为
其中,反反对称运算符为从四维方阵到六维向量的一个映射
由李代数的引入一节,如果固定了时刻t,那么有李代数so(3)到李群SO(3)的映射
对exp函数进行泰勒展开
这看起来需要求一个无穷级数,还要计算李代数反对称矩阵的n次幂,不过根据相似对角化的知识,对称矩阵的对角化一定可以为高次幂带来比较简单的运算,首先,先将李代数表示如下
其中θ是该三维向量的模长,a是单位长度的方向向量,则有
证明如下
有了上述的简化基础,此时再进行运算
容易发现,这就是上一讲中描述旋转矩阵与旋转向量关系的罗德里格斯公式,李代数so(3)对应的正是旋转向量组成的空间,在角度θ限定在一个2π角度内时,可以得到李代数so(3)到李群SO(3)的一个唯一指数映射,SO(3)映射到so(3)称为对数映射,计算较为复杂。
通过旋转向量一节的方法,分别算出转角和转轴,相对计算对数映射公式更为简便。
类似上文so(3)的推导,可以比较快的得到
则两者的相互映射关系可以写作如下
上面介绍了李代数的定义,SLAM中最常用的两类李代数so(3)和se(3),但切莫忘记为什么要使用李代数。目前看来,李代数可以和李群在一个2π角度内形成唯一映射,那么对于李群的乘法(也就是一次旋转),在李代数上是怎么表达与计算呢?
根据指数公式在标量上的表示,我们难免有一个美好的想法:
因为根据标量的指数函数就有这样的性质,然而很遗憾,对于矩阵的指数函数并没有这样的性质。
上面的式子实际上可由BCH公式定量说明
根据BCH公式,令其中一个李代数为小量,以至于其二阶以上的项都可以被忽略
其中
以李群左乘一个小量为例,左乘一个微小旋转△R,则李群上为△R·R,对应到李代数上,是一个加法运算
如果是在李代数上做一个微小量的加法,对应到李群上是一次左乘或右乘
对于变换矩阵群SE(3)和李代数se(3)也有类似的近似公式,不过形式更为复杂,一般工程中直接调用对应计算库计算,故不赘述。
设想一个简单的位姿估计问题,对世界坐标系的点集P,在位姿T得到了得到了观测点集Z,由前面的知识,对每一点有
其中w为观测数据带来的误差。
为了最小化误差,一般采用最小二乘法做最优估计,即
求解此问题需要用到目标函数J关于自变量T的导数,也就是要对变换矩阵群T求导,然而,变换矩阵群T上对加法并没有封闭性,导致无法直接求导,故而转向其唯一映射的李代数,李代数对加法具有封闭性,可以进行求导。
该模型用李代数表示姿态,根据李代数加法的定义,对李代数求导。
设一点p,经过旋转矩阵R得到Rp,现在要求旋转后的坐标对旋转矩阵的导数,直接用对应的李代数表示姿态
其中,第二式为左乘近似公式,第三式为一阶泰勒展开,第五式将反对称矩阵与一矩阵相乘看做叉积过程,交换后符号取反,详细见上一讲的数学基础部分,这样得到了李代数求导的结果,但计算上还是比较复杂的。
对李群左乘或者右乘微小扰动,然后对扰动求导,分为左扰动和右扰动模型,这里以左乘扰动模型为例。
使李群左乘一个扰动,并利用近似公式,对扰动的李代数求导
其中,第二式用到了一阶泰勒展开,第四式将反对称矩阵与一矩阵相乘看做叉积过程,交换后符号取反,详细见上一讲数学基础部分。
显然,对比上面第一个求导模型,省去了J的计算,这也使这种模型更为实用。
使变换矩阵左乘一个扰动,然后对扰动求导
在之前,我们已经定义了
所以有
最后一步是来源于
由于计算较为复杂,暂时略去这一步的推导,综上,结果如下。
该讲的实践模块主要是让大家学会使用Sopuhs进行李群与李代数的映射以及扰动更新模型的应用,将上面的理论付诸实际。
首先安装sophus,采用源码编译安装
#安装Sopuhs
#先将高翔的slambook2/3rdParty中对应版本的Sophus clone下来
cd Sophus
mkdir build
cmake ..
make
sudo make install 然后正常编译ch4中的代码,并尝试运行。
useSophus.cpp中已经注释的十分清楚了,包含了旋转矩阵群和变换矩阵群的初始化,两类李代数的初始化,左乘扰动模型更新。
书上还有另外一个例子:评价轨迹误差。该程序将ground truth与estimated两个文件中的信息读出并转换成变换矩阵群SE(3),其误差根据书上提供的误差定义编程实现,注释也比较清楚,这里不多赘述。