首页 > 其他分享 >视觉slam十四讲CH4 ---李群与李代数求导

视觉slam十四讲CH4 ---李群与李代数求导

时间:2024-03-04 21:56:28浏览次数:26  
标签:wedge phi 李群 --- slam CH4 exp 求导 代数

视觉slam十四讲 ---CH4 李群与李代数求导

李群与李代数相较于CH3是比较的抽象的数学知识,这个工具的提出目的是解决一些旋转位姿描述的优化问题。本讲最终的目的是解决如何描述对旋转求导的问题。

1. 什么是群

群是一种集合加上一种运算的代数结构

记集合为A,运算为\(\cdot\quad\),则若此结构满足以下几条性质,构成一个群。
image

第三讲中的旋转矩阵R以及变换矩阵T加上乘法运算就构成一种群。

特殊正交群

\[SO(3) = \{R\in R^{n\times n}|RR^T = I, det(R) = 1\}\\ \]

特殊欧式群

\[SE(3) = \{ T = \begin{bmatrix} R & t \\ 0^T & 1\\ \end{bmatrix} \in R^{4\times 4} | R \in SO(3),t\in R^3 \} \]

对于SO(3)以及SE(3),它们对于乘法是封闭的,也就是说对于多个旋转矩阵或者变换矩阵相乘,结果仍为旋转矩阵或者变换矩阵。这一点在上一章描述多次旋转时可以看作是多个旋转矩阵相乘是相同的。

本章的章节名是李群与李代数。那么什么是李群呢?

李群是具有连续(光滑)性质的群。类似于二维函数的连续。数学上已经证明SO(3)以及SE(3)都是李群。

在涉及一些优化问题时,我们需要对于旋转这一位姿变换进行求导操作来找出一些类似于"旋转的变化率"的概念帮助我们去优化。(如梯度下降)。但是对于SO(3)以及SE(3),仅满足乘法的封闭性,并不满足加法的封闭性,也就是并不处于线性空间中。如下导数的定义,显然想要求导且导数有意义的话,该代数结构应该在线性空间中才可以实现。

image

2. 李代数

对于R或者T来说,并不能直接对其求导,那么能否找到一种映射关系将其映射到线性空间中呢?

给出如下推导,假设旋转是随时间变化的函数。

\[\forall R(t)\in SO(3),R(t)R(t)^T = I \\ 两边求导(抽象的求导)得\\ \dot{R(t)}R(t)^T + R(t)\dot{R(t)^T} = 0 \\ 即\\ \dot{R(t)}R(t)^T = -R(t)\dot{R(t)^T} \\ 由 (ab)^T = b^Ta^T \\ \dot{R(t)}R(t)^T = -(\dot{R(t)R(t)^T})^T \\ 对于一个反对称矩阵,有 a = -a^T,显然上式满足,故\dot{R(t)}R(t)^T为反对称矩阵。\\ 假设 \dot{R(t)}R(t)^T = \phi(t)^\wedge \]

需要注意的是,这里的\(\phi(t)^{\wedge}\)中的^代表着一个三维向量\(\phi\)扩充为一个反对称阵。比如

\[a = (1,2,3)^T \\ a^{\wedge} = \begin{bmatrix} 0&1&2 \\ -1&0&3 \\ -2&-3&0 \\ \end{bmatrix} \]

因此\(\phi(t)^{\wedge}\)代表我们假设R由\(\phi\)扩充而来。
接着推理有

\[两边右乘R,有 \dot{R(t)} = \phi(t)^{\wedge}R(t) \\ 假定t = 0时刻 R = I,且认为t = 0附近\phi(t)变化不大,记作\phi_0\quad可认为上式就是一个微分方程。\\ 解得 \ln(R(t)) = \phi_0^{\wedge} \\ 同理有 R(t) = exp(\phi_0^{\wedge}) \]

可以看出,经过一通推导,我们发现旋转矩阵与一个东西有着对数形式上的映射。这里的\(\phi_0\)就是SO(3)对应的李代数
与李群一样,李代数的构成也要满足一定的性质。如下
image

可以知道对于\(\phi_0\)来说,满足如上的定义
image

其李括号的定义的运算类型为

image

对于SE(3)上的李群,直接给出其李代数对应形式
image

其李括号的定义为

image

这里的\(\wedge\)操作与so(3)的定义不同,不再表示由三维向量扩充反对称阵,而是表示将\(\xi\)这个六维向量扩充为一个四维矩阵。不难看出\(\xi\)的前三维由平移向量得出,后三维就是se(3)。

数学上已经证明,李代数处于线性空间中,可以进行求导操作

3. 对数映射与指数映射

上面我们给出了李代数与李群的映射关系,即

\[\ln(R(t)) = \phi_0^{\wedge}\\ 即 \ln{R(t)}^{\vee} = \phi_0 \\\ R(t) = exp(\phi_0^\wedge) \]

但是这只是抽象的公式,并没有告诉我们如何将其中的一些具体元素对应转换。但是通过这个我们可以知道对于已知李群求李代数是一种对数映射,已知李代数求李群是一种指数映射。

\[对于exp(\phi^{\wedge}),进行泰勒展开 \\ 因为e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \ldots \\ 又对于一个三维向量可以写成模长乘单位方向向量的模式,不妨假设\phi = \theta\vec{a},\vec{a}为单位向量 \\ \]

具体形式与化简如下图
image

化简应用的性质如下

image

最终我们得出这样的一个式子
image

不难看出,这个公式与上一讲旋转矩阵转角轴(旋转向量)的罗德里格斯公式如出一辙。这也揭示了so(3)的物理意义就是旋转向量。

因此由so(3)的李代数指数映射求其对应的李群SO(3)的过程本质上就是旋转向量向旋转矩阵的转换。

对于已知旋转矩阵求其so(3)上的李代数的过程,我们有对数映射形式\(\ln{R(t)} = \phi\),尽然可以使用与求指数映射形式类似的泰勒展开来推导,这样比较麻烦。

但是我们已经知道了so(3)上的李代数实际上就是角轴,因此使用第三章中旋转向量转角轴的公式即可。

\[\text{角度}\\ \theta = arcos(\frac{tr(R)-1}{2})\\ \text{轴向量}\\ R\vec{n} = \vec{n},求解R特征值为1时的特征向量 \]

关于方向向量的求解,因为使用角轴描述旋转时,旋转前后的单位方向向量是不变的(因为是绕着这个轴转的嘛)。因此对轴乘以旋转矩阵进行旋转操作后的结果仍是其本身,依据这个列出的特征方程。

至于SE(3)与se(3)之间的转换,由下图总结给出

最后总结以下李群与李代数的映射关系以及变换
image

4. 李群与李代数的近似

既然李代数处于线性空间,而且李群与李代数可以通过指数映射以及对数映射进行转换,那么我们是否可以直接使用李代数表述李群的求导操作呢?

一个朴素的思想

\[对于R_1R_2 = exp(\phi_1^\wedge)exp(\phi_2^\wedge) \\ 在实数域中有exp(x_1)exp(x_2) = exp(x_1 + x_2) \\ 猜想:是否有 R_1R_2 = exp(\phi_1^\wedge)exp(\phi_2^\wedge) = exp(\phi_1^\wedge + \phi_2^\wedge) = exp((\phi_1 + \phi_2)^\wedge) \]

但是根据BCH近似公式
image

可以知道对于两个矩阵,\(exp(A)exp(B) \neq exp(A+B)而是等于exp(A+B+余项)\)。

不过根据如下公式可以将上式进行线性近似
image

其中\(J_l\)为左乘雅可比矩阵,\(J_r\)为右乘雅可比矩阵。具体表示方法如下

image

image

也就是说当两个量中有一个为小量时可以使用BCH近似来实现李群乘法转化为李代数加法。但是还是不够直观,给出如下推导。注意雅可比矩阵视为常系数。

\[exp((J_l(\phi_2)\phi_1)^{\wedge})exp(\phi_2^{\wedge}) = exp(J_l(\phi_2)(\phi_1)^{\wedge})exp(\phi_2^{\wedge}) \\ 根据以上BCH近似将J_l(\phi_2)(\phi_1)^{\wedge}看作小量,有 \\ exp(J_l(\phi_2)(\phi_1)^{\wedge})exp(\phi_2^{\wedge}) = exp(J_l^{-1}(\phi_2)J_l(\phi_2)\phi_1^\wedge+\phi_2^\wedge) = exp(\phi_1^\wedge + \phi_2^\wedge) = exp((\phi_1 + \phi_2)^\wedge) \]

即最后得出了这样一个等式,且将\(J_l(\phi_2)\)简写为\(J_l\)

\[exp((\phi_1+\phi_2)^\wedge) = exp(J_l\phi_1^\wedge)exp(\phi_2^\wedge) \]

依据这个等式,我们就可以将李代数的加法与李群的乘法近似且简洁的联系在一起了。下面贴出SE(3)与se(3)的关系,推导类似。
image

5. 李代数求导

以上我们就已经具备了实现李代数求导的准备。

求导的方法有两种

  • 李代数求导
  • 扰动模型求导
    对于旋转矩阵求导的应用场景如下

\[对于一个三维向量\vec{p},对其进行旋转操作R,求旋转后的向量或者点相对于旋转的变化率 \\ 不妨记为\frac{\partial{Rp}}{\partial{R}} \]

李代数求导

李代数求导就是将上式中的旋转矩阵李群直接用对应的李代数来进行替换,然后在李代数中套用导数定义来实现
image

  • 第二步使用了上面推导的\(exp((\phi_1+\phi_2)^\wedge) = exp(J_l\phi_1^\wedge)exp(\phi_2^\wedge)\)
  • 第三步近似,因为\(J_l\delta\phi^\wedge\)是一个小量,因此由泰勒展开或者说等价无穷小,\(e^x = 1+x\)有\(J_l\delta\phi^\wedge = (I + (J_l)\delta\phi^\wedge)\)
  • 第四步展开括号或者提公因式可以得出
  • 第五步由反对称阵与向量叉乘的关系\(\vec{a}\times\vec{b} = \vec{a}^\wedge\vec{b} = -\vec{b}\times\vec{a} = -\vec{b}^\wedge\vec{a}\) 即 \(\vec{a}^\wedge\vec{b} = -\vec{b}^\wedge\vec{a}\)
  • 第六步上下约掉\(\delta\phi\)

扰动模型求导

扰动模型求导的思路是在原来的旋转矩阵上左乘一个小的扰动旋转。然后对这个扰动求导。
不严谨的表示为

\[\lim_{\Delta R\rightarrow0}\frac{\Delta RRp-Rp}{\Delta R} \]

要做的就是将上述中的李群换成对应的李代数。设\(\Delta R\leftrightarrow \delta\varphi\),推导如下图。
image

推导所使用的化简方法与李代数求导并无二异。
可以看出,使用扰动求导的方法得出的结果更加简洁,没有最后的左乘雅可比矩阵。

但是使用两种方法求出的结果是有差异的。

  • 李代数求导的对象是对旋转矩阵本身,令导数等于0求出的旋转矩阵即为最优的旋转。
  • 扰动模型求导的对象是\(\Delta R\),令导数等于0求出的为最优的\(\Delta R\),最终的\(R = \Delta RR\)

最后贴出SE(3)求导的推导。
image

需要注意的是\((Tp)^\odot\)中的\(\odot\)符号代表着SE(3)求导。

最后想要支持李代数李群相关运算,可以使用Sophus库来实现,Sophus库是Eigen的一个关于李代数李群的一个扩展库。

标签:wedge,phi,李群,---,slam,CH4,exp,求导,代数
From: https://www.cnblogs.com/CrescentWind/p/18052814

相关文章

  • 35多继承-菱形继承
    多继承-菱形继承菱形继承会导致相同的基类成员出现多份拷贝,解决方法是使用虚继承。这样可以实现更多代码的的复用#include<iostream>usingnamespacestd;classA{private: intma;public: A(inti):ma(i) { cout<<"A()"<<endl; } ~A() { cout<<"~A(......
  • 003-Java程序流程控制
    3.Java程序流程控制(重点)程序的三种控制结构3.1分支结构if,switch3.1.1ifif分支根据条件(真或假)来决定执行某段代码。if分支应用场景if第一种形式执行流程:首先判断条件表达式的结果,如果为true执行语句体,为false就不执行语句体。if第二种形式......
  • 鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)
    鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署)鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)鸿蒙开发游戏(五)---大鱼吃小鱼(添加音效)鸿蒙开发游戏(六)---大鱼吃小鱼(称霸海洋) 前言:该篇对NPC进行了升级,这里可以投入多个......
  • ems-jsp 用户登录模块
    整体思路1.登录首先要从前端获取账号和密码2.根据用户名去查询用户,用户存在比对密码(注意由于密码是加密存入数据库的所以比对时要用用户输入的密码加密后跟数据库中的密码比对)。  用户不存在,登陆失败,返回登录界面并且显示失败原因。代码:展示部分Controller层:@Requ......
  • MySQL-18 MySQL8其他新特性
    C-18.MySQL8其他新特性1.MySQL8新特性概述MySQL从5.7版本直接跳跃发布了8.0版本,可见是一个令人兴奋的里程碑的版本。MySQL8版本在功能上,做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是对MySQLOptimizer优化器进行了改进。不仅在速度上得到了改善,还为用......
  • C++U6-06 - 一维线性动态规划
    上节课作业:链接:https://pan.baidu.com/s/17Fei1SuGEk5pnSspf_hprg?pwd=hq04提取码:hq04 动态规划  [最长上升子序列]  本题采用动态规划。数据储存,设定数组a[]用于存储数字序列,设定dp[]数组用于统计上升的序列个数;遍历组数a[],在遍历的过程中如果出现了数......
  • p7915-solution
    P7915Solutionlink考虑枚举第一个操作选L还是R。这样原序列就被分为了两个栈,用四个指针\(p1,p2,p3,p4\)分别指向这两个栈的栈顶栈底。感性理解一下,某一个栈的栈顶\(x\)可以被pop当且仅当某一个栈的栈底等于\(x\)。于是直接dfs,每次优先选L,同时确定第\(2n-i+1\)......
  • p7914-solution
    P7914Solutionlink先考虑Subtask\(4\)。设\(dp_i\)表示长度为\(i\)的方案数,按题目定义转移:AB,ASB:\(\displaystyledp_n\getsdp_n+\sum_{i=1}^{n-1}\sum_{j=0}^kdp_i\timesdp_{n-i-j}\)(A):\(\displaystyledp_n\getsdp_n+dp_{n-2}\)(SA),(AS):\(\displa......
  • p7913-solution
    P7913Solutionlink先考虑有\(n\)个廊桥的分配。假设廊桥编号为\(1\simn\),我们用两个堆\(h1,h2\)分别存当前空闲的廊桥编号和正在使用廊桥的飞机的离开时间。对于国内和国外的飞机分别做一次以下操作:先按到达时间排序,从左到右扫,到第\(i\)架飞机的到达、离开时间为\(l_......
  • p5384-solution
    P5384Solutionlink弱化这题空间\(\mathcalO(n\logn)\)会MLE。考虑怎么搞到\(\mathcalO(n)\)。首先求k级祖先用树剖空间是\(\mathcalO(n)\)的。然后看看我们建线段树的过程,我们发现每次查询都是在对应深度的线段树里查,那么考虑把询问离线,把节点、询问对应到深度......