0


ubuntu从零到一跑通ORB_SLAM2及其ORBSLAM2_with_pointcloud稠密建图

前言

    ORB_SLAM2算法虽然经典,但是环境部署却非常麻烦,我使用虚拟机安装的Ubuntu20.04版本吃了很多亏,最终跑通了ORB_SLAM2,也解决了所有ORB_SLAM2稠密建图版本的编译报错,但最终倒在了运行稠密建图ORBSLAM2_with_pointcloud版本时的段错误上。段错误,不了解代码很难解决(网上说的解决办法都试得差不多了),我呢太菜,又想先看看跑起来的效果,于是没办法只能重装系统,用Ubuntu18.04尝试一下,力保所有的库和包和相关教程一致。但是,我感觉配环境不是一次就能成功的,所以做个记录,下次配环境时,会快一些,也给大家做个参考。

    悲惨,跑到最后还是有段错误,最终更换Eigen版本为3.2.10才成功,其实github上的issue早有提示要装eigen3.2.10的,只是我一直痴迷于网上的博客,导致眼花缭乱。**其他ubuntu版本遇到段错误的,可以试试替换eigen版本为3.2.10**

1 安装ubuntu18.04.6

     ubuntu镜像源(下载时网页显示可能有问题,下载速度很快但是不显示):Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

    这一部分,基本上没什么问题,按照网络上的教程一步一步来,保证网络畅通就行。过程注意以下几点。

    ①为了便捷的获得中文支持,建议**选择自定义安装**

** 硬盘空间给大**一些(建议50G以上,我设了80G),后面需要设置交换空间,以及安装各种库和软件包

    ③网络选择NAT模式

    ④安装过程,保持网络畅通,不要点击skip跳过,系统会崩(不要问我为什么会知道的。。)

    ⑤换源(解决**问题中的①后可以复制粘贴了**再换,不然挺麻烦的),网上源很多,建议都试试,找一个最快的,我测的在我这最快的是中科大的源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup #备份

sudo gedit /etc/apt/sources.list #打开之后,复制镜像源

deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

sudo apt-get update #查看更新快不快,有没有报错,有的话,再换镜像源
   ⑥增大swap交换空间,网上教程很多,但总是差点少点的。。。

    (1)先进入根目录,然后关闭所有的交换空间
cd / #进入根目录
sudo swapoff -a
    (2)增加8G**16G**交换空间 (8G编译稠密建图版崩了)
sudo dd if=/dev/zero of=/swapfile bs=1G count=16
    (3)设置/swapfile权限
sudo chmod 600 /swapfile
    (4)格式化交换空间
sudo mkswap /swapfile
    (5)激活交换空间就完成了
sudo swapon /swapfile
    (6)查看交换空间大小
free -h

1.1 问题

①安装成功ubuntu后会出现窗口界面不适配,以及Ubuntu和windows之间无法复制粘贴问题

     解决办法:终端输入以下命令,下载vm-tool解决
sudo apt-get update #不更新软件列表,无法下载软件

sudo apt-get install open-vm-tools -y

sudo apt-get install open-vm-tools-desktop -y

sudo reboot #重启

②swapon: /swapfile:读交换区头失败

    解决办法:先格式化/swapfile,再激活/swapfile就可以了
sudo mkswap /swapfile #格式化
sudo swapon /swapfile #激活

2 cmake 及编译基本环境安装

    ①安装gcc g++
sudo apt-get install gcc g++
    ②安装cmake,下载源码安装太麻烦了,我选择的是命令行安装,虽然有点旧,但是适合ORB_SLAM2算法相关包的编译
sudo apt-get install cmake

3 安装Eigen 3.2.10

    **错误示范:**

    ①安装Eigen,网上教程说要源码安装3.1~3.2的,但我在ubuntu20版试过,更换版本不能解决段错误问题,所以省事,直接命令行安装了  

     ②设置软链接

      跑到最后,发现还是有段错误,还是要源码安装3.2.10版本的才行。

   ** 正确示范:**

    下载地址:  Eigen    

     ①下载解压之后进入源码文件夹
mkdir build
cd build
cmake..
sudo make install
sudo cp -r /usr/local/include/eigen3 /usr/include
    ②查看当前版本
pkg-config --modversion eigen3

4 安装Pangolin 0.5

   源码地址:https://github.com/stevenlovegrove/Pangolin/releases/tag/v0.5

    ①安装依赖项
sudo apt-get install libglew-dev libpython2.7-dev
    ②终端进入源码文件夹,然后老一套
mkdir build
cd build
cmake ..
make -j4
sudo make install

5 安装OpenCV 3.4.7

    源码地址:https://github.com/opencv/opencv 选择低版本,会少很多错误

    ①安装依赖项
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff5-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran
   ②终端进入源码文件夹,安装opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4 
sudo make install
    ③(1)配置环境,修改配置文件
sudo gedit /etc/ld.so.conf.d/opencv.conf
     (2)可能是个空文件,不过不用管,在里面填入 /usr/local/lib就行

/usr/local/lib

    (3)执行ldconfig,更新配置
sudo ldconfig 
    ④(1)配置bash
sudo gedit /etc/bash.bashrc
      (2)在文件内容最后添加下面语句,保存再退出

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

      (3)更新bash
source /etc/bash.bashrc
    ⑤进入opencv-3.4.7/samples/cpp/example_cmake,编译例程测试,得到hello opencv则安装成功
cmake .
make
./opencv_example

5.1 问题

①报错:fatal error: Eigen/Core: 没有那个文件或目录

    解决办法:安装eigen,若已安装,则设置软链接
sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen

6 运行ORB_SLAM2

    源码地址:可以直接git clone下载GitHub - raulmur/ORB_SLAM2: Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities

    ①终端进入源码文件夹,查看build.sh 是否可执行权限,我比较粗暴直接777全部权限都给了
chmod 777 ./build.sh
    ②执行build.sh,安装ORB_SLAM2相关依赖,并生成可执行文件mono_tum等(感慨一下之前环境不匹配,这一步贼多错误,现在就只有一个usleep的小问题了)
./build.sh
    ③运行TUM的f1_xyz数据集,轻松搞定 

TUM数据集:Computer Vision Group - Dataset Download

KITTI数据集:The KITTI Vision Benchmark Suite

EuRoC数据集:kmavvisualinertialdatasets – ASL Datasets

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml data/rgbd_dataset_freiburg1_xyz/

6.1 问题

①报错:c++: internal compiler error: 已杀死 (program cc1plus)

    解决办法:运行内存不足需要增大交换空间,具体步骤查看本文**1**中的⑥:增大swap交换空间。

② error: ‘usleep’ was not declared in this scope

    解决办法:在出错程序的头文件中加入#include <unistd.h>即可,一个一个加吧,只有这个办法(但是不知道为啥,我只在system.h添加了,然后所有报错都没了)
#include <unistd.h>

7 安装运行高翔博士的稠密建图ORBSLAM2_with_pointcloud_ map版本

    源码地址:GitHub - gaoxiang12/ORBSLAM2_with_pointcloud_map ,建议git

    这一步是最难的一步,在Ubuntu20上折腾了很久,主要是有段错误,非常难受。改进的算法多了稠密建图,所以需要使用点云库PCL,和他配套的VTK可视化工具,这个版本的选择众说纷纭,有的说用最新的,有的说用老的1.7,1.8。最终还是选择了PCL1.8.1,第一遍试了命令行安装,但好像是版本太低,导致编译死机于是在网上查了一下,PCL1.8.1对应VTK版本为7.1.1,只能源码安装VTK了

    ①安装VTK7.1.1

    下载地址:https://www.vtk.org/files/release/7.1/VTK-7.1.1.zip

    (1)安装相关依赖
sudo apt-get install git build-essential linux-libc-dev cmake cmake-gui libusb-1.0-0-dev libusb-dev libudev-dev mpi-default-dev openmpi-bin openmpi-common libflann1.9 libflann-dev libeigen3-dev libboost-all-dev libvtk6.3-qt libvtk6.3 libvtk6-dev libqhull* libgtest-dev freeglut3-dev pkg-config libxmu-dev libxi-dev mono-complete openjdk-8-jdk openjdk-8-jre libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev
    (2)安装qt5 及其相关工具(你懂的,我还是喜欢命令行安装,不出问题绝不回头)
sudo apt-get install qt5-default qtcreator qttools5-dev libqt5x11extras5-dev
    (3)进入VTK源码文件夹,编译VTK
mkdir build && cd build
cmake ..
cmake-gui      ###操作见下面文字及图片###
make -j4
sudo make install
    选择build文件夹路径,然后勾选“VTK_GROUP_QT”,点击左下角Configure,报错erro。在报错位置输入“VTK_QT_VERSION” = 5,再点击Configure,Generate,出现Configuring done,

Generating done就可以了

     (4)配置环境变量(源码安装弊端要添加环境变量)
#sudo gedit /home/用户名/.bashrc
#简便方法,用~代替
sudo gedit ~/.bashrc
#添加下面的内容
#export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
#更新.bashrc
source ~/.bashrc

#添加环境变量
sudo sh -c "echo '/usr/lib/x86_64-linux-gnu' >> /etc/ld.so.conf"
#更新
sudo sh -c "ldconfig"
    ②安装PCL

源码地址:https://github.com/PointCloudLibrary/pcl,选择1.8.1的tag下载

    (1)安装相关依赖,我把PCL的依赖和VTK融合了,源码安装了VTK这一步就不用进行了·
sudo apt-get install git build-essential linux-libc-dev cmake cmake-gui libusb-1.0-0-dev libusb-dev libudev-dev mpi-default-dev openmpi-bin openmpi-common libflann1.9 libflann-dev libeigen3-dev libboost-all-dev libvtk6.3-qt libvtk6.3 libvtk6-dev libqhull* libgtest-dev freeglut3-dev pkg-config libxmu-dev libxi-dev mono-complete openjdk-8-jdk openjdk-8-jre libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev
    (2)终端进入PCL源码文件夹,编译安装
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_GPU=ON-DBUILD_apps=ON -DBUILD_examples=ON \ -DCMAKE_INSTALL_PREFIX=/usr .. 
make -j4  
sudo make install
    (3)安装openni可视化库依赖
sudo apt-get install libopenni-dev 
sudo apt-get install libopenni2-dev
    (4)随便找个地方新建文件夹,在文件夹内创建main.cc和CMakeLists.txt,进行cmake编译测试

    main.cc
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>
 
 
int main(int argc, char **argv) {
    std::cout << "Test PCL !!!" << std::endl;
    
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
    uint8_t r(255), g(15), b(15);
    for (float z(-1.0); z <= 1.0; z += 0.05)
    {
      for (float angle(0.0); angle <= 360.0; angle += 5.0)
      {
    pcl::PointXYZRGB point;
    point.x = 0.5 * cosf (pcl::deg2rad(angle));
    point.y = sinf (pcl::deg2rad(angle));
    point.z = z;
    uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
        static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
    point.rgb = *reinterpret_cast<float*>(&rgb);
    point_cloud_ptr->points.push_back (point);
      }
      if (z < 0.0)
      {
    r -= 12;
    g += 12;
      }
      else
      {
    g -= 12;
    b += 12;
      }
    }
    point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
    point_cloud_ptr->height = 1;
    
    pcl::visualization::CloudViewer viewer ("test");
    viewer.showCloud(point_cloud_ptr);
    while (!viewer.wasStopped()){ };
    return 0;
}
    CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(pcl_test)
 
find_package(PCL 1.2 REQUIRED)
 
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
 
add_executable(pcl_test 
                main.cc)
 
target_link_libraries (pcl_test ${PCL_LIBRARIES})
 
install(TARGETS pcl_test RUNTIME DESTINATION bin)
    文件夹内输入./pcl_test ,出现如下窗口则pcl安装成功
./pcl_test 

     ② 编译g2o_with_orbslam2

    为了不增加文章篇幅,所以**请读者查看问题①②③依次修改9**(也可直接编译,等报错显示之后在修改)(狗头表情)

    然后还是老一套
mkdir build
cmake ..
make -j4
sudo make install
    ③编译ORB_SLAM2_modified

    (1)进入ORB_SLAM2_modified文件夹,给build.sh可执行权限
chmod 777 build.sh
    (2)修改CmakeLists.txt
#将      12行,13行中的-march=native删掉,33行换掉opencv版本
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3   -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3   -march=native")

find_package(OpenCV 2.3.7 REQUIRED)

#改为
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3   -march=native")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3   -march=native")

find_package(OpenCV 3.4.7 REQUIRED)
    (3)执行build.sh
./build.sh
    ④运行ORBSLAM2_with_pointcloud_map

    (1)在Exmaple中为生成相应的可执行文件,因为生成点云需要深度,所以需要生成结合rgb和depth的txt文件,associate.py下载地址
#  PATH_TO_SEQUENCE为下载的TUM数据集路径,rgb.txt为数据集自带
python associate.py PATH_TO_SEQUENCE/rgb.txt PATH_TO_SEQUENCE/depth.txt > associations.txt
    (2)复制字典,高翔博士的Vocabulary没有ORBvoc.txt,需要复制一下ORB_SLAM2当中的

     (3)运行程序
# PATH_TO_SEQUENCE_FOLDER 为数据集路径,我的为data/rgbd_dataset_freiburg1_xyz/
# ASSOCIATIONS_FILE为associate.py生成的txt文件路径
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE
    (4)完结撒花

   ⑤保存点云

    (1)修改ORB_SLAM2_modified/pointcloudmapping.cc文件:
               添加头文件
#include <pcl/io/pcd_io.h>
               在文件126行void PointCloudMapping::viewer()中,while(1)结束后后追加两行代码
pcl::io::savePCDFile("result.pcd", *globalMap);
cout << "Final result saved." << endl;
    (2)重新编译ORB_SLAM2_modified,再运行就会生成result.pcd

      (3)终端输入命令查看点云文件
pcl_viewer result.pcd 

7.1 问题

①报错:error: no matching function for call to ‘g2o::SE2::setRotation (Eigen::Rotation2D<double>::Scalar

解决办法:修改 g2o_with_orbslam2/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp,51行

将
t.setRotation(t.rotation().angle()+_measurement);
改为
t.setRotation((Eigen::Rotation2Dd)(t.rotation().angle()+_measurement));

②error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_ TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

    解决办法:修改 g2o_with_orbslam2/g2o/solvers/linear_solver_eigen.h,54行
将
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;
改为
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;

③error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__ INTEGER_WAS_EXPECTED’ is not a member of ‘Eigen::internal::static_asse

    解决办法:修改g2o_with_orbslam2/g2o/solvers/linear_solver_eigen.h,80行
将
VectorXd probLimits(MO_NUM_ELEMS);
      for (int i = 0; i < probLimits.size(); ++i)
        probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS;
改为
VectorXd probLimits;
      probLimits.resize(MO_NUM_ELEMS);
      for (int i = 0; i < probLimits.size(); ++i)
        probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS;

④Could not find a configuration file for package "OpenCV" that is compatible with requested version "2.4.3"

    解决办法:修改CmakeLists.txt中的find_package(OpenCV 2.4.3 REQUIRED),为自己的版本

⑤Could not find a package configuration file provided by "Qt5X11Extras" with any of the following names:

    解决办法:sudo apt install libqt5x11extras5-dev

⑥Could not find a package configuration file provided by "Qt5UiPlugin" with a

    解决办法:sudo apt-get install qttools5-dev

⑦error while loading shared libraries: libvtkgl2ps-7.1.so.1: cannot open shared object file: No such file or directory

    解决办法:源码安装问题多,需要自己添加到环境变量里去

⑧double free or corruption (out) 已放弃 (核心已转储)

    解决办法:更换eigen版本为3.2.1       

8 总结

    兜兜转转,总算跑起来了,段错误一生之敌,还是得学会如何使用编译工具查看段错误的位置才行。后面的话,深入学习了ROS,再尝试使用ROS来跑ORB_SLAM2。

参考博客

orb_slam从零开始保姆级环境安装配置教程 - 量子与太极 - 博客园

Ubuntu18.04更改国内镜像源(阿里云、网易、清华、中科大)_花好约猿上王者的博客-CSDN博客_ubuntu国内镜像源

一文搞定Ubuntu编译安装OpenCV(附网盘链接)_小鹏聊智驾的博客-CSDN博客

ubuntu 下pcl1.8的安装与测试_magic_ll的博客-CSDN博客_ubuntu安装pcl1.8

https://www.jianshu.com/p/548234bb88fc

Eigen3卸载与重装_憨憨2号的博客-CSDN博客_eigen卸载


本文转载自: https://blog.csdn.net/weixin_46596757/article/details/127528792
版权归原作者 野马AS 所有, 如有侵权,请联系我们删除。

“ubuntu从零到一跑通ORB_SLAM2及其ORBSLAM2_with_pointcloud稠密建图”的评论:

还没有评论