Linux 命令汇总
目录
1 资源链接
Ubuntu、VMware、VScode、高翔SLAM 14讲、slambook、slambook2、Miniconda、OpenCV、Eigen、Pangolin、Sophus、https://github.com/boostorg/boost、fmt
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下载完成后,直接是文件夹,单步执行如下命令安装:
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。
经过笔者多次尝试,使用源码安装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个小时了:( 无奈只能放弃(附上一张打开的网页......)。
高翔的slambook,是2016年的课件,github上最后一次更新也在2022年了,所以接下来的章节,笔者准备使用slambook2~