李群李代数快速入门

李群李代数入门及应用

李群和李代数是机器人学、计算机视觉、控制理论等领域中处理旋转和平移变换的重要数学工具。它们为三维空间中的位姿(位置和姿态)提供了紧凑且高效的表示方法,特别适用于优化问题(如SLAM、Bundle Adjustment等)。以下是李群和李代数的快速入门指南:


一、基本概念

1. 李群(Lie Group)
  • 定义:李群是同时具有群结构和光滑流形结构的数学对象。在机器人学中,常用的李群包括:
    • SO(3):三维旋转群,表示所有3×3旋转矩阵的集合。
    • SE(3):三维刚体变换群(旋转+平移),表示所有4×4齐次变换矩阵的集合。
  • 性质
    • 封闭性:两个李群元素的乘积仍属于该李群。
    • 逆元存在:每个李群元素都有逆元。
    • 光滑性:李群上的乘法运算和求逆运算是光滑的。
2. 李代数(Lie Algebra)
  • 定义:李代数是李群的切空间,描述了李群在单位元附近的局部性质。每个李群对应一个李代数。
  • 与李群的关系
    • 李代数通过指数映射(Exponential Map)生成李群元素。
    • 李群元素通过对数映射(Logarithm Map)映射到李代数。
  • 常用李代数
    • so(3):对应SO(3)的李代数,是3×3反对称矩阵的集合,可用三维向量(旋转向量)表示。
    • se(3):对应SE(3)的李代数,是6维向量(前3维为旋转向量,后3维为平移向量)。

二、为什么需要李群和李代数?

  1. 避免万向节锁(Gimbal Lock)
    • 欧拉角表示旋转时会出现奇点(万向节锁),而李群和李代数无此问题。
  2. 优化友好
    • 李代数上的加法操作对应李群上的“接近”操作,适合梯度下降等优化算法。
  3. 插值平滑
    • 李群上的插值(如Slerp)比直接线性插值更平滑。
  4. 紧凑表示
    • SO(3)用9个参数(旋转矩阵)或4个参数(四元数)表示,而李代数so(3)仅用3个参数(旋转向量)。

三、核心操作

1. SO(3) 与 so(3)
  • 旋转矩阵(SO(3))
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d(0,0,1)).toRotationMatrix();
    
  • 旋转向量(so(3))
    Eigen::Vector3d so3 = Sophus::SO3d::log(R);  // 对数映射:SO(3) -> so(3)
    Eigen::Matrix3d R_exp = Sophus::SO3d::exp(so3).matrix();  // 指数映射:so(3) -> SO(3)
    
  • 四元数与SO(3)的转换
    Eigen::Quaterniond q(R);  // 旋转矩阵 -> 四元数
    Sophus::SO3d SO3_q(q);   // 四元数 -> SO(3)
    
2. SE(3) 与 se(3)
  • 齐次变换矩阵(SE(3))
    Eigen::Vector3d t(1, 0, 0);  // 平移向量
    Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
    T.block<3,3>(0,0) = R;
    T.block<3,1>(0,3) = t;
    Sophus::SE3d SE3_T(T);
    
  • 变换向量(se(3))
    Eigen::Matrix<double,6,1> se3 = SE3_T.log();  // 对数映射:SE(3) -> se(3)
    Sophus::SE3d SE3_exp = Sophus::SE3d::exp(se3); // 指数映射:se(3) -> SE(3)
    

四、关键应用场景

1. 位姿优化(Bundle Adjustment)
  • 问题:优化相机位姿(SE(3))和三维点坐标,最小化重投影误差。
  • 方法
    • 将位姿表示为SE(3),通过李代数se(3)更新位姿。
    • 使用高斯-牛顿或LM算法迭代优化。
2. SLAM中的位姿图优化
  • 问题:优化机器人轨迹中的位姿节点,使相邻位姿的变换与观测一致。
  • 方法
    • 每个位姿节点用SE(3)表示,边用SE(3)或so(3)表示约束。
    • 通过李代数计算误差和雅可比矩阵。
3. 机器人运动控制
  • 问题:控制机器人末端执行器到达目标位姿。
  • 方法
    • 计算目标位姿与当前位姿的误差(SE(3))。
    • 通过李代数将误差映射到控制输入(如关节速度)。

五、代码示例(C++ with Sophus)

#include <iostream>
#include <Eigen/Core>
#include "sophus/so3.hpp"
#include "sophus/se3.hpp"

int main() {
    // SO(3) 示例
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d(0,0,1)).toRotationMatrix();
    Sophus::SO3d SO3_R(R);
    Eigen::Vector3d so3 = SO3_R.log();  // 旋转向量
    std::cout << "Rotation vector (so3): " << so3.transpose() << std::endl;

    // SE(3) 示例
    Eigen::Vector3d t(1, 0, 0);
    Sophus::SE3d SE3_Rt(R, t);
    Eigen::Matrix<double,6,1> se3 = SE3_Rt.log();  // 变换向量
    std::cout << "Transformation vector (se3): " << se3.transpose() << std::endl;

    return 0;
}

六、学习资源

  1. 书籍
    • 《Visual SLAM十四讲》(高翔):第4-5章详细讲解李群李代数。
    • 《State Estimation for Robotics》(Timothy D. Barfoot):第5章。
  2. 论文
    • “A Tutorial on SE(3) Transformation Parameterizations and On-Manifold Optimization”(Blanco et al.)。
  3. 在线教程

通过掌握李群和李代数,你可以更高效地处理三维空间中的旋转和平移问题,尤其在优化和插值场景中表现优异。建议从SO(3)和SE(3)的基本操作入手,逐步深入到实际应用中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老黄编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值