当你下定决心开始学习SLAM时,看到《视觉SLAM十四讲》的你是否欣喜若狂?
当你学完理论知识准备在实践章节大显身手时,发现源码完全不会跑的你又是否一脸懵逼?
不要怕!
和李哈哈一起刷夜,我们一起康康每讲的实践部分,到底怎么玩。
写在前面的话
和很多初学SLAM的小伙伴一样,我对SLAM、对Linux,甚至对C++都不清楚😴
看了看SLAM十四讲感觉突然有点感觉的时候,实践部分又完全无从下手😟
针对以上这种情况,我决定将自己完成实践部分作业的过程分享出来😚
希望那些和我一样刚开始学习SLAM的小伙伴,能够与我产生共鸣😝
如果对你能有一丢丢帮助,🏀⚽️观众老爷们点个赞👍👍👍👍👍👍
其他各讲实践索引
你可以从这里直接跳转到其他讲的实践讲解:
视觉SLAM十四讲源码的正确打开方式:第1讲 预备知识
视觉SLAM十四讲源码的正确打开方式:第2讲 初识SLAM
视觉SLAM十四讲源码的正确打开方式:第3讲 三维空间刚体运动
李哈哈视觉SLAM十四讲源码的正确打开方式:第4讲 李群和李代数
实践3.2:Eigen
把从GitHub
上下载的源码打开,把其中的ch3
文件夹拷贝到桌面
如果不知道源码在哪里/怎么下载,可以从索引查看第1讲的内容
我习惯将需要用到的文件拷贝到桌面或桌面的某个文件夹进行测试
本节将讲解如何使用Eigen
表示矩阵和向量,在下一节的实践引申至旋转矩阵与变换矩阵的计算。
本节的代码在ch3/useEigen
中
Eigen
是一个 C++
开源线性代数库。它提供了快速的有关矩阵的线性代数运算,还
包括解方程等功能。许多上层的软件库也使用Eigen
进行矩阵运算,包括 g2o
、Sophus
等。
安装Eigen
安装Eigen
的方法书上写的直接用就没啥问题(我就是这么装的)
终端输入:
sudo apt-get install libeigen3-dev
Eigen
的头文件默认位置为"/usr/include/eigen3"
,可以命令行输入以下指令查看电脑安装的位置:
sudo updatedb
locate eigen3
作者提到,Eigen的特殊支出在于,它是纯用头文件搭建起来的库(一般的库应该有头文件&库文件)
所以,在使用时,只需要引入Eigen的头文件,而不需要链接库文件
编译工程
说到这一步,我就来精神了昂!
从何说起呢?😘
很久很久之前,当我开心地打开ch3
这个文件夹,以为简单的编译运行就能跑了
然而这个文件的结构完全让我不知所措
最关键的是,书上写的用来指导编译这个程序的CMakeList.txt
只有一句话:
include_directories("/usr/include/eigen3")
但是我打开的CMakeList.txt
长这个样子:
cmake_minimum_required(VERSION 2.8)
project(useEigen)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")
# 添加Eigen头文件
include_directories("/usr/include/eigen3")
add_executable(eigenMatrix eigenMatrix.cpp)
更离谱的是,ch3里边有四个实践的文件夹:
刚刚提到的CMakeList.txt
是useEigen
这个文件夹里的,外边居然还有一个CMakeList.txt
!😥
这和我在第2讲看到的工程结构完全不一样啊!
直觉告诉我,作者把一整讲的所有源码都放在了一起,用最外层的CMakeList.txt
统一调度
后来看来确实如此
看到这里的时候,我果断停下滚去学CMake了
学习的成果在这里:(这篇文章我觉得自己写的还是不错的,起码花里胡哨的😏)
CMake自学记录,看完保证你知道CMake怎么玩!!!
非常希望大家粗略的看一下上文,找到里边提到的教程自己做做demo
试试看
毕竟迟早要学的嘛
学成归来,开始编译工作,我的方法是在根目录创建一个build
文件夹,用来存放编译生成的中间文件:(根目录就是打开ch3之后所在的地方)
以useEigen
目录为例,此时该目录文件如下:
在build
目录下打开终端,使用编译指令:
cmake ..
该指令后边的两个.
是指对上一级目录进行cmake
此时build
目录下生成了useEigen
目录,其内容如下:
之后我们仍在build
目录下,使用编译指令:
make
这时build
目录下的useEigen
目录如下:
可以看到生成了可执行文件eigenMatrix
至此运行前的编译准备过程就完成了
简单说一下这两个指令在干嘛
cmake:根据CMakeList.txt
的内容生成编译文件CMakeFiles
make:根据CMakeFiles
以及源文件生成可执行文件
由于我们创建了一个build文件夹,所以编译的中间文件及生成的可执行文件保存在了buil
目录下
这样说可能不是完全正确,因为我对在build
目录下编译的原理还不是很清楚,后续搞懂了回来填坑
应该要再创建一个bin
目录来把可执行文件放进去统一管理,但这里先不考虑这个了,抓住主要矛盾就好啦🚩
运行useEigen
使用./
命令来运行二进制可执行文件,具体运行方法可以输入以下指令:
./useEigen/eigenMatrix
在命令行中输入指令效果如下:
关于代码的讲解可以参照这篇还不存在的文章🚩
实践3.2:Eigen
师傅别念了,已经在写了啦😟
关于本节的代码,我加了一丢丢注释,贴在下边啦:
#include <iostream>
using namespace std; //使用std名称空间
#include <ctime>
// Eigen 核心部分
#include <Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Dense>
using namespace Eigen; //使用Eigen名称空间
#define MATRIX_SIZE 50
/****************************
* 本程序演示了 Eigen 基本类型的使用
****************************/
int main(int argc