《视觉SLAM》学习笔记(一)
视频地址:https://www.bilibili.com/video/BV1Dz4y1S7gn?t=749
github地址:https://github.com/gaoxiang12
【第一版、第二版的代码】
第三节 《视觉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
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》学习笔记(四)【敬请期待】
…