Ubuntu20.04下ORB-SLAM2稠密建图+octomap天生八叉树舆图(上) ...

打印 上一主题 下一主题

主题 950|帖子 950|积分 2850

前言

最近用orb-slam2跑了一下自己的数据集,由于是希罕点云建图,结果并不是很理想,看到别人建的稠密点云舆图结果还可以,就想着看看结果,参考了网上许多大佬的博客,也踩了不少坑,为避免遗忘,索性记录下来。
所用版本

这里用的是高博修改的版本ORBSLAM2_with_pointcloud_map,系统为Ubuntu20.04,Ubuntu18.04也大差不差,网上也有许多资料。
准备工作

虽然是高博修改的版本,但是orb-slam2所必要的一些依靠项还是要安装的,已经乐成编译过orb-slam2可以跳过这一步直接进入正文稠密建图。
安装依靠项

  1. sudo apt-get update
  2. sudo apt-get install git gcc g++ vim make cmake
复制代码
安装Pangolin

我这里安装Pangolin 0.6,下载链接。下载完是一个压缩包,记得解压一下。
(1)安装依靠项
  1. sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev
  2. sudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libpng-dev
复制代码
(2)编译
进入解压后的Pangolin文件
  1. cd Pangolin
  2. mkdir build && cd build
  3. cmake -DCPP11_NO_BOOST=1 ..
  4. make
  5. sudo make install
复制代码
(3)安装乐成后实行下面,会出现下面窗口就是乐成了
  1. cd ../examples/HelloPangolin
  2. mkdir build && cd build
  3. cmake ..
  4. make
  5. ./HelloPangolin
复制代码

安装OpenCV3

我安装的是OpenCV-3.4.15,很顺利没什么题目。网上也有许多人的用的其他版本,如果之前安装过可以输入下面命令查询。
  1. pkg-config --modversion opencv
复制代码
这是opencv官网地点,找到对应的版本,点击点击 Sources 进行下载,得到 opencv-3.4.15.zip 压缩文件。

打开 opencv-3.4.15.zip地点文件夹,实行下面命令解压后放到符合的地方
  1. unzip opencv-3.4.15.zip
复制代码
安装依靠项
  1. sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
  2. sudo apt update
  3. sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev
  4. sudo apt-get install libavformat-dev libjpeg.dev libtiff5.dev
  5. sudo apt-get install libswscale-dev libjasper-dev
  6. sudo apt-get install libcanberra-gtk-module libcanberra-gtk3-module
  7. #或者
  8. sudo apt-get install libcanberra-gtk*
复制代码
配置并编译
  1. cd opencv-3.4.15
  2. mkdir build && cd build
  3. cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
  4. #电脑性能差可去掉-j4,性能很好可增加数字(线程)
  5. make -j4
  6. sudo make install
复制代码
 查询OpenCV版本、库以及头文件目录的三个命令来确保上面的OpenCV安装步骤都正常
  1. pkg-config --modversion opencv
  2. pkg-config --cflags opencv
  3. pkg-config --libs   opencv
复制代码
安装Eigen3

直接安装:
  1. sudo apt-get install libeigen3-dev
复制代码
建议源码安装
  1. cd eigen3
  2. mkdir build && cd build
  3. cmake ..
  4. make
  5. sudo make install
复制代码
安装反面文件在:
  1. /usr/local/include/eigen3/
复制代码
复制头文件到/usr/local/include:
  1. sudo cp -r /usr/local/include/eigen3/
  2. Eigen /usr/local/include
复制代码
安装orb-slam2

下载zip文件后解压,实行
注意:出现了对应的错误则修改,如果没有出现则不修改。每次改动后将 ORB_SLAM2 文件夹下面的 build 文件夹删掉,还有 ORB_SLAM2/Thirdparty/DBoW2 && g2o 文件夹下面的 build 文件夹删掉,之后再实行上面的指令重新编译看看是否有错
  1. cd ORB_SLAM2
  2. chmod +x build.sh
  3. ./build.sh
复制代码
编译时如果有错误1
  1. error: ’usleep’ was not declared in this scope
复制代码
根据终端报错表现的文件位置去修改,找到对应的头文件加上
  1. #include <unistd.h>
复制代码
编译时如果有错误2
  1. error: static assertion failed: std::map must have the same value_type as its allocator
复制代码
把ORB-SLAM2源码目录中include/LoopClosing.h文件中的
  1. typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
  2.         Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
复制代码
修改为:
  1. typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
  2.         Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;
复制代码
 到这里应该就可以乐成编译了,然后进入正题。
稠密建图

如果之前乐成编译过orb-slam2,下面的工作会顺利许多。
1.新建工作空间

  1. #orb_ws是工作空间名,可以自行替换
  2. mkdir -p orb_ws/src
  3. cd orb_ws
  4. catkin_make
复制代码
设置情况变量,在orb_ws目录下打开一个终端
  1. echo "source ~/orb_ws/devel/setup.bash" >> ~/.bashrc
  2. source ~/.bashrc
复制代码
可以在主目录下ctrl+h看到隐蔽文件.bashrc中最下面多了工作空间的情况变量
2.ORBSLAM2_with_pointcloud_map源码

  1. cd orb_ws/src/
  2. git clone https://gitcode.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git
复制代码
删除ORB_SLAM2_modified/Thirdparty/DBoW2/build、ORB_SLAM2_modified/Thirdparty/g2o/build以及ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/build这3个 build 文件夹。
将 之前下载好的ORB_SLAM2下的Vocabulary子文件夹复制粘贴到ORB_SLAM2_modified 文件夹下。
在ORB_SLAM2_modified文件下的CMakeLists.txt中取消编译器的一些设置。
  1. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
  2. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")
复制代码
在 Thirdparty/g2o/CMakeLists.txt 中删除 -march=native
  1. # Compiler specific options for gcc
  2. SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native")
  3. SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native")
复制代码
3.编译

  1. cd ORB_SLAM2_modified
  2. chmod +x build.sh
  3. ./build.sh
复制代码
编译时大概会出现的错误1:

  1. #报错
  2. /usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above
  3.     7 |   #error PCL requires C++14 or above
复制代码
表明正在利用的点云库 (PCL) 必要至少 C++14 的 C++ 标准版本才能编译,大概利用较旧的 C++ 标准,从而导致此题目。
修改/ORB_SLAM2_modified/CMakeLists.txt文件-std=c++11换成-std=c++14
编译时大概会出现的错误2:

  1. /usr/include/c++/9/bits/stl_map.h:122:71: error: static assertion failed: std::map must have the same value_type as its allocator
复制代码
解决办法: 打开include文件下的LoopClosing.h
  1. typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
  2.         Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
复制代码
更换为:
  1. typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
  2.         Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;
复制代码
编译时大概会出现的错误3:

  1. home/cgm/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:81:22: error: ‘std::chrono::monotonic_clock’ has not been declared
  2. 81 | std::chrono::monotonic_clock::time_point t1 = std::chrono::monotonic_clock::now();
复制代码
根据报错的文件位置来修改:
将代码中全部利用 `std::chrono::monotonic_clock` 的地方更换为 `std::chrono::steady_clock`。
不出不测,到这里就编译乐成辣!
然后继续编译ros节点,实行:
  1. ./build_ros.sh
复制代码
大概会出现下面报错
报错

  1. [rosbuild] rospack found package "ORB_SLAM2" at   "/home/fast-drone/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2", but the   current directory is
复制代码
缘故起因:之前编译过orb-slam2,以是在编译高博的这版ROS_PACKAGE_PATH会辩论,按下面步骤修改一下就好了。
解决办法:
将ORB_SLAM2_modified/Examples/ROS/的ORB_SLAM2改名为ORB_SLAM2_1,如果之前没有编译过orb-slam2不用做这一步。
然后在~/.bashrc最后面设置路径(注意这个path是我的路径,读者必要自己修改):
  1. export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/fast-drone/orb_ws/src/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Examples/ROS
  2. source ~/.bashrc
复制代码
然后进入/opt/ros/noetic/目录下会有一个文件setup.bash,在当前目录下打开一个终端实行:
  1. sudo vim setup.bash
复制代码
在setup.bash最下面添加
  1. export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/fast-drone/orb_ws/src/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Examples/ROS
复制代码
然后source setup.bash革新一下,再开一个终端实行:
  1. echo $ROS_PACKAGE_PATH
复制代码
检察终端表现是否为自己刚才修改的路径
然后继续编译ros节点
  1. cd ORB_SLAM2_modified
  2. chmod +x build_ros.sh
  3. ./build_ros.sh
复制代码
编译乐成后下面进行数据集的工作
4.数据集

由于之前git clone高博的这版文件中并没有tum数据集,以是还必要用到原版orb-slam2中的官网数据集,当然有自己的数据集也可以用。
在主目录下新建一个darren_file文件,将orb-slam2的data文件中的rgbd_dataset_freiburg1_xyz复制过来。
我的路径是:
  1. /home/fast-drone/darren_file/rgbd_dataset_freiburg1_xyz
复制代码
再将ORB_SLAM2_modified/Examples/RGB-D 里全部文件复制到/home/fast-drone/ORB_SLAM2/data/rgbd_dataset_freiburg1_xyz 重名文件直接更换。(这里根据自己的路径修改)
在rgbd_dataset_freiburg1_xyz里开一个终端输入:
  1. python associate.py rgb.txt depth.txt  > association.txt
复制代码
乐成的话会天生一个association.txt
大概的报错:

如果没有天生大概是空缺文件,看看是不是这个报错
  1.   File "associate.py", line 119, in <module>     matches = associate(first_list, second_list,float(args.offset),float(args.max_difference))
复制代码
解决办法:python2和python3语法不一样,必要将associate.py中
  1. first_keys = first_list.keys()
  2. second_keys = second_list.keys()
复制代码
换成:
  1. first_keys = list(first_list.keys())
  2. second_keys = list(second_list.keys())
复制代码
然后再重新实行python associate.py rgb.txt depth.txt  > association.txt
题目就解决辣!
下面继续跑数据集

进入ORB_SLAM2_modified输入
实行(内里的路径修改成自己的):
  1. ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /home/fast-drone/darren_file/rgbd_dataset_freiburg1_xyz
  2. /home/fast-drone/darren_file/rgbd_dataset_freiburg1_xyz
  3. /association.txt
复制代码
运行乐成会出现黑白的点云图,而且还不能保存舆图,继续修改。
彩色点云舆图

在ORB_SLAM2_modified/include/Tracking.h添加
  1.     // Current Frame
  2.     Frame mCurrentFrame;
  3.     cv::Mat mImRGB; //添加这行
  4.     cv::Mat mImGray;
  5.     cv::Mat mImDepth;
复制代码
在ORB_SLAM2_modified/src/Tracking.cc处修改两处
  1. cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double &timestamp)
  2. {
  3.     mImRGB = imRGB;//添加这行
  4.     mImGray = imRGB;
  5.     mImDepth = imD;
复制代码
  1. // insert Key Frame into point cloud viewer
  2. //mpPointCloudMapping->insertKeyFrame( pKF, this->mImGray, this->mImDepth );
  3. mpPointCloudMapping->insertKeyFrame( pKF, this->mImRGB, this->mImDepth ); //修改地方
复制代码
保存彩色点云舆图

修改ORB_SLAM2_modified/src/pointcloudmapping.cc,在此中调用 PCL 库的pcl::io::savePCDFileBinary函数就可以保存点云舆图了,修改如下:
加入头文件
  1. #include <pcl/io/pcd_io.h>
复制代码
在 void PointCloudMapping::viewer() 函数中(大概在最后面的那部门代码)加入保存舆图的命令,最后样式如下:
  1. ...
  2. for ( size_t i=lastKeyframeSize; i<N ; i++ )
  3. {
  4.     PointCloud::Ptr p = generatePointCloud( keyframes[i], colorImgs[i], depthImgs[i] );
  5.     *globalMap += *p;
  6. }
  7. pcl::io::savePCDFileBinary("vslam.pcd", *globalMap);   // 只需要加入这一句
  8. ...
复制代码
 重新编译

进入ORB_SLAM2_modified目录下重新编译(把build文件删除了)
  1. cd ORB_SLAM2_modified
  2. chmod +x build.sh
  3. ./build.sh#编译ros节点./build_ros.sh
复制代码
ORB_SLAM2_modified目录下重开一个终端运行
  1. #路径改成自己的./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /home/fast-drone/darren_file/rgbd_dataset_freiburg1_xyz
  2. /home/fast-drone/darren_file/rgbd_dataset_freiburg1_xyz
  3. /association.txt
复制代码
此时可以看到下面的彩色点云图

终端ctrl+c停止后,在ORB_SLAM2_modified目录下可以看到一个vslam.pcd文件
 

 在该目录下开一个终端,检察保存的点云舆图:
  1. #如果没有安装pcl,执行下面
  2. sudo apt-get install pcl-tools
  3. #查看点云
  4. pcl_viewer vslam.pcd
复制代码
得到保存好的彩色点云舆图,后面就可以用 octomap天生八叉树舆图进行路径规划了。
先苏息下,剩下的八叉树舆图后面再写吧 。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表