ORB系列文章目錄
前言:視覺學(xué)習(xí)筆記4——學(xué)習(xí)研究ORB-SLAM3
前言
ORB-SLAM3基本搭建完成,具體可以看開頭的系列文章目錄,接下來需要研究如何自定義自己的地圖,也就是實(shí)時地圖的保存與運(yùn)用。
一、地圖保存
方法1(使用自帶OSA保存):
按照開源說明來看,地圖保存與加載在V1.0已經(jīng)實(shí)現(xiàn)了,需要修改相應(yīng)的yaml文件即可,也就是相機(jī)yaml文件,例如單目測試就需要修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml文件。
-
1、修改yaml文件
在該文件中的末尾添加以下代碼:
System.SaveAtlasToFile: "map.osa"
-
2、ORB-SLAM3編譯運(yùn)行:
重新編譯后再運(yùn)行單目實(shí)例,這時就會自動保存點(diǎn)云了,點(diǎn)云信息保存在.osa文件中。
sudo ./build.sh
sudo ./build_ros.sh
-
3、加載
按道理此時地圖已經(jīng)保存成功,也確實(shí)有.osa文件出現(xiàn)在主目錄里,可是我卻沒有很好辦法來查看和調(diào)用這個文件,所以就修改為pcd文件來使用。
方法2(保存為PCD文件):
經(jīng)過查詢找到這位博主的文章
- 1、安裝PCL庫
sudo apt-get install libpcl-dev pcl-tools
-
2、修改MapDrawer.cc 文件
第一步,先加入 pcl 保存點(diǎn)云所需的頭文件:
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
第二步,找到 DrawMapPoints 函數(shù)中的如下代碼:
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
)
-
4、ORB-SLAM3編譯運(yùn)行:
重新編譯后再運(yùn)行單目實(shí)例,這時就會自動保存點(diǎn)云了,.pcd文件保存在主目錄下。想要修改保存位置可以參考這篇博客
sudo ./build.sh
sudo ./build_ros.sh
- 5、使用 pcl_viewer 進(jìn)行查看.pcd文件
pcl_viewer map.pcd
二、地圖調(diào)用
1.修改PCD文件
接下來需要把建圖的點(diǎn)云集用meshlab導(dǎo)成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
//多加上一個頭函數(shù)
#include <pcl/io/ply_io.h>
//修改之前的DrawMapPoints 函數(shù)
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
再運(yùn)行單目實(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
這時就會自動保存點(diǎn)云.cly文件了。文件保存在主目錄下,想要修改文件保存位置可以參考這篇博客
2.安裝使用meshlab
非常簡單,打開【Ubuntu軟件】,右上角點(diǎn)擊搜索,輸入meshlab回車,然后點(diǎn)擊安裝,只需10s即可安裝成功!
然后找到應(yīng)用圖標(biāo),打開meshlab,然后打開文件選擇打開的保存的map.ply文件,成功顯示!文章來源:http://www.zghlxwxcb.cn/news/detail-464488.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-464488.html
未完待續(xù)···
到了這里,關(guān)于視覺學(xué)習(xí)筆記4——ORB-SLAM3的地圖保存與使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!