• 【视觉SLAM十四讲】学习笔记-第二讲


    其他章节:
        第二讲:初识SLAM

    初识SLAM

            SLAM(Simultaneous Localization and Mapping),同时定位与地图构建。它是指搭载特定传感器主体,在没有环境先验信息的情况下,于运动过程中建立环境模型,同时估计自己的运动。

    相机介绍

            单目相机:即一个摄像头,这种传感器结构简单,成本低;缺点是但是它以二维的形式反映了三维的世界,丢掉了深度,因此平移之后才能计算深度,但仍然无法确定真实尺度。
            双目相机:由两个单目相机组成,但两个相机之间的距离(基线)已知,因此我们通过基线来估计每个像素的空间位置。它的缺点是配置与标定均较为复杂,其深度量程和精度受基线和分辨率所限;并且视差的计算非常消耗计算资源。
            深度相机:通过红外结构光原理,测出物体与相机之间的距离,因此可以节省大量的计算;但目前多数深度相机还存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题。

    经典视觉SLAM框架
    在这里插入图片描述
            1.传感器信息读取。在视觉SLAM中主要为相机图像信息的读取和预处理。如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。

            2.视觉里程计(Visual Odometry, VO)。估算相邻图像间相机的运动,以及局部地图的样子。
            VO能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构,它和实际的里程计一样,只计算相邻时刻的运动。但是由于里程计的工作方式,导师误差会传递,形成累计漂移。

            3.后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。
            主要指SLAM过程中噪声的问题。后端优化要考虑的,就是如何从有噪声的数据中估计整体系统的状态,以及这个状态估计的不确定性有多大(最大后验概率估计MAP)。

            4.回环检测(Loop Closing) 。回环检测判断机器人是否到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
            主要解决位置估计随时间漂移的问题。通过识别到过的场景,并把“A与B是同一个点”的信息告诉后端优化算法;然后后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样,如果我们有充分而且正确的回环检测,就可以消除累积误差,得到全局一致的轨迹和地图。

            5.建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。.
            大体分为度量地图和拓扑地图。度量地图强调精确地表示地图中物体的位置关系,通常用稀疏与稠密对其分类。稀疏地图并不需要表达所有的物体;稠密地图着重于建模所有看到的东西。拓扑地图更强调地图元素之间的关系。拓扑地图由节点和边组成,只考虑节点间的连通性。

    SLAM问题的数学表述

            若机器人在离散时刻 t = 1 , . . . , k t=1,...,k t=1,...,k中的位置为 x = x 1 , . . . , x k x=x_1,...,x_k x=x1,...,xk,那么从 k − 1 k-1 k1时刻到 k k k时刻,机器人的位置可以抽象成一个运动方程 x k = f ( x k − 1 , u k , w k ) x_k=f(x_{k-1},u_k,w_k) xk=f(xk1,uk,wk)。其中, u k u_k uk是运动传感器读数(输入), w k w_k wk为噪声
            假设地图中有 N N N个路标 y 1 , . . . , y N y_1,...,y_N y1,...,yN,当机器人在 x k x_k xk位置上看到某个路标点 y j y_j yj,产生了一个观测数据 z k , j z_{k,j} zk,j,同样可以抽象成一个观测方程 z k , j = h ( y j , x k , v k , j ) z_{k,j}=h(y_j,x_k,v_{k,j}) zk,j=h(yj,xk,vk,j)。其中, v k , j v_{k,j} vk,j是这次观测里的噪声。

    实践部分

    使用的vm虚拟机,ubuntu20.04版本。

            首先是基础的创建文件(vim记得要sudo权限,第一次没加没法写入。)
    请添加图片描述
            书里示例程序:
    在这里插入图片描述
            使用g++编译,并运行out文件:
    在这里插入图片描述
            为了便捷管理未来的项目,书里介绍了cmake生成makefile
    在这里插入图片描述
            使用命令sudo cmake .编译
    在这里插入图片描述
            生成的Makefile可以用make命令进行
    在这里插入图片描述

    这一节都是基础,之前基本都用过学过,包括后面的库函数之类的,不多写了

  • 相关阅读:
    前端JS基础第三篇:七道例题带你弄懂this指向问题
    面试总结-单例模式之Java实现
    beego语言golang编程语言安装bee : 无法将“bee”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
    Selenium 前世今生
    【机器学习】逻辑回归LR的推导及特性是什么,面试回答?
    十二、排序
    AMD64(x86_64)架构abi文档:中
    抢跑“补盲”风口,纯固态激光雷达上车面临哪些挑战?
    java特种兵读书笔记(5-1)——并发之基础介绍
    反射获取类、方法、属性
  • 原文地址:https://blog.csdn.net/weixin_43476037/article/details/126736020