学习笔记2022.08.08-08.13
一、vscode配置
这一周花了很长时间去考驾照(结果还没过 哭哭),主要跑了slambook2第四、第五章的代码,熟悉代码结构和相关库在linux中的应用。得到的很重要的一点就是在linux环境下vscode最好只用来写cpp、Cmakelists.txt之类的文件,虽然c_cpp_properties.json、tasks.json配置依赖库的路径不算困难, tasks.json: 引出tasks.json可以点击左上方终端然后点击配置默认生成任务。主要修改args部分,添加“l","库文件路径“。 c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include",
//"/home/jane/project/Sophus",
"/usr/local/include/pangolin",
"/usr/local/include/pangolin/gl"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}
引出c_cpp_properties.json可以Ctrl+Shift+P可以调出控制窗口再输入edit或者configuration,选择"C/Cpp:Edit Configurations。"依赖的库主要安装在/usr/local/include的目录下,在c_cpp_properties修改include path部分。
二、Cmakelists.txt语法
主要涉及的是配置第三方库,先找到包所在的位置,用find_pakages找到包,再include_directories(${xxx})添加头文件目录,add_excutable(可执行文件名称 源文件名称),将库链接到可执行文件:target_link_libraries(可执行文件名称 ${库})
project(rgbd)
cmake_minimum_required(VERSION 3.10)
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS})
add_executable(joinMap joinMap.cpp)
target_link_libraries(joinMap ${Pangolin_LIBRARIES} )
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(joinMap ${OpenCV_LIBS})
include_directories("/usr/local/include/eigen3")
target_link_libraries(joinMap ${Sophus_LIBRARIES} fmt)
set(CMAKE_CXX_FLAGS "-std=c++11")
链接: link
三、用命令行编译
1、在项目文件夹下新建一个build文件夹用于存放编译文件
jane@jane-virtual-machine:~/桌面/slambook2/ch5$ mkdir build
2、进入build文件夹
jane@jane-virtual-machine:~/桌面/slambook2/ch5$ cd build
3、用Cmake生成makefile文件
jane@jane-virtual-machine:~/桌面/slambook2/ch5$ cmake ..
注意是cmake 两个点表示在build的上一级目录根据Cmakelists.txt操作,生成的文件会放在build文件夹中(提供MakeFile文件)。
4、生成可执行文件
root@jane-virtual-machine:/home/jane/桌面/slambook2/ch5/build# make
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jane/桌面/slambook2/ch5/build
[ 50%] Linking CXX executable joinMap
[100%] Built target joinMap
使用make命令根据MakeFile的内容生成可执行文件,如果在build文件下进行make,生成的可执行文件也会在build文件夹中。
5、运行可执行文件
root@jane-virtual-machine:/home/jane/桌面/slambook2/ch5/build# ./joinMap
转换图像中: 1
转换图像中: 2
转换图像中: 3
转换图像中: 4
转换图像中: 5
点云共有0个点.
Point cloud is empty!
root@jane-virtual-machine:/home/jane/桌面/slambook2/ch5/build# cd ..
root@jane-virtual-machine:/home/jane/桌面/slambook2/ch5# ./joinMap
bash: ./joinMap: 没有那个文件或目录
如果直接在build文件夹下运行./joinMap文件,会发现运行结果不对,应当将执行文件复制到根目录下进行运行。
root@jane-virtual-machine:/home/jane/桌面/slambook2/ch5# ./joinMap
转换图像中: 1
转换图像中: 2
转换图像中: 3
转换图像中: 4
转换图像中: 5
点云共有1081843个点.
二、slam依赖库的安装
主要涉及到的库有Eigen3、sophus(fmt)、opencv、pangolin,最好将下载的源码文件放在一个专门的文件夹下,便于管理,安装之后可以在/usr/local/include中找到已安装的库。此外,安装opencv和pangolin都需要安装依赖. opencv:安装依赖
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
先从官网下载opencv源码,然后安装依赖,然后解压新建build文件,进行编译 pangolin做法类似,也要先安装依赖,但是slambook2中使用的pangolin是0.5版本的,若要下载0.5版本,可以使用命令:
git clone --recursive https://github.com/stvenlovegrove/Pangolin.git -b v0.5
recursive表示下载子模块,比较慢。可以在终端输入
git clone git@github.com:dmlc/dgl.git
配置SSHKey,参考链接: 链接: SSHKey
二、在visual studio配置opencv
首先还是在官网上下载相应的版本(.exe结尾的文件),安装(包括相关依赖包),记住安装位置。在visual studio配置主要修改: 1、项目属性界面–C/VC+±-包含目录(opencv的include文件夹的绝对路径)以及库目录(编译后lib的绝对路径) 2、C/C±-常规–附加包含目录(opencv的include文件夹的绝对路径,编译后lib的绝对路径) 3、链接器–常规–附加库目录(编译后lib的绝对路径) 4、链接器–输入–附加依赖项名称 5、最后还要在编译后的bin文件夹中找到对应的动态链接库(.dll结尾)复制到项目文件夹中。
三、代码中的类和变量
1、头文件“chrono”
chrono是一个头文件的名字,但是也是一个std下的一个子命名空间的名字:在这个头文件下的所有元素(除了(不包含)common_type 类 特殊化)不是直接定义在std命名空间下的(就像大多数标准库一样)而是定义在std::chrono命名空间里。 在这个头文件下的元素都是处理时间的。这主要依靠三种概念解决。
持续时间类 Durations
他们测量时间范围,例如:1分钟,或10毫秒。
在这个库中,他们表示成这个duration类模板的对象,这个类模板结合了数量和单位(例如 10毫秒就有10作为数量表示,毫秒作为单位)。
时间点 Time points
在时间上这可能涉及到一个特殊点,就像某个人的生日,今天的黎明,或者在下一辆火车经过的时候。
在这个库中,这time_point类模板通过使用一个相对一个新纪元的持续时间表现这个(这个新纪元是一个固定的点,这个点与所有使用相同的时钟的time_point对象相同)。
时钟 Clocks
一个框架,将一个时间点与真实物理时间关联。
这个库提供至少三种时钟,这些时钟提供方法去表示当前时间作为一个time_point:system_clock,steady_clock 和 high_resolution_clock。 system_clock 提供访问当前的time_point,是一个全系统实时时钟。steady_clock 提供访问当前的time_point,是专门被设计去计算时间间隔的.high_resolution_clock 提供访问当前的time_point,是一个具有最短tick周期的时钟,它可能是 system_clock or steady_clock的同义词。
函数:
duration_cast(用于转换单位)
time_point_cast
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> timeused = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
2、CV::Rect
Mat Image = image;
Image(Rect(0, 0, 100, 100)).setTo(0);
在ImageBasic.cpp中Rect()用于创建中心位于(0,0),高宽分别为100的图像。
3、cv::imshow
imshow("image",image);
imshow("Image",Image);
waitKey(0);
Mat Image_small;
resize(image, Image_small, Size(200, 200), 0, 0, INTER_NEAREST);
imshow("small", Image_small);
waitKey();
ImageBasic.cpp用于显示克隆的图像Image以及缩小的图像Image_small
4、vector中的reserve使用
一般的vector的大小随着push_back的增大而增大,但是reserve可以在小于n值情况下不重新分配空间。当需要多次向向量添加元素且事先知道元素的数量时利于使用。
5、boost::format
|