SLAM学习笔记 | slambook1

Linux 命令汇总

目录

1 资源链接

2 配置

2.1 基础设置

2.2 C++ & CMake环境配置

2.3 Python & Miniconda环境配置

2.4 包的安装

2.4.1 OpenCV

2.4.2 Eigen

2.4.3 Pangolin 

2.4.4 Sophus

2.4.5 fmt

2.4.6 boost

2.4.7 pcl

3 运行

3.1 高翔slambook

 3.1.1 ch3

useEigen 

 useGeometry

visualizeGeometry 

3.1.2 ch4

useSophus

​编辑​​3.1.3 ch5

imageBasics

joinMap 

3.2 高翔slambook2

1 资源链接

UbuntuVMwareVScode高翔SLAM 14讲slambookslambook2MinicondaOpenCVEigenPangolinSophushttps://github.com/boostorg/boostfmt

2 配置

2.1 基础设置

VMware搭建虚拟机基本上为傻瓜式,我设置内存8GB,硬盘200GB,实际根据自己设置,内存建议给大点。进入系统运行如下命令,创建存放各种资源的文件夹,便于管理:

uname -r    # 查看Linux内核版本 <我的内核版本6.5.0-17-generic>
sudo apt update    # 更新apt
mkdir ~/pkgs    # 在当前用户目录创建pkgs文件夹 <所有的源码都存放在此>

# 选装
sudo apt install tree # 用于查看文件结构
sudo apt install neovim # vim编辑器

进入pkgs文件夹,使用 git 下载14讲配套课件,当然也可以手动下载,然后复制到 pkgs 文件夹

sudo apt install git    # 安装git工具
cd ~/pkgs    # 进入创建好的pkgs文件夹
git clone https://github.com/gaoxiang12/slambook.git # 使用git下载14讲配套课件

 下载完成后 cd slambook 进入文件夹,通过 ls 查看文件目录:

​​

运行和编辑可以通过Linux自带的vim或neovim来完成(如果你牛的话!),建议还是使用VScode。通过第一章的资源链接下载得到 .deb 的文件,默认下载文件存放在用户目录的Downloads文件夹中,进入该文件夹并右击 Open in Terminal ,然后通过如下命令安装:

sudo dpkg -i <Your VScode File Name>.deb    # .deb前为自己的VScode文件名

安装完成后就可以在应用程序中看到VScode,具体VScode如何使用网上有很多教程。 打开VScode安装如下插件:

2.2 C++ & CMake环境配置

首先是安装g++编译器,通过以下命令完成:

sudo apt install build-essential gdb # 安装g++、gcc和gdb

安装完成后通过以下命令检查安装是否成功:

gcc --version && g++ --version && gdb --version

如果能输出gcc、g++和gdb的版本代表安装成功。 接着安装CMake,通过以下命令完成:

sudo apt install cmake # 安装CMake

同样检查CMake是否安装成功:

cmake --version

2.3 Python & Miniconda环境配置

下载Miniconda或Anaconda,笔者这里选择Miniconda,两者的具体区别如下图:

下载后在Downloads文件夹中得到一个.sh的文件,同样在Downloads文件夹右击 Open in Terminal ,通过如下命令安装:

bash <Your Miniconda File Name>.sh -b -u -p ~/miniconda3 # .sh前为自己的Miniconda文件名
~/miniconda3/bin/conda init bash # 初始化

输入conda,如果提示 conda: command not found,这是因为conda没有成功添加到环境当中。手动添加,输入open ~/.bashrc打开配置文件,在最后一行空白处加入 export PATH="/home/<User Name>/miniconda3/bin:$PATH"(这里的<User Name>是你自己的用户名)保存文件关闭终端,再新打开一个终端输入source ~/.bashrc即可

2.4 包的安装

2.4.1 OpenCV

1)首先安装依赖(不安装也可以)

sudo apt update # 更新apt

# 安装依赖
sudo apt-get install libgtk-3-dev libgtk2.0-dev pkg-config

libgtk:GTK是一个Linux平台下基于Xwindows图形窗口的图形用户编程接口工具,可以借助它开开发Linux平台下基于Xwindows的图形用户界面。

2)下载OpenCV(官网很多时候打不开,需要梯子),笔者这里下载4.6.0的版本,点击Sources下载源文件,OpenCV本身也是cmake和c++的工程文件,因此可以使用cmake进行编译。

 也可以使用git直接下载到本地,这样默认下载的最新的版本(目前是4.9.0)

git clone https://github.com/opencv/opencv.git

3)下载完成后,通过 cp opencv-4.6.0.zip ~/pkgs/ 将文件拷贝到pkgs文件夹中(养成良好的文件管理习惯),然后单步执行如下代码安装:

cd ~/pkgs/opencv-4.6.0 # 注意自己的opencv版本
mkdir build && cd build # 创建build文件夹
cmake ..
# make -j   # -j表示多线程编译 需要比较久的时间 笔者使用make
make
sudo make install # 安装opencv

笔者在使用make -j的时候,虚拟机会莫名的卡死,然后重启,使用make就没有这个问题,虽然速度慢了很多,但是不卡死。推测是多线程编译的问题,如果大家有解决方法,欢迎评论区留言。 

2.4.2 Eigen

Eigen是一个高层次的C++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法

1)官网下载Eigen3.4.0,下载后解压(亦可用内置的解压工具,右击压缩文件就能看到):

​​

tar zxvf <FileName>.tar.gz # .tar.gz格式
tar jxvf <FileName>.tar.bz2 # .tar.bz2格式
unzip <FileName>.zip # .zip格式

2)同样将文件解压到pkgs文件夹中,然后单步执行如下代码:

cd ~/pkgs/eigen-3.4.0 # 注意自己的eigen版本
mkdir build && cd build # 创建build文件夹
cmake ..
make
sudo make install # 安装eigen

Tips:eigen只是一个模版类,并没有实际编译成的动态库,进入eigen的安装目录 /usr/local/include/eigen3,然后通过tree命令查看文件结构(tree需要安装)。

2.4.3 Pangolin 

Pangolin是一个用于SLAM可视化的openGL库,目前有很多SLAM系统都用它作为可视化的工具。

1)下载Pangolin,笔者直接使用git下载:

cd ~/pkgs
git clone https://github.com/stevenlovegrove/Pangolin.git

2)git下载完成后,直接是文件夹,单步执行如下命令安装:

pangolin安装参考

cd ~/pkgs/Pangolin
./scripts/install_prerequisites.sh recommended # 安装依赖
cmake -B build
cmake --build build
cd build
sudo make install  # 安装pangolin到/usr/local/include

Tips:通过ls /usr/local/include来查看pangolin是否安装到位:

2.4.4 Sophus

Sophus库是基于Eigen基础上开发的,继承了Eigen库中的定义的各个类。但Eigen并没有提供李代数的支持,因而需要Sophus。

1)下载sophus,笔者直接使用git下载:

cd ~/pkgs
git clone https://github.com/strasdat/Sophus.git

2)git下载完成后,直接是文件夹,单步执行如下命令安装: 

cd ~/pkgs/Sophus
mkdir build && cd build
cmake ..
make
sudo make install

2.4.5 fmt

fmt 库是一个开源的C++格式化库,它提供了一种简洁、安全和高效的方法来进行字符串格式化。

1)下载fmt,笔者直接使用git下载:

cd ~/pkgs
git clone https://github.com/fmtlib/fmt.git

2)git下载完成后,直接是文件夹,单步执行如下命令安装: 

cd ~/pkgs/fmt
mkdir build && cd build
cmake ..
make
sudo make install
sudo ldconfig  # 更新动态链接库

2.4.6 boost

1)下载boost,笔者直接使用git下载:

cd ~/pkgs
git clone https://github.com/boostorg/boost.git

 2)git下载完成后,直接是文件夹,执行如下命令:

cd ~/pkgs/boost
./bootstrap.sh

报错:

​​

进入boost文件夹,通过 tree 命令发现压根没有 src 这个文件夹,git下载的boost代码只有914KB,而Release的 boost-1.84.0.tar.gz 有118MB。

解决方法参考1

解决方法参考2

经过笔者多次尝试,使用源码安装boost会有很多依赖上的问题,所以笔者这里选择直接用 apt 安装:

sudo apt-get install libboost-dev

使用 apt 安装,头文件位于 /usr/local 路径下:

​​ 

2.4.7 pcl

sudo apt-get installl libpcl-dev

3 运行

3.1 高翔slambook

 3.1.1 ch3

useEigen 

需要安装的库:Eigen

Eigen库的安装参考2.4.2小节

进入eigenMatrix.cpp发现如下错误

​​

 1)这表明vscode并没有定位到Eigen库,同样右击Go to Definition显示No definition found for 'Core',此时我们打开.vscode文件夹下的c_cpp_properties.json:

​​

2)在includePath加入如下代码(其作用是告诉vscode去该目录下寻找Eigen库):

​​

"includePath": ["${workspaceFolder}/**",
                "/usr/local/include/eigen3"],

3)此时我们回到eigenMatrix.cpp,发现错误消失,点击Go to Definition也可以跳转至Core:

​​

4)在vscode终端(Ctrl+Shift+`)输入如下命令运行该文件: 

cd ~/pkgs/slambook/ch3/useEigne/
mkdir build && cd build
cmake ..
make

cmake .. 正常通过,但当执行make时出现如下错误:

​​

明明我们已经安装,却没有找到Eigen库。

5)进入CMakeLists.txt中,发现include_directories后面调用的Eigen库的地址有问题:

​​

参考2.4.2节中Eigen安装的地址,将代码修改为:

include_directories("/usr/local/include/eigen3")

 6)再次执行步骤 4),编译通过:

​​

7)通过 ./eigenMatrix 运行即可:

​​


 useGeometry

需要安装的库:Eigen

Eigen库的安装参考2.4.2小节

 1)同样修改CMakeLists.txt中Eigen库的调用地址

include_directories("/usr/local/include/eigen3")

2) 在vscode终端(Ctrl+Shift+`)输入如下命令运行该文件: 

cd ~/pkgs/slambook/ch3/useGeometry/
mkdir build && cd build
cmake ..
make

3) 通过 ./eigenGeometry  运行即可:

​​


visualizeGeometry 

需要安装的库:Eigen、Pangolin

Eigen库的安装参考2.4.2小节

Pangolin库的安装参考2.4.3小节

 1)同上将pangolin库的路径告诉vscode,打开.vscode文件夹下的c_cpp_properties.json补充:

"includePath": ["${workspaceFolder}/**",
                "/usr/local/include/eigen3",
                "/usr/local/include/pangolin"],

2)将 include_directories("/usr/include/eigen3") 修改为:

include_directories("/usr/local/include/eigen3")

进入visualizeGeometry.cpp,发现在第93存在错误:

​​

不过好像不影响编译。

3)在vscode终端(Ctrl+Shift+`)输入如下命令运行该文件: 

cd ~/pkgs/slambook/ch3/visualizeGeometry/
mkdir build && cd build
cmake ..
make

cmake .. 编译通过,make出现如下大量错误(只截取一部分):

​​

这是由于C++版本的问题导致 。

4)修改CMakeList.txt中的set(CMAKE_CXX_FLAGS "-std=c++11")为:

set(CMAKE_CXX_FLAGS "-std=c++14")

5)再次执行步骤 3),编译通过:

​​

 6)通过 ./visualizeGeometry  运行发现错误:

​​

这是由于动态链接库未更新导致无法找到依赖库导致的。 

7)终端执行如下命令再次编译即可:

sudo ldconfig  # 更新动态链接库

解决方法参考此处

ldconfig命令是一个在Linux系统上执行的实用程序,用于配置共享库的运行时链接。当在Linux上安装新的共享库文件时,或者在已安装的共享库文件的位置发生变化时,ldconfig命令可以更新系统中的共享库缓存,以使动态连接器能够正确找到和加载共享库。

8)再次执行 ./visualizeGeometry 运行成功:

​​

3.1.2 ch4

useSophus

需要安装的库:Eigen、Sophus

Eigen库的安装参考2.4.2小节

Sophus库的安装参考2.4.4小节

1) 同上将Sophus库的路径告诉vscode,打开.vscode文件夹下的c_cpp_properties.json补充:

"includePath": ["${workspaceFolder}/**",
                 "/usr/local/include/eigen3",
                 "/usr/local/include/pangolin",
                 "/usr/local/include/sophus"],

保存后进入 useSophus.cpp 发现库引用依旧报错:

​​通过 ls /usr/local/include/sophus 查看发现,Sophus库中没有so3.h和se3.h的文件,但有so3.hpp和se3.hpp文件:

​​

2)修改库引用代码:

#include "sophus/so3.hpp"
#include "sophus/se3.hpp"

hpp是一种C++的头文件,用于保存C++代码的函数和变量声明。

3)在vscode终端(Ctrl+Shift+`)输入如下命令运行该文件: 

cd ~/pkgs/slambook/ch4/useSophus/
mkdir build && cd build
cmake ..
make

cmake .. 编译通过,make报错:

​​

其原因是没有fmt,安装即可。

fmt库的安装参考2.4.5小节

4)再次运行make依旧报大量错误, 在CMakeList.txt中加入:

set(CMAKE_CXX_FLAGS "-std=c++14")
include_directories( "/usr/local/include/eigen3" )

修改保存后运行发现已经不出现库和C++版本的问题 ,观察终端返回的错误,发现错误来自 SO3、SE3。通过查看Sophus库的源码,笔者发现在代码中并没有SO3,但是有SO3d(等价于SO3<double>),SE3同样:

​​

5)修改源代码

解决方法参考此处

#include <iostream>
#include <cmath>
using namespace std; 
 
#include <Eigen/Core>
#include <Eigen/Geometry>
 
#include "sophus/so3.hpp"
#include "sophus/se3.hpp"
 
int main( int argc, char** argv )
{
    // 沿Z轴转90度的旋转矩阵
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();
    
    Sophus::SO3<double> SO3_R(R);               // Sophus::SO(3)可以直接从旋转矩阵构造
//  Sophus::SO3 SO3_v( 0, 0, M_PI/2 );  // 亦可从旋转向量构造 
    Eigen::Quaterniond q(R);            // 或者四元数
    Sophus::SO3<double> SO3_q( q );
    // 上述表达方式都是等价的
    // 输出SO(3)时,以so(3)形式输出
    cout<<"SO(3) from matrix: "<<SO3_R.log()<<endl;
//  cout<<"SO(3) from vector: "<<SO3_v<<endl;
    cout<<"SO(3) from quaternion :"<<SO3_q.log()<<endl;
    
    // 使用对数映射获得它的李代数
    Eigen::Vector3d so3 = SO3_R.log();
    cout<<"so3 = "<<so3.transpose()<<endl;
    // hat 为向量到反对称矩阵
    cout<<"so3 hat=\n"<<Sophus::SO3<double>::hat(so3)<<endl;
    // 相对的,vee为反对称到向量
    cout<<"so3 hat vee= "<<Sophus::SO3<double>::vee( Sophus::SO3<double>::hat(so3) ).transpose()<<endl; // transpose纯粹是为了输出美观一些
    
    // 增量扰动模型的更新
    Eigen::Vector3d update_so3(1e-4, 0, 0); //假设更新量为这么多
    Sophus::SO3<double> SO3_updated = Sophus::SO3<double>::exp(update_so3)*SO3_R;
    cout<<"SO3 updated = "<<SO3_updated.log()<<endl;
    
    /********************萌萌的分割线*****************************/
    cout<<"************我是分割线*************"<<endl;
    // 对SE(3)操作大同小异
    Eigen::Vector3d t(1,0,0);           // 沿X轴平移1
    Sophus::SE3<double> SE3_Rt(R, t);           // 从R,t构造SE(3)
    Sophus::SE3<double> SE3_qt(q,t);            // 从q,t构造SE(3)
    cout<<"SE3 from R,t= "<<endl<<SE3_Rt.log()<<endl;
    cout<<"SE3 from q,t= "<<endl<<SE3_qt.log()<<endl;
    // 李代数se(3) 是一个六维向量,方便起见先typedef一下
    typedef Eigen::Matrix<double,6,1> Vector6d;
    Vector6d se3 = SE3_Rt.log();
    cout<<"se3 = "<<se3.transpose()<<endl;
    // 观察输出,会发现在Sophus中,se(3)的平移在前,旋转在后.
    // 同样的,有hat和vee两个算符
    cout<<"se3 hat = "<<endl<<Sophus::SE3<double>::hat(se3)<<endl;
    cout<<"se3 hat vee = "<<Sophus::SE3<double>::vee( Sophus::SE3<double>::hat(se3) ).transpose()<<endl;
    
    // 最后,演示一下更新
    Vector6d update_se3; //更新量
    update_se3.setZero();
    update_se3(0,0) = 1e-4d;
    Sophus::SE3<double> SE3_updated = Sophus::SE3<double>::exp(update_se3)*SE3_Rt;
    cout<<"SE3 updated = "<<endl<<SE3_updated.matrix()<<endl;
    
    return 0;
}

再次执行步骤3)发现还是有错误,提示:

​​

6)打开CMakeList.txt,添加 include_directories("/usr/local/include/fmt") 以及在 target_link_libraries( useSophus ${Sophus_LIBRARIES} ) 最后加入fmt即可,CMakeList.txt完整代码如下:

cmake_minimum_required( VERSION 2.8 )
project( useSophus )
set(CMAKE_CXX_FLAGS "-std=c++14")  # 添加该句
include_directories("/usr/local/include/eigen3")  # 添加该句
include_directories("/usr/local/include/fmt")  # 添加该句
# 为使用 sophus,您需要使用find_package命令找到它
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
add_executable( useSophus useSophus.cpp )
target_link_libraries( useSophus ${Sophus_LIBRARIES} fmt)  # 最后加入fmt

7)执行步骤3)编译成功,通过 ./useSophus 运行:

​​3.1.3 ch5

imageBasics

需要安装的库:OpenCV

OpenCV库的安装参考2.4.1小节

1)将OpenCV库的路径告诉vscode,打开.vscode文件夹下的c_cpp_properties.json补充:

"includePath": ["${workspaceFolder}/**",
                 "/usr/local/include/eigen3",
                 "/usr/local/include/pangolin",
                 "/usr/local/include/sophus"
                 "/usr/local/include/opencv4"],

2)由于笔者安装OpenCV的版本为4.6.0,因而需要修改CMakeList.txt中的 find_package(OpenCV 3 REQUIRED) 为:

find_package(OpenCV 4 REQUIRED)

如果对OpenCV的版本有更为细致的要求 find_package(OpenCV 4.6.0 REQUIRED) 亦可

 3)在vscode终端(Ctrl+Shift+`)输入如下命令运行该文件: 

cd ~/pkgs/slambook/ch5/imageBasics/
mkdir build && cd build
cmake ..
make

4)编译完成后,输入如下命令运行:

./imageBasics ../ubuntu.png

​​


joinMap 

需要安装的库:Eigen、OpenCV、boost、pcl

Eigen库的安装参考2.4.2小节

OpenCV库的安装参考2.4.1小节

boost安装: sudo apt-get install libboost-dev 

pcl安装: sudo apt-get installl libpcl-dev 

1)进入joinMap文件夹,单步执行如下命令编译:

cd ~/pkgs/slambook/ch5/joinMap
mkdir build && cd build
cmake ..
make

 cmake .. 成功,make错误:(

笔者在尝试了很多方法,虽然最后make成功了,也生产了点云图,但是使用pcl_viewer查看点云图的时候,无论如何都是黑屏,就像这样

尝试源码重装了vtk(虚拟机make -j4执行了近1个小时),重装pcl-tools 以及修改代码实时显示等方法,都没有办法显示点云图,查了一圈资料也没有遇到类似的问题(笔者认为代码是没有问题的,毕竟最后成功的生成了点云,问题应该是出在vtk和pcl上)。在写下这段话的时候,笔者已经快弄了3个小时了:( 无奈只能放弃(附上一张打开的网页......)。

vtk安装参考pcl_viewer黑屏1pcl_viewer黑屏2

高翔的slambook,是2016年的课件,github上最后一次更新也在2022年了,所以接下来的章节,笔者准备使用slambook2~


3.2 高翔slambook2

SLAM学习笔记 | slambook2

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值