• slambook2+ubuntu20.04(第九章-第十章)


    例程代码编译与效果展示

    slambook2
    ch9

    cmakelists.txt
    set(CMAKE_BUILD_TYPE "Release")
    set(CMAKE_CXX_FLAGS "-O3 -std=c++11")
    修改为

    set(CMAKE_BUILD_TYPE "Debug")
    set(CMAKE_CXX_FLAGS "-O3 -std=c++17")


    bundle_adjustment_ceres.cpp
    在using namespace std;下添加

    string text_file = "../problem-16-22106-pre.txt";

    将argv[1]替换为text_file 

    并注释掉if (argc != 2) 执行的东西

    bundle_adjustment_g2o.cpp也做上述同样操作


    mkdir build
    cd build/
    cmake ..
    make  -j8

    ./bundle_adjustment_ceres
    ./bundle_adjustment_g2o


    ubuntu下安装meshlab(参考链接,也可以只看下面步骤)ubuntu下安装meshlab (使用tar.gz)_ubuntu安装meshlab_YuQiao0303的博客-CSDN博客


    装依赖
    sudo apt-get install libfontconfig1
    官网下载gz
    https://github.com/cnr-isti-vclab/meshlab/releases

    解压
    当前目录下运行AppRun

    或者usr/bin/meshlab

    平时调用(建议另一个终端)

    cd /home/mengs/3rdparty/MeshLab

    ./AppRun

    点击File->Import Mesh

    然后选择ch9  build下的ply文件
    我的ply文件路径:/home/mengs/slambook2/ch9/build


    ch10


    cmakelists.txt
    set(CMAKE_BUILD_TYPE "Release")
    set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
    修改为

    set(CMAKE_BUILD_TYPE "Debug")
    set(CMAKE_CXX_FLAGS "-std=c++17 -O2")

    pose_graph_g2o_lie_algebra.cpp文件

    在using namespace std;下添加
    string text_file = "../sphere.g2o";


    注释掉下面
    if (argc != 2) {
            cout << "Usage: pose_graph_g2o_SE3_lie sphere.g2o" << endl;
            return 1;
        }
        
        
        
        将下面
        ifstream fin(argv[1]);
        if (!fin) {
            cout << "file " << argv[1] << " does not exist." << endl;
            return 1;
        }
        
        替换为
          ifstream fin(text_file);
        if (!fin) {
            cout << "file " << text_file<< " does not exist." << endl;
            return 1;
        }  
        
    pose_graph_g2o_SE3.cpp也做上述同样操作


    另外

    pose_graph_g2o_lie_algebra.cpp 文件54行的部分,添加 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;
        }
        
     
       


    mkdir build
    cd build/
    cmake ..
    make  -j8

    ./pose_graph_g2o_lie
    ./pose_graph_g2o_SE3

    结果是保存在result_lie.g2o和result.g2o中


    打开g20_view


    g2o_viewer result_lie.g2o
    g2o_viewer result.g2o

    然后单击左边的优化(英文)


    正常是能在cd 到你的g2o/bin下
    例如
    cd /home/mengs/G2o/g2omy/bin

    看到g2o_viewer的可执行文件(如果不行,可能安装g2o可能不是最新或者没有完全安装g2o)


    ch11


    本章报错的情况有两种,
    小改的报错,opencv版本(自己装的,尽量4.0以上本人4.7.0)和数据文件地址。
    库的报错,在运行loop*.cpp时,别人可以正常运行,而我无论怎么修改都会报以下错

    comparing images with database 
    terminate called after throwing an instance of 'std::length_error'
      what():  cannot create std::vector larger than max_size()
    已放弃 (核心已转储)

    这个错在网上找不到教程,gpt也只是叫你查看内存或者显存。
    我尝试了自己的虚拟机和双系统,还有别人成功的代码,还是会有错。

    后来我卸载了之前slambook1的DBow3的库,
    卸载命令(删除本地DBow3 sudo make install 时的文件)

    1. sudo rm -rf /usr/local/include/DBow3
    2. sudo rm -rf /usr/local/lib/libDBow3*
    3. sudo rm -rf /usr/local/bin/DBow3*

    再locate DBow3看看有没有相关的,记得先sudo updatedb(删除后日志没那么快更新,locate可能显示没删除)。


    注!!!本人教训,一定要安装最新的库(最好是git,不要用老的)


    在安装最新的DBow3后, std::vector larger than max_size()这个错就没了。本人猜测可能是与opencv版本,ubuntu版本和自己的电脑有关,但只要装最新的库,就不会出现这种错误。


    DBow3
    #下载地址
    git clone https://github.com/rmsalinas/DBow3.git
    #进入DBow3目录下,使用cmake编译
    cd DBOW3   //进入g2o文件夹
    mkdir build     //创建build文件夹
    cd build    //进入 build
    cmake ..   //cmake编译  这个过程比较漫长
    make -j8
    sudo make install   //安装即可
    sudo ldconfig //更新一下刚安装好的库文件

    cmakelists.txt
    set( CMAKE_BUILD_TYPE "Release" )(修改方便调试)

    find_package( OpenCV 3.1 REQUIRED )

    set( DBoW3_LIBS "/usr/local/lib/libDBoW3.a" )(你如果用的 DBoW3库是高翔的第一版的库,就不用改。)

    修改为

    set(CMAKE_BUILD_TYPE "Debug")


    find_package( OpenCV 4 REQUIRED )


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


    注意!set( DBoW3_LIBS "/usr/local/lib/libDBoW3.so" )这个最新版才要改,建议还是装最新的库

    修改文件路径
    feature_training.cpp文件
            string path = "./data/"+to_string(i+1)+".png";
    修改为
            string path = "../data/"+to_string(i+1)+".png";


    loop_closure.cpp

            string path = "./data/" + to_string(i + 1) + ".png";
    修改为

            string path = "../data/" + to_string(i + 1) + ".png";
            
    可参考    
    【slam十四讲第二版】【课本例题代码向】【第十一讲~回环检测】【DBoW3的安装】【创建字典】【相似度检测】【增加字典规模】_dbow3如何在原有字典的基础上增加规模_踏破万里无云的博客-CSDN博客
        
        
        
        
    gen_vocab_large.cpp文件
                

    所需数据集
    Computer Vision Group - Dataset Download

     


    下载tgz
    Sequence 'freiburg2_desk'(差不多1.76G,解压后差不多2G)

    解压后放在与build(ch11的)同个目录下
    修改后的gen_vocab_large.cpp

    1. #include "DBoW3/DBoW3.h"//词袋支持头文件
    2. #include //opencv核心模块
    3. #include //gui模块
    4. #include //特征点头文件
    5. #include
    6. #include
    7. #include
    8. using namespace cv;
    9. using namespace std;
    10. int main( int argc, char** argv )
    11. {
    12.     string dataset_dir = "../rgbd_dataset_freiburg2_desk/rgb";//图像路径
    13.     vector rgb_files;
    14.     glob(dataset_dir, rgb_files);
    15.     // string dataset_dir = argv[1];
    16.     // ifstream fin ( dataset_dir+"/home/liqiang/slambook2/ch11/rgbd_dataset_freiburg1_desk2/rgb" );
    17.     // if ( !fin )
    18.     // {
    19.     //     cout<<"please generate the associate file called associate.txt!"<
    20.     //     return 1;
    21.     // }
    22.     // vector rgb_files, depth_files;
    23.     // vector rgb_times, depth_times;
    24.     // while ( !fin.eof() )
    25.     // {
    26.     //     string rgb_time, rgb_file, depth_time, depth_file;
    27.     //     fin>>rgb_time>>rgb_file>>depth_time>>depth_file;
    28.     //     rgb_times.push_back ( atof ( rgb_time.c_str() ) );
    29.     //     depth_times.push_back ( atof ( depth_time.c_str() ) );
    30.     //     rgb_files.push_back ( dataset_dir+"/"+rgb_file );
    31.     //     depth_files.push_back ( dataset_dir+"/"+depth_file );
    32.     //     if ( fin.good() == false )
    33.     //         break;
    34.     // }
    35.     // fin.close();
    36.     cout<<"generating features ... "<//输出generating features (正在检测ORB特征)...
    37.     vector descriptors;//描述子
    38.     Ptr< Feature2D > detector = ORB::create();
    39.     int index = 1;
    40.     for ( String path : rgb_files )
    41.     {
    42.         Mat image = imread(path);
    43.         vector keypoints; //关键点
    44.         Mat descriptor;//描述子
    45.         detector->detectAndCompute( image, Mat(), keypoints, descriptor );
    46.         descriptors.push_back( descriptor );
    47.         cout<<"extracting features from image " << index++ <//输出extracting features from image(从图像中提取特征)
    48.     }
    49.     cout<<"extract total "<size()*500<<" features."<
    50.     // create vocabulary
    51.     cout<<"creating vocabulary, please wait ... "<//输出creating vocabulary, please wait (创建词典,请稍等)...
    52.     DBoW3::Vocabulary vocab;
    53.     vocab.create( descriptors );
    54.     cout<<"vocabulary info: "<
    55.     vocab.save( "vocab_larger.yml.gz" );//保存词典
    56.     cout<<"done"<
    57.     return 0;
    58. }


    直接开干

    1. mkdir build 
    2. cd build/
    3. cmake ..
    4. make -j8


    此时的loop_closure.cpp(只有10张图的字典)
    读取的字典是    DBoW3::Vocabulary vocab("./vocabulary.yml.gz");

     ./feature_training 
     
     ./loop_closure 
     
     



     读取数据集(1.76G那个)
     此时的loop_closure.cpp(2965张图的字典)
    读取的字典是   DBoW3::Vocabulary vocab("./vocab_larger.yml.gz");

    如果这个使用slambook自带的跑出来就不是出现同样的结果,因为他训练的数据对应的跟测试的10张图片不是同一个数据集的。所以结果如果按他给的出来没书里写的那么明显。

    ctrl + s 

    make 

     ./gen_vocab 
     

    1. extracting features from image 2965
    2. extract total 1482500 features.


      ./loop_closure 

    1. searching for image 9 returns 4 results:
    2. 9, Score: 1>
    3. 0, Score: 0.032521>
    4. 5, Score: 0.00942901>
    5. 4, Score: 0.00864222>

    可以看出第十张图和第一张图的相似度程度远大于第十张跟其他图片

    (总共2965个点,loop会有点久,建议别在虚拟机跑)


    ch12


    主要错误,段错误,路径错误。opencv语法错误

    12章参考代码

    slambook2(ch12)—— Ubuntu18.04安装pcl库 + octomap库 + 例程演示 + VMware虚拟机扩展磁盘容量_slambook2 ch12_@曾记否的博客-CSDN博客

    段错误修改

    视觉slam14讲 ch12 单目稠密地图重建报错:段错误 (核心已转储)_The Last Of Us的博客-CSDN博客

    opencv语法错误(CV_GRAY2BGR)

    slambook2+ubuntu20.04(第六章-第八章)_对不起,我还只是小孩的博客-CSDN博客

    当然,可以直接跟着下面走就行

    安装依赖
    安装PCL(可见前面文章细节安装)
    sudo apt install libpcl-dev  pcl-tools

    安装octomap
    sudo apt-get install liboctomap-dev octovis

    安装libusb
    sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
    sudo ldconfig


    下载数据集(ti子可能速度好一些)
    http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip

    或者

    链接: https://pan.baidu.com/s/1CfUpOdoVtaQoaMhcoNOt1w 提取码: 7gvi

    下载后解压放在ch12目录下,即与build一样路径

    /dence_mono/cmakelists.txt文件修改

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


    find_package(OpenCV 3.1 REQUIRED)

    修改为

    set(CMAKE_BUILD_TYPE "Debug")
    set(CMAKE_CXX_FLAGS "-std=c++17 -march=native -O3")

    find_package(OpenCV 4 REQUIRED)


    /dence_mono/dense_mapping.cpp文件修改

    bool update(

    修改为

    void update(
      


    不然会报段错误,前面有链接讲到。
    注!代码一共有两处bool update(,都得修改返回类型

    main函数里


    cv::cvtColor(ref, ref_show, CV_GRAY2BGR);
        cv::cvtColor(curr, curr_show, CV_GRAY2BGR);

        cv::cvtColor(ref, ref_show, CV_GRAY2BGR);
        cv::cvtColor(curr, curr_show, CV_GRAY2BGR);  

    的CV_GRAY2BGR全部修改为COLOR_GRAY2BGR(opencv4的语法)


    运行输入快捷设置和路径
     

    1.     if (argc != 2) {
    2.         cout << "Usage: dense_mapping path_to_test_dataset" << endl;
    3.         return -1;
    4.     }
    5.     // 从数据集读取数据
    6.     vector color_image_files;
    7.     vector poses_TWC;
    8.     Mat ref_depth;
    9.     bool ret = readDatasetFiles(argv[1], color_image_files, poses_TWC, ref_depth);


    修改为


       

    1. // if (argc != 2) {
    2.     //     cout << "Usage: dense_mapping path_to_test_dataset" << endl;
    3.     //     return -1;
    4.     // }
    5.     string test_dataset_file = "../../remode_test_data/test_data";
    6.     // 从数据集读取数据
    7.     vector color_image_files;
    8.     vector poses_TWC;
    9.     Mat ref_depth;
    10.     bool ret = readDatasetFiles(test_dataset_file, color_image_files, poses_TWC, ref_depth);


    /dence_RGBD/cmakelist.txt
    set(CMAKE_BUILD_TYPE Release)
    set(CMAKE_CXX_FLAGS "-std=c++11 -O2")

    修改为
    set(CMAKE_BUILD_TYPE Debug)
    set(CMAKE_CXX_FLAGS "-std=c++17 -O2")

    /dence_RGBD/octomap_mapping.cpp和/dence_RGBD/pointcloud_mapping.cpp

    (路径修改)

    ./data
    修改成
    ../../dense_RGBD/data

    共两处


    /dence_RGBD/surfel_mapping.cpp
    在#include下一行添加

    std::string map_pcd_file = "map.pcd";

        if (argc == 0 || pcl::io::loadPCDFile(argv[1], *cloud)) {
    修改为
        if (argc == 0 || pcl::io::loadPCDFile(map_pcd_file, *cloud)) {



    开始跑代码

    1. mkdir build
    2. cd build/
    3. cmake ..
    4. make -j8
    5. cd dense_mono/
    6. ./dense_mapping

    此时会有201个文件,201次回环,因为没有167.png,所以loop167会跳过,但不影响运行。
    建议不要虚拟机运行(会卡死)

    1. Average squared error = 0.253473, average error: -0.00722449
    2. *** loop 200 ***
    3. Average squared error = 0.253483, average error: -0.00722778
    4. *** loop 201 ***
    5. estimation returns, saving depth map ...
    6. done.


    上面/dense_mapping是到最后一步显示

    1. cd ..
    2. cd dense_RGBD/
    3. ./pointcloud_mapping 


    运行结果
    正在将图像转换为点云...
    转换图像中: 1
    转换图像中: 2
    转换图像中: 3
    转换图像中: 4
    转换图像中: 5
    点云共有1309800个点.
    滤波之后,点云共有31876个点.


    终端运行

    pcl_viewer map.pcd

    会出来一张图

    ./surfel_mapping map.pcd

    出来一张清晰一点图

    ./octomap_mapping 

    运行结果
    正在将图像转换为 Octomap ...
    转换图像中: 1
    转换图像中: 2
    转换图像中: 3
    转换图像中: 4
    转换图像中: 5
    saving octomap ... 
    Writing 1136665 nodes to output stream... done.


    同样

    octovis octomap.bt

    出来一张蓝色沙发


    第十二章结束,十三章需要下载一个数据集,可以提前下
    这个是官网,需要注册,而且网络不稳定
    https://www.cvlibs.net/datasets/kitti/eval_odometry.php

    博主找到了另一个稳定又好用的网站(专门下载KITTI)

    -OpenDataLab-有影响力的数据开源开放平台,公开数据集触手可及

    2023.06.12


     

  • 相关阅读:
    git学习
    ERP库存管理 华夏
    做网站有哪些注意事项
    面试中关于 SpringCloud 都需要了解哪些基础?
    【WebRTC---源码篇】(十:零)WEBRTC/StreamStatisticianImpl持续更新中)
    c++ --- 归并排序
    聊聊 RocketMQ 名字服务
    解决img标签和p标签不能水平居中对齐的问题
    【无标题】
    Java 代理模式之静态代理与动态代理
  • 原文地址:https://blog.csdn.net/mengshenglo/article/details/131143533