《视觉SLAM十四讲》第一版源码slambook编译调试

2023-11-07

  1. slambook-master/ch2

编译正常,log如下:

slambook-master/ch2# mkdir build && cd build && cmake .. && make -j8

-- The C compiler identification is GNU 9.4.0

-- The CXX compiler identification is GNU 9.4.0

-- Check for working C compiler: /usr/bin/cc

-- Check for working C compiler: /usr/bin/cc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Detecting C compile features

-- Detecting C compile features - done

-- Check for working CXX compiler: /usr/bin/c++

-- Check for working CXX compiler: /usr/bin/c++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Configuring done

-- Generating done

-- Build files have been written to: /mnt/d/slam14/slambook-master/ch2/build

Scanning dependencies of target helloSLAM

Scanning dependencies of target hello

Scanning dependencies of target hello_shared

[ 37%] Building CXX object CMakeFiles/hello_shared.dir/libHelloSLAM.cpp.o

[ 37%] Building CXX object CMakeFiles/hello.dir/libHelloSLAM.cpp.o

[ 37%] Building CXX object CMakeFiles/helloSLAM.dir/helloSLAM.cpp.o

[ 50%] Linking CXX executable helloSLAM

[ 75%] Linking CXX shared library libhello_shared.so

[ 75%] Linking CXX static library libhello.a

[ 75%] Built target hello

[ 75%] Built target helloSLAM

[ 75%] Built target hello_shared

Scanning dependencies of target useHello

[ 87%] Building CXX object CMakeFiles/useHello.dir/useHello.cpp.o

[100%] Linking CXX executable useHello

[100%] Built target useHello

slambook-master/ch2/build# ./helloSLAM

Hello SLAM!

slambook-master/ch2/build# ./helloSLAM

Hello SLAM!

  1. slambook-master/ch3

1.编译问题

slambook-master/ch3/visualizeGeometry# mkdir build && cd build && cmake .. && make -j8

……

Scanning dependencies of target visualizeGeometry

[ 50%] Building CXX object CMakeFiles/visualizeGeometry.dir/visualizeGeometry.cpp.o

In file included from /usr/local/include/pangolin/utils/signal_slot.h:3,

                 from /usr/local/include/pangolin/windowing/window.h:35,

                 from /usr/local/include/pangolin/display/display.h:34,

                 from /usr/local/include/pangolin/pangolin.h:38,

                 from /mnt/d/slam14/slambook-master/ch3/visualizeGeometry/visualizeGeometry.cpp:9:

/usr/local/include/sigslot/signal.hpp:109:79: error: ‘decay_t’ is not a member of ‘std’; did you mean ‘decay’?

  109 | constexpr bool is_weak_ptr_compatible_v = detail::is_weak_ptr_compatible<std::decay_t<P>>::value;

      |                                                                               ^~~~~~~

1.解决方案

将CMakeLists中set(CMAKE_CXX_FLAGS "-std=c++11")注释掉即可

#set(CMAKE_CXX_FLAGS "-std=c++11")

不过编译后运行./visualizeGeometry会有如下报错:

2.编译问题

slambook-master/ch3/visualizeGeometry/build# ./visualizeGeometry

terminate called after throwing an instance of 'std::runtime_error'

  what():  Pangolin X11: Failed to open X display

Aborted

2.解决方案

这个估计是WSL系统没有没有配置界面显示所致,待配置了界面显示估计问题就解决了。

  1. slambook-master/ch4

1.编译问题

slambook-master/ch4/useSophus/useSophus.cpp:5:10: fatal error: Eigen/Core: No such file or directory

5 | #include <Eigen/Core>

1.解决方案

在CMakeLists中添加Eigen库

# 添加Eigen头文件

include_directories( "/usr/include/eigen3" )  #apt命令自动安装的eigen库路径

#include_directories( "/usr/local/include/eigen3" ) #源码编译安装的eigen库路径

2.编译问题

 slambook-master/ch4/useSophus/useSophus.cpp编译问题

(1)slambook-master/ch4/useSophus/useSophus.cpp:8:10: fatal error: sophus/so3.h: No such file or directory

8 | #include "sophus/so3.h"

2.解决方案

因新版本Sophus库中头文件名有改变,将代码useSophus.cpp:8中

#include <sophus/so3.h>

#include <sophus/se3.h>

改为

#include <sophus/so3.hpp>

#include <sophus/se3.hpp>

3.编译问题

slambook-master/ch4/useSophus/useSophus.cpp:16:17: error: missing template arguments before ‘SO3_R’

   16 |     Sophus::SO3 SO3_R(R);               // Sophus::SO(3)可以直接从旋转矩阵构造

slambook-master/ch4/useSophus/useSophus.cpp:24:34: error: ‘SO3_v’ was not declared in this scope; did you mean ‘SO3_R’?

   24 |     cout<<"SO(3) from vector: "<<SO3_v<<endl;

slambook-master/ch4/useSophus/useSophus.cpp:25:38: error: ‘SO3_q’ was not declared in this scope; did you mean ‘SO3_R’?

   25 |     cout<<"SO(3) from quaternion :"<<SO3_q<<endl;

3.解决方案

Sophus库新版本是模板类,定义时需要指定类型,将代码useSophus.cpp中:

Sophus::SO3 SO3_R(R);               // Sophus::SO(3)可以直接从旋转矩阵构造

Sophus::SO3d SO3_v( 0, 0, M_PI/2 );  // 亦可从旋转向量构造

Eigen::Quaterniond q(R);            // 或者四元数

Sophus::SO3d SO3_q( q );

改为:

//Sophus::SO3 SO3_R(R);               // Sophus::SO(3)可以直接从旋转矩阵构造

Sophus::SO3d SO3_R(R);              // Sophus::SO(3)可以直接从旋转矩阵构造

//Sophus::SO3 SO3_v( 0, 0, M_PI/2 );  // 亦可从旋转向量构造

Sophus::SO3d SO3_v( 0, 0, M_PI/2 );  // 亦可从旋转向量构造

Eigen::Quaterniond q(R);            // 或者四元数

//Sophus::SO3 SO3_q( q );

Sophus::SO3d SO3_q( q );

4.编译问题

slambook-master/ch4/useSophus/useSophus.cpp:33:33: error: ‘template<class Scalar_, int Options> class Sophus::SO3’ used without template arguments

   33 |     cout<<"so3 hat=\n"<<Sophus::SO3::hat(so3)<<endl;

4.解决方案

因新版本Sophus库打印需要log()函数:,将代码useSophus.cpp中:

cout<<"SO(3) from matrix: "<<SO3_R<<endl;

改为:

cout<<"SO(3) from matrix: "<<SO3_R.log()<<endl;

5.编译问题

/usr/bin/ld: CMakeFiles/useSophus.dir/useSophus.cpp.o: in function `std::make_unsigned<int>::type fmt::v8::detail::to_unsigned<int>(int)':

useSophus.cpp:(.text._ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_[_ZN3fmt2v86detail11to_unsignedIiEENSt13make_unsignedIT_E4typeES4_]+0x23): undefined reference to `fmt::v8::detail::assert_fail(char const*, int, char const*)'

……

collect2: error: ld returned 1 exit status

make[2]: *** [CMakeFiles/useSophus.dir/build.make:97: useSophus] Error 1

make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/useSophus.dir/all] Error 2

make: *** [Makefile:91: all] Error 2

5.解决方案

没有链接fmt库,链接上fmt 库就没问题了,将CMakeLists.txt中:

target_link_libraries( useSophus ${Sophus_LIBRARIES} )

改为:

target_link_libraries(useSophus ${Sophus_LIBRARIES} fmt)

  1. slambook-master/ch5

1.编译问题

/slambook-master/ch5/imageBasics

CMake Error at CMakeLists.txt:8 (find_package):

  Could not find a configuration file for package "OpenCV" that is compatible

  with requested version "3".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.5

-- Configuring incomplete, errors occurred!

See also "/mnt/d/slam14/slambook-master/ch5/imageBasics/build/CMakeFiles/CMakeOutput.log".

1.解决方案

因为按照了opencv4.5.5版本不是opencv3.x.x版本,将CMakeLists.txt中:

find_package( OpenCV 3 REQUIRED )

改为:

find_package( OpenCV REQUIRED )

2.编译问题

slambook-master/ch5/imageBasics/build# ./imageBasics

terminate called after throwing an instance of 'std::logic_error'

  what():  basic_string::_M_construct null not valid

Aborted

2.解决方案

//TODO有待解决,解决其他问题后一并解决

应该是由于wsl没有安装UI界面,导致编译的程序调用界面显示时不能显示所致。

3.编译问题

CMake Error at CMakeLists.txt:15 (find_package):

  By not providing "FindPCL.cmake" in CMAKE_MODULE_PATH this project has

  asked CMake to find a package configuration file provided by "PCL", but

  CMake did not find one.

  Could not find a package configuration file provided by "PCL" with any of

  the following names:

    PCLConfig.cmake

    pcl-config.cmake

  Add the installation prefix of "PCL" to CMAKE_PREFIX_PATH or set "PCL_DIR"

  to a directory containing one of the above files.  If "PCL" provides a

  separate development package or SDK, be sure it has been installed.

[ 50%] Building CXX object CMakeFiles/joinMap.dir/joinMap.cpp.o

/mnt/d/slam14/slambook-master/ch5/joinMap/joinMap.cpp:10:10: fatal error: pcl/visualization/pcl_visualizer.h: No such file or directory

   10 | #include <pcl/visualization/pcl_visualizer.h>

      |

3.解决方案

# eigen

#include_directories( "/usr/include/eigen3/" )

include_directories( "/usr/local/include/eigen3/" )

应该时PCL库没有安装成功,需要重新安装PCL库。

4.编译问题

Scanning dependencies of target joinMap

[ 50%] Building CXX object CMakeFiles/joinMap.dir/joinMap.cpp.o

In file included from /usr/local/include/pcl-1.12/pcl/pcl_macros.h:74,

                 from /usr/local/include/pcl-1.12/pcl/impl/point_types.hpp:42,

                 from /usr/local/include/pcl-1.12/pcl/point_types.h:354,

                 from /mnt/d/slam14/slambook-master/ch5/joinMap/joinMap.cpp:8:

/usr/local/include/pcl-1.12/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above

7 |   #error PCL requires C++14 or above

4.解决方案

在CMakeLists中添加C++14编译

set( CMAKE_CXX_STANDARD 14)

5.编译问题

slambook-master/ch5/joinMap/build# ./joinMap

请在有pose.txt的目录下运行此程序

5.解决方案

解决办法1:

将make生成的build/joinMap文件复制到pose.txt文件下,在运行./joinMap。

解决办法2:

在joinMap.cpp中:

将ifstream fin("./pose.txt");改为ifstream fin("…/pose.txt");

将boost::format fmt( “./%s/%d.%s” ); 改为boost::format fmt( “…/%s/%d.%s” );

之后保存,重新编译运行即可。

  1. slambook-master/ch6

1.编译问题

slambook-master/ch6/ceres_curve_fitting/build# make -j16

[ 50%] Building CXX object CMakeFiles/curve_fitting.dir/main.cpp.o

In file included from /usr/local/include/ceres/internal/parameter_dims.h:37,

                 from /usr/local/include/ceres/internal/autodiff.h:151,

                 from /usr/local/include/ceres/autodiff_cost_function.h:130,

                 from /usr/local/include/ceres/ceres.h:37,

                 from /mnt/d/slam14/slambook-master/ch6/ceres_curve_fitting/main.cpp:3:

/usr/local/include/ceres/internal/integer_sequence_algorithm.h:64:21: error: ‘integer_sequence’ is not a member of ‘std’

   64 | struct SumImpl<std::integer_sequence<T, N, Ns...>> {

1.解决方案

在CMakeLists中添加C++14编译

set( CMAKE_CXX_STANDARD 14)

2.编译问题

slambook-master/ch6/g2o_curve_fitting/build

[ 50%] Building CXX object CMakeFiles/curve_fitting.dir/main.cpp.o

In file included from /usr/local/include/g2o/core/base_unary_edge.h:30,

                 from /mnt/d/slam14/slambook-master/ch6/g2o_curve_fitting/main.cpp:3:

/usr/local/include/g2o/core/base_fixed_sized_edge.h:199:32: error: ‘index_sequence’ is not a member of ‘std’

  199 |   struct HessianTupleType<std::index_sequence<Ints...>> {

2.解决方案

在CMakeLists中添加C++14编译

set( CMAKE_CXX_STANDARD 14)

3.编译问题

/mnt/d/slam14/slambook-master/ch6/g2o_curve_fitting/main.cpp: In function ‘int main(int, char**)’:

/mnt/d/slam14/slambook-master/ch6/g2o_curve_fitting/main.cpp:77:49: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::LinearSolverType*&)’

   77 |     Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器

      |                                                 ^

In file included from /usr/local/include/g2o/core/block_solver.h:206,

                 from /mnt/d/slam14/slambook-master/ch6/g2o_curve_fitting/main.cpp:4:

/usr/local/include/g2o/core/block_solver.hpp:39:1: note: candidate: ‘g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<3, 1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 3, 3> >]’

   39 | BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)

      | ^~~~~~~~~~~~~~~~~~~

/usr/local/include/g2o/core/block_solver.hpp:39:68: note:   no known conversion for argument 1 from ‘g2o::BlockSolver<g2o::BlockSolverTraits<3, 1> >::LinearSolverType*’ {aka ‘g2o::LinearSolver<Eigen::Matrix<double, 3, 3> >*’} to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, 3, 3> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, 3, 3> > > >’

   39 | BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)

      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~

/mnt/d/slam14/slambook-master/ch6/g2o_curve_fitting/main.cpp:79:103: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(Block*&)’

   79 |     g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );

      |                                                                                                       ^

3.解决方案

将源码main.cpp相关部分修改如下:

// 构建图优化,先设定g2o

    typedef g2o::BlockSolver< g2o::BlockSolverTraits<3,1> > Block;  // 每个误差项优化变量维度为3,误差值维度为1

    //Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense<Block::PoseMatrixType>(); // 线性方程求解器

       std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<Block::PoseMatrixType>());

    //Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器

      std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

    // 梯度下降方法,从GN, LM, DogLeg 中选

    //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );

    g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

       // g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr );

    // g2o::OptimizationAlgorithmDogleg* solver = new g2o::OptimizationAlgorithmDogleg( solver_ptr );

    g2o::SparseOptimizer optimizer;     // 图模型

    optimizer.setAlgorithm( solver );   // 设置求解器

    optimizer.setVerbose( true );       // 打开调试输出

#参考关于高博十四讲中由于g2o更新出现的问题解决_xiaoshuiyisheng的博客-CSDN博客

  1. slambook-master/ch7

1.编译问题

CMake Error at CMakeLists.txt:10 (find_package):

  Could not find a configuration file for package "OpenCV" that is compatible

  with requested version "3.1".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.5

1.解决方案

将CMakeLists改为:

#find_package( OpenCV 3.1 REQUIRED )

find_package( OpenCV REQUIRED )

# find_package( OpenCV REQUIRED ) # use this if in OpenCV2

find_package( G2O REQUIRED )

find_package( CSparse REQUIRED )

include_directories(

    ${OpenCV_INCLUDE_DIRS}

    ${G2O_INCLUDE_DIRS}

    ${CSPARSE_INCLUDE_DIR}

    #"/usr/include/eigen3/"

    "/usr/include/eigen3/"

)

2.编译问题

CSPARSE_LIBRARY

    linked by target "pose_estimation_3d3d" in directory /mnt/d/slam14/slambook-master/ch7

    linked by target "pose_estimation_3d2d" in directory /mnt/d/slam14/slambook-master/ch7

CMake Warning (dev) in CMakeLists.txt:

  Policy CMP0021 is not set: Fatal error on relative paths in

  INCLUDE_DIRECTORIES target property.  Run "cmake --help-policy CMP0021" for

  policy details.  Use the cmake_policy command to set the policy and

  suppress this warning.

  Found relative path while evaluating include directories of

  "feature_extraction":

    "CSPARSE_INCLUDE_DIR-NOTFOUND"

This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:

  Policy CMP0021 is not set: Fatal error on relative paths in

  INCLUDE_DIRECTORIES target property.  Run "cmake --help-policy CMP0021" for

  policy details.  Use the cmake_policy command to set the policy and

  suppress this warning.

  Found relative path while evaluating include directories of

  "pose_estimation_2d2d":

    "CSPARSE_INCLUDE_DIR-NOTFOUND"

This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:

  Policy CMP0021 is not set: Fatal error on relative paths in

  INCLUDE_DIRECTORIES target property.  Run "cmake --help-policy CMP0021" for

  policy details.  Use the cmake_policy command to set the policy and

  suppress this warning.

  Found relative path while evaluating include directories of

  "triangulation":

    "CSPARSE_INCLUDE_DIR-NOTFOUND"

This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:

  Policy CMP0021 is not set: Fatal error on relative paths in

  INCLUDE_DIRECTORIES target property.  Run "cmake --help-policy CMP0021" for

  policy details.  Use the cmake_policy command to set the policy and

  suppress this warning.

  Found relative path while evaluating include directories of

  "pose_estimation_3d2d":

    "CSPARSE_INCLUDE_DIR-NOTFOUND"

This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) in CMakeLists.txt:

  Policy CMP0021 is not set: Fatal error on relative paths in

  INCLUDE_DIRECTORIES target property.  Run "cmake --help-policy CMP0021" for

  policy details.  Use the cmake_policy command to set the policy and

  suppress this warning.

  Found relative path while evaluating include directories of

  "pose_estimation_3d3d":

    "CSPARSE_INCLUDE_DIR-NOTFOUND"

This warning is for project developers.  Use -Wno-dev to suppress it.

-- Generating done

CMake Generate step failed.  Build files cannot be regenerated correctly.

2.解决方案

未安装CSparse,需要执行以下命令来安装CSparse。

sudo apt-get install libsuitesparse-dev

3.编译问题

[ 10%] Building CXX object CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o

/mnt/d/slam14/slambook-master/ch7/pose_estimation_3d2d.cpp:12:10: fatal error: g2o/solvers/csparse/linear_solver_csparse.h: No such file or directory

   12 | #include <g2o/solvers/csparse/linear_solver_csparse.h>

3.解决方案

g2o安装有问题导致缺少/usr/local/include/g2o/solvers/csparse文件夹而找不到g2o/solvers/csparse/linear_solver_csparse.h头文件,重新安装g2o库即可。

4.编译问题

slambook-master/ch7/feature_extraction.cpp: In function ‘int main(int, char**)’:

/mnt/d/slam14/slambook-master/ch7/feature_extraction.cpp:17:35: error: ‘CV_LOAD_IMAGE_COLOR’ was not declared in this scope

   17 |     Mat img_1 = imread ( argv[1], CV_LOAD_IMAGE_COLOR );

……

4.解决方案

在源码feature_extraction.cpp、pose_estimation_2d2d.cpp、pose_estimation_3d2d.cpp、pose_estimation_3d3d.cpp中添加头文件

#include <opencv2/imgcodecs/legacy/constants_c.h>

#参考链接

SLAM十四讲,第七章程序ch7报错, error: ‘CV_LOAD_IMAGE_COLOR’ was not declared in this scope_XXX的博客-CSDN博客_cv_load_image_color

5.编译问题

slambook-master/ch7/pose_estimation_2d2d.cpp:155:65: error: ‘CV_FM_8POINT’ was not declared in this scope

  155 |     fundamental_matrix = findFundamentalMat ( points1, points2, CV_FM_8POINT );

5.解决方案

将源码/slambook-master/ch7/pose_estimation_2d2d.cpp中CV_FM_8POINT改为FM_8POINT即可。如下所示:

//fundamental_matrix = findFundamentalMat ( points1, points2, CV_FM_8POINT );

fundamental_matrix = findFundamentalMat ( points1, points2, FM_8POINT );

#参考链接高翔slam14讲中ch7代码中的一些修改_jywell-CSDN博客

6.编译问题

slambook-master/ch7/pose_estimation_3d2d.cpp:9:

/usr/local/include/g2o/core/base_fixed_sized_edge.h:199:32: error: ‘index_sequence’ is not a member of ‘std’

  199 |   struct HessianTupleType<std::index_sequence<Ints...>> {

6.解决方案

需要在Cmakelists中更新至c++14,在CMakeLists中添加set( CMAKE_CXX_STANDARD 14)

7.编译问题

slambook-master/ch7/pose_estimation_3d2d.cpp:178:14: error: ‘VertexSBAPointXYZ’ is not a member of ‘g2o’; did you mean ‘VertexPointXYZ’?

  178 |         g2o::VertexSBAPointXYZ* point = new g2o::VertexSBAPointXYZ();

      |              ^~~~~~~~~~~~~~~~~

      |              VertexPointXYZ

7.解决方案

新版g2o库中不再存在原先的VertexSBAPointXYZ,将所有报错的地方改为VertexPointXYZ即可。

8.编译问题

(1)slambook-master/ch7/pose_estimation_3d2d.cpp:152:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’

  152 |     Block* solver_ptr = new Block ( linearSolver );     // 矩阵块求解器

(2)slambook-master/ch7/pose_estimation_3d3d.cpp:280:49: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’

  280 |     Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器

8.解决方案

新版本g2o中API接口变了,有两种修改模式,基本意义相同但第一种更简洁:

(1)slambook-master/ch7/pose_estimation_3d2d.cpp解决方案采用第一种方法:参考增加智能指针 std::unique_ptr,第一种方法是根据新版本中的示例来进行语句修改。如下所示:

// 初始化g2o

    typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3

    //Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器

    std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCSparse<Block::PoseMatrixType>());

       //Block* solver_ptr = new Block ( linearSolver );     // 矩阵块求解器

    //std::unique_ptr<Block> solver_ptr( new Block( linearSolver) );

      std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

    //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr );

    g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

       g2o::SparseOptimizer optimizer;

    optimizer.setAlgorithm ( solver );

(2)slambook-master/ch7/pose_estimation_3d3d.cpp解决方案采用第二种方法:根据报错来修改Block的初始化方法,在每个语句对应加入unique_ptr。如下所示:

// 初始化g2o

    typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose维度为 6, landmark 维度为 3

    Block::LinearSolverType* linearSolver = new g2o::LinearSolverEigen<Block::PoseMatrixType>(); // 线性方程求解器

    //Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器

       //std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

       Block* solver_ptr = new Block( std::unique_ptr<Block::LinearSolverType>(linearSolver) );      // 矩阵块求解器

    //g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr );

       //g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton ( std::move(solver_ptr));

       g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( unique_ptr<Block>(solver_ptr) );

    g2o::SparseOptimizer optimizer;

optimizer.setAlgorithm( solver );

9.编译问题

/usr/bin/ld: CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o: undefined reference to symbol '_ZTVN3g2o14VertexPointXYZE'

/usr/bin/ld: /usr/local/lib/libg2o_types_slam3d.so: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status

make[2]: *** [CMakeFiles/pose_estimation_3d2d.dir/build.make:113: pose_estimation_3d2d] Error 1

make[1]: *** [CMakeFiles/Makefile2:169: CMakeFiles/pose_estimation_3d2d.dir/all] Error 2

9.解决方案

(1)DSO missing的原因基本上是因为有库没有连接上,导致未识别。最保险的方法是在最前端将所有库设置为G2O_LIBS:

SET(G2O_LIBS g2o_cli g2o_ext_freeglut_minimal g2o_simulator g2o_solver_slam2d_linear g2o_types_icp g2o_types_slam2d g2o_core g2o_interface g2o_solver_csparse g2o_solver_structure_only g2o_types_sba g2o_types_slam3d g2o_csparse_extension g2o_opengl_helper g2o_solver_dense g2o_stuff g2o_types_sclam2d g2o_parser g2o_solver_pcg g2o_types_data g2o_types_sim3 cxsparse )

(2)由于是在pose_estimation_3d2d中出现问题,所以可以在随后对应的链接中加入${G2O_LIBS}

target_link_libraries( pose_estimation_3d2d

   ${OpenCV_LIBS}

   ${CSPARSE_LIBRARY}

   g2o_core g2o_stuff g2o_types_sba g2o_csparse_extension ${G2O_LIBS}

)

#参考链接

SLAM十四讲ch7代码调整(undefined reference to symbol)_山馗的博客-CSDN博客

10.编译问题

(1)slambook-master/ch7/build# ./feature_extraction

usage: feature_extraction img1 img2

类似的问题还有

slambook-master/ch7/build# ./triangulation

usage: triangulation img1 img2

slambook-master/ch7/build# . /pose_estimation_2d2d

usage: pose_estimation_2d2d img1 img2

slambook-master/ch7/build# . /pose_estimation_3d2d

usage: pose_estimation_3d2d img1 img2 depth1 depth2

slambook-master/ch7/build# . /pose_estimation_3d3d

usage: pose_estimation_3d3d img1 img2 depth1 depth2

(2)slambook-master/ch7/build# ./feature_extraction ../1.png ../2.png

terminate called after throwing an instance of 'cv::Exception'

  what():  OpenCV(4.5.5-dev) /mnt/d/slam14/wsl_libs/opencv-4.x/modules/highgui/src/window.cpp:1268: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

Aborted

10.解决方案

(1)报错的意思就是以下运行命令格式不对:

./feature_extraction

./triangulation

./pose_estimation_2d2d

./pose_estimation_3d2d

./pose_estimation_3d3d

正确的命令运行格式应该为:

./feature_extraction img1 img2

./triangulation img1 img2

./pose_estimation_2d2d img1 img2

./pose_estimation_3d2d img1 img2 depth1 depth2

./pose_estimation_3d3d img1 img2 depth1 depth2

如果这些二进制文件feature_extraction、triangulation、pose_estimation_2d2d img1 img2、pose_estimation_3d2d、pose_estimation_3d3d是在源代码目录生成的或者是在新建的build目录中编译生成后移动或者拷贝到源码文件目录下的,实际的运行命令为:

./feature_extraction 1.png 2.png

./triangulation 1.png  2.png

./pose_estimation_2d2d 1.png 2.png

./pose_estimation_3d2d 1.png 2.png 1_depth.png 2_depth.png

./pose_estimation_3d3d 1.png 2.png 1_depth.png 2_depth.png

如果这些二进制文件feature_extraction、triangulation、pose_estimation_2d2d img1 img2、pose_estimation_3d2d、pose_estimation_3d3d是在新建的build目录中编译生成的不移动或拷贝它们,实际的运行命令为:

./feature_extraction ../1.png ../2.png

./triangulation ../1.png ../2.png

./pose_estimation_2d2d ../1.png ../2.png

./pose_estimation_3d2d ../1.png ../2.png ../1_depth.png ../2_depth.png

./pose_estimation_3d3d ../1.png ../2.png ../1_depth.png ../2_depth.png

(2)//TODO有待解决,解决其他问题后一并解决

应该是由于wsl没有安装UI界面,导致编译的程序调用界面显示时不能显示所致。

  1. slambook-master/ch8

1.编译问题

(1)slambook-master/ch8/LKFlow/build# ./useLK

usage: useLK path_to_dataset

(2)slambook-master/ch8/LKFlow/build# ./useLK ../../data/

LK Flow use time:0.0142803 seconds.

tracked keypoints: 1750

terminate called after throwing an instance of 'cv::Exception'

  what():  OpenCV(4.5.5-dev) /mnt/d/slam14/wsl_libs/opencv-4.x/modules/highgui/src/window.cpp:1268: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

Aborted

1.解决方案

(1)退出LKFlow文件夹,进入data文件夹并将将data文件夹中的压缩文件用tar -zxvf data.tar.gz命令解压,然后进入LKFlow/build文件夹目录执行./useLK ../../data/命令

(2)//TODO有待解决,解决其他问题后一并解决

应该是由于wsl没有安装UI界面,导致编译的程序调用界面显示时不能显示所致。

2.编译问题

[ 50%] Building CXX object CMakeFiles/direct_semidense.dir/direct_semidense.cpp.o

In file included from /usr/local/include/g2o/core/base_unary_edge.h:30,

                 from /mnt/d/slam14/slambook-master/ch8/directMethod/direct_sparse.cpp:14:

/usr/local/include/g2o/core/base_fixed_sized_edge.h:199:32: error: ‘index_sequence’ is not a member of ‘std’

  199 |   struct HessianTupleType<std::index_sequence<Ints...>> {

2.解决方案

在CMakeLists中添加C++14编译

set( CMAKE_CXX_STANDARD 14)

3.编译问题

(1)slambook-master/ch8/directMethod/direct_semidense.cpp: In function ‘bool poseEstimationDirect(const std::vector<Measurement>&, cv::Mat*, Eigen::Matrix3f&, Eigen::Isometry3d&)’:

/mnt/d/slam14/slambook-master/ch8/directMethod/direct_semidense.cpp:266:62: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 1> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 1> >::LinearSolverType*&)’

  266 |     DirectBlock* solver_ptr = new DirectBlock ( linearSolver );

(2)slambook-master/ch8/directMethod/direct_sparse.cpp:258:62: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 1> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 1> >::LinearSolverType*&)’

  258 |     DirectBlock* solver_ptr = new DirectBlock ( linearSolver );

3.解决方案

新版本g2o中API接口变了,有两种修改模式,基本意义相同但第一种更简洁:

(1)slambook-master/ch8/directMethod/direct_semidense.cpp解决方案采用第一种方法:参考增加智能指针 std::unique_ptr,第一种方法是根据新版本中的示例来进行语句修改。如下所示:

// 初始化g2o

    typedef g2o::BlockSolver<g2o::BlockSolverTraits<6,1>> DirectBlock;  // 求解的向量是6*1的

    //DirectBlock::LinearSolverType* linearSolver = new g2o::LinearSolverDense< DirectBlock::PoseMatrixType > ();

       std::unique_ptr<DirectBlock::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<DirectBlock::PoseMatrixType>());

    //DirectBlock* solver_ptr = new DirectBlock ( linearSolver );

       std::unique_ptr<DirectBlock> solver_ptr ( new DirectBlock ( std::move(linearSolver)));     // 矩阵块求解器

    // g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr ); // G-N

    //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr ); // L-M

       g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

    g2o::SparseOptimizer optimizer;

    optimizer.setAlgorithm ( solver );

    optimizer.setVerbose( true );

(2)slambook-master/ch8/directMethod/direct_sparse.cpp解决方案也采用第一种方法:参考增加智能指针 std::unique_ptr,第一种方法是根据新版本中的示例来进行语句修改。如下所示:

// 初始化g2o

    typedef g2o::BlockSolver<g2o::BlockSolverTraits<6,1>> DirectBlock;  // 求解的向量是6*1的

    //DirectBlock::LinearSolverType* linearSolver = new g2o::LinearSolverDense< DirectBlock::PoseMatrixType > ();

       std::unique_ptr<DirectBlock::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<DirectBlock::PoseMatrixType>());

    //DirectBlock* solver_ptr = new DirectBlock ( linearSolver );

       std::unique_ptr<DirectBlock> solver_ptr ( new DirectBlock ( std::move(linearSolver)));     // 矩阵块求解器

    // g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr ); // G-N

    //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr ); // L-M

       g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

    g2o::SparseOptimizer optimizer;

    optimizer.setAlgorithm ( solver );

    optimizer.setVerbose( true );

4.编译问题

slambook-master/ch8/directMethod/build# ./direct_semidense

usage: useLK path_to_dataset

4.解决方案

运行命令格式不对,采用useLK path_to_dataset格式如下:

slambook-master/ch8/directMethod/build# ./direct_semidense  ../../data/

  1. slambook-master/ch9

1.编译问题

CMake Error at CMakeLists.txt:16 (find_package):

  Could not find a configuration file for package "OpenCV" that is compatible

  with requested version "3.1".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.5

1.解决方案

将CMakeLists改为:

# OpenCV

#find_package( OpenCV 3.1 REQUIRED )

find_package( OpenCV REQUIRED )

2.编译问题

[ 83%] Building CXX object src/CMakeFiles/myslam.dir/config.cpp.o

In file included from /mnt/d/slam14/slambook-master/project/0.1/src/mappoint.cpp:20:

/mnt/d/slam14/slambook-master/project/0.1/include/myslam/common_include.h:32:10: fatal error: sophus/se3.h: No such file or directory

   32 | #include <sophus/se3.h>

2.解决方案

因新版本Sophus库中头文件名有改变,将代码common_include.h:32中

// for Sophus

#include <sophus/se3.hpp>

改为

// for Sophus

//#include <sophus/se3.h>

#include <sophus/se3.hpp>

3.编译问题

In file included from /mnt/d/slam14/slambook-master/project/0.3/src/g2o_types.cpp:1:

/mnt/d/slam14/slambook-master/project/0.3/include/myslam/g2o_types.h:37:80: error: ‘VertexSBAPointXYZ’ is not a member of ‘g2o’; did you mean ‘VertexPointXYZ’?

   37 | class EdgeProjectXYZRGBD : public g2o::BaseBinaryEdge<3, Eigen::Vector3d, g2o::VertexSBAPointXYZ, g2o::VertexSE3Expmap>

3.解决方案

将g2o_types.cpp 和g2o_types.h中‘VertexSBAPointXYZ’修改为 ‘VertexPointXYZ’

4.编译问题

/mnt/d/slam14/slambook-master/project/0.3/src/visual_odometry.cpp:202:26: error: ‘class Sophus::SE3<double>’ has no member named ‘rotation_matrix’; did you mean ‘rotationMatrix’?

  202 |         T_c_r_estimated_.rotation_matrix(),

      |                          ^~~~~~~~~~~~~~~

4.解决方案

将visual_odometry.cpp中‘rotation_matrix’修改为‘rotationMatrix’

5.编译问题

/mnt/d/slam14/slambook-master/project/0.3/src/visual_odometry.cpp:194:49: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 2> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 2> >::LinearSolverType*&)’

  194 |     Block* solver_ptr = new Block( linearSolver );

5.解决方案

将visual_odometry.cpp中相关代码修改如下:

// using bundle adjustment to optimize the pose

    typedef g2o::BlockSolver<g2o::BlockSolverTraits<6,2>> Block;

    //Block::LinearSolverType* linearSolver = new g2o::LinearSolverDense<Block::PoseMatrixType>();

    std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<Block::PoseMatrixType>());

       //Block* solver_ptr = new Block( linearSolver );

      std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

    //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr );

       g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

    g2o::SparseOptimizer optimizer;

optimizer.setAlgorithm ( solver );

6.编译问题

(1)[ 50%] Building CXX object src/CMakeFiles/myslam.dir/camera.cpp.o

In file included from /mnt/d/slam14/slambook-master/project/0.1/include/myslam/frame.h:24,

                 from /mnt/d/slam14/slambook-master/project/0.1/include/myslam/map.h:24,

                 from /mnt/d/slam14/slambook-master/project/0.1/src/map.cpp:20:

/mnt/d/slam14/slambook-master/project/0.1/include/myslam/camera.h:41:55: error: invalid use of template-name ‘Sophus::SE3’ without an argument list

   41 |     Vector3d world2camera( const Vector3d& p_w, const SE3& T_c_w );

(2)[ 83%] Building CXX object src/CMakeFiles/myslam.dir/config.cpp.o

In file included from /mnt/d/slam14/slambook-master/project/0.1/src/frame.cpp:20:

/mnt/d/slam14/slambook-master/project/0.1/include/myslam/frame.h:37:5: error: invalid use of template-name ‘Sophus::SE3’ without an argument list

   37 |     SE3                            T_c_w_;      // transform from world to camera

(3)[ 50%] Building CXX object src/CMakeFiles/myslam.dir/camera.cpp.o

/mnt/d/slam14/slambook-master/project/0.1/src/camera.cpp:29:60: error: invalid use of template-name ‘Sophus::SE3’ without an argument list

   29 | Vector3d Camera::world2camera ( const Vector3d& p_w, const SE3& T_c_w )

(4)[ 33%] Building CXX object src/CMakeFiles/myslam.dir/camera.cpp.o

/mnt/d/slam14/slambook-master/project/0.1/src/frame.cpp:30:44: error: ‘SE3’ is not a type

   30 | Frame::Frame ( long id, double time_stamp, SE3 T_c_w, Camera::Ptr camera, Mat color, Mat depth )

      |                                            ^~~

/mnt/d/slam14/slambook-master/project/0.1/src/frame.cpp:30:1: error: no declaration matches ‘myslam::Frame::Frame(long int, double, int, myslam::Camera::Ptr, cv::Mat, cv::Mat)’

   30 | Frame::Frame ( long id, double time_stamp, SE3 T_c_w, Camera::Ptr camera, Mat color, Mat depth )

(5)/mnt/d/slam14/slambook-master/project/0.2/test/run_vo.cpp:79:9: error: ‘SE3’ was not declared in this scope; did you mean ‘Sophus::SE3’?

   79 |         SE3 Tcw = pFrame->T_c_w_.inverse();

      |         ^~~

      |         Sophus::SE3

In file included from /mnt/d/slam14/slambook-master/project/0.2/include/myslam/common_include.h:34,

                 from /mnt/d/slam14/slambook-master/project/0.2/include/myslam/config.h:23,

                 from /mnt/d/slam14/slambook-master/project/0.2/test/run_vo.cpp:8:

/usr/local/include/sophus/se3.hpp:11:7: note: ‘Sophus::SE3’ declared here

   11 | class SE3;

      |       ^~~

(6)/mnt/d/slam14/slambook-master/project/0.2/src/visual_odometry.cpp: In member function ‘void myslam::VisualOdometry::poseEstimationPnP()’:

/mnt/d/slam14/slambook-master/project/0.2/src/visual_odometry.cpp:181:27: error: missing template arguments before ‘(’ token

  181 |     T_c_r_estimated_ = SE3(

      |                           ^

/mnt/d/slam14/slambook-master/project/0.2/src/visual_odometry.cpp:182:12: error: missing template arguments before ‘(’ token

  182 |         SO3(rvec.at<double>(0,0), rvec.at<double>(1,0), rvec.at<double>(2,0)),

      |            ^

6.解决方案

// project中0.1、0.2、0.3、0.4项目中均有此问题。

由于Sophus::SE3和Sophus::SO3在Sophus库新版本中都是模板类,需要声明模板类的数据类型,有两种办法:

(1)一种办法是

using Sophus::SE3;

using Sophus::SO3;

SE3<double> xxx;

SO3<double> yyy;

(2)另一种办法是

using Sophus::SE3d;

using Sophus::SO3d;

SE3d xxx;

SO3d yyy;

采用第二种方法后可将const SE3& T_c_w改为:const SE3d & T_c_w,其他类似地把SE3改为SE3d。最难修改的是T_c_r_estimated_初始化部分,采用第二种方法修改源码如下:

//T_c_r_estimated_ = SE3(

    //    SO3(rvec.at<double>(0,0), rvec.at<double>(1,0), rvec.at<double>(2,0)),

    //    Vector3d( tvec.at<double>(0,0), tvec.at<double>(1,0), tvec.at<double>(2,0))

       // 此处旋转向量经罗德里格斯转换

    Mat R;

    cv::Rodrigues(rvec, R);

    Eigen::Matrix3d RE;

    RE << R.at<double>(0,0), R.at<double>(0,1), R.at<double>(0,2),

            R.at<double>(1,0), R.at<double>(1,1), R.at<double>(1,2),

            R.at<double>(2,0), R.at<double>(2,1), R.at<double>(2,2);

       // SO3构造函数参数为旋转矩阵

    T_c_r_estimated_ = SE3d(

              SO3d(RE),

              Vector3d(tvec.at<double>(0,0), tvec.at<double>(1,0), tvec.at<double>(2,0)));

#参考链接

关于使用新版Sophus(2018年6月github版本)的使用_王勇的博客-CSDN博客

视觉SLAM十四讲 从理论到实践-第九讲实践:设计前端,关于Sophus库中SO3类构造函数使用疑惑_RobotLife的博客-CSDN博客

7.编译问题

[ 88%] Building CXX object test/CMakeFiles/run_vo.dir/run_vo.cpp.o

/mnt/d/slam14/slambook-master/project/0.2/test/run_vo.cpp:6:10: fatal error: opencv2/viz.hpp: No such file or directory

    6 | #include <opencv2/viz.hpp>

7.解决方案

这是由于编译VTK+opencv+opencv_contrib不完整所致,重新编译opencv+opencv_contrib即可,编译命令中要开VTK:-D WITH_VTK=ON。

8.编译问题

/mnt/d/slam14/slambook-master/project/0.2/test/run_vo.cpp:84:17: error: ‘Tcw’ was not declared in this scope

   84 |                 Tcw.rotation_matrix()(0,0), Tcw.rotation_matrix()(0,1), Tcw.rotation_matrix()(0,2),

/mnt/d/slam14/slambook-master/project/0.2/test/run_vo.cpp:84:21: error: ‘using SE3d = class Sophus::SE3<double>’ {aka ‘class Sophus::SE3<double>’} has no member named ‘

rotation_matrix’; did you mean ‘rotationMatrix’?

   84 |                 Tcw.rotation_matrix()(0,0), Tcw.rotation_matrix()(0,1), Tcw.rotation_matrix()(0,2),

8.解决方案

将‘rotation_matrix’修改为‘rotationMatrix’即可。

9.编译问题

[100%] Linking CXX executable ../../bin/run_vo

/usr/bin/ld: CMakeFiles/run_vo.dir/run_vo.cpp.o: in function `char const* fmt::v8::detail::parse_replacement_field<char, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&>(char const*, char const*, fmt::v8::detail::format_string_checker<char, fmt::v8::detail::error_handler, Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> > >&)':

run_vo.cpp:(.text._ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_[_ZN3fmt2v86detail23parse_replacement_fieldIcRNS1_21format_string_checkerIcNS1_13error_handlerEJN5Eigen9TransposeINS5_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEEEEEPKT_SE_SE_OT0_]+0x163): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'

9.解决方案

没有链接fmt库,链接上fmt 库就没问题了,将CMakeLists.txt中:

add_executable( run_vo run_vo.cpp )

target_link_libraries( run_vo myslam )

改为:

add_executable( run_vo run_vo.cpp )

target_link_libraries( run_vo myslam fmt)

10.编译问题

/mnt/d/slam14/slambook-master/project/0.4/src/g2o_types.cpp:7:16: error: ‘SE3’ in namespace ‘g2o’ does not name a type

    7 |     const g2o::SE3* point = static_cast<const g2o::SE3*> ( _vertices[0] );

      |                ^~~

/mnt/d/slam14/slambook-master/project/0.4/src/g2o_types.cpp:9:52: error: ‘point’ was not declared in this scope

    9 |     _error = _measurement - pose->estimate().map ( point->estimate() );

      |                                                    ^~~~~

10.解决方案

在头文件g2o_types.h中添加以下头文件引用即可:

#include <g2o/core/base_vertex.h>

#include <g2o/core/base_binary_edge.h>

#include <g2o/core/block_solver.h>

#include <g2o/core/optimization_algorithm_levenberg.h>

#include <g2o/solvers/eigen/linear_solver_eigen.h>

#include <g2o/types/slam3d/types_slam3d.h>

#include <g2o/types/slam3d/types_slam3d.h>

#include <g2o/core/sparse_optimizer.h>

#include <g2o/core/block_solver.h>

#include <g2o/core/factory.h>

#include <g2o/core/optimization_algorithm_factory.h>

#include <g2o/core/optimization_algorithm_gauss_newton.h>

#include <g2o/core/robust_kernel.h>

#include <g2o/core/robust_kernel_factory.h>

#include <g2o/core/optimization_algorithm_levenberg.h>

#include <g2o/solvers/eigen/linear_solver_eigen.h>

#include <g2o/solvers/csparse/linear_solver_csparse.h>

#参考链接:ORB_SLAM之error: ‘Sim3’ in namespace ‘g2o’ does not name a type简单暴力解决问题_英雄小摔哥的博客-CSDN博客

11.编译问题

[100%] Linking CXX executable ../../bin/run_vo

/usr/bin/ld: ../../bin/run_vo: hidden symbol `_ZNK3fmt2v86detail10locale_ref3getISt6localeEET_v' in /usr/local/lib/libfmt.a(format.cc.o) is referenced by DSO

/usr/bin/ld: final link failed: bad value

collect2: error: ld returned 1 exit status

make[2]: *** [test/CMakeFiles/run_vo.dir/build.make:154: ../bin/run_vo] Error 1

make[1]: *** [CMakeFiles/Makefile2:142: test/CMakeFiles/run_vo.dir/all] Error 2

make: *** [Makefile:91: all] Error 2

11.解决方案

本以为安装将gcc,g++版本升级到6.5之后解决了,一查gcc/g++版本是9.4.0的适配Ubuntu20.04LTS版本的,故此法不可行。

#参考链接

【Linux】报错/usr/bin/ld: demo: hidden symbol `__cpu_indicator_init‘ in /usr/lib/gcc/x86_64-linux-gnu/5/_怡宝2号_51CTO博客

后来考虑到跟fmt库兼容问题,重新安装Sophus库(编译命令中添加"-DUSE_BASIC_LOGGING=ON")编译问题依旧,故此法也行不通。

#参考链接hidden symbol `_ZNK3fmt2v86detail10locale_ref3getISt6localeEET_v‘_一个有梦想,有追求,有抱负的人-CSDN博客

//TODO有待解决,0.2、0.3、0.4项目中均有此编译问题

12.编译问题

[ 20%] Building CXX object src/CMakeFiles/myslam.dir/visual_odometry.cpp.o

In file included from /usr/local/include/g2o/solvers/csparse/csparse_helper.h:30,

                 from /usr/local/include/g2o/solvers/csparse/linear_solver_csparse.h:32,

                 from /mnt/d/slam14/slambook-master/project/0.4/include/myslam/g2o_types.h:51,

                 from /mnt/d/slam14/slambook-master/project/0.4/src/g2o_types.cpp:1:

/usr/local/include/g2o/solvers/csparse/csparse_extension.h:27:10: fatal error: cs.h: No such file or directory

   27 | #include <cs.h>

      |          ^~~~~~

compilation terminated.

make[2]: *** [src/CMakeFiles/myslam.dir/build.make:146: src/CMakeFiles/myslam.dir/g2o_types.cpp.o] Error 1

make[2]: *** Waiting for unfinished jobs....

In file included from /usr/local/include/g2o/solvers/csparse/csparse_helper.h:30,

                 from /usr/local/include/g2o/solvers/csparse/linear_solver_csparse.h:32,

                 from /mnt/d/slam14/slambook-master/project/0.4/include/myslam/g2o_types.h:51,

                 from /mnt/d/slam14/slambook-master/project/0.4/src/visual_odometry.cpp:28:

/usr/local/include/g2o/solvers/csparse/csparse_extension.h:27:10: fatal error: cs.h: No such file or directory

   27 | #include <cs.h>

      |          ^~~~~~

compilation terminated.

make[2]: *** [src/CMakeFiles/myslam.dir/build.make:160: src/CMakeFiles/myslam.dir/visual_odometry.cpp.o] Error 1

make[1]: *** [CMakeFiles/Makefile2:116: src/CMakeFiles/myslam.dir/all] Error 2

make: *** [Makefile:91: all] Error 2

12.解决方案

//TODO有待解决, 0.4项目中均有此编译问题

  1. slambook-master/ch10

1.编译问题

/mnt/d/slam14/slambook-master/ch10/ceres_custombundle/common/BALProblem.cpp:8:10: fatal error: Eigen/Core: No such file or directory

8 | #include <Eigen/Core>

1.解决方案

在CMakeLists中添加"/usr/include/eigen3",如下所示:

include_directories(${CERES_INCLUDE_DIRS}

                    ${PROJECT_SOURCE_DIR}/common

                    ${PROJECT_SOURCE_DIR}/common/tools

                    ${PROJECT_SOURCE_DIR}/common/flags

                                   "/usr/include/eigen3" )

2.编译问题

[ 83%] Building CXX object CMakeFiles/ceres_customBundle.dir/ceresBundle.cpp.o

In file included from /usr/local/include/ceres/internal/parameter_dims.h:37,

                 from /usr/local/include/ceres/internal/autodiff.h:151,

                 from /usr/local/include/ceres/autodiff_cost_function.h:130,

                 from /usr/local/include/ceres/ceres.h:37,

                 from /mnt/d/slam14/slambook-master/ch10/ceres_custombundle/ceresBundle.cpp:3:

/usr/local/include/ceres/internal/integer_sequence_algorithm.h:64:21: error: ‘integer_sequence’ is not a member of ‘std’

   64 | struct SumImpl<std::integer_sequence<T, N, Ns...>> {

2.解决方案

在CMakeLists中添加set( CMAKE_CXX_STANDARD 14)

3.编译问题

/mnt/d/slam14/slambook-master/ch10/ceres_custombundle/ceresBundle.cpp:17:14: error: ‘struct ceres::Solver::Options’ has no member named ‘num_linear_solver_threads’; did you mean ‘linear_solver_type’?

   17 |     options->num_linear_solver_threads = params.num_threads;

      |              ^~~~~~~~~~~~~~~~~~~~~~~~~

      |              linear_solver_type

3.解决方案

规避的话注释掉options->num_linear_solver_threads = params.num_threads;

//options->num_linear_solver_threads = params.num_threads;

更好的方法是用“options->num_threads = params.num_threads;”替换原来的“options->num_linear_solver_threads = params.num_threads;”

这是因为“Solver::Options::num_linear_solver_threads is deprecated, Solver::Options::num_threads controls all parallelism in Ceres Solver now.“

4.编译问题

slambook-master/ch10/ceres_custombundle/build# ./ceres_customBundle

Usage: bundle_adjuster -input <path for dataset>

4.解决方案

运行命令应该按照bundle_adjuster -input <path for dataset>,故修改运行命令如下:

./ceres_customBundle -input ../data/problem-16-22106-pre.txt

5.编译问题

[ 83%] Building CXX object CMakeFiles/g2o_customBundle.dir/g2o_bundle.cpp.o

In file included from /usr/local/include/g2o/types/sba/edge_project_psi2uv.h:30,

                 from /usr/local/include/g2o/types/sba/types_six_dof_expmap.h:38,

                 from /mnt/d/slam14/slambook-master/ch10/g2o_custombundle/g2o_bundle.cpp:25:

/usr/local/include/g2o/core/base_fixed_sized_edge.h:199:32: error: ‘index_sequence’ is not a member of ‘std’

  199 |   struct HessianTupleType<std::index_sequence<Ints...>> {

5.解决方案

在CMakeLists中添加set( CMAKE_CXX_STANDARD 14)

6.编译问题

[ 83%] Building CXX object CMakeFiles/g2o_customBundle.dir/g2o_bundle.cpp.o

/mnt/d/slam14/slambook-master/ch10/g2o_custombundle/g2o_bundle.cpp: In function ‘void SetMinimizerOptions(std::shared_ptr<g2o::BlockSolver<g2o::BlockSolverTraits<9, 3> > >&, const BundleParams&, g2o::SparseOptimizer*)’:

/mnt/d/slam14/slambook-master/ch10/g2o_custombundle/g2o_bundle.cpp:136:74: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::__shared_ptr<g2o::BlockSolver<g2o::BlockSolverTraits<9, 3> >, __gnu_cxx::_S_atomic>::element_type*)’

  136 |         solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr.get());

6.解决方案

//this function is  unused yet..

//void SetMinimizerOptions(std::shared_ptr<BalBlockSolver>& solver_ptr, const BundleParams& params, g2o::SparseOptimizer* optimizer)

void SetMinimizerOptions(std::unique_ptr<BalBlockSolver>& solver_ptr, const BundleParams& params, g2o::SparseOptimizer* optimizer)

{

    //std::cout<<"Set Minimizer  .."<< std::endl;

    g2o::OptimizationAlgorithmWithHessian* solver;

    if(params.trust_region_strategy == "levenberg_marquardt"){

        //solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr.get());

              solver = new g2o::OptimizationAlgorithmLevenberg(std::move(solver_ptr));

    }

    else if(params.trust_region_strategy == "dogleg"){

        //solver = new g2o::OptimizationAlgorithmDogleg(solver_ptr.get());

              solver = new g2o::OptimizationAlgorithmDogleg(std::move(solver_ptr));

    }

    else

    {

        std::cout << "Please check your trust_region_strategy parameter again.."<< std::endl;

        exit(EXIT_FAILURE);

    }

    optimizer->setAlgorithm(solver);

    //std::cout<<"Set Minimizer  .."<< std::endl;

}

void SetSolverOptionsFromFlags(BALProblem* bal_problem, const BundleParams& params, g2o::SparseOptimizer* optimizer)

{  

    //BalBlockSolver* solver_ptr;

   

   

    //g2o::LinearSolver<BalBlockSolver::PoseMatrixType>* linearSolver = 0;

       std::unique_ptr<BalBlockSolver::LinearSolverType> linearSolver;

   

    if(params.linear_solver == "dense_schur" ){

        //linearSolver = new g2o::LinearSolverDense<BalBlockSolver::PoseMatrixType>();

              linearSolver = g2o::make_unique<g2o::LinearSolverDense<BalBlockSolver::PoseMatrixType> >();

    }

    else if(params.linear_solver == "sparse_schur"){

        //linearSolver = new g2o::LinearSolverCholmod<BalBlockSolver::PoseMatrixType>();

        //dynamic_cast<g2o::LinearSolverCholmod<BalBlockSolver::PoseMatrixType>* >(linearSolver)->setBlockOrdering(true);  // AMD ordering , only needed for sparse cholesky solver

         auto cholesky = g2o::make_unique<g2o::LinearSolverCholmod<BalBlockSolver::PoseMatrixType> >();

        cholesky->setBlockOrdering(true);

        linearSolver = std::move(cholesky);

       }

   

    //solver_ptr = new BalBlockSolver(linearSolver);

       std::unique_ptr<BalBlockSolver> solver_ptr( new BalBlockSolver(std::move(linearSolver)));

    //SetLinearSolver(solver_ptr, params);

    //SetMinimizerOptions(solver_ptr, params, optimizer);

    g2o::OptimizationAlgorithmWithHessian* solver;

    if(params.trust_region_strategy == "levenberg_marquardt"){

        //solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr);

              solver = new g2o::OptimizationAlgorithmLevenberg(std::move(solver_ptr));

    }

    else if(params.trust_region_strategy == "dogleg"){

        //solver = new g2o::OptimizationAlgorithmDogleg(solver_ptr);

              solver = new g2o::OptimizationAlgorithmDogleg(std::move(solver_ptr));

    }

    else

    {

        std::cout << "Please check your trust_region_strategy parameter again.."<< std::endl;

        exit(EXIT_FAILURE);

    }

    optimizer->setAlgorithm(solver);

}

7.编译问题

slambook-master/ch10/g2o_custombundle/ceres/autodiff.h:225:11: error: ‘class ceres::internal::FixedArray<ceres::Jet<double, 12>, 17, Eigen::aligned_allocator<ceres::Jet<double, 12> > >’ has no member named ‘get’

  225 |         x.get() + jet0,

      |         ~~^~~

7.解决方案

//TODO有待解决

8.编译问题

slambook-master/ch10/g2o_custombundle/g2o_bundle.cpp:169:63:   required from here

/usr/include/c++/9/ext/new_allocator.h:146:4: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<9, 3> >::BlockSolver(g2o::LinearSolver<Eigen::Matrix<double, 9, 9, 0, 9, 9> >*&)’

  146 |  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

8.解决方案

//TODO未解决

  1. slambook-master/ch11

1.编译问题

(1)slambook-master/ch11/pose_graph_gtsam.cpp:6:10: fatal error: sophus/se3.h: No such file or directory

    6 | #include <sophus/se3.h>

      |          ^~~~~~~~~~~~~~

(2)slambook-master/ch11/pose_graph_g2o_lie_algebra.cpp:15:10: fatal error: sophus/se3.h: No such file or directory

   15 | #include <sophus/se3.h>

1.解决方案

(1)将slambook-master/ch11/pose_graph_gtsam.cpp:6中代码修改如下:

//#include <sophus/se3.h>

//#include <sophus/so3.h>

#include <sophus/se3.hpp>

#include <sophus/so3.hpp>

(2)将slambook-master/ch11/pose_graph_g2o_lie_algebra.cpp:15中代码修改如下:

//#include <sophus/se3.h>

//#include <sophus/so3.h>

#include <sophus/se3.hpp>

#include <sophus/so3.hpp>

2.编译问题

[ 66%] Built target pose_graph_gtsam

In file included from /usr/local/include/g2o/core/base_binary_edge.h:30,

                 from /mnt/d/slam14/slambook-master/ch11/pose_graph_g2o_lie_algebra.cpp:7:

/usr/local/include/g2o/core/base_fixed_sized_edge.h:199:32: error: ‘index_sequence’ is not a member of ‘std’

  199 |   struct HessianTupleType<std::index_sequence<Ints...>> {

2.解决方案

在CMakeLists中添加C++14编译

set( CMAKE_CXX_STANDARD 14)

3.编译问题

slambook-master/ch11/pose_graph_g2o_lie_algebra.cpp:33:21: error: missing template arguments before ‘e’

   33 | Matrix6d JRInv( SE3 e )

3.解决方案

将SE3修改为SE3<double>

类似的问题将SO3修改为SO3<double>

4.编译问题

slambook-master/ch11/pose_graph_g2o_SE3.cpp:38:103: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(Block*&)’

   38 |     g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg( solver_ptr );

4.解决方案

将pose_graph_g2o_lie_algebra.cpp和pose_graph_g2o_SE3.cpp中相关代码修改为:

typedef g2o::BlockSolver<g2o::BlockSolverTraits<6,6>> Block;  // 6x6 BlockSolver

    //Block::LinearSolverType* linearSolver = new g2o::LinearSolverCholmod<Block::PoseMatrixType>(); // 线性方程求解器

       std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverCholmod<Block::PoseMatrixType>());

       //Block* solver_ptr = new Block ( linearSolver );     // 矩阵块求解器

      std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

    // 梯度下降方法,从GN, LM, DogLeg 中选

       //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr );

       g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( std::move(solver_ptr));

5.编译问题

slambook-master/ch11/pose_graph_g2o_lie_algebra.cpp:77:67: error: no matching function for call to ‘Sophus::SO3<double>::SO3(const double&, const double&, const double&)’

   77 |             Sophus::SO3<double> ( update[3], update[4], update[5] ),

5.解决方案

//TODO 有待解决

  1. slambook-master/ch12

1.编译问题

CMake Error at CMakeLists.txt:8 (find_package):

  Could not find a configuration file for package "OpenCV" that is compatible

  with requested version "3.1".

  The following configuration files were considered but not accepted:

/usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.5

1.解决方案

将CMakeLists改为:

# opencv

#find_package( OpenCV 3.1 REQUIRED )

find_package( OpenCV REQUIRED )

2.编译问题

-- Build files have been written to: /mnt/d/slam14/slambook-master/ch12/build

make[2]: *** No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'feature_training'.  Stop.

make[2]: *** Waiting for unfinished jobs....

make[2]: *** No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'loop_closure'.  Stop.

make[2]: *** Waiting for unfinished jobs....

make[2]: *** No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'gen_vocab'.  Stop.

make[2]: *** Waiting for unfinished jobs....

[ 50%] Building CXX object CMakeFiles/gen_vocab.dir/gen_vocab_large.cpp.o

[ 50%] Building CXX object CMakeFiles/loop_closure.dir/loop_closure.cpp.o

[ 50%] Building CXX object CMakeFiles/feature_training.dir/feature_training.cpp.o

make[1]: *** [CMakeFiles/Makefile2:139: CMakeFiles/gen_vocab.dir/all] Error 2

make[1]: *** Waiting for unfinished jobs....

make[1]: *** [CMakeFiles/Makefile2:87: CMakeFiles/feature_training.dir/all] Error 2

make[1]: *** [CMakeFiles/Makefile2:113: CMakeFiles/loop_closure.dir/all] Error 2

make: *** [Makefile:91: all] Error 2

2.解决方案

由于/usr/local/lib/中只有libDBoW3.so没有libDBoW3.a,将CMakeLists中libDBoW3.a改为libDBoW3.so即可,如下所示:

#set( DBoW3_LIBS "/usr/local/lib/libDBoW3.a" )

set( DBoW3_LIBS "/usr/local/lib/libDBoW3.so" )

#参考链接

make[2]: *** No rule to make target ‘/usr/local/lib/libDBoW3.a‘, needed by ‘feature_training‘. Stop_听雪楼主长恨水的博客-CSDN博客

高翔视觉slam十四讲第二版第十一章DBow3词库安装与出现的问题 - JavaShuo

  1. slambook-master/ch13

1.编译问题

[ 75%] Building CXX object CMakeFiles/pointcloud_mapping.dir/pointcloud_mapping.cpp.o

In file included from /usr/local/include/pcl-1.12/pcl/pcl_macros.h:74,

                 from /usr/local/include/pcl-1.12/pcl/impl/point_types.hpp:42,

                 from /usr/local/include/pcl-1.12/pcl/point_types.h:354,

                 from /mnt/d/slam14/slambook-master/ch13/dense_RGBD/pointcloud_mapping.cpp:9:

/usr/local/include/pcl-1.12/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above

    7 |   # PCL requires C++14 or above

      |    ^~~~~

1.解决方案

在CMakeLists中添加

set( CMAKE_CXX_STANDARD 14)

2.编译问题

slambook-master/ch13/dense_RGBD/build# ./octomap_mapping

cannot find pose file

slambook-master/ch13/dense_RGBD/build# ./pointcloud_mapping

cannot find pose file

2.解决方案

回退到源码目录,执行./build/pointcloud_mapping命令,如下:

slambook-master/ch13/dense_RGBD# ./build/pointcloud_mapping

Segmentation fault

//TODO有待解决,可能是由于UI界面显示问题导致的

3.编译问题

CMake Error at CMakeLists.txt:11 (find_package):

  Could not find a configuration file for package "OpenCV" that is compatible

  with requested version "3.1".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.5.5

3.解决方案

将CMakeLists改为:

# opencv

#find_package( OpenCV 3.1 REQUIRED )

find_package( OpenCV REQUIRED )

4.编译问题

slambook-master/ch13/dense_monocular/dense_mapping.cpp:8:10: fatal error: sophus/se3.h: No such file or directory

    8 | #include <sophus/se3.h>

4.解决方案

// for sophus

//#include <sophus/se3.h>

#include <sophus/se3.hpp>

5.编译问题

/mnt/d/slam14/slambook-master/ch13/dense_monocular/dense_mapping.cpp:402:34: error: ‘CV_GRAY2BGR’ was not declared in this scope

  402 |     cv::cvtColor( ref, ref_show, CV_GRAY2BGR );

5.解决方案

这是由于OpenCV版本更新导致的,用COLOR_GRAY2BGR替换掉CV_GRAY2BGR即可。

6.编译问题

slambook-master/ch13/dense_monocular/dense_mapping.cpp:51:15: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, class _Alloc> class std::vector’

   51 |     vector<SE3>& poses

      |               ^

/mnt/d/slam14/slambook-master/ch13/dense_monocular/dense_mapping.cpp:51:15: note:   expected a type, got ‘SE3’

/mnt/d/slam14/slambook-master/ch13/dense_monocular/dense_mapping.cpp:51:15: error: template argument 2 is invalid

/mnt/d/slam14/slambook-master/ch13/dense_monocular/dense_mapping.cpp:58:11: error: invalid use of template-name ‘Sophus::SE3’ without an argument list

   58 |     const SE3& T_C_R,

6.解决方案

//TODO

将SE3修改为SE3d,例如:

//using Sophus::SE3;

using Sophus::SE3d;

7.编译问题

/mnt/d/slam14/slambook-master/ch13/dense_monocular/dense_mapping.cpp:351:25: error: ‘using SE3d = class Sophus::SE3<double>’ {aka ‘class Sophus::SE3<double>’} has no member named ‘rotation_matrix’; did you mean ‘rotationMatrix’?

  351 |     Vector3d f2 = T_R_C.rotation_matrix() * f_curr;

      |                         ^~~~~~~~~~~~~~~

      |                         rotationMatrix

7.解决方案

将‘rotation_matrix’修改为‘rotationMatrix’

8.编译问题

[100%] Linking CXX executable dense_mapping

/usr/bin/ld: CMakeFiles/dense_mapping.dir/dense_mapping.cpp.o: in function `Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize() [clone .part.0]':

dense_mapping.cpp:(.text+0x171): undefined reference to `fmt::v8::vprint(fmt::v8::basic_string_view<char>, fmt::v8::basic_format_args<fmt::v8::basic_format_context<fmt::v8::appender, char> >)'

/usr/bin/ld: CMakeFiles/dense_mapping.dir/dense_mapping.cpp.o: in function `updateDepthFilter(Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, Sophus::SE3<double, 0> const&, cv::Mat&, cv::Mat&)':

8.解决方案

在CMakeLists中添加fmt库链接,如下所示:

#target_link_libraries( dense_mapping ${THIRD_PARTY_LIBS})

target_link_libraries( dense_mapping ${THIRD_PARTY_LIBS} fmt)

9.编译问题

slambook-master/ch13/dense_RGBD# pcl_viewer map.pcd

2022-02-09 00:18:10.525 (   0.158s) [        7B4A0800] vtkContextDevice2D.cxx:32    WARN| Error: no override found for 'vtkContextDevice2D'.

The viewer window provides interactive commands; for help, press 'h' or 'H' from within the window.

> Loading map.pcd 2022-02-09 00:18:10.964 (   0.597s) [        7B4A0800]vtkXOpenGLRenderWindow.:1212   ERR| vtkXOpenGLRenderWindow (0x5606ef7f5b80): bad X server connection. DISPLAY=

Aborted

9.解决方案

//TODO有待解决掉其他问题后一并解决

应该是由于wsl没有安装UI界面,导致编译的程序调用界面显示时不能显示所致。

其他说明

slambook-master/ch13/dense_monocular编译完后,需要下载remode_test_data.zip并解压到源码目录(下载链接http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip)。然后进入slambook-master/ch13/dense_monocular/build目录,执行./dense_mapping ../test_data即可运行。

#参考链接【读书笔记】《视觉SLAM十四讲(高翔著)》 第13讲_dahailuoa6的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《视觉SLAM十四讲》第一版源码slambook编译调试 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include

随机推荐

  • 时间数组传到数据库

    1 数据库 有数据 想精确到时分秒 就写datatime 不想要就写data 2 vue页面 写一个数组 可以放 开始时间 结束时间 3 把dataRange数组的索引 0 赋给workTimeBegin 1 赋给workTimeEnd 这
  • 给exe添加管理员权限的几种方法&修改exe兼容性属性的方法

    有些程序我们必须以管理员权限才能运行 但是我们又不想 右键 gt 以管理员权限运行 那么我们就只有给exe增加管理员权限了 1 如果是vs编译的exe可以通过配置属性 项目 XXX 属性 配置属性 链接器 清单文件 然后重新编译 可以根据需
  • delphi .dfm文件汉字不显示_搞定Delphi模块化之Package

    Package的优点 应用程序可以被高度的模块化 而且可以逐渐交付完成的功能给客户 维护方便 可以只更新单一的模块功能 提升程序的载入速度 Package的缺点 有些情形下使用Package只能间接的方式取得资料 变量 类 Package
  • springboot项目上传文件过大导致java heap space 的问题解决方案(windows和linux)

    windows 点击项目 run as debug as Run Configuration Debug Configuration java application Arguments Xmx1024m Xms1024m XX NewRa
  • 万物云原生下的服务进化

    导读 在万物云原生下的环境下 Java的市场份额也因耗资源 启动慢等缺点 导致在云原生环境里被放大而降低 通过这篇文章 读者可以更好地了解如何在云原生环境下通过升级相关版本和使用GraalVM打出原生镜像到方式 优化Java应用的性能和资源
  • 【详细齐全】FIO使用方法 及参数解析(文章末尾)

    linux 使用FIO测试磁盘iops 方法详解 FIO是测试IOPS的非常好的工具 用来对硬件进行压力测试和验证 支持13种不同的I O引擎 包括 sync mmap libaio posixaio SG v3 splice null n
  • 安装fastdfs及java操作

    1 安装 libfastcommon git地址 https github com happyfish100 libfastcommon git 安装 git clone https github com happyfish100 libf
  • key-value数据库

    传统的文件系统中 需要维护目录的层次结构 使用dentry inode directory等复杂结构保存元数据的信息 而面对更多定制文件系统的需求 越来越多的系统考虑使用key value形式保存文件系统中的元数据信息 使用数据库来保存这些
  • Windows 安装完mysql 后 配置环境变量、重置密码、开启远程连接

    第一步 配置环境变量 系统变量 Path在最后一段添加 D ruanjian mysql 8 0 17 winx64 bin 这个是你安装mysql bin的位置 第二步用临时密码登录并重置密码 mysql gt mysql u root
  • yum默认安装位置及被占进程运行:/var/run/yum.pid 已被锁定,PID 为 4032 的另一个程序正在运行。

    yum install XX 默认安装位置是 usr lib64 在安装过程出现下面进程被占用 解决 rm f var run yum pid
  • 9个开源自动化测试框架,质量保证测试工程师用起来

    自动化测试框架由一组最佳实践 通用工具和库组成 可帮助测试人员评估多个Web和移动应用的功能 安全性 可用性和可访问性 而在 软件开发世界中有很多的自动化测试框架 该如何选择 虽然技术团队可以构建复杂的自动化测试框架 但是当可以选择现有的开
  • Git 补丁— diff 和 patch 使用详解

    Git 补丁 diff 和 patch 使用详解 1 diff 和 patch 的区别 2 生成patch 2 1 git diff 3 git format patch 3 应用patch 4 冲突解决 题外话 1 diff 和 patc
  • flutter 图片加载和预览实现

    注 本文只提供了思路 并无完整性demo 使用的是cached network image 因为版本变革经常头大 而且需要自己对源码做些修改 建议github fork一下 然后导入自己的地址 类似 dependencies cached
  • Spider(网络蜘蛛)之ajax爬取douban电影排行和kfc门店数据

    爬前注意 首先douban的接口请求方式是get简单一点 寻找规律可以爬取数据 kfc的接口方式是post data所需要parse urlencode data encode utf 8 需要编码 编码和解码是两个相反的过程 字节 lt
  • 分布式事务框架Seata

    分布式事务框架Seata sei达 一 分布式事务前言 1 数据库管理系统中事务 transaction 的四个特性 简称ACID 这种特性简称刚性事物 原子性 Atomicity 原子性是指事务是一个不可再分割的工作单元 事务中的操作要么
  • 特征选择--scikit-learn

    特征选择 Feature Selection choosing a subset of all the features the ones more informative 最终得到的特征选是原来特征的一个子集 特征选取是机器学习领域非常重
  • synchronized方法和代码块

    1 同步 由于多线程并发存在数据不安全问题 为了保证数据的安全性需要一些特殊的手段来维持 数据不安全主要是针对修改来说的 如果一个数据只能读不能修改几乎不会产生什么安全问题 只有修改数据的时候容易产生一些差错导致多线程并发造成数据不安全 从
  • 清理 Ubuntu 系统的 4 个简单步骤

    清理 Ubuntu 系统的 4 个简单步骤 现在 试试看这 4 个简单的步骤 来清理你的 Ubuntu 系统吧 这份精简指南将告诉你如何清理 Ubuntu 系统以及如何释放一些磁盘空间 如果你的 Ubuntu 系统已经运行了至少一年 尽管系
  • js类型检测

    1 检测是否是字符串 function isString obj return Object prototype toString call obj object String 2 检测是否是对象 function isObject obj
  • 《视觉SLAM十四讲》第一版源码slambook编译调试

    slambook master ch2 编译正常 log如下 slambook master ch2 mkdir build cd build cmake make j8 The C compiler identification is G