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 时的文件)

sudo rm -rf /usr/local/include/DBow3
sudo rm -rf /usr/local/lib/libDBow3*
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 'freiburg1_desk2'(差不多330M)

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

#include "DBoW3/DBoW3.h"//词袋支持头文件
#include //opencv核心模块
#include //gui模块
#include //特征点头文件
#include 
#include 
#include 

using namespace cv;
using namespace std;


int main( int argc, char** argv )
{
    string dataset_dir = "../rgbd_dataset_freiburg1_desk2/rgb";//图像路径
    vector rgb_files;
    glob(dataset_dir, rgb_files);
    // string dataset_dir = argv[1];
    // ifstream fin ( dataset_dir+"/home/liqiang/slambook2/ch11/rgbd_dataset_freiburg1_desk2/rgb" );
    // if ( !fin )
    // {
    //     cout<<"please generate the associate file called associate.txt!"< rgb_files, depth_files;
    // vector rgb_times, depth_times;
    // while ( !fin.eof() )
    // {
    //     string rgb_time, rgb_file, depth_time, depth_file;
    //     fin>>rgb_time>>rgb_file>>depth_time>>depth_file;
    //     rgb_times.push_back ( atof ( rgb_time.c_str() ) );
    //     depth_times.push_back ( atof ( depth_time.c_str() ) );
    //     rgb_files.push_back ( dataset_dir+"/"+rgb_file );
    //     depth_files.push_back ( dataset_dir+"/"+depth_file );

    //     if ( fin.good() == false )
    //         break;
    // }
    // fin.close();

    cout<<"generating features ... "< descriptors;//描述子
    Ptr< Feature2D > detector = ORB::create();
    int index = 1;
    for ( String path : rgb_files )
    {
        Mat image = imread(path);
        vector keypoints; //关键点
        Mat descriptor;//描述子
        detector->detectAndCompute( image, Mat(), keypoints, descriptor );
        descriptors.push_back( descriptor );
        cout<<"extracting features from image " << index++ <


直接开干

mkdir build 
cd build/

cmake ..
make -j8


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

 ./feature_training 
 
 ./loop_closure 
 
 
 读取数据集(330M那个)
 此时的loop_closure.cpp
读取的字典是   DBoW3::Vocabulary vocab("./vocab_larger.yml.gz");

ctrl + s 

make 

 ./gen_vocab 
 
  ./loop_closure 

(总共640个点,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的语法)


运行输入快捷设置和路径
 

    if (argc != 2) {
        cout << "Usage: dense_mapping path_to_test_dataset" << endl;
        return -1;
    }

    // 从数据集读取数据
    vector color_image_files;
    vector poses_TWC;
    Mat ref_depth;
    bool ret = readDatasetFiles(argv[1], color_image_files, poses_TWC, ref_depth);


修改为


   

// if (argc != 2) {
    //     cout << "Usage: dense_mapping path_to_test_dataset" << endl;
    //     return -1;
    // }
    string test_dataset_file = "../../remode_test_data/test_data";
    // 从数据集读取数据
    vector color_image_files;
    vector poses_TWC;
    Mat ref_depth;
    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)) {



开始跑代码

mkdir build
cd build/
cmake ..
make -j8


cd dense_mono/
./dense_mapping

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

Average squared error = 0.253473, average error: -0.00722449
*** loop 200 ***
Average squared error = 0.253483, average error: -0.00722778
*** loop 201 ***
estimation returns, saving depth map ...
done.


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

cd ..
cd dense_RGBD/

./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


 

你可能感兴趣的:(slam学习分享,ubuntu,slam)