视觉slam14讲——第4讲 李群李代数

来源:互联网 发布:cs鼠标垫推荐知乎 编辑:程序博客网 时间:2024/06/06 02:23

  • 基础
    • 1 李群
    • 2 李代数
  • 李代数求导

1 基础

1.1 李群

群是只有一种运算的集合,拥有四种性质.

  • 封闭性
  • 结合律
  • 幺元

比如, 特殊正交群和特殊欧氏群
这里写图片描述

李群指有连续光滑性质的群, SO(3)和SE(3)在实数空间上是连续的.

1.2 李代数

每个李群都有对应的李代数, 李代数描述了李群的局部性质.

李代数由一个集合,一和数域F, 一个二元运算 , 组成.
满足四条性质

  • 封闭性
  • 双线性
  • 自反性
  • 雅可比等价

李群SO(3)和SE(3)对应的李代数如下

这里写图片描述


李群SO(3)和SE(3)对应的李代数转换关系如下


这里写图片描述

2 李代数求导

有两种方法

  • 用李代数表示姿态,然后根据李代数加法对李代数求导
  • 对李群左乘或右乘微小扰动,然后对该扰动求导,称为左扰动模型和右扰动模型

使用Sophus库进行操作如下
(1) 构造李群SO(3)和SE(3)
以下三种方法都是等价的

/********************** SO3 **************************/Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();// 沿Z轴转90度的旋转矩阵Sophus::SO3 SO3_R(R);// Sophus::SO(3)可以直接从旋转矩阵构造Sophus::SO3 SO3_v(0, 0, M_PI/2); // 亦可从旋转向量构造Eigen::Quaterniond q(R);// 或者四元数Sophus::SO3 SO3_q( q );/********************** SE3 **************************/Eigen::Vector3d t(1,0,0);           // 沿X轴平移1Sophus::SE3 SE3_Rt(R, t);           // 从R,t构造SE(3)Sophus::SE3 SE3_qt(q,t);            // 从q,t构造SE(3)

(2)求出对应的李代数

/********************** SO3 **************************/// 使用对数映射获得它的李代数Eigen::Vector3d so3 = SO3_R.log();cout<<Sophus::SO3::hat(so3)<<endl;// hat 为向量到反对称矩阵cout<<Sophus::SO3::vee(Sophus::SO3::hat(so3));// 相对的,vee为反对称到向量/********************** SE3 **************************/// 李代数se(3) 是一个六维向量,方便起见先typedef一下typedef Eigen::Matrix<double,6,1> Vector6d;Vector6d se3 = SE3_Rt.log();// 在Sophus中,se(3)的平移在前,旋转在后.cout<<Sophus::SE3::hat(se3)<<endl;cout<<Sophus::SE3::vee( Sophus::SE3::hat(se3) )<<endl;

(3)增量扰动模型的更新

/********************** SO3 **************************/Eigen::Vector3d update_so3(1e-4, 0, 0); //假设更新量为这么多Sophus::SO3 SO3_updated = Sophus::SO3::exp(update_so3)*SO3_R;/********************** SE3 **************************/Vector6d update_se3; //更新量update_se3.setZero();update_se3(0,0) = 1e-4d;Sophus::SE3 SE3_updated = Sophus::SE3::exp(update_se3)*SE3_Rt;
原创粉丝点击