ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-18 21:29:53  阅读:194  来源: 互联网

标签:文件 cmake 笔记 相机 插入 SLAM 视觉 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

在这里插入图片描述

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》学习笔记(四)【敬请期待】


标签:文件,cmake,笔记,相机,插入,SLAM,视觉,slam
来源: https://blog.csdn.net/way7486chundan/article/details/116990001

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有