ORB-SLAM2实时彩色点云地图构建及保存

ORB-SLAM2实时点云地图构建

https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map是高翔博士基于ORB-SLAM2改的,可以进行实时点云地图构建,先按照高翔博士的改ORB_SLAM2,改好之后如何编译如下:

首先要安装PCL

复制代码
sudo apt install libpcl-dev

编译

有几处需要改动:

CMakeLists.txt中 "-march=native"

cmake 复制代码
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

Thirdparty/g2o/CMakeLists.txt 中 "-march=native"

cmake 复制代码
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") 
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native") 

在CMakeLists.txt中以下修改

cmake 复制代码
# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
   add_definitions(-DCOMPILEDWITHC11)
   message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
   add_definitions(-DCOMPILEDWITHC0X)
   message(STATUS "Using flag -std=c++0x.")
else()
   message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

# 添加下面一行(如果不添加c++11可以成功编译则不需要)
set(CMAKE_CXX_STANDARD 14)
...
...
...

之后将ORB_SLAM2目录下的build、/Thirdparty/DBoW2/build及Thirdparty/g2o/build文件夹删除,然后就可以编译了

bash 复制代码
sudo chmod +x .build.sh
./build.sh

不出意外的话,至此就可以成功运行程序了

bash 复制代码
./bin/rgbd_tum ./Vocabulary/ORBvoc.txt ./Examples/RGB-D/TUM1.yaml ../../../slam_data/rgbd_dataset_freiburg1_desk ../../../slam_data/rgbd_dataset_freiburg1_desk/associations.txt

至于vocabulary文件用txt或是bin都可以,高翔博士在这里有读取bin文件的改动

如何是完全按照高翔博士的改法,TUM1.yaml多了

复制代码
PointCloudMapping.Resolution: 0.01

在System.cc中有读取此值

复制代码
float resolution = fsSettings["PointCloudMapping.Resolution"];
...
mpPointCloudMapping = make_shared<PointCloudMapping>( resolution );

如果TUM1.yaml中没有PointCloudMapping.Resolution: 0.01,上面两行也可以直接改为,完全是可以的

复制代码
mpPointCloudMapping = make_shared<PointCloudMapping>(0.01);

后面的数据集和rgb-depth关联文件路径改为自己的就可以了

此时得到的是黑白点云地图,并且没有保存

改善

将点云地图改为彩色,并保存

需进行以下修改:

1.Tracking.h

c++ 复制代码
// Current Frame
Frame mCurrentFrame;
cv::Mat mImRGB; //<added>添加这一行!
cv::Mat mImGray;
cv::Mat mImDepth; // adding mImDepth member to realize pointcloud view

2.Tracking.cc

c++ 复制代码
cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double &timestamp)
{
    mImRGB = imRGB;//<added>添加这一行
    mImGray = imRGB;
    mImDepth = imD;
    ...
}
void Tracking::CreateNewKeyFrame()
{
    ...
    // insert Key Frame into point cloud viewer
    // mpPointCloudMapping->insertKeyFrame( pKF, this->mImGray, this->mImDepth );
    mpPointCloudMapping->insertKeyFrame( pKF, this->mImRGB, this->mImDepth ); //将上面一行改为这一行
    ...
}

3.pointcloudmapping.cc

这里是保存点云地图的改动

首先是加入头文件

复制代码
#include <pcl/io/pcd_io.h>

然后是调用地图保存函数

c++ 复制代码
void PointCloudMapping::viewer()
{
    ...
    for ( size_t i=lastKeyframeSize; i<N ; i++ )
    {
        PointCloud::Ptr p = generatePointCloud( keyframes[i], colorImgs[i], depthImgs[i] );
        *globalMap += *p;
    }
    //保存地图,这里为了管理,新建了pcd文件夹,将所有保存的pcd放入里面	
	pcl::io::savePCDFileBinary("/pcd/vslam.pcd", *globalMap); 
    ...
}

参考:https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map/issues

相关推荐
放羊郎1 天前
SLAM各类算法特点对比
人工智能·算法·slam·视觉slam·建图·激光slam
放羊郎3 天前
基于三维点云图的路径规划
人工智能·动态规划·slam·点云·路径规划·激光slam
求索小沈3 天前
ubuntu22.04 ros2 fast_lio2 复现
slam·ros2·重定位·建图·mid360·fast_lio2
WWZZ20254 天前
快速上手大模型:深度学习2(实践:深度学习基础、线性回归)
人工智能·深度学习·算法·计算机视觉·机器人·大模型·slam
WWZZ20259 天前
快速上手大模型:机器学习6(过拟合、正则化)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
WWZZ20259 天前
快速上手大模型:机器学习5(逻辑回归及其代价函数)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
WWZZ202510 天前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
放羊郎11 天前
面向不同障碍物的自主导航策略
yolo·slam·识别·平滑·语义地图
WWZZ202512 天前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
小猫挖掘机(绝版)13 天前
kalibr进行相机内参以及相机imu的融合标定
ubuntu·无人机·slam·标定·vinsfusion