SLAM学习笔记 | slambook2

1 资源

slambook2g2o-20230223_gitgoogle-glog 0.6.0Ceres 2.1.0DBow3

2 配置

3 运行

ch2、ch3、ch4、ch5imageBasics与slambook基本一致,详情可以看我这篇文章:
持续更新 SLAM学习笔记 | 全过程含资源 | Linux环境
在slambook2中,CMakeList.txt在章节文件夹中,按章节编译运行。

3.1 ch5

1)修改CMakeList.txt中c++的标准支持的c++11 -02c++14 -03,并添加fmt库。由于笔者的Eigen是通过cmake编译安装的,所以安装在/usr/lcoal/include中,如果通过apt安装,则无需修改:

// slambook2/ch5/CMakeList.txt
set(CMAKE_CXX_FLAGS "-std=c++14 -O3")
// include_directories("/usr/include/eigen3")
include_directories("/usr/local/include/eigen3")
include_directories("/usr/local/include/fmt")

ch5/rgbd/CMakeList.txt中添加对fmt的链接:

// target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} )
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} fmt)

2)编译imageBasicsrgbdstereo

cd ~/pkgs/slambook2/ch5
mkdir build && cd build
cmake ..
make -j2

编译完成好,在build文件夹中就能看到对应的三个文件夹:

ls ~/pkgs/slambook2/ch5/build/

在这里插入图片描述
3)首先运行rgbd,我们编译好的joinMap可执行文件在ch5/build/rgbd下,我们需要将其拷贝到ch5/rgbd文件夹下才可以运行:
在这里插入图片描述

# 复制joinMap到有pose.txt、文件夹color、文件夹depth的目录
cd ~/pkgs/slambook2/ch5/build/rgbd/
cp joinMap ../../rgbd
# 运行
./joinMap pose.txt

运行结果:鼠标左键平移,右键旋转
在这里插入图片描述
4)接着运行stereo,同样将ch5/build/stereo的可执行文件stereoVision拷贝到ch5/stereo目录下:

# 复制stereoVision到有left.png、right.png的目录
cd ~/pkgs/slambook2/ch5/build/stereo/
cp stereoVision ../../stereo
# 运行
./stereoVision

运行结果:鼠标左键平移,右键旋转
在这里插入图片描述
在这里插入图片描述

3.2 ch6

1)修改CMakeList.txt中Eigen库的位置及c++标准支持:

// include_directories("/usr/include/eigen3")
include_directories("/usr/local/include/eigen3")
// set(CMAKE_CXX_FLAGS "-std=c++14 -O3")
set(CMAKE_CXX_FLAGS "-std=c++17")

2)编译

cd ~/pkgs/slambook2/ch6
mkdir build && cd build
cmake ..
make -j2

报错:没有找到Ceres
在这里插入图片描述
安装Ceres
再次编译,依旧报错‘make_unique’ is not a member of ‘g2o’
在这里插入图片描述
这类问题通常是g2o的版本导致的
3)重新下载g2o_20230223_git,具体的安装过程参考(安装g2o)。安装完后再次编译,ceresCurveFitting.cppgaussNewton.cpp编译通过,g2oCurveFitting.cpp依旧有大量错误,看错误的代码,应该是glog的问题。
4)无奈重新安装google-glog 0.6.0,安装完成后再次编译,结果又提示找不到Ceres。。。。。。再次安装Ceres ,这一次下载Ceres 2.1.0的版本。经过漫长的编译和安装后,再次make -j2终于成功!!!
在这里插入图片描述

g2o、glog、Ceres之间存在相互依赖关系,总结还是版本的问题:
g2o_20230223_git => google-glog 0.6.0 => Ceres 2.1.0

5)最后./g2oCurveFitting ./gaussNewton 查看运行结果:
在这里插入图片描述
在这里插入图片描述

3.3 ch7

问题1 OpenCV版本问题
解决方法:在CMakeLists.txt中将find_package( OpenCV3.0 REQUIRED )中的3.0改为对应版本。笔者下载的是4.6.0吗,所以这里改成4

#find_package(OpenCV 3 REQUIRED)
find_package(OpenCV 4 REQUIRED)

问题2 error: ‘CV_LOAD_IMAGE_COLOR’ was not declared in this scope
解决方法:在ch7文件夹中每一个.cpp文件中都引入头文件:

#include "opencv2/imgcodecs/legacy/constants_c.h"

或直接替换报错代码:

CV_LOAD_IMAGE_UNCHANGED  = -1 ( = cv::IMREAD_UNCHANGED),
CV_LOAD_IMAGE_GRAYSCALE  = 0  ( = cv::IMREAD_GRAYSCALE),
CV_LOAD_IMAGE_COLOR      = 1  ( = cv::IMREAD_COLOR),
CV_LOAD_IMAGE_ANYDEPTH   = 2  ( = cv::IMREAD_ANYDEPTH),

问题3 error: ‘index_sequence’ is not a member of ‘std’
解决方法:在CMakeList.txt中将set(CMAKE_CXX_FLAGS "-std=c++11 -O2 ${SSE_FLAGS} -msse4")替换如下:

set(CMAKE_CXX_FLAGS "-std=c++14 -O2 ${SSE_FLAGS} -msse4")

问题4 CV_FM_8P0INT was not declared
解决方法:将CV_FM_8P0INT改为:

cv::FM_8P0INT

问题5 undefined reference to fmt::v10::vprint(fmt::v10::basic_string_view<char>, fmt::v10::basic_format_args<fmt::v10::context>
解决方法:在CMakeList.txtinclude_directories添加fmt的头文件路径,并在target_link_libraries中链接:

include_directories(
        ${OpenCV_INCLUDE_DIRS}
        ${G2O_INCLUDE_DIRS}
        ${Sophus_INCLUDE_DIRS}
        "/usr/include/eigen3/"
        "/usr/local/include/fmt")
target_link_libraries(pose_estimation_2d2d ${OpenCV_LIBS} fmt)
target_link_libraries(pose_estimation_3d2d
        g2o_core g2o_stuff
        ${OpenCV_LIBS} fmt)
        add_executable(pose_estimation_3d3d pose_estimation_3d3d.cpp)
target_link_libraries(pose_estimation_3d3d
        g2o_core g2o_stuff
        ${OpenCV_LIBS} fmt)

1)笔者在第七章遇到的所有问题都记录如上,希望对大家有帮助。修改完成后编译:

cd ~/pkgs/slambook2/ch7/
mkdir build && cd build
cmake ..
make -j2

编译成功,并产生可执行文件:
在这里插入图片描述
2)运行orb_cv,在build文件夹下执行:

./orb_cv ../1.png ../2.png

运行结果:
在这里插入图片描述
在这里插入图片描述
3)运行orb_self,由于orb_self要同1.png2.png在同一目录下,故在build文件夹下执行:

cp orb_self ../
cd ..
./orb_self

运行结果:
在这里插入图片描述
4)运行pose_estimation_2d3d,在build文件夹下执行:

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

5)运行pose_estimation_3d2d,在build文件夹下执行:

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

6)运行pose_estimation_3d3d,在build文件夹下执行:

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

7)运行triangulation,在build文件夹下执行:

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

运行结果:
在这里插入图片描述

3.4 ch8

问题1 identifier "CV_GRAY2BGR" is undefined
出现位置:optical_flow.cpp中第146行cv::cvtColor(img2, img2_single, CV_GRAY2BGR);direct_method.cpp中第208行cv::cvtColor(img2, img2_show, CV_GRAY2BGR);
解决方法:在optical_flow.cppdirect_method.cpp中引入头文件

#include <opencv2/imgproc/types_c.h>

问题2 ‘enable_if_t’ in namespace ‘std’ does not name a template type
出现类似std的报错基本上是c++标准的问题
解决方法:修改CMakeList.txtc++11c++14

set(CMAKE_CXX_FLAGS "-std=c++14 ${SSE_FLAGS} -g -O3 -march=native")

问题3 undefined reference to fmt::v10::vprint(fmt::v10::basic_string_view<char>, fmt::v10::basic_format_args<fmt::v10::context>
出现fmt::v10的保存,基本解决方法都是一样的
解决方法:在CMakeList.txtinclude_directories添加fmt的头文件路径,并在target_link_libraries中链接:

include_directories(
        ${OpenCV_INCLUDE_DIRS}
        ${G2O_INCLUDE_DIRS}
        ${Sophus_INCLUDE_DIRS}
        "/usr/include/eigen3/"
        ${Pangolin_INCLUDE_DIRS}
        "/usr/local/include/fmt"
)
target_link_libraries(optical_flow ${OpenCV_LIBS} fmt)
target_link_libraries(direct_method ${OpenCV_LIBS} ${Pangolin_LIBRARIES} fmt)

1)笔者在第八遇到的所有问题都记录如上,希望对大家有帮助。修改完成后编译:

cd ~/pkgs/slambook2/ch8/
mkdir build && cd build
cmake ..
make -j2

编译成功,并产生可执行文件:
在这里插入图片描述
2)运行direct_method,由于direct_method要同.png文件在同一目录下,故在build文件夹下执行:

cp direct_method ../
cd ..
./direct_method

运行结果(若干张,仅展示其中一张):
在这里插入图片描述
3)运行optical_flow,由于optical_flow要同.png文件在同一目录下,故在build文件夹下执行:

cp optical_flow ../
cd ..
./optical_flow

运行结果:
在这里插入图片描述

3.5 ch9

问题1 undefined reference to g2o::csparse::CSparse::
解决方法:参考文章
替换CMakeList.txt中的所有内容:

cmake_minimum_required(VERSION 2.8)
 
project(bundle_adjustment)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3 -std=c++14")
set( CMAKE_CXX_STANDARD 14)
 
if (POLICY CMP0072)
  set(OpenGL_GL_PREFERENCE LEGACY)
endif()

Find_Package(g2o REQUIRED)
Find_Package(Ceres REQUIRED)
Find_Package(Sophus REQUIRED)
Find_Package(fmt REQUIRED)
 
# SET(G2O_LIBS g2o_csparse_extension g2o_stuff g2o_core cxsparse)
SET(G2O_LIBS g2o::g2o_ceres_ad g2o::stuff g2o::opengl_helper g2o::core 
    g2o::g2o_hierarchical_library g2o::g2o_simulator_library   
    g2o::types_slam2d g2o::types_slam2d_addons  
    g2o::solver_pcg g2o::solver_dense g2o::solver_slam2d_linear 
    g2o::solver_structure_only g2o::solver_csparse g2o::csparse_extension g2o::solver_cholmod g2o::solver_eigen 
    # g2o::csparse_extension g2o::stuff g2o::core 
    cxsparse)
 
# Eigen
include_directories("/usr/include/eigen3")
include_directories("/usr/include/suitesparse/")
add_library(bal_common common.cpp)
add_executable(bundle_adjustment_g2o bundle_adjustment_g2o.cpp)
add_executable(bundle_adjustment_ceres bundle_adjustment_ceres.cpp)
target_link_libraries(bundle_adjustment_ceres Ceres::ceres fmt::fmt bal_common)
target_link_libraries(bundle_adjustment_g2o ${G2O_LIBS} fmt::fmt bal_common)

问题2 ./bundle_adjustment_g2o: error while loading shared libraries: libg2o_csparse_extension.so: cannot open shared object file: No such file or directory
解决方法:打开ld.so.conf

sudo gedit /etc/ld.so.conf

添加语句并保存:

/usr/local/lib

更新:

sudo ldconfig

1)修改完成后编译:

cd ~/pkgs/slambook2/ch9/
mkdir build && cd build
cmake ..
make -j4

编译成功,并产生可执行文件:
在这里插入图片描述
2)运行bundle_adjustment_ceres

cp bundle_adjustment_ceres ../
./bundle_adjustment_ceres problem-16-22106-pre.txt

报错:./bundle_adjustment_ceres: /home/zyr/miniconda3/lib/libstdc++.so.6: version GLIBCXX_3.4.30 not found (required by ./bundle_adjustment_ceres)
解决方法:重新创建软链接即可,注意自己libstdc++.so.6的路径

#ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /home/zyr/miniconda3/lib/libstdc++.so.6
ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 <Your libstdc++.so.6 Path>

再次运行bundle_adjustment_ceres成功,终端输出结果,生成final.plyinitial.ply文件。
3)运行bundle_adjustment_g2o

cp bundle_adjustment_g2o ../
./bundle_adjustment_g2o problem-16-22106-pre.txt

终端输出结果,生成final.plyinitial.ply文件。

3.6 ch10

这章编译比较顺利,修改CMakeList.txt中c++标准以及链接fmt即可,完整CMakeList.txt如下

cmake_minimum_required(VERSION 2.8)
project(pose_graph)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++14 -O2")
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
# Eigen
include_directories("/usr/include/eigen3")
include_directories("/usr/local/include/fmt")
# sophus 
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
# g2o 
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIRS})
add_executable(pose_graph_g2o_SE3 pose_graph_g2o_SE3.cpp)
target_link_libraries(pose_graph_g2o_SE3
        g2o_core g2o_stuff g2o_types_slam3d ${CHOLMOD_LIBRARIES}
        fmt)
add_executable(pose_graph_g2o_lie pose_graph_g2o_lie_algebra.cpp)
target_link_libraries(pose_graph_g2o_lie
        g2o_core g2o_stuff
        ${CHOLMOD_LIBRARIES}
        ${Sophus_LIBRARIES}
        fmt)

1)修改完后编译:

cd ~/pkgs/slambook2/ch10/
mkdir build && cd build
cmake ..
make -j4

编译成功,并产生可执行文件:
在这里插入图片描述
2)运行pose_graph_g2o_lie

cp pose_graph_g2o_lie ../
cd ..
./pose_graph_g2o_lie sphere.g2o

报错:Sophus ensure failed in function 'void Sophus::SO3Base<Derived>::normalize() [with Derived = Sophus::SO3<double>]', file '/usr/local/include/sophus/so3.hpp', line 320.
顶点类VertexSE3LieAlgebra的读入函数virtual bool read(istream& is)缺少返回值,会报以上错误。
解决方法:在pose_graph_g2o_lie_algebra.cpp代码的VertexSE3LieAlgebra函数最后(第55行)加上return true;,再次编译即可解决。

class VertexSE3LieAlgebra : public g2o::BaseVertex<6, SE3d> {
public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
    virtual bool read(istream &is) override {
        double data[7];
        for (int i = 0; i < 7; i++)
            is >> data[i];
        setEstimate(SE3d(
            Quaterniond(data[6], data[3], data[4], data[5]),
            Vector3d(data[0], data[1], data[2])
        ));
        return true; //添加
    }

再次编译成功,执行cp pose_graph_g2o_lie ../,然后./pose_graph_g2o_lie sphere.g2o,终端输出结果,生成result_lie.g2o,使用g2o_viewer查看结果:

g2o_viewer result_lie.g2o

在这里插入图片描述
3)运行pose_graph_g2o_SE3

cp pose_graph_g2o_SE3 ../
cd ..
./pose_graph_g2o_SE3 sphere.g2o

终端输出结果,生成result.g2o,使用g2o_viewer查看结果:

g2o_viewer result.g2o

在这里插入图片描述

3.7 ch11

问题1 首先安装DBoW3,make时出现如下错误:
error: ‘ostream’ in namespace ‘std’ does not name a type
error: ‘string’ in namespace ‘std’ does not name a type
error: ‘size_t’ has not been declared
error: ‘uint64_t’ does not name a type error: ‘std::ostream’ has not been declared
error: ‘std::istream’ has not been declared
error: ‘ostream’ in namespace ‘std’ does not name a type

解决方法:
/DBow3-master/src/BowVector.h中引入头文件:

#include <ostream>
#include <string>
#include <cstdint>

BowVector.h头文件引入完整代码:

#ifndef __D_T_BOW_VECTOR__
#define __D_T_BOW_VECTOR__

#include <map>
#include <vector>
#include "exports.h"
#include <ostream> //添加
#include <string> //添加
#include <cstdint> //添加
// #if _WIN32
// #include <cstdint>
// #endif

/DBow3-master/src/FeatureVector.h中引入头文:

#include <ostream>

修改完后,执行编译安装:

mkdir build && cd build
cmake ..
make -j4
sudo make install

问题2 Could not find a configuration file for package "OpenCV" that is compatible with requested version "3.1".
由OpenCV版本不匹配导致

解决方法:修改CMakeList.txt中OpenCV版本要求为自己安装的版本即可

# find_package( OpenCV 3.1 REQUIRED )
find_package( OpenCV 4 REQUIRED )

问题3
No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'loop_closure'.
No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'feature_training'.
No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'gen_vocab'.

解决方法:在CMakeList.txt中添加对DBoW3的动态链接

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

1)修改完后编译:

cd ~/pkgs/slambook2/ch11/
mkdir build && cd build
cmake ..
make -j4

编译成功,并产生可执行文件:
在这里插入图片描述
将三个可执行文件复制到ch11目录下:

cp feature_training ../
cp gen_vocab ../
cp loop_closure ../

2)运行feature_training

./feature_training

运行后生成vocabulary.yml.gz文件
3)运行loop_closure

./loop_closure

终端输出图像两两间的相似度评分
4)运行gen_vocab,报错:
terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid
这是由于传入空指针导致的

解决方法:修改代码,完整gen_vocab_large.cpp如下:

 #include "DBoW3/DBoW3.h"//词袋支持头文件
#include <opencv2/core/core.hpp>//opencv核心模块
#include <opencv2/highgui/highgui.hpp>//gui模块
#include <opencv2/features2d/features2d.hpp>//特征点头文件
#include <iostream>
#include <vector>
#include <string>
 
using namespace cv;
using namespace std;
 
 
int main( int argc, char** argv )
{
    String directoryPath = "/home/zyr/pkgs/slambook2/ch11/data";//图像路径
    vector<String> imagesPath;
    glob(directoryPath, imagesPath);
    cout<<"generating features ... "<<endl;//输出generating features (正在检测ORB特征)...
    vector<Mat> descriptors;//描述子
    Ptr< Feature2D > detector = ORB::create();
    int index = 1;
    for ( String path : imagesPath )
    {
        Mat image = imread(path);
        vector<KeyPoint> keypoints; //关键点
        Mat descriptor;//描述子
        detector->detectAndCompute( image, Mat(), keypoints, descriptor );
        descriptors.push_back( descriptor );
        cout<<"extracting features from image " << index++ <<endl;//输出extracting features from image(从图像中提取特征)
    }
    cout<<"extract total "<<descriptors.size()*500<<" features."<<endl;
 
    // create vocabulary
    cout<<"creating vocabulary, please wait ... "<<endl;//输出creating vocabulary, please wait (创建词典,请稍等)...
    DBoW3::Vocabulary vocab;
    vocab.create( descriptors );
    cout<<"vocabulary info: "<<vocab<<endl;
    vocab.save( "vocab_larger.yml.gz" );//保存词典
    cout<<"done"<<endl;
 
    return 0;
}

再次编译后运行成功,生成vocab_larger.yml.gz文件

3.8 ch12

问题1 error: ‘CV_GRAY2BGR’ was not declared in this scope
在OpenCV4中,CV_GRAY2BGR已被cv::COLOR_GRAY2BGR替换
解决方法:修改ch12/dense_mono/dense_mapping.cpp中所有的CV_GRAY2BGR

cv::COLOR_GRAY2BGR

问题2 error: ‘class pcl::MovingLeastSquares<pcl::PointXYZRGB, pcl::PointXYZRGBNormal>’ has no member named ‘setPolynomialFit’; did you mean ‘setPolynomialOrder’?
解决方法:修改ch12/dense_RGBD/surfel_mapping.cpp中(第31行)的setPolynomialFit()setPolynomialOrder()

SurfelCloudPtr reconstructSurface(
        const PointCloudPtr &input, float radius, int polynomial_order) {
    pcl::MovingLeastSquares<PointT, SurfelT> mls;
    pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
    mls.setSearchMethod(tree);
    mls.setSearchRadius(radius);
    mls.setComputeNormals(true);
    mls.setSqrGaussParam(radius * radius);
    // mls.setPolynomialFit(polynomial_order > 1); //修改为setPolynomialOrder
    mls.setPolynomialOrder(polynomial_order > 1);  
    mls.setPolynomialOrder(polynomial_order);
    mls.setInputCloud(input);
    SurfelCloudPtr output(new SurfelCloud);
    mls.process(*output);
    return (output);
}

问题3 undefined reference to fmt::v10::vprint(fmt::v10::basic_string_view<char>, fmt::v10::basic_format_args<fmt::v10::context>
出现fmt::v10的保存,基本解决方法都是一样的
解决方法:在CMakeList.txttarget_link_libraries中链接fmt即可
完整dense_RGBD/CMakeList.txt代码:

cmake_minimum_required(VERSION 2.8)

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-std=c++14 -O2")

# opencv 
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

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

# fmt
include_directories(${FMT_INCLUDE_DIRS})
find_package(FMT REQUIRED)

# pcl 
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})

# octomap 
find_package(octomap REQUIRED)
include_directories(${OCTOMAP_INCLUDE_DIRS})

add_executable(pointcloud_mapping pointcloud_mapping.cpp)
target_link_libraries(pointcloud_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} fmt::fmt) #链接fmt

add_executable(octomap_mapping octomap_mapping.cpp)
target_link_libraries(octomap_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} ${OCTOMAP_LIBRARIES} fmt::fmt) #链接fmt

add_executable(surfel_mapping surfel_mapping.cpp)
target_link_libraries(surfel_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} fmt::fmt) #链接fmt

完整dense_mono/CMakeList.txt代码:

cmake_minimum_required(VERSION 2.8)
project(dense_monocular)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++14 -march=native -O3")

# Eigen
include_directories("/usr/include/eigen3")
# OpenCV
find_package(OpenCV 4 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# Sophus
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
完整`dense_RGBD/CMakeList.txt`代码:
set(THIRD_PARTY_LIBS
        ${OpenCV_LIBS}
        ${Sophus_LIBRARIES})

add_executable(dense_mapping dense_mapping.cpp)
target_link_libraries(dense_mapping ${THIRD_PARTY_LIBS} fmt) #链接fmt

1)修改完成后编译:

cd ~/pkgs/slambooks/ch12
cmake ..
make -j4

编译成功,生成可执行文件:
在这里插入图片描述
1)运行dense_mapping,需要先下载数据集(复制到浏览器就会下载,界面打不开):

http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip

笔者运行会莫名中断:

read total 202 files.
*** loop 1 ***
Segmentation fault (core dumped)

大概率是内存爆掉了:( ,结果可以参考这篇文章:《视觉SLAM十四讲 第二版》笔记及课后习题(第十二讲)
2)运行octomap_mapping,在有data文件夹的目录下执行:

./octomap_mapping

生成octomap.bt文件,使用octovis查看结果:

octovis octomap.bt

在这里插入图片描述

3)运行pointcloud_mappingsurfel_mapping,在有data文件夹的目录下执行:

./pointcloud_mapping

生成map.pcd文件,使用surfel_mappingpcl_viewer查看结果:

./surfel_mapping map.pcd
pcl_viewer map.pcd

查看./surfel_mapping map.pcd结果:
在这里插入图片描述

查看pcl_viewer map.pcd结果:
在这里插入图片描述

3.9 ch13

问题1 error: ‘CV_GRAY2BGR’ was not declared in this scope
在OpenCV4中,CV_GRAY2BGR已被cv::COLOR_GRAY2BGR替换
解决方法:修改ch13/src/viewer.cpp中所有的CV_GRAY2BGR

cv::COLOR_GRAY2BGR

问题2 error: ‘CV_FILLED’ was not declared in this scope
在OpenCV4中,CV_FILLED已被cv::FILLED替换
解决方法:修改ch13/src/frontend.cpp中所有的CV_FILLED

cv::FILLED

问题3
/usr/bin/ld: cannot find -lglut: No such file or directory
collect2: error: ld returned 1 exit status
解决方法:

sudo apt-get install freeglut3-dev

1)修改完成后,再在将c++的标准改为14,并增加对fmt的链接,具体操作方法可以参考3.8 ch12,基本都会遇到的问题。编译:

cd ~/pkgs/slambook2/ch13
mkdir build && cd build
cmake ..
make -j4

编译完成后会在ch13/bin目录下生成run_kitti_stereotest_triangulation两个可执行文件:
在这里插入图片描述

2)运行test_triangulation

./test_triangulation

终端输出结果:
在这里插入图片描述

3)运行run_kitti_stereorun_kitti_stereo需要与config在同级目录:

cp run_kitti_stereo ../
cd ..
./run_kitti_stereo

运行结果:在这里插入图片描述

完结撒花!!!

作者邮箱:zyr_0821@163.com
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值