《视觉SLAM》学习笔记(一)

《视觉SLAM》学习笔记(一)

视频地址:https://www.bilibili.com/video/BV1Dz4y1S7gn?t=749
github地址:https://github.com/gaoxiang12
【第一版、第二版的代码】


第二节 《视觉SLAM》学习笔记(二)

第三节 《视觉SLAM》学习笔记(三)【敬请期待】
第四节 《视觉SLAM》学习笔记(四)【敬请期待】


一、预备知识

1.1 视觉slam的应用

  • 手持设备定位
  • 自动驾驶定位
  • AR(增强现实)

1.2 参考书目

  • 《视觉SLAM十四讲》
  • 《Multiple View Geometry in computer vision》
  • 《STATE ESTIMATION FOR ROBOTICS》

三本电子书链接: https://pan.baidu.com/s/1JDbQxbHHse5MXHqvrDrZ7w 提取码: tuid

二、SLAM是什么

自主定位两大基本问题:

  • 定位:对自身的了解
  • 建图:对环境的了解

准确定位组要精确地图,精确地图来自准确定位

2.1 传感器类别

传感器是机器人感知外界的手段

  • 内质:感受机器人本体信息——IMU、激光、相机等——*部署
  • 外质:安装于环境中——二维码Marker、GPS、导轨等——GPS需要接收卫星信号;Marker、导轨需要在环境安装使用
2.1.1 相机

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

分类:

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

特点:

  • 以二维投影形式记录三维世界;缺失距离维度
  • 相机运动时,可以通过视差确定深度

2.2 SLAM是什么

2.2.1 视觉slam框架
  • 前端:visual odometry
  • 后端:optimization
  • 回环:loop closing
  • 建图:mapping

《视觉SLAM》学习笔记(一)

2.2.2 slam问题的数学描述
  • 运动: x k + 1 = f ( x k , u k ) + v k x_{k+1}=f(x_k,u_k)+v_k xk+1​=f(xk​,uk​)+vk​
  • 测量: z k , j = g ( x k , y k ) + v k , j z_{k,j}=g(x_k,y_k)+v_{k,j} zk,j​=g(xk​,yk​)+vk,j​

状态估计问题:

  • 运动方程: x k + 1 = f ( x k , u k , w k ) x_{k+1}=f(x_k,u_k,w_k) xk+1​=f(xk​,uk​,wk​)
  • 测量方程: z k , j = h ( x k , y k , v k , j ) z_{k,j}=h(x_k,y_k,v_{k,j}) zk,j​=h(xk​,yk​,vk,j​)

三、Linux下的C++基础

编辑器:gcc -v , g++ -v , clang , cmake

3.1 vim的简单实使用

【非课程内容,补充】
vim有命令模式插入模式退出模式三种。简单命令

命令 作用 命令 作用
vim file_name 浏览模式 文件存在时打开文件 文件不存在时创建文件
插入模式 插入模式 插入模式 插入模式
i 在光标所在位置插入字符 I 光标所在行的行首插入字符
o 光标所在行的下一行新行插入字符 O 光标所在行的上以行新行插入
s 删除光标所在字符并插入字符 S 删除光标所在行并插入字符
a 光标所在字符的下一个字符插入 A 光标所在行的行尾插入字符
退出模式 退出模式 退出模式 退出模式
:w 保存但不退出 :q 退出
:wq 保存并退出 :q! 强制退出,不保存
:e! 放弃所有修改,从上次保存文件开始再编辑命令历史 ESC 切换模式

命令模式下不能编辑文本,通过i进入插入模式进行编辑,编辑完成后通过ESC键进入命令模式。

3.2 “hello slam!”

最简单的C++程序

#include<iostream>

using namespace std;

int main(int argc,char** argv){
	cout<<"hello slam!"<<endl;
	return 0;
}
3.2.1 g++运行简单c++文件
 touch main.cpp
 vim main.cpp #写入上方代码
 cat main.cpp #显示整个文件

#include<iostream>

using namespace std;
int main(int argc,char** argv){
cout<<"hello slam!"<<endl;
return 0;
}

 g++ main.cpp #并不会在终端显示,会生成一个a.out文件
 ./a.out  #运行该文件
hello slam!#终端输出结果
3.2.2 cmake编译大中型项目

注:没有安装cmake需要先安装

touch CMakeLists.txt #新建CMakeLists.txt文档
vim CMakeLists.txt #写CMakeLists.txt文档

project(helloSLAM)
add_executable(sayhello main.cpp)
#写CMakeLists.txt文档,保存退出

cmake .  #编译CMakeLists.txt,编译完成产生CMakeCache.txt、CMakeFiles、cmake_install.cmake、Makefile中间文件
make  #从Makefile中读取相应指令,编译。产生“sayhello”文件【在CMakeFiles定义】
./sayhello  #运行文件
hello slam! #运行结果

3.2.3 Linux下运行C/C++程序cmake命令

【非课程内容,补充】
感谢大佬「Silent_Summer」,原文链接:https://blog.csdn.net/cxsydjn/article/details/79548984

mkdir build #新建build文件夹
cd build    #进入build文件夹
cmake ..    #通过编写cmakelist文件,自动生成Makefile
make        #批处理.c或.cpp文件,从Makefile中读取相应指令后编译。
make install#将 make 生成的文件安装到系统的对应目录中。

Pipeline

源文件 --> cmakelist --> cmake --> makefile --> make --> 可执行文件

编写程序的主要步骤:

Edit: 使用编辑器编写源代码,如.c,.cc,.cpp等文件。
Compile: 使用编译器编译源代码生成目标文件,如.o,.a(Linux下静态库),.so(Linux下共享库)等文件。
Link: 使用连接器链接目标代码生成可执行文件,如.exe(Window),.out(Unix)等文件。 

一般来说,库的头文件在 /usr/local/include/dependency_name/ 目录下,库文件则存在 /usr/local/lib/目录下。


下个笔记见咯~

第二节 《视觉SLAM》学习笔记(二)

第三节 《视觉SLAM》学习笔记(三)【敬请期待】
第四节 《视觉SLAM》学习笔记(四)【敬请期待】


上一篇:ICRA2021 SLAM方向论文汇总


下一篇:Ubuntu18.04安装DS-SLAM caffe-segnet-cudnn7出现的问题