《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM

《视觉SLAM》学习笔记(一)——ch1预备知识,ch2初识SLAM

  • 一、预备知识
    • 1.1 视觉slam的应用
    • 1.2 参考书目
  • 二、SLAM是什么
    • 2.1 传感器类别
      • 2.1.1 相机
    • 2.2 SLAM是什么
      • 2.2.1 视觉slam框架
      • 2.2.2 slam问题的数学描述
  • 三、Linux下的C++基础
    • 3.1 vim的简单实使用
    • 3.2 “hello slam!”
      • 3.2.1 g++运行简单c++文件
      • 3.2.2 cmake编译大中型项目
        • 3.2.2.1 cmake语法特性
        • 3.2.2.2 cmake重要指令
        • 3.2.2.3 cmake编译简单项目
      • 3.2.3 Linux下运行C/C++程序cmake命令
    • 3.3 用cmake编译带库的略复杂项目
    • 3.4 IDE
      • 3.4.1 kdevelop
      • 3.4.2 Clion
        • 3.4.2.1 下载与安装
        • 3.4.2.2 简单使用
      • 3.4.3 JetBrains全家桶小科普


课程视频地址【第二版】:https://www.bilibili.com/video/BV1D54y1G7f6
课程视频链接【第一版】:https://www.bilibili.com/video/BV16t411g7FR
课程github地址:https://github.com/gaoxiang12 【第一版、第二版的代码】
电子书下载见《学习笔记(一)》1.2节

提示】无论使用哪个版本的纸质书,先去github上对照作者给的勘误文件,纠正一下书中的错误。


《视觉SLAM十四讲》学习笔记(二)——ch3 三维空间刚体运动
《视觉SLAM十四讲》学习笔记(三)——ch4 李群与李代数
《视觉SLAM十四讲》学习笔记(四)【敬请期待】
《视觉SLAM十四讲》学习笔记(五)【敬请期待】


Cmake官方文档:https://cmake.org/documentation/【选择自己安装的对应版本】
Eigen深入学习:https://eigen.tuxfamily.org/index.php?title=Main_Page


一、预备知识

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》学习笔记(一)——ch1-2 预备知识,初识SLAM_第1张图片

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,ukwk)
  • 测量方程: 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

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

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在其中的作用》

3.2.2.1 cmake语法特性

  • 基本语法格式:指令(参数1 参数2 …),参数使用括弧括起,参数之间用空格或者分号分开。
  • 指令是大小写无关的,参数和变量大小写相关
  • 变量使用**${}**方式取值,但在 if 控制语句中直接使用变量名。

add_executable( )ADD_EXECUTABLE( )相同。

3.2.2.2 cmake重要指令


【文件】

  • include头文件
  • src源文件(可执行程序 / 所需库的源文件)
  • library库文件
  • CMakeLists.txt经 cmake 编译后生成makefile文件

【指令】

  • cmake_minimum_required(VERSION xx.xx)指定cmake的最低版本
  • project(projectname [CXX/JAVA])定义工程名称,并指定工程支持的语言(可选)
  • set(var [value] cache type docstring[force]])显式定义变量
  • include_directories([after/before] [systemm] dir1 dir2 ...)向工程添加特定头文件搜索路径
  • add_library(libname [shared/static/module] [exclude_from_all] source1 source2 ... )生成库文件
  • add_executable( exename source1 source2 ... )生成工程目标文件(可执行文件)
  • add_compile_options(添加编译参数
  • add_subdirectory()添加存放源文件的子目录
  • find_package()添加依赖,有Module模式(basic signature)和Config模式(full signature),可设置路径、连接路径、库。
  • link_libraiies添加需要链接的库文件路径,绝对路径
  • link_directories( dir1 dir2 ...)添加需要链接的库文件路径
  • target_link_libraiies为target设置要链接的库文件名称
  • aux_source_directory(dir [variable])查找指定目录下的所有源文件,并将列表存储在指定变量中

【变量】

  • CMAKE_C_FLAGS gcc 编译选项
  • CMAKE_CXX_FLAGS g++ 编译选项
  • CMAKE_BUILD——TYPE 编译类型(Debug,Release)
  • CMAKE_BINARY_DIR, PROJECT_BINARY_DIR, _BINARY_DIR ,PROJECT_BINARY_DIR是CMake生成一系列文件的目录,包括MakeFile等文件。如果是in source build ,指的是工程顶层目录;如果是out of source,指的是工程编译所发生的目录。
  • CMAKE_SOURCE_DIR, PROJECT_SOURCE_DIR, _SOURCE_DIR 无论采取何种编译方式,都是工程顶层目录,即顶层的CMakeLists.txt所在的目录。
  • CMAKE_C_COMPILER 指定C编译器
  • CMAKE_CXX_COMPILER 指定C++编译器
  • EXECUTABLE_OUTPUT_PATH 可执行文件输出存放路径
  • LIBRARY_OUTPUT_PATH 库文件输出存放路径

3.2.2.3 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」的讲解,《关于cmake、make、make install》

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

【用build管理生成的中间文件,条理清晰】

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/目录下。

3.3 用cmake编译带库的略复杂项目

mkdir include src     #创建源文件
touch include/Hello.h src/Hello.c     #创建Hello.h头文件
vim include/Hello.h  #编写Hello.h——头文件
vim src/Hello.cpp      #编写函数定义——实现文件
vim main.cpp         #编写main函数——调用库以实现功能
vim CMakeLists.txt   #编写CMakeLists.txt

include/Hello.h文件

#pragma once

void sayHello();

src/Hello.cpp文件

#include "Hello.h" //包含头文件
#include

using namespace std;

void sayHello(){
	cout<<"Hello SLAM!"<<endl;
}

main.cpp文件

#include "Hello.h"

using namespace std;

int main(int argc,char** argv){
	sayHello();
	return 0;
}

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5) //声明要求的 cmake 最低版本,否则会提示error

project(helloSLAM)  // 声明一个 cmake 工程

include_directories("include") //声明头文件在include文件夹下

#only source files
add_library(libHello src/Hello.cpp)  //添加hello库,源码是Hello.cpp,编译后是libHello

add_executable(sayHello main.cpp) //添加可执行程序调用hello库中函数
target_link_libraries(sayHello libHello)  //将库文件链接到可执行程序上

【编写CMakeLists.txt文件的注意事项】
1.声明要求的 cmake 最低版本。如无该声明,cmake ..后会提示:
CMake Warning (dev) in CMakeLists.txt:
No cmake_minimum_required command is present. A line of code such as

cmake_minimum_required(VERSION 3.5)

should be added at the top of the file. The version specified may be lower
if you wish to support older CMake versions for this project. For more
information run “cmake --help-policy CMP0000”.
查看cmake的版本:cmake --version 。我是3.5.1,添上去就好了。

2.库文件链接到可执行文件。如果忘记链接,会提示
CMakeFiles/sayHello.dir/main.cpp.o: In function main': main.cpp:(.text+0x10): undefined reference tosayHello()’
collect2: error: ld returned 1 exit status
CMakeFiles/sayHello.dir/build.make:94: recipe for target ‘sayHello’ failed
make[2]: *** [sayHello] Error 1
CMakeFiles/Makefile2:67: recipe for target ‘CMakeFiles/sayHello.dir/all’ failed
make[1]: *** [CMakeFiles/sayHello.dir/all] Error 2
Makefile:83: recipe for target ‘all’ failed
make: *** [all] Error 2
即该函数只提供了声明,没提供实现。

3.4 IDE

3.4.1 kdevelop

免费,第一版视频以此为例。

  • 安装:sudo apt-get install kdevelop
  • 打开:终端输入 kdevelop

3.4.2 Clion

JetBrains的,学生(edu邮箱)可申请1年教育免费(我激活了Clion和Pycharm,很香哈哈哈,感谢!——见3.4.3节)。
第二版视频以此为例。

3.4.2.1 下载与安装

官网下载地址:https://www.jetbrains.com/clion/download/,可以选择win/Mac/Linux系统。It’s a long time. Let’s have a cup of tea~

  • 安装:sudo snap install clion --classic
  • 打开:终端输入 clion

这是官网推荐的Linux下的安装方式,简直不要太简单,不需要任何压缩包解压编译等等的操作!我安装的版本是Version: 2021.1.1
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第2张图片
填写账户密码就行了。
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第3张图片
铛铛铛铛~有了!
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第4张图片

3.4.2.2 简单使用

打开3.3节的helloSLAM工程。debugger选择GDB方式(Linux),LLDB是Mac的。
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第5张图片打开后界面如下,可以直观看到相关文件。可以断点调试、规范格式、颜色高亮等功能。debug模式。
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第6张图片
点击build——build project,自动build好。
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第7张图片设置debug模式:在CMakeLists.txt文件中添加
set( CMAKE_BUILD_TYPE "Debug" ),方便调试。

3.4.3 JetBrains全家桶小科普

教育优惠 (免费)申请地址:https://www.jetbrains.com/shop/eform/students

  • 小科普:JetBrains全家桶
产品 功能 产品 功能 产品 功能
IntelliJ IDEA Java IDE PhpStorm PHP IDE GoLand go语言 IDE
PyCharm Python IDE Clion C++ IDE WebStorm JavaScript IED
DataGrip 跨平台数据库工具 RubyMine Ruby / Rails IDE Rider .NET IDE
AppCode iOS/OS X IDE

下图截自百度百科(早知道就不自己敲表格了
《视觉SLAM》学习笔记(一)——ch1-2 预备知识,初识SLAM_第8张图片


下个笔记见咯~

《视觉SLAM十四讲》学习笔记(二)——ch3 三维空间刚体运动
《视觉SLAM十四讲》学习笔记(三)——ch4 李群与李代数
《视觉SLAM十四讲》学习笔记(四)【敬请期待】
《视觉SLAM十四讲》学习笔记(五)【敬请期待】


你可能感兴趣的:(SLAM)