视觉SLAM十四讲——第二讲初识SLAM

本文深入解析《视觉SLAM十四讲》第二讲的核心概念,包括SLAM问题本质、视觉传感器类型及其优缺点,以及经典视觉SLAM框架的运作原理。从单目、双目到深度相机,再到视觉里程计、后端优化、回环检测和建图,全面覆盖视觉SLAM关键技术。

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

@《视觉SLAM十四讲》知识点与习题

《视觉SLAM十四讲》第二讲知识点整理+习题

正在学习SLAM相关知识,将一些关键点及时记录下来。

知识点整理

本讲主要是介绍了SLAM,主要是视觉SLAM方面的基础知识,对一些术语进行了大体的解释,并且将整本书的内容的逻辑梳理了一遍,手把手上手视觉SLAM。
SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计

  1. 定位 ,“我在什么地方”,即自身状态
  2. 建图 ,“周围环境是怎么样”
  3. 传感器,分为携带于机器人本体和安装于环境中两种情况。但是后者约束了外部环境,前者只能通过测量到的间接物理量来计算位置数据。后者更适用于未知环境
  4. 相机,单目相机、双目相机、深度相机三大类。以一定速率拍摄周围的环境,形成一个连续的视频流。
    • 单目相机:结构特别简单,成本特别低,单目SLAM非常受研究者关注。
      但是在投影的过程中,丢失了深度信息,然而这个距离(物体与相机)很关键。因此,从单目SLAM中恢复三维结构,需要改变相机的视角,即移动相机来估计相机的运动,才能计算深度。
      在相机移动过程中,不同远近的物体在图像上的运动会形成视差,有助于定量的判断
      单目SLAM估记得轨迹和地图将与实际的轨迹和地图相差一个因子,即所谓的尺度scale。由于单目SLAM无法仅凭图像得到这个真实尺度,所以又称为尺度不确定性
    • 双目相机和深度相机:测量物体与我们之间的距离,消除尺度不确定性。
      双目相机:通过基线(两个相机之间的距离)来估计每个像素的空间位置。双目相机需要大量的计算才能估计每一个像素点的深度。测量的深度范围与基线相关。后者越大,测量到的就越远。
      但是,双目相机的配置与标定均较为复杂,深度量程和精度受双目的基线与分辨率所限,且视差的计算非常消耗计算资源。室内室外均可
      深度相机:通过物理测量手段,通过红外或TOF来获得距离,相较于双目相机节省了大量的计算。
      但是,深度相机存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题,主要用于室内。
  5. 经典视觉SLAM框架,传感器信息读取、视觉里程计(VO)、后端优化(Optimization)、回环检测(Loop Closing)、建图(Mapping)。
传感器数据
前端视觉里程计
后端非线性优化
建图
回环检测
  1. 如果把工作环境限制在静态、刚体,光照变化不明显、没有人为干扰的场景,那么这个SLAM系统是相当成熟的了。
    • 传感器信息读取:视觉SLAM:相机图像信息的读取和预处理。在机器人中,还有码盘、惯性传感器等信息的读取和同步
    • VO: 估计相邻图像间相机的运动,以及局部地图的样子。VO只计算相邻时刻的运动,而和再往前的过去的信息没有关联。将相邻时刻的运动”串“起来,就构成了运动轨迹,就进行了定位。且根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图。
      但是,会出现累计漂移。即误差会逐帧累加。
    • Optimization: 接受不同时刻VO测量的相机位姿,以及Loop Closing的信息,对他们进行优化,得到全局一致的轨迹和地图,对整个轨迹的形状进行校正。
      主要处理噪声的问题。需从带噪声的数据中估计整个系统的状态,以及这个状态(轨迹、地图)估计的不确定性。将不确定性表达出来以后,采用filtering或非线性优化,估计状态的均值和不确定性(方差)
    • Loop Closing: 判断机器人是否到达过先前的为止。若检测到回环,将信息提供给Optimization进行处理。实质是一种计算图像数据相似性的算法
    • Mapping: 根据估记的轨迹,建立于任务要求对应的地图。根据需求,对环境进行描述。
      度量地图:精确地表示地图中物体的位置关系,用稀疏与稠密对齐分类。稀疏:选择具有代表意义的东西——路标,适用于定位。 稠密:建模所有看到的东西,适用于导航。但是稠密地图存储空间大,且大多数时候很多细节部分是无用的。
      拓扑地图:强调地图元素之间的关系。由节点和边组成,只考虑节点之间的连通性。但是不擅长表达具有复杂结构的地图。如何对地图进行分割形成节点与边,又如何使用拓扑地图进行导航进行路径规划,仍是有待研究的问题
  2. 观测:在k时刻于xk处探测到了某一个路标yj,产生了一个观测数据zk,j。
    运动:从k-1时刻到k时刻,位置x的变化。需要测量自身运动的传感器。
    当知道运动测量的读数u,以及传感器的读数z,如何求解定位问题(估计x)和建图问题(估计y)。因此,SLAM问题转换成为了一个状态估计问题
  3. 状态估计问题:根据噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。
    • 线性高斯系统的无偏的最优估计可以又卡尔曼滤波器KF给出
    • 复杂的非线性非高斯系统,使用以扩展卡尔曼滤波器和非线性优化两大类方法求解
    • 最早的实时视觉SLAM系统是基于EKF开发的,但是EKF的缺陷是线性化误差和噪声高斯分布假设。
    • 目前,主流视觉SLAM使用以图优化为代表的优化技术进行状态估计

习题

  • 阅读文献1, 2。心得会在另一个博客中记录
  • 阅读综述3,4,5,6,7
  • g++命令参数
    g++ Test.cpp:功能:生成默认为a.exe的文件,这个过程包含了编译和链接
    g++ -o Test.exe Test.cpp。-o命令是输出的意思,这样就输出了Test.exe。使用-o可以指定目标名称 8
  • 注意需要首先使用+按钮添加添加二进制文件,修改名字,且将环境选择为default。Debug界面里保持默认配置即可。接下来设置断点,点击Default按钮。会看到界面有些许的变化,上方出现Stop All和Stop按钮。在左侧打开Variables一栏,即可以查看变量的值。

Kdevelop中的Debug

  • 如果将CMakeLists.txt中的target_link_libraries(useHello hello_shared)注释掉,在Build时会报错,提示”Linking CXX executable useHello … recipe for target ‘useHello’ failed … undefined reference to ‘printHello()’"这句话就表示,此时虽然将库文件包含进去了,但是没有给头文件,无法知道该如何去调用该库文件中的函数,从而无法知道printHello()函数应该如何使用
  • 看《cmake实践》。把一些用到的点,书上没有解释的整理如下
    cmake . :命令后面的点号,代表本目录
    中间文件有:CMakefiles, CMakeCache.txt, cmake_install.cmake等文件,以及Makefile
    CMakeLists.txt: cmake的构建定义文件,文件名大小写相关
    若工程中有多个目录,需每个目录均存在CMakeLists.txt
    PROJECT指令定义工程名称,同时也隐式的定义了两个cmake变量,projectName_BINARY_DIR和projectName_SOURCE_DIR
    SET指令可以显式的定义变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值