slam第四讲

本文介绍了使用李群和李代数进行位姿优化的方法,包括SO(3)和SE(3)及其对应的李代数so(3)和se(3)。文中详细解释了如何利用这些数学工具简化优化过程,并给出了评估轨迹误差的具体方法。

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

一、解决的问题

如前所述,相机的位姿由6个自由度来表示,转换成数学描述就是由旋转矩阵和变换矩阵R,t{R,t}R,t描述,在SLAM中位姿是未知的,我们需要解决形如“什么样的相机位姿最符合当前观测数据”,即一种典型的方式是把它构建成一个优化问题,求解最优的R,t{R,t}R,t,使得误差最小化,即对位姿进行估计和优化。这里之所以引入李群和李代数是因为旋转矩阵自身是带有约束的(正交且行列式为1),它们作为优化变量时会引入额外的约束,使优化变得困难,通过李群和李代数间的转换关系,我们可以把位姿估计变成无约束优化问题。

二、李群和李代数

简单来说我们希望用李群和李代数的方法来优化位姿问题。

2.1 李群和李代数的基础

如前所述我们用旋转矩阵和变换矩阵来描述位姿,三维旋转矩阵构成了特殊正交群SO(3){SO(3)}SO(3),而变换矩阵构成了特殊欧式群SE3{SE3}SE3,如下:
在这里插入图片描述
但他们对加法不封闭,对乘法封闭即:
在这里插入图片描述
在这里插入图片描述


  • 群是一种集合加上一种运算的代数结构,满足以下条件:
    在这里插入图片描述
    而李群是指具有连续光滑性质的群,而SO(n){SO(n)}SO(n)SE(n){SE(n)}SE(n)在实数空间上是连续的,我们能够直观地想象一个刚体能够连续地在空间中运动,所以它们都是李群。
  • 李代数
    每个李群都有与之对应的李代数,李代数描述了李群的局部性质,李代数定义如下:
    在这里插入图片描述
    so(3){so(3)}so(3)se(3){se(3)}se(3)上的李代数为:
    在这里插入图片描述
    在这里插入图片描述
    综上李代数的定义与相互转换关系如下:
    在这里插入图片描述
  • 李代数求导与扰动模型
    迄今为止我们采用李代数的主要原因是为了优化,通常求导是优化时的必要手段,我们来看下李代数的求导。
    SO(3){SO(3)}SO(3)上的李代数求导,通常李代数解决求导问题的思路分为两种:
    1. 用李代数表示姿态,然后根据李代数加法对李代数求导。
    2. 对李群左乘或右乘微小扰动,然后对该扰动求导,称为左扰动和右扰动
    • 李代数求导
      在这里插入图片描述

    • 扰动模型(左乘)
      在这里插入图片描述

  • SE(3){SE(3)}SE(3)上的李代数求导
    在这里插入图片描述

三、评估轨迹误差

在实际工程中,我们经常需要评估算法的估计轨迹与真实轨迹的差异来评价算法的精度。真实轨迹往往通过某些更高精度的系统获得,而估计轨迹是由待评价的算法计算得到的。常见的误差指标有绝对轨迹误差(Absolute Trajectory Error,ATE),形如:
在这里插入图片描述
这实际上是每个位姿李代数的均方根误差。这种误差可以刻画两条轨迹的旋转和平移误差。

总结

本讲引入了李群SO(3){SO(3)}SO(3)SE(3){SE(3)}SE(3),以及它们对应的李代数so(3)so(3)so(3)se(3)se(3)se(3)。我们介绍了位姿在他们上面的表达和转换,然后通过BCH的线性近似,就可以对位姿进行燃动并求导。这给之后讲解位姿的优化打下了理论基础,因为们需要经常对某一个位姿的估计值进行调整,使它对应的误差减小。只有在弄清楚如何对位姿进行调整和更新之后,我们才能继续下一步的内容。

### SLAM十四第七实验代码解读与实现 #### 1. 实验背景 《SLAM十四》第七主要围绕视觉里程计展开,重点讨论基于特征点的方法来估计相机运动。这一章节涵盖了多个核心算法和技术,包括特征点检测、匹配、对极几何、三角测量以及PnP方法等[^4]。 #### 2. 关键技术解析 ##### (1)特征点检测与描述子计算 - **ORB特征**:ORB是一种快速有效的局部特征描述符,在本实验中被广泛用于特征点的提取和描述。它结合了FAST角点检测器和BRIEF描述子的优点。 - **OpenCV实现**:可以利用OpenCV库中的`cv::ORB`类轻松完成ORB特征的提取和匹配操作[^4]。 ```cpp // 创建ORB对象 cv::Ptr<cv::ORB> orb = cv::ORB::create(); // 提取关键点和描述子 std::vector<cv::KeyPoint> keypoints; cv::Mat descriptors; orb->detectAndCompute(image, cv::noArray(), keypoints, descriptors); ``` ##### (2)特征点匹配 - 使用暴力匹配(Brute Force Matching)或者FLANN匹配器来进行特征点之间的相似度比较。 - 需要注意的是,可以通过设置阈值过滤掉低质量的匹配结果。 ```cpp // 创建BFMatcher对象 cv::BFMatcher matcher(cv::NORM_HAMMING); // 进行匹配 std::vector<std::vector<cv::DMatch>> matches; matcher.knnMatch(descriptors1, descriptors2, matches, 2); ``` ##### (3)对极几何约束 - 对极几何的核心是对本质矩阵E的求解,进而分解得到相对旋转和平移向量\( R \)和\( t \)[^4]。 - 利用RANSAC算法剔除误匹配点,提高鲁棒性。 ```cpp // 计算基础矩阵F cv::Mat F = findFundamentalMat(points1, points2, CV_FM_RANSAC); // 由F推导出本质矩阵E cv::Mat E = cameraMatrix.t() * F * cameraMatrix; // 分解E获取可能的R和t组合 decomposeEssentialMat(E, R1, R2, t); ``` ##### (4)三角测量 - 基于两帧图像间的相对位姿关系,通过三角化方法恢复三维空间中特征点的位置[^4]。 ```cpp // 调用triangulatePoints函数进行三角化 cv::Mat points4d_homogeneous; cv::triangulatePoints(P1, P2, points1, points2, points4d_homogeneous); ``` ##### (5)PnP问题求解 - 已知某些特征点的世界坐标及其对应的像素坐标时,可采用PnP方法估算相机的姿态参数。 ```cpp // 解决PnP问题 cv::solvePnP(object_points, image_points, K, dist_coeffs, rvec, tvec); ``` #### 3. 完整流程概述 整个实验过程大致分为以下几个阶段: - 图像预处理; - 特征点提取与匹配; - 应用对极几何原理估计初始姿态; - 利用三角测量重建稀疏地图; - 最终验证并优化所得结果。 #### 4. 注意事项 在实际编码过程中需特别留意数据格式转换、噪声干扰等问题,并适当调整超参以适应不同场景需求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值