视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数

刚了5天的李群和李代数,发现对前面变换矩阵还是没理解全,又回去补充了上一篇博客,有需要的请链接
https://blog.csdn.net/weixin_38593194/article/details/85234607
现在感觉理解些了,一遍写一边整理思路。
我们先说观感再说具体的学习内容
观感就是
1、还是要学c++,模板类。模板类里是类、继承、重载、模板这几个c++使用特性的混合应用,忘了基础的补补基础,看C++书上内容挺简单的,实际用起来很难,找C++ primer第六版或者上一篇博客的c++链接补充下吧。
2、李群和李代数比较抽象,不做这块的话之前应该很少有相关方面经验的,重点关注以下几个问题:

  1. 为什么李群要转换成李代数计算?有什么优势?
  2. 为什么引入指数和对数映射?跟李代数和李群又是什么关系?
  3. 为什么引入指数和对数映射?跟李代数和李群又是什么关系?
  4. 扰动模型和实际运动过程中四元数和三维向量的关系?以及编程的时候怎么表达?

下面是要学习的内容

(1)本节内容

1、李群和李代数基础 2、指数与对数映射 3、扰动模型 4、Sophus库使用说明

(2)需要的基础知识

能把上节旋转矩阵和变换矩阵相关的吃透就可以了

(3)开发环境

编译平台:ubuntu16.04,
编译软件:IDE:Clion 编译器:Cmake 语言标准:C++11

(4)学习内容

引入李群和李代数是解决什么样的相机位姿符合当前的观测数据,即求解最优R,t。使误差最小化的问题。
旋转矩阵有一定的约束性(正交且行列式为1),他们作为优化变量的时候会引入额外的约束,通过李群和李代数的转换关系,将位子估计变成无约束的优化问题

1、群的定义
为什么引入李群这种东西,旋转矩阵R和变换矩阵T不是可以表示机器人的旋转和平移特性吗?
首先给群下个不完全的定义:群是为了描述满足一类性质的矩阵的集合。满足三维旋转矩阵定义和性质的构成特殊正交群SO(3)、满足变换矩阵定义和性质的构成特殊欧式群SE(3)
他们两个的定义如下:
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第1张图片
正式定义:
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第2张图片
ps:这里对群的定义是针对SO3和SE3的特定的,只要满足一种集合加上一种运算的代数结构都可为群,例如{Z,+}也为群,但不是李群了
同时请思考为什么旋转矩阵的加法为什么不是群?
首先什么是旋转矩阵来着?旋转矩阵要满足下面性质:
在这里插入图片描述
行列式为1,且是正交矩阵,不存在R1+R2或者T1+T2还满足这个性质,但是存在R1R2或者T1T2还满足这个性质的(可以看作做了两次旋转)。
2、那么李群是什么?
李群是指具有连续(光滑)性质的群。像整数群 Z 那样离散的群没有连续性质,所以不是李群。而 SO(n) 和 SE(n),它们在实数空间上是连续的。我们能够直观地想象一个刚体能够连续地在空间中运动,所以它们都是李群。由于 SO(3) 和 SE(3) 对于相机姿态估计尤其重要,我们主要讨论这两个李群。
2、李代数
前边一直逼逼叨叨说的李代数是什么鬼?
我是这么理解的:相机在三维空间中是连续的旋转或者变换的,而我们SLAM目的就是优化求解相机的这个最佳的位姿T(变换矩阵)。它观测到一个惯性坐标系下点p产生了一个观测数据z,z是相机坐标系下的坐标,则可得到z=Tp+w,w是观测噪声(误差),w=z-Tp。
机器人的位姿估计就转变成寻找一个最优的T使得整体的误差最小化
在这里插入图片描述
优化方法一般都采用迭代优化的方法,每次迭代都更新一个位姿的增量delta,使得目标函数最小。这个delta就是通过误差函数对T微分得到的。也就是说我们需要对变换矩阵T求微分(导数),我们先以SO(3)空间中的旋转矩阵 R为例来说说(T与R只差了一个平移,对T求到的过程平移可以看作常数),你觉得如何对R求微分呢?
貌似不可以直接对矩阵求微分吧。为什么呢?我们刚才讲过R构成的群叫做李群SO(3),R1+R2就不是SO(3)了,同样道理,这里变成R1+ΔR就不是SO(3)了,所以需要将SO(3)进行某种运算,一对一的转换成另一种对加法有封闭性的运算,才可以继续进行。
下面我们来推导李代数是怎么得出来的,既然不能对R导,那引入时间变量t。机器人运动中,t是连续的
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第3张图片
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第4张图片
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第5张图片
经过这段推导得到给定某时刻的 R,我们就能求得一个 ϕ,它描述了 R 在局部的导数关系。起码我们可以证明R在局部对t是可导的。
其对t的导数,向量ϕ就是李代数,李代数可定义于李群的正切空间上,描述了李群中元素局部性质,分别把它们记作小写的so(3)和se(3)。
**问题又来了矩阵指数 exp(ϕ^) 如何计算?**这个留到后面讲
先给出李代数的定义,,,再不给不知到怎么讲了-_-!

3、李代数是什么
对于SO(3):
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第6张图片

视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第7张图片

对于SE(3)
那我们正常情况下将平移和旋转结合到一起组成的变换矩阵T的群SE(3)的李代数是什么呢,用se(3)表示。
与so(3)相似,se(3)位于R6空间中。
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第8张图片
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第9张图片
接下来考虑第二个问题,exp(ϕ^)怎么算

4、指数与对数映射
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第10张图片
注意,这里定义了的ϕ已经成为一个旋转向量了,忘记旋转向量定义的看十四讲-49页上半段文字
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第11张图片
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第12张图片
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第13张图片
那是不是每个旋转矩阵R都有唯一的旋转向量ϕ?在多转和360度里不是一对一运算的,但是将旋转角度固定的±Π,李群和李代数元素是一对一对应。
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第14张图片
推导
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第15张图片
最后总结三维旋转和三维变换中李群和李代数的关系
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第16张图片
现在再回想我们为什么用李代数呢?是因为无法直接对变换\旋转矩阵求导——>那不能求导怎么办?引入时间变量t,无法对矩阵求导可以对t求导——>对t求导后解决什么问题呢?解决在局部连续的时间内对误差的线性优化问题。对,李代数的引入就是为了解决状态估计过程中的优化问题

5、扰动模型
现在我们已经解决求导的问题了。两次连续的旋转可以用矩阵乘法来描述,但用李代数如何表示呢?
在这里插入图片描述
则两次连续的矩阵乘法可表示为:
在这里插入图片描述
我们自然是希望李群中两个矩阵相乘对应李代数上对应元素的相加,这样我们才能够利用加法来计算导数和进行更新。
在这里插入图片描述
但是这个公式并不成立
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第17张图片
李代数求导分两种:
一种是用李代数表示位姿,然后根据李代数加法来对李代数求导。这种方法上面推导了,结果中有复杂的雅克比公式,不是很方便。
第二种,就是对李群进行左乘或者右乘微小的扰动,然后对该扰动求导。
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第18张图片
视觉slam爬坑——高翔深蓝学院——第三讲——李群与李代数_第19张图片
第二行为泰勒展开社区高阶项后的近似。泰勒公式:
最后一行将反对称矩阵符号看作叉积,变换之后变号。
在这里插入图片描述
6、Sophus库使用
Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。

你可能感兴趣的:(视觉slam进阶)