赞
踩
ORB_SLAM3是第一个能够使用针孔和鱼眼镜头模型使用单目、立体和 RGB-D 相机执行视觉、视觉惯性和多地图 SLAM 的实时 SLAM 库。
链接: github.com/UZ-SLAMLab/ORB_SLAM3
虽然但是,笔者使用了以下这个纯使用ros的版本:
链接: github.com/thien94/orb_slam3_ros
sudo apt install libeigen3-dev
cd ~
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake ..
make
sudo make install
OpenCV(要求>3.0), ubuntu20.04自带OpenCV 4.2.0
使用以下指令查看OpenCV版本
pkg-config --modversion opencv4
安装ros会自动安装,也可以使用apt安装:
sudo apt-get update
sudo apt-get install libboost-all-dev
cd ~/catkin_ws/src
git clone https://github.com/thien94/orb_slam3_ros.git
cd ../
catkin_make
在 config/Monocular-Inertial/EuRoC.yaml 开头添加:
System.SaveAtlasToFile: "MH01_stereo_inertial"
启用保存文件的功能
# 新终端
roslaunch orb_slam3_ros euroc_mono_inertial.launch
# 新终端
rosbag play MH_01_easy.bag
ctrl^C 结束运行后自动保存地图文件,保存的地图文件在 /.ros
文件格式为.osa
sudo apt-get install libpcl-dev pcl-tools
在文件夹 /orb_slam3/src 中
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
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);
for(size_t i=0, iend=vpMPs.size(); i<iend;i++)
{
if(vpMPs[i]->isBad() || spRefMPs.count(vpMPs[i]))
continue;
Eigen::Matrix<float,3,1> pos = vpMPs[i]->GetWorldPos();
glVertex3f(pos(0),pos(1),pos(2));
}
修改为以下代码:
for(size_t i=0, iend=vpMPs.size(); i<iend;i++) { if(vpMPs[i]->isBad() || spRefMPs.count(vpMPs[i])) continue; Eigen::Matrix<float,3,1> pos = vpMPs[i]->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() > pre_num) { pcl::io::savePCDFileBinary("map.pcd", *cloud_saved); pre_num = cloud_saved->points.size(); }
extern int pre_num = 0;
find_package(PCL REQUIRED) 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} ) 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 )
保存的pcd文件在 /.ros
文件名为 map.pcd
使用PCDviewer查看:
笔者使用的是工业相机flir录制的数据,使用 euroc_mono.launch
先查看录制数据bag的话题名称:
rosbag info YOURBAG.bag
<remap from="/camera/image_raw" to="/flir_adk/image_raw"/>
修改 /config/Monocular/EuRoC.yaml
修改 相机内参 fx
fy
cx
cy
畸变参数k1
k2
p1
p2
图片像素 width
height
# 新终端
roslaunch orb_slam3_ros euroc_mono.launch
# 新终端
rosbag play YOURBAG.bag
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。