详解SLAM中的李群和李代数(上)
1 概述
最近阅读高翔大神的《视觉SLAM十四讲》这本书,感觉整本书写的非常的平实,用非常接地气的语言毫无保留的介绍了视觉SLAM的相关知识,非常值得一读。不过,在第4章出现的李群和李代数的相关概念就有点令人难以费解了。其实这段不是这本书的作者故意写的晦涩难懂,而是这部分知识属于数学或者物理专业才会学习的知识,普通的理工科专业的读者没有接触过这方面的知识。笔者也是在这个地方卡了壳,因此在本文中将李群和李代数相关的知识总结一下。
2 群
在数学中,群是一个基础但非常重要的代数结构,它由一个集合和一种满足特定条件的二元运算组成。具体来说,如果一个集合 \(G\) 和其上的一个二元运算 \(\cdot\) 满足以下四个公理,则称 \((G, \cdot)\) 为一个群:
- 封闭性(Closure):对于 \(G\) 中任意两个元素 \(a\) 和 \(b\),它们通过运算 \(\cdot\) 得到的结果也是 \(G\) 的一个元素。即,如果 \(a, b \in G\),那么 \(a \cdot b \in G\)。
- 结合律(Associativity):对于 \(G\) 中任意三个元素 \(a\)、\(b\) 和 \(c\),它们之间的运算满足结合律。即,\((a \cdot b) \cdot c = a \cdot (b \cdot c)\)。
- 单位元(Identity element):存在一个 \(G\) 中的特殊元素 \(e\)(称为单位元),使得对于 \(G\) 中的任何元素 \(a\) 都有 \(e \cdot a = a \cdot e = a\)。
- 逆元(Inverse element):对于 \(G\) 中的每一个元素 \(a\),都存在一个 \(G\) 中的元素 \(b\)(记作 \(a^{-1}\),称为 \(a\) 的逆元),使得 \(a \cdot a^{-1} = a^{-1} \cdot a = e\),这里 \(e\) 是上述的单位元。
概念说出来都是很抽象的,那么接下来直接举两个具体的例子。
2.1 整数集与加法运算
如果集合\(G = \mathbb{Z}= \{ \dots, -2, -1, 0, 1, 2, \dots\ \}\),运算\(\cdot = +\),那么整数集与加法运算\((Z,+)\)就是一个群,因为其符合群的四个公理:
封闭性:
对于任意两个整数 $ a, b \in \mathbb{Z} \(,\) a + b $ 仍然是一个整数。例如,$ 3 + (-5) = -2 $,结果仍然在 $ \mathbb{Z} $ 中。
因此,封闭性成立。结合律:
加法是结合的,即对于任意 $ a, b, c \in \mathbb{Z} $,有\[(a + b) + c = a + (b + c)
\]因此,结合律成立。
单位元:
单位元是 $ e = 0 $,因为对于任意 $ a \in \mathbb{Z} $,有\[a + 0 = 0 + a = a
\]因此,单位元存在。
逆元:
对于任意 $ a \in \mathbb{Z} $,它的逆元是 $ -a $,因为\[a + (-a) = (-a) + a = 0
\]因此,每个元素都有逆元。
2.2 非零实数集与乘法运算
如果集合\(G = \mathbb{R}^* = \{ x \in \mathbb{R} \mid x \neq 0 \}\),运算\(\cdot = \times\),那么非零实数集与乘法运算\((\mathbb{R}^*,\times)\)就是一个群,因为其符合群的四个公理:
封闭性:
对于任意两个非零实数 $ a, b \in \mathbb{R}^* \(,\) a \times b $ 仍然是一个非零实数。例如,$ 3 \times (-2) = -6 $,结果仍然在 $ \mathbb{R}^* $ 中。
因此,封闭性成立。结合律:
乘法是结合的,即对于任意 $ a, b, c \in \mathbb{R}^* $,有\[(a \times b) \times c = a \times (b \times c)
\]因此,结合律成立。
单位元:
单位元是 $ e = 1 $,因为对于任意 $ a \in \mathbb{R}^* $,有\[a \times 1 = 1 \times a = a
\]因此,单位元存在。
逆元:
对于任意 $ a \in \mathbb{R}^* $,它的逆元是 $ \frac{1}{a} $,因为\[a \times \frac{1}{a} = \frac{1}{a} \times a = 1
\]因此,每个元素都有逆元。
这样来看的话,群的概念还是很好理解的。数学上的语言都是很抽象很概括的,我们不妨结合具体的例子来理解。那么,为什么会有群这个概念呢,因为数学家发现这种二元运算的集合有非常规律良好的性质,因此将其归纳总结了出来。
3 李群
李群是具有光滑性质的群。群的定义我们刚才论述过,那么这个“光滑”指的是一个怎么样的概念呢?要说清楚这个概念,可能需要更加专业的数学知识(比如《微分几何》),但是我们可以用简单一点的概念进行类比,那就是高数中的可导。
回忆一下高数中关于可导的定义:设 \(f: D \to \mathbb{R}\) 是一个实值函数,定义在某个区间 \(D\) 上,并且 \(x_0 \in D\) 是该区间中的一个内点。如果极限
\]
存在,则称函数 \(f\) 在点 \(x_0\) 处是可导的,这个极限称为 \(f\) 在 \(x_0\) 处的导数,记作 \(f'(x_0)\) 或 \(\frac{df}{dx}(x_0)\)。
直观地说,这个极限衡量了当输入 \(x\) 发生微小变化时,输出 \(f(x)\) 的变化率。如果一个函数在某区间内处处可导,那么这个函数在该区间内不仅连续,而且是“光滑”的,没有尖点或间断。这是一个非常优良的性质,它意味着这个函数的每个点都可以用切线方程来近似,从而使得复杂的问题可以通过简单的线性问题来解决,极大地简化了计算。
李群的光滑性质就类似于高数中的可导性。光滑意味着群运算是可以进行微分的,李群上的任何点都可以研究其局部变化率(即导数),并通过这些导数来分析群的性质。函数的导数就是导函数,而李群在单位元附近的局部性质的描述就是李代数,它通过切空间捕捉了李群的局部线性化信息。
SLAM中两个重要的李群是特殊正交群 \(SO(n)\) 和 特殊欧式群 \(SE(n)\),特殊正交群是旋转变换的集合和运算,特殊欧式群是欧式变换/刚性变换的集合和运算。旋转变换和欧式变换是SLAM中的两个重要的几何变换,要理解这两个概念,需要重点看《视觉SLAM十四讲》第3讲三维空间刚体运动的知识;或者对计算机图形学、计算机视觉中几何变换的知识有所了解。
3.1 特殊正交群 \(SO(3)\)
如果集合\(G\)是所有的三维旋转矩阵,运算\(\cdot\)是矩阵乘法,这样构成的群就是特殊正交群\(SO(3) = \{ R \in \mathbb{R}^{3\times3} \mid R^T R = I, \det(R) = 1\}\)。
特殊正交群符合群的四个公理:
- 封闭性:如果 \(R_1, R_2 \in SO(3)\),则 \(R_1 R_2 \in SO(3)\)。两个旋转矩阵的乘积仍然是正交矩阵,且行列式仍为1。从图形学的角度上来说,旋转两次得到的姿态,旋转一次也可以得到。
- 结合律:矩阵乘法本身是结合的,因此 \(SO(3)\) 满足结合律。
- 单位元:单位矩阵 \(I \in SO(3)\),因为 \(I^T I = I\) 且 \(\det(I) = +1\)。
- 逆元:对于任意 \(R \in SO(3)\),其逆元是 \(R^{-1} = R^T\)(正交矩阵的性质),且 \(\det(R^{-1}) = 1\)。
特殊正交群具有光滑特性,这一点我们可以结合旋转变换本身的特性来理解。设想这样的一个场景:三维空间中有一个魔方,这个魔方以自己的中心点位置进行旋转。无论这个魔方怎么旋转,到任何位置,旋转过程都是平滑的。在计算机图形学中,很容易实现这样的一个任务:给定一个起点旋转矩阵、终点旋转矩阵以及起终点的时间差,很容易线性插值出任意时刻的旋转矩阵。能够平滑地旋转物体,也很符合我们对客观物理现象的认知。
3.2 特殊欧式群 \(SE(3)\)
如果集合\(G\)是所有的欧式变换(刚体变换)矩阵,运算\(\cdot\)是矩阵乘法,这样构成的群就是特殊欧式群\(SE(3)=\bigg\{ T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \in \mathbb{R}^{4\times4} \mid R \in SO(3) ,t \in \mathbb{R}^3 \bigg\}\)。在这里,\(R\)表示旋转矩阵,\(t\)是平移向量。
特殊欧式群符合群的四个公理:
- 封闭性:如果 \(T_1, T_2 \in SE(3)\),则 \(T_1 T_2 \in SE(3)\)。欧式变换是齐次变换矩阵,相乘后仍然保持旋转矩阵在左上角,平移向量在右上角的形式。从图形学的角度上来说,欧式变换两次得到的位姿,欧式变换一次也可以得到。
- 结合律:矩阵乘法本身是结合的,因此 \(SE(3)\) 满足结合律。
- 单位元:单位矩阵 \(I_{4 \times 4}\)(包含 \(3 \times 3\) 单位矩阵和零平移向量)是 \(SE(3)\) 的单位元。
- 逆元:对于任意 \(T \in SE(3)\),其逆元是
\begin{bmatrix}
R^T & -R^T t \\
0 & 1
\end{bmatrix}.
\]
特殊欧式群具有光滑特性,这一点同样可以结合欧式变换本身的特性来理解。欧式变换是旋转变换与平移变换的组合,我们可以假设这样一个场景:一个照相机要拍摄一个物体,需要移动到这个物体的前方,并且要调整相机朝向,才能准确生成这张物体的照片。相机无论怎么移动位置,调整朝向,这个过程都是平滑的。在计算机图形学的场景中,经常会有这样的需求,按照一条固定的轨迹飞行,这条飞行轨迹上的任意一点都可以通过插值得到,保证相机操作的平滑性。
4 李代数
4.1 预备
在进行李代数的论述之前,我们需要先学习一些预备知识。
4.1.1 反对称矩阵
一个 \(n \times n\) 实矩阵 \(A\) 是反对称矩阵(或斜对称矩阵),如果它满足:
\]
也就是说,矩阵的转置等于它的负数,那么这个矩阵就是反对称矩阵。一个反对称矩阵的例子如下:
\begin{bmatrix}
0 & -a_3 & a_2 \\
a_3 & 0 & -a_1 \\
-a_2 & a_1 & 0
\end{bmatrix}.
\]
反对称矩阵有一个很重要的性质:每个三维向量都有唯一的反对称矩阵对应。具体来说,给定一个三维实向量:
\begin{bmatrix}
a_1 \\
a_2 \\
a_3
\end{bmatrix}
\in \mathbb{R}^3,
\]
我们可以唯一地构造一个 \(3\times3\) 的反对称矩阵,记作:
\begin{bmatrix}
0 & -a_3 & a_2 \\
a_3 & 0 & -a_1 \\
-a_2 & a_1 & 0
\end{bmatrix}.
\]
这个符号 \([\boldsymbol{a}]_\times\) 中的 \(\times\) 表示“叉乘”,因为这个矩阵的作用就等价于与 \(\boldsymbol{a}\) 做叉积。
等价于叉积运算是什么意思呢?设 \(\boldsymbol{a}, \boldsymbol{b} \in \mathbb{R}^3\),那么:
\]
即:\(\boldsymbol{a}\) 和 \(\boldsymbol{b}\) 的叉积 等于 反对称矩阵 \([\boldsymbol{a}]_\times\) 作用在 \(\boldsymbol{b}\) 上的结果。
举例说明,设:
\boldsymbol{b} = \begin{bmatrix}4 \\ 5 \\ 6\end{bmatrix},
\]
则:
\begin{bmatrix}
0 & -3 & 2 \\
3 & 0 & -1 \\
-2 & 1 & 0
\end{bmatrix}
\]
\begin{bmatrix}
0 & -3 & 2 \\
3 & 0 & -1 \\
-2 & 1 & 0
\end{bmatrix}
\begin{bmatrix}4 \\ 5 \\ 6\end{bmatrix} =
\begin{bmatrix}
-3 \\ 6 \\ -3
\end{bmatrix}
\]
而直接计算叉积:
\begin{vmatrix}
\mathbf{i} & \mathbf{j} & \mathbf{k} \\
1 & 2 & 3 \\
4 & 5 & 6
\end{vmatrix}
= -3\mathbf{i} + 6\mathbf{j} - 3\mathbf{k} =
\begin{bmatrix}
-3 \\ 6 \\ -3
\end{bmatrix}
\]
两者的结果一致。
4.1.2 函数求导
1. 乘积法则
设 \(f(t), g(t)\) 是两个可导的实函数,那么它们乘积的导数为:
\]
例如,设 \(f(t) = t^2, g(t) = \sin t\),则:
\]
2. 链式法则
如果 \(y = f(g(t))\),那么:
\]
例如,令:
- \(f(u) = e^u\)
- \(u = g(t) = at\)
根据链式法则:
\]
即:
\]
4.1.3 矩阵求导
对于一个随自变量t变化的矩阵 \(R(t)\),它的导数 \(\frac{dR(t)}{dt}\) 是将该矩阵的每个元素分别对自变量 \(t\) 求导得到的新矩阵。例如:
如果:
\begin{bmatrix}
r_{11}(t) & r_{12}(t) \\
r_{21}(t) & r_{22}(t)
\end{bmatrix},
\]
那么:
\begin{bmatrix}
\frac{dr_{11}}{dt} & \frac{dr_{12}}{dt} \\
\frac{dr_{21}}{dt} & \frac{dr_{22}}{dt}
\end{bmatrix}.
\]
所以,矩阵对自变量求导 = 矩阵中每个元素对自变量求导。
通过上述概念可看出,矩阵转置运算与微分运算是可交换的。可以理解为:
- 转置是对矩阵元素做排列;
- 微分是对每个元素做导数;
- 所以先转置再导数 = 先导数再转置。
公式描述就是:
\]
4.1.4 微分方程
微分方程是数学中的一种方程,它涉及一个或多个未知函数及其导数,目标是找到满足该方程的未知函数。后面会求解一个一阶线性常微分方程如下:
\]
其中 \(a\) 是常数。
先说答案,这个方程的通解是:
\]
可以把这个解代入原方程验证是否成立。对解的两边进行求导:
\]
左边是 \(\frac{dx(t)}{dt}\),右边是 \(a x(t)\),两者相等,所以解成立。
如果需要严格推导这个解,需要使用分离变量法。
从原方程出发:
\]
把变量分开:
\]
两边积分:
\Rightarrow \ln|x| = at + C,
\]
其中 \(C\) 是积分常数。
两边取指数:
\]
令 \(x_0 = e^C\),得:
\]
4.2 引出
前面我们介绍过,李群的光滑性质保证了是可以微分的,那我们就尝试对李群\(SO(3)\)进行求导。假设一个刚体在三维空间中绕某个轴旋转,其旋转状态可以用一个旋转矩阵 \(R(t)\) 来描述,其中 \(t\) 是时间参数。那么我们要求的就是 \(R(t)\) 关于时间 \(t\) 的导数:
\]
由于 \(R(t)\) 是正交矩阵,满足 \(R(t)^T R(t) = I\),对两边关于 \(t\) 求导:
\]
根据函数求导的乘积法则,展开左边的导数:
\]
根据预备知识,矩阵转置运算与微分运算可交换,有\(\frac{dR(t)^T}{dt} = \big(\frac{dR(t)}{dt}\big)^T\),因此上式可以改写为:
\]
继而:
\]
这表明 \(\frac{dR(t)}{dt} R(t)^T\) 是一个反对称矩阵,记作 \([\boldsymbol{\omega}(t)]_{\times}\),即:
\]
上式是一个一阶线性微分方程,有如下条件:
\]
这个方程我们在预备知识中求解过,它的解是:
\]
其中 \(\exp\) 表示矩阵指数运算。\(\boldsymbol{\omega}(t)\) 描述了刚体在时刻 \(t\) 的瞬时旋转轴和旋转速率,其实也就是表达旋转矩阵的旋转向量,\([\boldsymbol{\omega}(t)]_{\times}\) 是其对应的反对称矩阵。这个公式给出了从旋转向量到旋转矩阵(李群)的映射,也就是指数映射。而这个旋转向量,就是我们要论述的李代数。
如果读者熟悉计算机图形学,就会对旋转向量并不陌生,它描述了一个旋转操作的方向(旋转轴)和大小(旋转角度)。四元数就是一个与旋转向量密切相关的参数,通过罗德里格斯公式也可以将旋转向量转换成旋转矩阵。
5 结语
本篇由群引申到李群,再引出到李代数,不得不说SLAM中李群和李代数相关的知识还是很多,其中很多知识都是第一次接触到。另外,很多更基础的知识(比如高数、线代)也都忘记了,不得不一边学习新的知识一边复习旧的知识。在下一篇文章中,笔者会继续总结论述一下李代数相关的内容。
详解SLAM中的李群和李代数(上)的更多相关文章
- 使用IDEA详解Spring中依赖注入的类型(上)
使用IDEA详解Spring中依赖注入的类型(上) 在Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值)注入Bean组件 ...
- 从零开始一起学习SLAM | 为啥需要李群与李代数?
很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候,都有点蒙蒙哒,感觉突然到了另外一个世界,很多都不自觉的跳过了,但是这里必须强调一点,这部分在后续SLAM的学习中其实是非常重要的基础,不信你 ...
- jQuery:详解jQuery中的事件(二)
上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...
- 图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...
- 【转】详解C#中的反射
原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...
- 详解Webwork中Action 调用的方法
详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...
- 【转】详解JavaScript中的this
ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...
- 深入详解SQL中的Null
深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
- 详解Objective-C中委托和协议
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...
随机推荐
- ctfshow web入门 文件包含全部wp
Web78 <?php if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_fil ...
- java 8 lamdba 表达式list集合的BigDecimal求和操作
- [Jaav SE/程序生命周期] 优雅的Java应用程序的启停钩子框架
序 了解 spring 生态及框架的 java er 都知道,spring 应用的生命周期管理及配套接口较为优雅.可扩展. 但脱离 spring 的 java 应用程序,如何优雅地启停.管理程序的生命 ...
- 开启 Typecho 的 gzip 压缩
简介 GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 网站采用Gzip压缩,还有一个好处,就是让你少了一份流量 ...
- 百万架构师第四十四课:Nginx:Nginx 的扩展-OpenRestry|JavaGuide
百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的扩展-OpenRestry 课程目标 Nginx 进程模型简介 Nginx 的高 ...
- Spark - [03] RDD概述
RDD,分布式数据集,是Spark中最基本的数据抽象. 一.什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是 Spark 中最基本的数据抽象. 代 ...
- luogu-P10596题解
简要题意 一个有 \(N\) 个元素的集合有 \(2N\) 个不同子集(包含空集),现在要在这 \(2N\) 个集合中取出若干集合(至少一个),使得它们的交集的元素个数为 \(K\),求取法的方案数, ...
- Selenium KPI接口 警告弹 -alert/confirm/promp
应用场景: 有些页面进入后自带弹窗提醒功能需要确认,这时候就需要将焦点定位到alert弹窗上. 使用格式: alert=driver.switchtoalert() alert.accept() 实现 ...
- 自动化-Yaml文件写入函数封装
1.文件布局 打开文件修改读取方式为w dump函数写入文件 写入中文 使用allow_unicode=True class ReadConfiYaml: def __init__(self,yaml ...
- 归并排序(递归)(NB)
博客地址:https://www.cnblogs.com/zylyehuo/ 递归思路 # _*_coding:utf-8_*_ import random def merge(li, low, mi ...