SLAM数学篇:李群与李代数

SLAM问题中,位姿估计涉及到旋转和平移的连续变化。通过李群与李代数,将位姿表示为无约束优化变量,解决旋转矩阵的约束问题。指数与对数映射用于转化,BCH公式处理矩阵指数之积,而扰动模型简化了求导计算。这些理论为SLAM的优化提供了基础。

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

李群与李代数

位姿估计问题

  假设某时刻机器人位姿为 T T T ,观察到世界坐标系中 p p p 点,产生观测数据 z z z ,则有
z = T p + w z=Tp+w z=Tp+w
存在观测噪声 w w w ,计算观测数据与实际数据的误差,即
e = z − T p e=z-Tp e=zTp
假设有 N N N 个路标点及观测,则寻找一个最优 T T T ,使得整体误差最小,即
min ⁡ T J ( T ) = ∑ i = 1 N ∣ ∣ z i − T p i ∣ ∣ 2 2 \min_{T}J(T)=\sum_{i=1}^N{||z_i-Tp_i||}_2^2 TminJ(T)=i=1N∣∣ziTpi∣∣22
  这是SLAM核心问题,我们构建了与位姿有关的重投影误差函数,若求最优位姿便应使得误差最小化,自然想到对位姿进行求导。但是因旋转矩阵自身带有约束(正交矩阵且行列式为1),对加法不封闭,将变换矩阵作为优化的变量时,会引入额外的约束。那我们怎么解决这个问题?引入李群与李代数,李代数由向量组成,具有良好的加法运算。通过李群与李代数之间的转换将位姿估计变成无约束优化问题,然后通过高斯牛顿法、列文伯格-马夸尔特法等优化算法简化求解。

李群与李代数

  李群是指具有连续(光滑)性质的群,在SLAM中主要讨论 S O ( n ) SO(n) SO(n) S E ( n ) SE(n) SE(n) 两个李群。 S O ( n ) SO(n) SO(n) S E ( n ) SE(n) SE(n) 是用来描述旋转平移上的变化,随时间变化连续,是矩阵的集合。每个李群都有与之对应的李代数,李代数描述了李群的局部性质,是定义在李群正切空间上的一组向量。

关系推导:
R R T = I ⇒ 微分 R ′ ( t ) R ( t ) T = − ( R ′ ( t ) R ( t ) T ) T ⇒ 反对称矩阵 R ′ ( t ) R ( t ) T = ϕ ( t ) ∧ ⇒ R ′ ( t ) = ϕ ( t ) ∧ R ( t ) ⇒ 积分 R ( t ) = e ϕ 0 ∧ t ⇒ R = e ϕ ∧ RR^T=I \Rightarrow^{微分} R'(t)R(t)^T=-(R'(t)R(t)^T)^T \Rightarrow^{反对称矩阵} R'(t)R(t)^T=\phi(t)^\wedge \Rightarrow R'(t)=\phi(t)^\wedge R(t) \\\\ \Rightarrow^{积分} R(t)=e^{\phi_0^\wedge t} \Rightarrow R=e^{\phi^\wedge} RRT=I微分R(t)R(t)T=(R(t)R(t)T)T反对称矩阵R(t)R(t)T=ϕ(t)R(t)=ϕ(t)R(t)积分R(t)=eϕ0tR=eϕ

结果定义:
S O ( 3 ) = { R ∈ R 3 × 3 ∣ R T R = I , d e t ( R ) = 1 } S E ( 3 ) = { [ R t 0 T 1 ] ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SO(3) = \{R \in \Bbb R^{3\times3}|R^TR = I,det(R)=1\} \\\\ SE(3)=\{ \begin{bmatrix} R & t \\\\ 0^T & 1 \end{bmatrix}| R \in SO(3),t \in \Bbb R^3 \} SO(3)={ RR3×3RTR=I,det(R)=1}SE(3)={ R0Tt1 RSO(3),tR3}

s o ( 3 ) = { ϕ ∈ R 3 , Φ = ϕ ∧ ∈ R 3 × 3 } s e ( 3 ) = { ξ = [ ρ ϕ ] ∈ R 6 , ρ ∈ R 3 , ϕ ∈ s o ( 3 ) , ξ ∧ = [ ϕ ∧ ρ 0 T 0 ] ∈ R 4 } so(3)=\{ \phi \in \Bbb R^3,\Phi=\phi^\wedge \in \Bbb R^{3 \times 3} \} \\\\ se(3)=\{ \xi=\begin{bmatrix} \rho \\\\ \phi \end{bmatrix} \in \Bbb R^6,\rho \in \Bbb R^3,\phi \in so(3),\xi^\wedge=\begin{bmatrix} \phi^\wedge & \rho \\\\ 0^T & 0 \end{bmatrix} \in \Bbb R^4 \} so(3)={ ϕR3,Φ=ϕR3×3}se(3)={ ξ= ρϕ R6,ρR3,ϕso(3),ξ= ϕ0Tρ0 R4}

  此处使用 ” ∧ ^\wedge ” 、“ ∨ ^\vee

### 关于 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、付费专栏及课程。

余额充值