【SLAM十四讲学习笔记】第4讲 李群与李代数

本文详细介绍了李群和李代数的基础知识,包括SO(3)和SE(3)的李代数表示,指数与对数映射的定义和性质。探讨了李代数在SO(3)和SE(3)上的求导以及扰动模型,阐述了在位姿估计中的应用,如误差计算和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SLAM十四讲学习笔记

第4讲 李群与李代数



4.1 李群李代数基础

在这里插入图片描述
它们对加法是不封闭的,关于乘法是封闭的。
群(Group)是一种集合加上一种运算的代数结构。我们把集合记作 A,运算记作 ·,
那么群可以记作 G = (A, ·)。
在这里插入图片描述
李群是指具有连续(光滑)性质的群。像整数群 Z 那样离散的群没有连续性质。而 SO(n) 和 SE(n),它们在实数空间上是连续的。

在这里插入图片描述
由于 R ̇ (t)R(t)T 是一个反对称矩阵,我们可以找到一个三维向量 φ(t) ∈ R3 与之对应。于是有:
在这里插入图片描述
同时在 t0 附近,设 φ 保持为常数 φ(t0) = φ0
在这里插入图片描述
李代数由一个集合 V,一个数域 F 和一个二元运算 [, ] 组成。如果它们满足以下几条 性质,称 (V, F, [, ]) 为一个李代数,记作 g。

在这里插入图片描述

二元运算被称为李括号。李括号表达了两个元素的差异。它不要求结合律,而要求元素和自己做李括号之后为零的性质。作为例子,三维向量 R3 上定义的叉积 × 是一种李 括号,因此 g = (R3 , R, ×) 构成了一个李代数。
李代数 so(3)
在这里插入图片描述
在这里插入图片描述

李代数 se(3)
在这里插入图片描述

我们仍使用 ∧ 和 ∨ 符号来指代“从向量到矩阵”和“从矩阵到向量”的关系在这里插入图片描述

4.2 指数与对数映射

定义:
在这里插入图片描述
性质:
在这里插入图片描述
推导:
在这里插入图片描述
反之,如果定义对数映射, 我们也能把 SO(3) 中的元素对应到 so(3) 中:在这里插入图片描述
SE(3) 上的指数映射:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3 李代数求导与扰动模型

在这里插入图片描述
当 φ1 或 φ2 为小量时,小量二次以上的项都可以被忽略掉。此时,BCH 拥有线性近似表达:

在这里插入图片描述

以第一个近似为例。该式告诉我们,当对一个旋转矩阵 R2(李代数为 φ2)左乘一个 微小旋转矩阵 R1(李代数为 φ1)时,可以近似地看作,在原有的李代数 φ2 上,加上了一 项Jl(φ2)−1φ1。

在这里插入图片描述
在这里插入图片描述

4.3.2 SO(3) 李代数上的求导

计算理想的观测与实际数据的误差:在这里插入图片描述

假设一共有 N 个这样的路标点和观测,于是就有 N 个上式。位姿估计,相当于是寻找一个最优的 T ,使得整体误差最小化: 在这里插入图片描述
我们经常会构建与位姿有关的函数,然后讨论该函数关于 位姿的导数,以调整当前的估计值。

4.3.3 李代数求导

在这里插入图片描述

在这里插入图片描述

4.3.4 扰动模型(左乘)

另一种求导方式,是对 R 进行一次扰动 ∆R。设左扰动 ∆R 对应的李代数为 φ。

在这里插入图片描述

4.3.5 SE(3) 上的李代数求导

在这里插入图片描述


### 关于 SLAM李群代数的代码实现 在《视觉SLAM十四》中提到,为了处理旋转和平移操作中的微分问题,引入了李群代数的概念。由于李群上的运算仅限于乘法而缺乏加法规则,这使得在其上定义导数变得困难[^3]。 针对这一挑战,在实际编程实践中通常会通过指数映射将李群转换至其对应的代数空间内进行计算,因为后者是一个线性的向量空间,允许执行诸如求导这样的操作。下面给出一段简单的 Python 实现例子用于展示如何利用 Sophus 库来进行 SE(3) 的基本操作: ```python import sophus as sp from scipy.spatial.transform import Rotation as R def se3_exp_map(w,u): """Compute the exponential map from Lie algebra to Lie group. Args: w (numpy.ndarray): A 3D vector representing angular velocity. u (numpy.ndarray): A 3D vector representing linear velocity. Returns: sophus.SE3: An element of SE(3). """ omega_hat = sp.so3.exp(sp.Vector3d(*w)) v = sp.Vector3d(*u) return sp.SE3(omega_hat, v) if __name__ == "__main__": # Example usage with random values for demonstration purposes only rotation_velocity = [0.1, 0.2, 0.3] translation_velocity = [0.4, 0.5, 0.6] transformation_matrix = se3_exp_map(rotation_velocity, translation_velocity) print(transformation_matrix.matrix()) ``` 上述代码片段展示了怎样创建一个 `sophus` 类型的对象并打印出相应的变换矩阵。这里使用的是 Sophus 这一专门设计用来高效表示 SO(3)/SE(3) 及其对应代数 so(3)/se(3) 的 C++/Python 库[^4]。 对于更复杂的场景比如轨迹绘制,则可能涉及到读取外部文件以及调用图形库如 Pangolin 来可视化结果。这部分工作往往依赖具体的应用需求和个人偏好来决定具体的实施方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值