前言:视觉学习笔记4——学习研究ORB-SLAM3
ORB-SLAM3基本搭建完成,具体可以看开头的系列文章目录,接下来需要研究如何自定义自己的地图,也就是实时地图的保存与运用。
按照开源说明来看,地图保存与加载在V1.0已经实现了,需要修改相应的yaml文件即可,也就是相机yaml文件,例如单目测试就需要修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml文件。
System.SaveAtlasToFile: "map.osa"
sudo ./build.sh
sudo ./build_ros.sh
经过查询找到这位博主的文章
sudo apt-get install libpcl-dev pcl-tools
第一步,先加入 pcl 保存点云所需的头文件:
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
第二步,找到 DrawMapPoints 函数中的如下代码:
for(set<MapPoint*>::iterator sit=spRefMPs.begin(), send=spRefMPs.end(); sit!=send; sit++)
{
if((*sit)->isBad())
continue;
Eigen::Matrix<float,3,1> pos = (*sit)->GetWorldPos();
glVertex3f(pos(0),pos(1),pos(2));
}
并将其修改为如下代码:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_saved(new pcl::PointCloud<pcl::PointXYZ>());
for(set<MapPoint*>::iterator sit=spRefMPs.begin(), send=spRefMPs.end(); sit!=send; sit++)
{
if((*sit)->isBad())
continue;
Eigen::Matrix<float,3,1> pos = (*sit)->GetWorldPos();
glVertex3f(pos(0),pos(1),pos(2));
//modified by Awei
pcl::PointXYZ p;
p.x = pos(0);
p.y = pos(1);
p.z = pos(2);
cloud_saved->points.push_back(p);
}
if (cloud_saved->points.size())
pcl::io::savePCDFileBinary("map.pcd", *cloud_saved);
第三步在ORB-SLAM3下的 CMakeLists.txt文件中添加 PCL 库
注意每一段代码放的位置,一共三段、
1、
find_package(PCL REQUIRED)
2、
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/CameraModels
${PROJECT_SOURCE_DIR}/Thirdparty/Sophus
${EIGEN3_INCLUDE_DIR}
${Pangolin_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
3、
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PCL_LIBRARIES}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
-lboost_serialization
-lcrypto
)
sudo ./build.sh
sudo ./build_ros.sh
pcl_viewer map.pcd
接下来需要把建图的点云集用meshlab导成dae格式的
MeshLab支持的输入输出格式:.ply, .stl, .obj, .qobj, off, .ptx, .vmi, .bre, .dae, .ctm, .pts, .apts, .xyz, .gts, .pdb, .tri, .asc, .txt, .x3d, .x3dv, .wrl,它不支持PLC格式,所以需要改一下代码,改成.ply。
再次魔改之前修改的MapDrawer.cc
//多加上一个头函数
#include <pcl/io/ply_io.h>
//修改之前的DrawMapPoints 函数
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_saved(new pcl::PointCloud<pcl::PointXYZ>());
for(set<MapPoint*>::iterator sit=spRefMPs.begin(), send=spRefMPs.end(); sit!=send; sit++)
{
if((*sit)->isBad())
continue;
Eigen::Matrix<float,3,1> pos = (*sit)->GetWorldPos();
glVertex3f(pos(0),pos(1),pos(2));
//modified by Awei
pcl::PointXYZ p;
p.x = pos(0);
p.y = pos(1);
p.z = pos(2);
cloud_saved->points.push_back(p);
}
for (int i = 0; i < cloud_saved->points.size(); i++)
{
if (isnan(cloud_saved->points[i].x))
{
cloud_saved->points[i].x = 0;
cloud_saved->points[i].y = 0;
cloud_saved->points[i].z = 0;
}
}
if (cloud_saved->points.size())
pcl::io::savePLYFileBinary("map.ply", *cloud_saved);
ORB-SLAM3重新编译
sudo ./build.sh
sudo ./build_ros.sh
再运行单目实例
第1个终端:
roscore
第2个终端:
roslaunch usb_cam-test.launch
第3个终端:
rosrun ORB_SLAM3 Mono /home/xxx/Guide_blind/ORB_SLAM3-1.0/Vocabulary/ORBvoc.txt /home/xxx/Guide_blind/ORB_SLAM3-1.0/Examples_old/ROS/ORB_SLAM3/Asus.yaml
第4个终端:
rqt_graph
这时就会自动保存点云.cly文件了。文件保存在主目录下,想要修改文件保存位置可以参考这篇博客
非常简单,打开【Ubuntu软件】,右上角点击搜索,输入meshlab回车,然后点击安装,只需10s即可安装成功!
然后找到应用图标,打开meshlab,然后打开文件选择打开的保存的map.ply文件,成功显示!