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的依赖
PS F:\prjs\ORB_SLAM3> git diff
diff --git a/Thirdparty/DBoW2/CMakeLists.txt b/Thirdparty/DBoW2/CMakeLists.txt
index c561724..2368c23 100644
--- a/Thirdparty/DBoW2/CMakeLists.txt
+++ b/Thirdparty/DBoW2/CMakeLists.txt
@@ -32,9 +32,22 @@ if(NOT OpenCV_FOUND)
endif()
endif()
+
+set(Boost_USE_STATIC_LIBS ON)
+add_definitions("-DBOOST_ALL_NO_LIB=1")
+find_package(Boost REQUIRED COMPONENTS
+ serialization)
+
set(LIBRARY_OUTPUT_PATH ${
PROJECT_SOURCE_DIR}/lib)
-include_directories(${
OpenCV_INCLUDE_DIRS})
+include_directories(${
OpenCV_INCLUDE_DIRS} ${
BOOST_INCLUDEDIR})
+link_directories(${
Boost_LIBRARY_DIRS})
+
+message("lib is: " ${
Boost_SERIALIZATION_LIBRARY})
+
add_library(DBoW2 SHARED ${
SRCS_DBOW2} ${
SRCS_DUTILS})
-target_link_libraries(DBoW2 ${
OpenCV_LIBS})
+target_link_libraries(DBoW2
+ ${
OpenCV_LIBS}
+ ${
Boost_SERIALIZATION_LIBRARY}
+)
diff --git a/Thirdparty/DBoW2/DBoW2/FORB.cpp b/Thirdparty/DBoW2/DBoW2/FORB.cpp
index 1f1990c..80bf473 100644
--- a/Thirdparty/DBoW2/DBoW2/FORB.cpp
+++ b/Thirdparty/DBoW2/DBoW2/FORB.cpp
@@ -13,7 +13,7 @@
#include <vector>
#include <string>
#include <sstream>
-#include <stdint-gcc.h>
+#include <stdint.h>
#include "FORB.h"
如果指定了vs2019,然后又用vs2015编译的库,就需要用如下的最后一个参数去掉boost的autolink;
mkdir build && cd build
cmake .. \
-G "Visual Studio 16" \
-DCMAKE_BUILDY_TYPE=Release \
-DOpenCV_DIR="F:/BASE_ENV/forOpenMVS/opencv/build" \
-DBOOST_ROOT="F:/BASE_ENV/forOpenMVS/boost_1_73_0_v140" \
-DBOOST_INCLUDEDIR="F:/BASE_ENV/forOpenMVS/boost_1_73_0_v140" \
-DBOOST_LIBRARYDIR="F:/BASE_ENV/forOpenMVS/boost_1_73_0_v140" \
-DBOOST_ALL_NO_LIB=1 \ # 避免boost的autolink,autolink会要求vs版本和boost版本一致
2.2 g2o
项目->属性->c+±>预处器宏定义->添加: WINDOWS,否则会出现vasprintf找不到定义。
cd ../../g2o
echo "Configuring and building Thirdparty/g2o ..."
mkdir build
cd build
cmake .. \
-G "Visual Studio 14" \
-DCMAKE_BUILDY_TYPE=Release \
-DEIGEN3_INCLUDE_DIR="F:\BASE_ENV\forOpenMVS\eigen" \
-DBOOST_ALL_NO_LIB=1 \
2.3 orbslam3
2.3.0 首先按照下面的diff修改所有的internal::axpy和internal::atxpy
+// add these marcos to fix:
+// 1>f:\prjs\orb_slam3\thirdparty\g2o\g2o\core\sparse_block_matrix.hpp(277): fatal error C1001: 编译器中发生内部错误。
+
+#define _AXPY(MatrixType,A,x,xoff,y,yoff)y.segment<MatrixType::RowsAtCompileTime>(yoff) += (A) * (x).segment<MatrixType::ColsAtCompileTime>(xoff)
+#define _ATXPY(MatrixType,A,x,xoff,y,yoff)y.segment<MatrixType::ColsAtCompileTime>(yoff) += (A).transpose() * (x).segment<MatrixType::RowsAtCompileTime>(xoff)
+
+
namespace g2o {
using namespace Eigen;
@@ -249,7 +256,8 @@ namespace g2o {
const typename SparseBlockMatrix<MatrixType>::SparseMatrixBlock* a=it->second;
int destOffset = it->first ? _rowBlockIndices[it->first - 1] : 0;
// destVec += *a * srcVec (according to the sub-vector parts)
- internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
+ // internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
+ _AXPY(MatrixType, *a, srcVec, srcOffset, destVec, destOffset);
}
}
}
@@ -274,9 +282,12 @@ namespace g2o {
if (destOffset > srcOffset) // only upper triangle
break;
// destVec += *a * srcVec (according to the sub-vector parts)
- internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
- if (destOffset < srcOffset)
- internal::atxpy(*a, srcVec, destOffset, destVec, srcOffset);
+ // internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
+ _AXPY(MatrixType, *a, srcVec, srcOffset, destVec, destOffset);
+ if (destOffset < srcOffset) {
+ // internal::atxpy(*a, srcVec, destOffset, destVec, srcOffset);

本文档详细介绍了ORB_SLAM3的下载、编译过程,包括DBoW2、g2o库的配置,并针对编译过程中遇到的如unistd.h缺失、Boost autolink等问题提供了解决方案。此外,还给出了编译成功后的输出示例及可能遇到的错误及其解决方法,如编译器内部错误、找不到std::max定义等。
最低0.47元/天 解锁文章
1205

被折叠的 条评论
为什么被折叠?



