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 个月前
卡尔曼滤波算法(Kalman Filter, KF)深入推导
人工智能·算法·slam·状态估计·滤波器·卡尔曼滤波算法
点云SLAM1 个月前
SLAM文献之-DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras
深度学习·3d·slam·droid-slam·稠密ba·端到端深度学习slam
JaydenQ1 个月前
如何使用3D高斯分布进行环境建模
slam
Perishell1 个月前
无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)
linux·机器人·动态规划·无人机·slam
知也无涯123452 个月前
机器学习大模型问题记录
计算机视觉·slam
bohu832 个月前
亚博microros小车-原生ubuntu支持系列:17 gmapping
slam·激光雷达·rviz·gmapping·microros·亚博·构建地图
深蓝学院2 个月前
顶刊JFR|ROLO-SLAM:首个针对不平坦路面的车载Lidar SLAM系统
slam·激光雷达
陈傻鱼2 个月前
ROS2测试仿真
机器人·ros·slam
点云SLAM3 个月前
CVPR 2024 自动驾驶方向总汇
人工智能·计算机视觉·自动驾驶·slam·cvpr·cvpr 2024·道路检测
什么都不会的小澎友3 个月前
相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“
slam