例程代码编译与效果展示
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
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)
本章报错的情况有两种,
小改的报错,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会有点久,建议别在虚拟机跑)
主要错误,段错误,路径错误。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