视觉SLAM十四讲-第九讲笔记

本文详细介绍了SLAM框架的程序设计,包括数据结构如camera、frame、mapPoint,以及框架组件如visual_odometry。实现了相邻两帧匹配、地图匹配的位姿估计方法,采用PNP和bundle adjustment。此外,还探讨了命名空间、智能指针、工厂模式、单例模式等实现细节。

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

本讲搭建了一个完整的前端框架。在匹配方案上,使用了相邻两帧匹配、与地图匹配两种方法;在位姿估计方法上,使用了PNP方法、PNP+bundle adjustment的方法。
这份代码实现的只有位姿估计和优化,虽然是PnP,但没有估计3d点深度,而是从深度图中取出的。也没有优化地图中特征点的位置。

一、程序框架

1. 数据结构

1.1. camera

相机内参,实现坐标转换。

成员变量

相机内参数

成员函数

坐标转换函数:2d<->camera<->world三个坐标系的相互转换。

1.2. frame

成员变量

含当前帧的外参(位姿信息),以李代数表示
彩色图
深度图
每一帧的标识信息,ID、时间戳等

成员函数

实现图像中一点与帧的交互,如找到对应点深度,判断是否在当前帧内等。

1.3. maopoint

特征点

成员变量

点位置的描述信息:pos、norm、id
点特征的描述信息:descriptor
点匹配的描述信息:观察到的次数、正确匹配的次数等

1.4. map

地图,即特征点的集合。这份代码里实现的是局部地图,没有把所有特征点都加进去,按照距离当前相机的距离和匹配次数有删减。

成员变量

维护两个hash list,键值为其id:
特征点的list
关键帧的list

成员函数

实现特征点和关键帧的增删

2. 框架

实现数据结构后,还需要其他一些文件完成整个流程。

2.1. visual_odometry

实现vo的整改流程。

成员变量

一个enum,维护当前vo的状态[LOST,INIT,OK]
两个frame,前一帧为参考帧ref_,当前帧curr_
一个map
特征描述相关:当前帧的特征点集、匹配点集、特征点描述子,特征点对应2d点的id_
如果是两帧匹配,还需要记录上一帧特征点的3d坐标集。

成员函数
  • 流程控制
    addFrame。对每一个新来的帧进行匹配和估计。
  • 特征提取
    extractKeypointconputeDescriptorfeatureMatching。这三个都是使用opencv中的函数完成。
    featureMatching部分,和地图中的特征点匹配,如果是两帧之间的匹配,就使用上一阵的特征点集。最终,都要更新当前帧匹配到的3D特征点集和对应2d点集。这里匹配的点集可能存在无匹配
  • 位姿估计
    • poseEstimationPnP。先使用solvePnPRansac,从匹配的特征点中估计位姿,得到估计的旋转矩阵、平移矩阵、内点集。内点是经Ransan后,证明是正确匹配的点。 如果使用bundle adjustment,就以PnP的结果为初始值,再进行迭代优化。这一步最终得到估计的位姿(李代数表示)。
    • checkEstimatePose
      要验证当前估计的位姿够不够好,如内点数、朝向等。
  • 地图维护
    • optimizeMap:删去里当前帧相机太远、朝向太偏、总是能看见却匹配不到的点。
    • addKeyFrame不知道维护这个关键帧序列是干嘛的,当前好像没用到,之后建图和后端似乎会用。
    • addPointMaps
### 视觉SLAM十四第五章内容概要 #### 5.1 相机模型简介 相机作为视觉SLAM系统中的重要传感器,其成像原理和模型对于理解整个系统的运作至关重要。本章节介绍了针孔相机模型及其变种,并讨论了如何通过内参矩阵来描述这些模型[^1]。 #### 5.2 图像特征提取与匹配 为了实现环境感知,在视觉SLAM中通常会利用图像中的显著特征来进行跟踪和地图构建工作。这部分解了几种常用的局部特征检测方法以及它们之间的相互比较;还探讨了基于ORB等快速算法的特点及应用场合。 #### 5.3 像素坐标系下的重投影误差计算 当给定三维空间点P的世界坐标(x,y,z),可以通过已知的位姿T将其转换到相机坐标系下(X,Y,Z)再映射至像素平面上(u,v)。理想情况下,该位置应该正好位于由同一时刻另一视角所拍摄图片中标记出来的对应特征点处。然而实际操作过程中由于噪声等因素影响,两者之间往往存在偏差ε=(u'-u, v'-v),这就是所谓的“重投影误差”。此概念不仅适用于单目情况也广泛应用于双目标定等领域[^2]。 ```cpp // 计算重投影误差的一个简单例子 Eigen::Vector2d computeReprojectionError(const Eigen::Vector3d& point_world, const Sophus::SE3d& pose_camera_to_world, const CameraIntrinsics& intrinsics, const Eigen::Vector2d& observed_point_image){ // 将世界坐标转为相机坐标 auto point_cam = pose_camera_to_world * point_world; // 归一化平面坐标 double inv_z = 1.0 / point_cam.z(); double u_proj = intrinsics.fx() * (point_cam.x() * inv_z) + intrinsics.cx(); double v_proj = intrinsics.fy() * (point_cam.y() * inv_z) + intrinsics.cy(); // 返回重投影误差 return {observed_point_image.x()-u_proj, observed_point_image.y()-v_proj}; } ``` #### 5.4 单应性矩阵H的应用场景分析 除了基本理论外,书中还特别提到了单应性矩阵(Homography Matrix,H)这一工具可以用来处理两帧间仅有旋转和平移变化的情况。具体而言就是说如果两个摄像设备在同一时间分别获取了一张照片,则只要满足上述条件就可以借助于它完成一些特定的任务比如拼接全景图等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值