- 最近发现了一个宝藏up主(全日制学生混),对初学者相当友好(讲解cmke、linux更加细致)。故花费数天再学ch1-ch5,并跑通了前5节的所有demo。
- 学生混引申了SLAM领域要学的其他方面的知识,个人认为,知道自己努力的方向是一件可喜又可叹的事情(仰天叹息兮,学海无涯,“屎山”重重)。正可谓君子终日乾乾,夕惕若厉,始能无咎。往山之巅,任重而道远。
视觉SLAM学习打卡【5-2】-全日制学生混版
一、linux文件系统
- / - 根目录
- /bin - 用户基础二进制文件( eg:cd、ls、chomd等 )
- /boot - 静态启动文件
- /dev - 设备文件(磁盘block、总线bus等)
- /etc - 配置文件(.config文件为主)
- /home - 主目录(用户)
- /lib - 存放着系统最基本的动态链接共享库
- /mnt - 用户临时挂载别的文件系统
- /opt - 自行安装的非常规软件所在目录(eg:ros)
- /root - linux系统超级管理员
- /tmp - 临时文件,重启清理
- /usr - 存储用户文件(eg:各种库)
二、ROS文件系统
WorkSpace --- 自定义的工作空间
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存储python文件
|-- src 存储C++源文件
|-- include 头文件
|-- msg 消息通信格式文件
|-- srv 服务通信格式文件
|-- action 动作格式文件
|-- launch 可一次性运行多个节点
|-- config 配置信息
|-- CMakeLists.txt: 编译的基本配置
三、linux基本命令
- ~ : 代表用户所在的文件夹 /home/user name
- pwd : 显示当前所在路径
- ls : 查看当前文件夹下目录
- cd : 转到目标文件夹
- 一个点 :代表当前路径
- 两个点 :代表上一级目录
- cd . : 路径不变,仍在当前路径
- cd+两点 : 返回上一级
- mkdir : 在当前目录下创建文件夹
- mkdir -p haha/xixi : 创建连级(-p)文件夹(haha、xixi均为文件夹,xixi在haha下)
- mkdir haha xixi wuwu : 在当前目录下创建同级文件夹
- touch hello.txt : 创建hello.txt文件
- rm -rf haha : 删除haha文件夹
- rm -r hello.txt:删除hello.txt文件
- sudo dpkg -i code_1.74.0-1670260027_amd64.deb : 安装 (dpkg -i) VScode (code_1.74.0-1670260027_amd64.deb为从官网下载的.deb安装包)
- man+指令 :查看某个指令的描述(man为manual手册的缩写)
- sudo apt update : 更新软件源
- sudo apt install git : 安装git工具克隆代码(apt install可以安装一些库)
- git clone URL : 从github克隆源码
- git clone --recursive URL : 若GitHub文件中有引用@,则可以通过recursive递归下载(例如slambook2中的3rdparty)
- g++是C++程序的编译器,gcc是C程序的编译器
- ./ + 可执行文件 : 执行.java/.panthon/.cpp文件
- ll : 查看文件读(r)、写(w)、执行(x) 权限.
chmod -x a.out : 把可执行文件a.out改为不可执行
chmod +x a.out : 把不可执行文件a.out权限改为可执行
其中,绿色代表可执行文件.
四、换镜像源
一般unbantu默认软件安装源为mirrors .unbantu.com,网速较慢。可以更改为国内镜像源。
1.点击图标Software&Updates
2.点击download from 下拉
3.选择 others
4.选择china下的镜像源
五、Linux中常用工具
1. htop
sudo apt install htop
类似于Windows的任务管理器,可以看到每个程序对CPU的占有值,并可以杀死某个程序.(引申:可以根据cpu占有情况优化自己的算法)
2. vim
sudo apt install vim
- vim为linux下的一种文本编辑工具.(在当前终端界面打开)
1.进入hello.txt编辑模式
vim hello.txt
2.输入i,进入INSERT插入模式
3.编辑内容
4.退出:先按Esc,退出INSERT模式;再按冒号(:),到达文件底部;最后输入wq(保存并退出)
- linux自带文本编辑器gedit,可以打开文件(弹出编辑框)
gedit hello.txt
3.terminator
sudo apt install terminator
通过分栏,可以在一个终端页面下同时运行多个进程(例如ros中控制小乌龟运动的程序)
- 左右分屏 :ctrl+shift+e
- 上下分屏:ctrl+shift+o(当然,也可以直接通过鼠标右键分屏)
- 选择终端框写程序:Alt+方向键
- 同时操作多个终端:Alt+A
- 放大某个命令框或者返回之前布局:ctrl+shift+x
4.VScode
选择源码文件夹进入,右键选择在当前页面打开终端.
code . //.代表当前路径
六、ros一键安装
致敬鱼香ros的发明者,为ros初学者带来了极大的帮助.
wget http://fishros.com/install -O fishros && . fishros
七、终端编译运行程序
1.单个cpp文件没有链接库
- 编译:直接g++
g++ helloSlam
- 运行:回车后生成 a.out 变绿色的可执行文件
./a.out
- 若想生成自定义名称的可执行文件,需加入-o
g++ helloSlam -o new_name
2.单个cpp文件有链接库
- 编译:格式 [ g++ 可执行文件 库文件 ]
g++ useHello.cpp libHelloSlam.cpp
3.源文件过多,引入cmake(依托于CMakeLists.txt文件)
- 若没有安装ros,先安装cmake
sudo apt install cmake
- 编译:cmake . 后,生成CMakeFiles等中间文件,然后再make。编译正儿八经是在第二步的make操作.
cmake .
make
- 由于cmake生成的中间文件影响源代码文件的观看直观性(即文件夹里一下子看上去乱七八糟),引入build文件夹.
mkdir build/
cd build/
cmake .. //生成的中间文件都在build中
make
./helloSlam
八、VScode之includePath配置
在程序中,会出现有头文件却找不见的情况,这时,就需要配置include路径.
1.使用自动修复功能
2.没有自动修复,手动添加
- CTRL+Shift+p,点击Edit Configurations(JSON)命令,手动添加
- 查找相关头文件,用到命令locate,先安装:
sudo apt install mlocate
安装好后,开始查找
locate core
locate core | grep Eigen //grep筛选和Eigen相关的
注:若是刚安装的库,由于日志数据未更新,可能locate不到,这时需要更新数据库Datebase:
sudo updatedb
- 加入JSON文件
- 通配符** ,即包含/usr/include/下所有库的头文件
/usr/include/**
- cpp文件中为 #include <Eigen/Core>
c_cpp_properties.json中为 “ /usr/include/eigen3 ”
Core文件实际路径为 /usr/include/eigen3/Eigen/Core
# 若把c_cpp_properties.json改为
/usr/include/eigen3/Eigen
# .cpp文件可直接写为
#include <Core>
九、CMakeLists如何添加xxx库
十、cmake进阶
1.target_link_libraries(target item)中item都可以是什么
- 库文件
# 共享库
add_library(hello_shared SHARED libHelloSLAM.cpp)
# 将库文件链接到可执行程序上
target_link_libraries(useHello hello_shared)
- 路径URL
find_package( Pangolin )
include_directories( ${
Pangolin_INCLUDE_DIRS} )
target_link_libraries( visualizeGeometry ${
Pangolin_LIBRARIES} )
- 库的target(命名空间格式)
ctrl+f 查找 ::
find_package(Sophus REQUIRED)
target_link_libraries(useSophus Sophus::Sophus)
# 若想查找具体的xxx::xxx(Sophus::Sophus),直接进入xxTargets.cmke文件查找
使用Sophus::Sophus,不用再写头文件目录include_directories(${Pangolin_INCLUDE_DIRS}) 和链接库路径target_link_libraries(visualizeGeometry ${Pangolin_LIBRARIES})
2.option
CMake中的option用于控制编译流程,相当于C语言中的条件编译.
options基本格式如下:
option(<variable> "<help_text>" [value])
- variable:定义选项名称
- help_text:说明选项的含义
- value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF
# option可以和if一块使用
option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF)
if(USE_UBUNTU_20)
message("You are using Ubuntu 20.04, fmt::fmt will be linked")
find_package(fmt REQUIRED)
set(FMT_LIBRARIES fmt::fmt)
endif()
在执行cmake时,可以使用-D+选项名称,修改选项的值,如下:
cmake .. -DUSE_UBUNTU_20=ON
3.add_subdirectory
命令格式如下:
add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
- source_dir :必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件。子目录可以是相对路径也可以是绝对路径。
- binary_dir:可选参数。该参数指定一个目录,用于存放输出文件。如果该参数没有指定,则默认的输出目录使用source_dir。
- [EXCLUDE_FROM_ALL]:可选参数。当指定了该参数,父目录的CMakeLists.txt不会构建子目录的目标文件,必须在子目录下显式去构建。
例外情况:当父目录的目标依赖于子目录的目标,则子目录的目标仍然会被构建出来以满足依赖关系。
4.message
一般命令格式为:
message([<mode>] "message text" ...)
mode如下:
- FATAL_ERROR:cmake出现错误,停止处理并生成。
- SEND_ERROR:出错,继续处理,但跳过生成。
- WARNING:发出警告,继续处理。
- STATUS:输出项目用户可能感兴趣的主要消息。
#CMakeLists.txt中
set(hello "123")
message(STATUS "hello=" ${
hello})
//camke ..后,输出hello=123