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

相关推荐
点云SLAM1 天前
Truncated Least Squares(TLS 截断最小二乘)算法原理
算法·slam·位姿估计·数值优化·点云配准·非凸全局优化·截断最小二乘法
点云SLAM2 天前
点云配准算法之- GICP算法点云配准概率模型推导和最大似然求解(MLE)
算法·机器人·slam·点云配准·最大似然估计·点云数据处理·gicp算法
WWZZ20254 天前
快速上手大模型:实践(Grounded-SAM2与Depth Anything V2)
大模型·sam·slam·多模态·具身智能·dino·grounded-sam2
点云SLAM5 天前
SLAM文献之-Embedding Manifold Structures into Kalman Filters(3)
计算机视觉·机器人·slam·fast-lio·卡尔曼滤波算法·导航系统·imu系统导航
某林2126 天前
基于SLAM Toolbox的移动机器人激光建图算法原理与工程实现
stm32·嵌入式硬件·算法·slam
点云SLAM6 天前
SLAM文献之-Embedding Manifold Structures into Kalman Filters(2)
机器人·slam·位姿估计·导航·imu·卡尔曼滤波算法·流行空间操作
xyz5999 天前
Mast3r_SLAM
slam
mmq在路上9 天前
Fast-livo2 gazebo仿真实践记录
人工智能·slam·xtdrone
徐行tag9 天前
平面运动模型下的特性及应用
数码相机·平面·slam
老黄编程13 天前
视觉SLAM十四讲解读-(v2.p84)李代数求导
算法·slam·李群李代数·视觉slam十四讲