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

Posted 野马AS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ubuntu从零到一跑通ORB_SLAM2及其ORBSLAM2_with_pointcloud稠密建图相关的知识,希望对你有一定的参考价值。

目录

前言

1  安装ubuntu18.04.6

1.1 问题

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

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

2 cmake 及编译基本环境安装

3 安装Eigen 3.2.10

4 安装Pangolin 0.5   

5 安装OpenCV 3.4.7

5.1 问题

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

6 运行ORB_SLAM2

6.1 问题

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

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

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

7.1 问题

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

②error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_ TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

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

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

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

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

⑦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) 已放弃 (核心已转储)

8 总结

参考博客


前言

        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)增加8G16G交换空间 (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卸载

以上是关于ubuntu从零到一跑通ORB_SLAM2及其ORBSLAM2_with_pointcloud稠密建图的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别