视觉SLAM中李群李代数与四元数总结

在SLAM中经常会用到李群李代数与四元数来表示旋转变换,这些数学公式往往需要推导来推导去,分分钟搞到头都大了。但在SLAM中往往用到其中那么几个固定的性质,所以是没有必要对这些数学基础作过多深入的研究,只需要记住其中一些常用的公式及性质即可。因此,本人在这里对这些数学基础作一个简单的总结,以便日后在工程中使用。

旋转的表示方式

SLAM中,往往会使用三种方式来表达空间中的旋转变换,分别为:旋转向量、旋转矩阵、四元数。

旋转向量

旋转向量可以非常直观地表示空间中的一个旋转变换:假设空间中有一单位向量\(\mathbf{n}\),以\(\mathbf{n}\)为转轴且旋转方向与\(\mathbf{n}\)相同,旋转的角度为\(\theta\)。可以将上述旋转变换记为“角轴”的组合形式:\(<\theta,\mathbf{n}>\),也可以组合成变通向量的形式:\(\mathbf{\phi}=\theta \mathbf{n}\).

旋转矩阵

旋转矩阵\(\mathbf{R}_{AB}\)可以表示一个物体由姿态\(A\)旋转变换到姿态\(B\)的过程,若将\(A\)与\(B\)视为一个坐标系,则\(\mathbf{R}_{BA}\) 可以表示坐标系\(A\)在坐标系\(B\)中的姿态。设\(W\)为世界坐标系,物体由姿态\(\mathbf{R}_{WA}\)转换到姿态\(\mathbf{R}_{WB}\)可以用\(\mathbf{R}_{AB}\)来表示,即:\(\mathbf{R}_{WB} = \mathbf{R}_{WA} \mathbf{R}_{AB}\).
如果坐标关系非常明确,则可以直接将下标去掉,直接记为\(\mathbf{R}\). 其中\(\mathbf{R}\)为单位正交阵,其具有如下性质:

  1. \(\mathbf{R}\)的行(列)均为单位向量且两两正交;
  2. \(\mathrm{det}(\mathbf{R})=1\);
  3. \(\mathbf{R}^{-1} = \mathbf{R}^\mathrm{T}\)

四元数

四元数可以定义为:
\[
\mathbf{q} = w+xi+yj+zk
\]

其中\(i,j,k\) 分别为四元数的三个虚部,这三个虚部满足如下性质:
\[
\left\{\begin{matrix}
i^2 + j^2 + k^2 = 1\\
ij=k, ji=-k \jk=i, kj=-i \ki=j, ik=-j
\end{matrix}\right.
\]

四元数还可以表示为
\[
\mathbf{q} = [w,x,y,z]^\mathrm{T}
\]

\[
\mathbf{q} = [s,\mathbf{v}], \mathbf{v} = [x,y,z]^\mathrm{T} \in \mathbb{R}^3
\]

我们可以使用单位四元数来表示空间任意的旋转变换,其中符合条件\(w^2+x^2+y^2+z^2=1\)的四元数为单位四元数。

三种方式之间转换

上述三种数学工具都可以表示空间中的旋转,他们其实是等价的,可以进行相互转换。

旋转向量 \(\leftrightarrow\) 旋转矩阵

设旋转向量为\(\mathbf{\phi}=\theta \mathbf{n}\),与之等价的旋转矩阵为\(\mathbf{R}\),两者之间的转换可以使用罗德里格斯公式来实现,即
\[
\mathbf{R} = \cos \theta \mathbf{I} + (1 - \cos \theta) \mathbf{n} \mathbf{n}^\mathrm{T} + \sin \theta \mathbf{n}^{\wedge}
\]

其中\(\mathbf{n}^{\wedge}\)为由\(\mathbf{n}\)转化而成的反对称矩阵,即
\[
\mathbf{n}^{\wedge} = \begin{bmatrix}
0 & -n_3 & n_2 \ n_3 & 0 & -n_1 \ -n_2 & n_1 & 0
\end{bmatrix}
\]
\(\mathbf{n}\)的反对称矩阵也可以用\([\mathbf{n}]_{\times}\)来表示。
反过来,由\(\mathbf{R}\)转化为\(\mathbf{n}\)的方法为:
\[
\left \{ \begin{matrix}
\theta = \arccos(\frac{\mathrm{tr}(\mathbf{R})-1}{2}) \ \mathbf{R} \mathbf{n} = \mathbf{n}
\end{matrix} \right.
\]
其中\(\mathbf{R} \mathbf{n} = \mathbf{n}\)表示矩阵\(\mathbf{R}\)的为1的特征值对应的单位特征向量。

旋转向量 \(\leftrightarrow\) 四元数

设旋转向量为\(\mathbf{\phi}=\theta \mathbf{n}\),与之等价的四元数为\(\mathbf{q}\),则有:
\[
\mathbf{q} = \cos \frac{\theta}{2} + \mathbf{n} \sin \frac{\theta}{2} = [\cos \frac{\theta}{2}, \mathbf{n} \sin \frac{\theta}{2}]^\mathrm{T}
\]
这种转换与虚数中的欧拉公式十分相似,即\(\mathrm{e}^{j \theta}=\cos \theta + j \sin \theta\),此处可以进行类比记忆。

旋转矩阵 \(\leftrightarrow\) 四元数

设四元数为\(\mathbf{q}=q_0+ q_1i+ q_2j + q_3k\),与之等价的旋转矩阵为\(\mathbf{R}\),他们之间的变换有:
\[
\mathbf{R} = \begin{bmatrix}
1-2q_2^2-2q_3^2 & 2 q_1 q_2 - 2 q_0 q_3 & 2 q_1 q_3 + 2 q_0 q_2 \ 2 q_1 q_2 + 2 q_0 q_3 & 1 - 2 q_1^2 - 2 q_3^2 & 2 q_2 q_3 - 2 q_0 q_1 \ 2 q_1 q_3 - 2 q_0 q_2 & 2 q_2 q_3 + 2 q_0 q_1 & 1 - 2 q_1^2 - 2 q_2^2
\end{bmatrix}
\]

\[
\begin{matrix}
q_0=\frac{\sqrt{\mathrm{tr}(\mathbf{R})+1}}{2} &
q_1 = \frac{m_{23}-m_{32}}{4 q_0} &
q_2 = \frac{m_{31}-m_{13}}{4 q_0} &
q_3 = \frac{m_{12} - m_{21}}{4 q_0}
\end{matrix}
\]

李群李代数的性质

上面讲到的旋转矩阵\(\mathbf{R}\)可以构成一个李群SO(3),即特殊正交群,而旋转向量\(\mathbf{\phi}=\theta \mathbf{a}\)可以构成一个李代数\(\mathfrak{so}(3)\)。由于引入发李代数,所以对旋转矩阵的求导就变得非常方便。在SLAM中对旋转矩阵求导或对物体的姿态作优化时会大量用到李代数与李群之间的转换。

指数与对数映射

李群与李代数之间的转换可以使用指数与对数来实现.
指数映射:
\[
\mathbf{R} = \exp(\mathbf{\phi}^{\wedge}) = \exp(\theta \mathbf{a}^{\wedge})= \cos \theta \mathbf{I} + (1-\cos \theta) \mathbf{a} \mathbf{a} ^{\mathrm{T}} + \sin \theta \mathbf{a}^{\wedge}
\]

上面这条公式是不是貌似十分相识???没错,它就是上面曾经曰过的罗德里格斯公式。

对数映射:
\[
\mathbf{\phi} = \ln(\mathbf{R})^{\vee} = \left ( \sum_{n=0}^{\infty} \frac{(-1)^n}{n+1} (\mathbf{R} - \mathbf{I})^{n+1} \right)^{\vee}
\]
这条公式看起来有点复杂,不过没有关系,反正也用得不太多,因为我们通常不会用上式来计算对数映射,而是用旋转矩阵的迹来计算,请见旋转向量 \(\leftrightarrow\) 旋转矩阵一节中有介绍。

BCH公式

指数函数\(\exp(x)\)(其中x是标量)具有\(\exp(x_1) \exp(x_2)=\exp(x_1+x_2)\)的性质,但对于李代数的指数映射是否具有如\(\exp(\mathbf{\phi}_1^{\wedge})\exp(\mathbf{\phi}_1^{\wedge}) = \exp((\mathbf{\phi}_1+\mathbf{\phi}_2)^{\wedge})\)的性质呢?很不幸,这个性质是不存在的,但可以使用BCH来近似。
BCH公式如下:
\[
\ln(\exp(\mathbf{\phi}_1^{\wedge})\mathbf{\phi}_2^{\wedge}))^{\vee} \approx \left \{ \begin{matrix}
\mathbf{J}_l(\mathbf{\phi}_2)^{-1} \mathbf{\phi}_1 + \mathbf{\phi}_2 & \mathbf{\phi}_1 \in \sigma \ \mathbf{\phi}_1 + \mathbf{J}_r(\mathbf{\phi}_1)^{-1} \mathbf{\phi}_2 & \mathbf{\phi}_2 \in \sigma
\end{matrix} \right.
\]

其中\(\sigma\)表示一个微波量的集合。上式中,第一个式子为左乘近似,第二个式子为右乘近似。现在此对其进行解释如下。
对于第一个式子,假设旋转矩阵为\(\mathbf{R}_2\)(其对应的李代数为\(\mathbf{\phi}_2\)),对\(\mathbf{R}_2\)左乘一个微小的旋转矩阵\(\mathbf{R}_1\)(其对应的李代数为\(\mathbf{\phi}_1\)),则\(\mathbf{R}_1\mathbf{R}_2\)所对应的李代数近似为\(\mathbf{J}_l(\mathbf{\phi}_2)^{-1} \mathbf{\phi}_1 + \mathbf{\phi}_2\),其中\(\mathbf{J}_l(\mathbf{\phi}_2)^{-1} \mathbf{\phi}_1\)为左乘了微小旋转矩阵\(\mathbf{R}_1\)所导致的李代数增加的部分。

对于第二个式子,假设旋转矩阵为\(\mathbf{R}_1\)(其对应的李代数为\(\mathbf{\phi}_1\)),对\(\mathbf{R}_1\)右乘一个微小的旋转矩阵\(\mathbf{R}_2\)(其对应的李代数为\(\mathbf{\phi}_2\)),则\(\mathbf{R}_1\mathbf{R}_2\)所对应的李代数近似为\(\mathbf{J}_r(\mathbf{\phi}_1)^{-1} \mathbf{\phi}_2 + \mathbf{\phi}_1\),其中\(\mathbf{J}_r(\mathbf{\phi}_1)^{-1} \mathbf{\phi}_2\)为左乘了微小旋转矩阵\(\mathbf{R}_2\)所导致的李代数增加的部分。

BCH公式还可以写成如下的形式,其中\(\Delta \mathbf{\phi}\)为增加的微小旋转:
\[
\begin{matrix}
\exp(\Delta \mathbf{\phi^{\wedge}}) \exp(\mathbf{\phi^{\wedge}})=\exp((\mathbf{J}_l^{-1}(\mathbf{\phi}) \Delta \mathbf{\phi} + \mathbf{\phi})^{\wedge}) \ \exp(\mathbf{\phi^{\wedge}}) \exp(\Delta \mathbf{\phi^{\wedge}})=\exp((\mathbf{\phi} + \mathbf{J}_r^{-1}(\mathbf{\phi}) \Delta \mathbf{\phi})^{\wedge}) \ \exp((\mathbf{\phi} + \Delta \mathbf{\phi})^{\wedge}) = \exp((\mathbf{J}_l \Delta \mathbf{\phi})^{\wedge}) \exp(\mathbf{\phi}^{\wedge}) = \exp(\mathbf{\phi}^{\wedge}) \exp((\mathbf{J}_r \Delta \mathbf{\phi})^{\wedge})
\end{matrix}
\]

李代数求导

假设我们对一个空间点\(\mathbf{p}\)进行了旋转,得到了\(\mathbf{R} \mathbf{p}\),现在我们要计算旋转之后的点关于旋转矩阵的导数,即:
\[
\frac{\partial (\mathbf{R} \mathbf{p})}{\partial \mathbf{R}^{\mathrm{T}}}
\]

由于\(\mathbf{R} \in \mathrm{SO}(3)\)是不在在加法的,所以为了方便求导,我们可以使用李代数来进行求导,即将上式转化为正式:
\[
\frac{\partial (\mathbf{R} \mathbf{p})}{\partial \mathbf{R}^{\mathrm{T}}} \Leftrightarrow \frac{\partial(\exp(\mathbf{\phi}^{\wedge}) \mathbf{p})}{\partial \mathbf{\phi}} = -(\mathbf{R} \mathbf{p})^{\wedge} \mathbf{J}_l
\]

上式的结果是用左乘BCH来近似得到的,由于\(\mathbf{J}_l\)的存在,增加计算的复杂度,所以可以使用扰动模型(左乘)来进行简化。左扰动模型的结果为:
\[
\frac{\partial (\mathbf{R} \mathbf{p})}{\partial \mathbf{R}^{\mathrm{T}}} \Leftrightarrow \frac{\partial (\mathbf{R} \mathbf{p})}{\partial \phi} = -(\mathbf{R} \mathbf{p})^{\wedge}
\]

上述公式只需直接记忆并使用即可,如果想知道如何推导的,可见参考文献[1]中的p74~p75.

四元数的性质

这里主要是对四无数的运算及若干性质作一简单的总结。具体的四元数的教程请阅读参考文献[2]。

四无数加法

\[
\mathbf{p} + \mathbf{q}
= [p_w, \mathbf{p}_v]^{\mathrm{T}} + [q_w, \mathbf{q}_v]^{\mathrm{T}}
= [p_w + q_w, \mathbf{p}_v + \mathbf{q}_v]^{\mathrm{T}}
\]

四无数乘法

四元数的加法用符号\(\otimes\)表示。其运算法则如下:

\[
\mathbf{p} \otimes \mathbf{q} = \begin{bmatrix}
p_w q_w - \mathbf{p}_v^\mathrm{T} \mathbf{q}_v \ p_w \mathbf{q}_v + q_w \mathbf{p}_v + \mathbf{p}_v \times \mathbf{q}_v
\end{bmatrix}
\]

四元数的乘法不满足交换律,即:
\[
\mathbf{p} \otimes \mathbf{q} \neq \mathbf{q} \otimes \mathbf{p}
\]

但四元数乘法仍然满足结合律,即:
\[
(\mathbf{p} \otimes \mathbf{q}) \otimes \mathbf{r} = \mathbf{p} \otimes (\mathbf{q} \otimes \mathbf{r})
\]

故四元数加法也满足分配律,即:
\[
\mathbf{p} \otimes (\mathbf{q} + \mathbf{r}) = \mathbf{p} \otimes \mathbf{q} + \mathbf{p} \otimes \mathbf{r}
\]
或者是:
\[
(\mathbf{p} + \mathbf{q}) \otimes \mathbf{r} = \mathbf{p} \otimes \mathbf{r} + \mathbf{q} \otimes \mathbf{r}
\]

两个四元数的乘法还可以用矩阵的形式的表示,即:
\[
\mathbf{q}_1 \otimes \mathbf{q}_2=[\mathbf{q}]_L \mathbf{q}_2
=[\mathbf{q}]_R \mathbf{q}_1
\]

而其中的\([\mathbf{q}]_L\) 与 \([\mathbf{q}]_R\)分别如下:
\[
[\mathbf{q}]_L = \begin{bmatrix}
q_w & -q_x & -q_y & -q_x \ q_x & q_w & -q_z & q_y \ q_y & q_z & q_w & -q_x \ q_z & -q_y & q_x & q_w
\end{bmatrix} = q_w \mathbf{I} + \begin{bmatrix}
0 & -\mathbf{q}_v^\mathbf{T} \ \mathbf{q}_v & [\mathbf{q}_v]_{\times}
\end{bmatrix}
\]

\[
[\mathbf{q}]_R = \begin{bmatrix}
q_w & -q_x & -q_y & -q_x \ q_x & q_w & q_z & -q_y \ q_y & -q_z & q_w & q_x \ q_z & q_y & -q_x & q_w
\end{bmatrix} = q_w \mathbf{I} + \begin{bmatrix}
0 & -\mathbf{q}_v^\mathbf{T} \ \mathbf{q}_v & -[\mathbf{q}_v]_{\times}
\end{bmatrix}
\]

上面这两条公式在证明或推导公式过程中十分有用,可以重点关注。

参考文献

[1] 《视觉SLAM十四讲——从理论到实践》高翔, 张涛
[2] 《Quaternion kinematics for the error-state Kalman filter》 Joan Sola.

原文地址:https://www.cnblogs.com/MerakXuan/p/12148013.html

时间: 2024-11-08 12:45:59

视觉SLAM中李群李代数与四元数总结的相关文章

视觉SLAM中的数学基础 第三篇 李群与李代数

视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换矩阵进行插值.求导.迭代等操作.例如,在经典ICP问题中,给定了两组3D点,我们要计算它们之间的变换矩阵.假设第一组的3D点为$\mathbf{P}=\{ \mathbf{p}_i | i = [1,2, \ldots, N] \}$,第二组3D点为$\mathbf{Q}=\{ \mathbf{q}

视觉SLAM中的数学基础 第二篇 四元数

视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM公开数据集.g2o等程序都使用四元数记录机器人的姿态.因此,理解四元数的含义与用法,对学习SLAM来说是必须的.本节我们就来讲讲四元数. 首先,请读者不要对四元数有什么神秘的感觉.四元数仅是3D姿态的一种表达方式,我们用一个单位四元数表达原本用旋转矩阵表示的三维旋转.这样做一个直接的好处是省空间.一

李群李代数

从零开始一起学习SLAM | 为啥需要李群与李代数? 视觉SLAM中的数学基础 第三篇 李群与李代数 原文地址:https://www.cnblogs.com/larry-xia/p/10346137.html

视觉SLAM之RANSAC算法用于消除图像误匹配的原理

在基于特征点的视觉SLAM中,通常情况下,在特征匹配过程中往往会存在误匹配信息,使得计算获取的位姿精度低,易产生位姿估计失败的问题,因此,剔除这些错配点有很大的必要性.常会用到RANSAC算法进行消除两两匹配图像的误匹配点,如果只停留在应用的层面上很简单,直接调用opencv函数就行,看到效果时,感觉好神奇,到底怎么实现的啊,以前一直也没弄太明白,与图像结合的博客也比较少,在查阅了一些资料后,笔者似乎明白了一点,希望笔者的总结会对您的理解有帮助. 首先先介绍一下RANSAC算法(RANdom S

视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)

在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只通过bag of words 模型用在图像处理中进行形象讲解,并没有涉及太多对SLAM的闭环检测的应用. 1.Bag-of-words模型简介 Bag-of-words模型是信息检索领域常用的文档表示方法.在信息检索中,BOW模型假定对于一个文档,忽略它的单词顺序和语法.句法等要素,将其仅仅看作是若

经典视觉SLAM框架

引言:通过前面的推送我们已经对SLAM有了个大体的认识.(初识视觉SLAM)下面来看经典的视觉SLAM框架,了解一下视觉SLAM究竟由哪几个模块组成.本文选自<视觉SLAM十四讲:从理论到实践>. 整体视觉SLAM流程图. 整个视觉SLAM流程包括以下步骤. 传感器信息读取.在视觉SLAM中主要为相机图像信息的读取和预处理.如果是在机器人中,还可能有码盘.惯性传感器等信息的读取和同步. 视觉里程计(Visual Odometry,VO).视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图

SLAM中的卡方分布

视觉slam中相邻帧特征点匹配时,动辄上千个特征点,匹配错误的是难免的,而误匹配势必会对位姿精度以及建图精度造成影响,那么如何分辨哪些是误匹配的点对儿呢?如果已知两帧的的单应矩阵,假设单应矩阵是没有误差的,那么两帧中匹配正确的特征点通过单应矩阵是重投影是不应该有误差的或者误差十分小,而误匹配的特征点的重投影误差一定十分显著.那么我们是不是可以设置一个误差门限,从而甄别出这些误匹配点?可是这个误差门限该设置为多少? 假设图像金字塔第n层中一个特征点\(\mathbf{p_c}=\begin{bma

视觉SLAM算法框架解析(1) PTAM

版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程碑式的项目.在此之前,MonoSLAM[2]为代表的基于卡尔曼滤波的算法架构是主流,它用单个线程逐帧更新相机位置姿态和地图.地图更新的计算复杂度很高,为了做到实时处理(30Hz),MonoSLAM每帧图片只能用滤波的方法处理约10~12个最稳定的特征点.PTAM最大的贡献是提出了tracking.m

《视觉slam十四讲》之第3讲-实践Eigen库

<视觉slam十四讲>之第3讲-实践Eigen库 Eigen库的安装 sudo apt-get install libeigen3-dev 注:Eigen是一个由纯头文件搭建的线性代数库,头文件安装路径为/usr/include/eigen3/. 实例1:Eigen的基础运算 #include <iostream> #include <ctime> #include <Eigen/Core> // Eigen 部分 #include <Eigen/De