【视觉SLAM十四讲】第一讲 概述与预备知识

课程内容与预备知识

  • 计算机视觉
    • 物体识别 (2D/3D)
    • 物体跟踪
    • 物体检测
    • 语义分割
    • ……应用
    • SLAM
  • 现实世界中的相机
    • 单目
    • 双目
    • 深度
  • 视频序列
  • 计算机视觉任务
  • 应用:手持设备定位,自动驾驶定位,增强现实

SLAM是什么

SLAM:Simultaneous Localization and Mapping 同时定位与地图构建。

搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。

主要就是解决 1. 定位(估计传感器自身位置) 2. 地图构建(建立周围环境的模型) 两个问题。定位侧重对自身的了解,建图侧重对外在的了解。

相互关联 准确的定位需要精确的地图 -- 精确的地图来自准确的定位

若传感器主要为相机,则称为“视觉SLAM”。

传感器

机器人感知外界环境的手段

  • 种类:内质的/外质的
  • 内质:感受机器人本体信息
    • IMU、激光、相机
  • 外质:安装于环境中的
    • 二维码Marker、GPS、导轨、磁条

环境限制了传感器的形式

  • GPS:需要能接收到卫星信号的环境
  • Marker、导轨:需要环境允许安装

相比之下,激光、相机等携带式传感器更加自由

相机

以一定速率采集图像、形成视频

分类

  • 单目相机 Monocular (无深度 深度需要其他手段估计)
  • 双目相机(立体相机) Stereo (通过视差计算深度)
  • 深度相机 RGB-D (通过物理方法测量深度)
  • 其他 全景、Event Camera

相机的特点

以二维投影形式记录了三维世界的信息,该过程丢掉了一个维度:距离

当相机运动时,可通过视差确定深度

视觉SLAM框架

前端:Visual Odometry 后端:Optimization 回环:Loop Closing 建图:Mapping

【视觉SLAM十四讲】第一讲 概述与预备知识_第1张图片

传感器信息读取

相机图像信息的读取和预处理

视觉里程计(VO)

估计相邻时刻的相机运动以及局部地图的样子

最简化:两个图像的相对运动

方法: 特征点法、直接法

累计漂移(accumulating drift):由于运动造成的误差会不断累计

后端优化

接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,得到全局一致的轨迹和地图

从带有噪声的数据中估计最优轨迹与地图

最大后验概率估计(MAP):从带噪声的数据中估计整体系统的状态,以及这个状态估计的不确定性有多大

空间状态的不确定性估计(Spatial Uncertainty)

滤波器,图优化

回环检测

解决位置估计随时间漂移的问题

检测相机是否到达过之前位置,判断与之前位置的差异,计算图像间相似性,词袋模型

建图

导航、规划、通讯、交互、可视化

  • 度量地图
    • 精确的表示地图中物体的位置关系
    • 稀疏、稠密
    • 大规模度量地图会出现一致性问题
  • 拓扑地图
    • 强调地图元素之间的关系
    • 由节点和边组成的图,只考虑节点间的连通性
    • 不擅长表达复杂结构地图

数学表述与框架

【视觉SLAM十四讲】第一讲 概述与预备知识_第2张图片

状态估计问题

当知道运动测量的读数u,以及传感器的读数z时,如何求解定位(估计x)和建图(估计y)的问题。

位置参数x-旋转+位移,与相机有关 

求解方法

  • 线性高斯系统(Linear Gaussian, LG)
    • 最简单,无偏的最优估计可以由卡尔曼滤波器(KF)给出
  • 非线性非高斯系统(NLNG)
    • 扩展卡尔曼滤波器(EKF)和非线性优化
  • 主流以图优化进行状态估计

课后习题

LINUX

1. 如何在 Ubuntu 中安装软件(命令⾏界⾯)?它们通常被安装在什么地⽅?

1)apt-get 方式的安装;

普通安装:sudo apt-get install XXX

修复安装:sudo apt-get -f install XXX

重新安装:sudo apt-get -f reinstall XXX

2)dpkg方式的安装

sudo dpkg -i package_name.deb

通常被安装在/usr/bin这个目录下

2. linux 的环境变量是什么?我如何定义新的环境变量?

Linux系统中的环境变量是用来指定系统运行环境的一些参数,比如我们使用命令的路径。

通过环境变量来帮助Linux系统构建起为用户服务的工作环境,是需要数百个变量来协同完成的。我们可以用env命令查看linux系统中所有的环境变量。

查看环境变量

export

添加临时环境变量

export PATH=/usr/local/bin:$PATH
// PATH是变量名,这里是指添加到PATH这个环境变量中
// =后面是要添加的环境变量
// :$PATH是指把新添加的环境变量与原先的环境变量重新赋值给PATH这个变量,这里可以看出如果有多个环境变量时,应该使用:进行分隔,如
// export PATH=/usr/local/php/bin:/usr/local/mysql/bin:$PATH
// 当然$PATH是放在开头还是最后是没有影响的

添加全局环境变量

vim /etc/profile
// 如果只修改当前用户的环境变量,则是`vim ~/.bashrc`
// 在文件的最后一行添加以下代码:
export PATH=$PATH:/usr/local/php/bin
// 规则和用法如第二条所说

3. linux 根⽬录下⾯的⽬录结构是什么样的?⾄少说出 3 个⽬录的⽤途。
 

/:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。

/bin,/usr/bin:该目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含shell解释器等。

/boot: 该目录中存放系统的内核文件和引导装载程序文件,/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。

/dev: 设备(device)文件目录,存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,存放连接到计算机上的设备(终端、磁盘驱动器、光驱及网卡等)的对应文件,包括字符设备和块设备等,常用的是挂载光驱mount /dev/cdrom/mnt。 

/etc: 系统配置文件存放的目录,该目录存放系统的大部分配置文件和子目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11(X Window系统有关)、/etc/sysconfig(与网络有关)、/etc/xinetd.d修改配置文件之前记得备份。该目录下的文件由系统管理员来使用,普通用户对大部分文件有只读权限。

/home: 系统默认的用户宿主目录,新增用户账号时,用户的宿主目录都存放在此目录下,~表示当前用户的宿主目录,~test表示用户test的宿主目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。

/lib,/usr/lib,/usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,该目录下存放了各种编程语言库。典型的linux系统包含了C、C++和FORTRAN语言的库文件。/lib目录下的库映像文件可以用来启动系统并执行一些命令,目录/lib/modules包含了可加载的内核模块,/lib目录存放了所有重要的库文件,其他的库文件则大部分存放在/usr/lib目录下。

/lost+fount: 在EXT2或EXT3文件系统中,当系统意外崩溃或机器意外关机,产生的一些文件碎片放在这里。在系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方法来修复,或者移动文件到运来的位置上

/mnt,/media: mnt目录主要用来临时挂载文件系统,为某些设备提供默认挂载点,如floppy,cdrom。这样当挂载了一个设备如光驱时,就可以通过访问目录/mnt/cdrom下的文件来访问相应的光驱上的文件了。

/opt: 给主机额外安装软件所摆放的目录。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下。

/proc: 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等。

/root:系统管理员root的宿主目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。

/sbin,/usr/sbin,/usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。

/tmp: 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。

/srv: 服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。

/usr: 应用程序存放目录,/usr/bin 存放应用程序, /usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件,/usr/local 存放软件升级包,/usr/share/doc 系统说明文件存放目录。

/usr/share/man:  程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容建议单独分区,设置较大的磁盘空间。

/var: 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log。/var/log/message: 所有的登录文件存放目录。/var/spool/mail: 邮件存放的目录。 /var/run: 程序或服务启动后。建议单独分区,设置较大的磁盘空间。

/tmp:存放临时文件目录,一些命令和应用程序会用的到这个目录。该目录下的所有文件会被定时删除,以避免临时文件占满整个磁盘。

4. 假设我要给 a.sh 加上可执⾏权限,该输⼊什么命令?

chomd +x a.sh, r:4 w:2 x:1

5. 假设我要将 a.sh ⽂件的所有者改成 xiang:xiang,该输⼊什么命令?

chown xiang:xiang a.sh

SLAM 综述文献阅读

增强现实应用
动态场景、语义地图、多机器人协作

ORB-SLAM2复现

参考:

Linux添加环境变量_zhang-jianqiang的博客-CSDN博客_linux 设置环境变量SLAM基础Linux基础操作解答~《视觉SLAM十四讲》_人工智能博士的博客-CSDN博客

你可能感兴趣的:(视觉slam十四讲,计算机视觉,人工智能)