orbSlam3Complie
1 编译orb_slam
1 | git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 |
建议编译前,先看一下该项目上的一个pull request:(使用原来项目问题过多, 遇到的每一个问题在第4节都会详细描述,于是使用如下的一个PR)
https://github.com/UZ-SLAMLab/ORB_SLAM3/pull/53
推荐使用vs2015生成器;
2 编译
2.1 DBoW2 编译(如果使用pr,本步骤可以不看,2.3的orbslam3也对所有cmakelist.txt的修改做了说明)
主要是需要添加oepncv和boost的依赖
1 | PS F:\prjs\ORB_SLAM3> git diff |
如果指定了vs2019,然后又用vs2015编译的库,就需要用如下的最后一个参数去掉boost的autolink;
1 | mkdir build && cd build |
2.2 g2o
项目->属性->c++->预处器宏定义->添加: WINDOWS,否则会出现vasprintf找不到定义。
1 | cd ../../g2o |
2.3 orbslam3
2.3.0 首先按照下面的diff修改所有的internal::axpy和internal::atxpy
1 | +// add these marcos to fix: |
如果你是自己在orbslam3直接编译的话,请参考: https://github.com/RainerKuemmerle/g2o/issues/91
2.3.1 找不到unistd.h
首先:unistd.h需要修改调,主要是为了使用usleep,该函数使用如下代码替换:
1 | ```cpp |
或者如下一行能搞定:推荐这个方法
1 | if (ttrack < T) { |
2.3.2 使用cmake-gui开始编译
cmake-gui配置:
opencv,boost,需要修改cmakelist.txt:
添加如下定义:
1 | -DBOOST_ALL_NO_LIB=1 |
如下是我对cmakeList.txt做出的修改。
1 | diff --git a/CMakeLists.txt b/CMakeLists.txt |
3 编译成功显示:
1 | 1>F:\prjs\ORB_SLAM3\Thirdparty\Pangolin\include\pangolin/gl/gldraw.h(109,1): warning C4267: “参数”: 从“size_t”转换到“GLint”,可能丢失数据 |
如下是一个调用gif:
- 1 下载数据:http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.zip
- 2 进入:ORB_SLAM3/Examples,执行脚本euroc_eval_examles.sh中的一行,将其中的一行(比如第7行)改成你需要的格式,然后拿出来执行:执行结果:
1
./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml ./EuRoc_Data/MH_01_easy/ ./Monocular/EuRoC_TimeStamps/MH01.txt result/Resdataset-MH01_mono
4 可能遇到的问题
4.1 g2o -> vasprint 找不到标识符
到它的声明处,就会发现,它的声明和定义均位于非活动预处理器块中,被宏定义WINDOWS关闭了。所以添加对应的宏定义即可:右键项目->属性->C++->预处理器->预处理器定义,为其添加一个变量,WINDOWS,保存设定之后,这个错误也就消失了。
以上过程也可以在cmakelist.txt中添加: ADD_DEFINITIONS(-DWINDOWS)
4.2 orb-slam3 -> cl.exe has no C++11 support. Please use a different C++ compiler.
因为cmakelist对于cl的c++11的支持方式需要如下编写:
1 | --- a/CMakeLists.txt |
4.3 stdio-gcc.h找不到
将其改为stdio.h即可
4.4 Failed to run MSBuild command: C:/Program Files (x86)/MSBuild/14.0/bin/MSBuild.exe
将上述的MSBuild.exe添加到里面,然后https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/
里面找到win8.1的sdk,安装即可。
4.5 fata_error: compiler internal error on msc1.cpp:1xxx编译器内部错误
和g2o/core/matrix_operation.h的代码有关系,参考如下修改:
https://github.com/RainerKuemmerle/g2o/issues/91
https://github.com/UZ-SLAMLab/ORB_SLAM3/pull/53
4.6 std::max找不到定义
添加:
1 | #include <algorithm> |
4.7 找不到openssl/md5.h
可以尝试安装strawberry-perl,里面有oepnssl的库,然后下载openssl的源码获得其include。
这里也有openssl编译好的链接库: https://indy.fulgan.com/SSL/LinkLibs/
我的下载地址为:https://indy.fulgan.com/SSL/LinkLibs/openssl-1.0.2g-x64_86-win64_LinkLibs.zip
配置完成后比如一些openssl的依赖就需要手动添加了:
F:\BASE_ENV\openSSL\openssl\include
F:\BASE_ENV\openSSL\openssl\lib\ssleay32.lib
F:\BASE_ENV\openSSL\openssl\lib\libeay32.lib
4.8 link2005 error 将所有项目->属性->c++->代码生成->MD改成MT
1 | 1>msvcprt.lib(MSVCP140.dll) : error LNK2005: "public: class std::basic_istream<char,struct std::char_traits<char> > & __cdecl std::basic_istream<char,struct std::char_traits<char> >::operator>>(double &)" (??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z) 已经在 pangolin.lib(widgets.obj) 中定义 |
4.9 QT5找不到FindQT5.cmake
1 | # step1: 设置qt的安装位置 |