Ubuntu 20.04 编译ORB_SLAM2源码(普通模式) + 点云地图构建 + 增加颜色信息

主要记录一下自己跑得时候遇见的问题的整合,自己搭建环境的时候差不多浏览了不下一百多个网站,整和一下资源提高大家的效率。参考链接里面的大佬都写的非常详细,可以看看他们的文章

  • Write by Evelyn Dou 2022/09/01

参考网址:https://www.jianshu.com/p/31c95d9a5f97

https://codingnote.cc/p/484790/

复现源码的过程遇见了很多编译器版本的坑,一开始使用C++14去解决,后面会出现一连串的问题,最终还是屈服使用pangolin 0.5 版本,换了版本之后编译就比较顺利

系统平台:

  • ubuntu20.04

  • gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

安装依赖项

opencv 3.4.10

各个版本opencv source:Releases - OpenCV 在opencv安装的时候踩了很多的坑,一开始安装最新版本的opencv4,导致 pkg-config --modversion opencv 命令运行的时候找不到版本,需要改变命令pkg-config --modversion opencv4就可以找到了。在安装完opencv之后一定要确认以下能否找到pkg,不然后面调用的时候会出现问题

我也尝试使用3.2.10,但是后面还是会出现问题,最终采用了3.4.10版本

  • ubuntu20.04 + python3.8

    安装过程中如果遇到 cuda 路径的问题,解决方案如下:安装opencv3.4.0报错 - thmx - 博客园

  • 安装开发者工具

    sudo apt update
    sudo apt upgrade
    sudo apt install build-essential cmake unzip pkg-config
    sudo apt install libjpeg-dev libpng-dev libtiff-dev
    sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
    sudo apt update
    sudo apt install libjasper1 libjasper-dev
    sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    sudo apt install libxvidcore-dev libx264-dev
    sudo apt install libgtk-3-dev
    sudo apt install python3.8-dev
    

获取opencv

获取最新版本opencv可以直接从git获取文件:

cd ~
​
git clone https://github.com/Itseez/opencv.git  
​
git clone https://github.com/Itseez/opencv_contrib.git

下载特定版本的压缩包(3.4.10)

wget https://github.com/opencv/opencv/archive/3.2.0.tar.gz
​
tar -xvzf 3.4.10.tar.gz
​
wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip
​
unzip 3.4.10.zip
  • 编译opencv

进入我们下载好的opencv文件,可以直接改成opencv比较方便,也可以是自己的文件名

cd ~/opencv
​
mkdir build
​
cd build
​
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_CUDA=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_EXAMPLES=ON ..    #个性化编译
​
# 其中编译也可以直接cmake ..
  • 编译过程中遇见的errorr

    • 网络问题导致很多文件下载不了,ippicv,可以在原来的下载网址前面添加代理就好了 GitHub Proxy 代理加速,如果遇见网络问题可以一个一个这样子解决,指定下载地址的文件在 opencv/3rdparty/ippicv/downloader.cmake 里面

    • boostdesc, vgg 下载:将opencv_contrib/modules/xfeatures2d/cmake 路径下的两个文件 download_boostdesc.cmake 和 download_vgg.cmake 中的 raw.githubusercontent.com 网址也修改为添加代理的地址。

确保上述所有的步骤没有ERROR之后,进行编译安装 make -j16 # 使用多线程

sudo make install    # 默认安装到 /usr/local/bin 目录中
​
sudo ldconfig  # 更新动态链接库

检查是否安装成功:

ldconfig -p | grep opencv  # -p = print
​
pkg-config --modversion opencv  #结果应该是刚刚安装的版本,一定要可以找到,不然后面调用的时候会找不到opencv,需要添加路径和环境变量

ERROR: 安装完之后,可能会出现ERROR CMake Error at CMakeLists.txt:37 (message):OpenCV > 2.4.3 not found.

解决方案: CMakeLists.txt添加:

set(OpenCV_DIR /$PATH to opencv/build)
find_package(OpenCV QUIET)

使用上述办法可能会解决一部分的情况,如果还是解决不了,参考以下文章步骤解决

找不到pkg的解决方案:Comprehensive guide to installing OpenCV 4.1.0 on Ubuntu 18.04 from source – CV-Tricks.com

To verify that the variables are set:使用以下命令看看路径
​
echo $PKG_CONFIG_PATH
echo $LD_LIBRARY_PATH

卸载opencv(如果存在版本不兼容的情况,可能需要卸载open,但是sudo make uninstall只会卸载,不会删除相关的文件,我们需要使用以下命令),我卸载了很多次,血泪的教训

具体操作步骤:

1、在ubuntu系统桌面中使用快捷键【Ctrl+Alt+T】打开终端命令行模式。

2、在ubuntu终端命令行输入以下命令进入安装opencv的build目录并进行卸载操作。

sudo make uninstall
cd (安装opencv的build目录路径) #使用cd命令进入安装opencv的build目录
sudo rm -r build

3、最后在输入以下命令清理/usr中所有opencv相关项即可。

sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*

注意:可能有部分文件夹找不到,那就不用清理。

Eigen3 3.2.10版本

wget  https://gitlab.com/libeigen/eigen/-/archive/3.2.10/eigen-3.2.10.tar.gz
​
tar -xvzf eigen-3.2.10.tar.gz 
​
mkdir build
​
cd build
​
cmake ..
​
sudo make install

默认安装在/usr/local/include/eigen3 路径下。安装好之后可以看看自己的文件夹里面是否有,如果没有的话,需要重新安装

Pangolin 0.5

Pangolin版本真的是一个很大的坑,虽然最新版本的也可以用,我们可以用过修改cmake list里面的C++版本,即所有的C++11替换成C++14,后续也会出现相应的要修改的地方,在ORB SLAM2里面后续也会遇见判断C++11的语句,如果遇见相应报错,直接把判断语句删掉,留下原本的三个条件就好

Pangolin官网:https://github.com/stevenlovegrove/Pangolin

推荐使用Pangolin0.5版本:安装链接:https://github.com/stevenlovegrove/Pangolin/tree/v0.5 # OpenGL sudo apt install libgl1-mesa-dev

# Glew
sudo apt install libglew-dev
​
# CMake
sudo apt install cmake
​
# python 
sudo apt install libpython2.7-dev
sudo python -mpip install numpy pyopengl Pillow pybind11
​
# Wayland
sudo apt install pkg-config
sudo apt install libegl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols
​
# FFMPEG (For video decoding and image rescaling)
sudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev
​
# DC1394 (For firewire input)
sudo apt install libdc1394-22-dev libraw1394-dev
​
# libjpeg, libpng, libtiff, libopenexr (For reading still-image sequences)
sudo apt install libjpeg-dev libpng-dev libtiff5-dev libopenexr-dev
​
# build Pangolin
git clone https://github.com/stevenlovegrove/Pangolin.git
​
cd Pangolin
​
mkdir build
​
cd build
​
cmake ..
​
cmake --build .    # 注意最后那个点

测试实例:

cd ~/Pangolin/build/examples/HelloPangolin
​
./HelloPangolin 

测试实例会出现一个立方体,鼠标可以拖动,如果测试没有问题就是装好了,测试完不成的话,检查一下前面的几个步骤是不是都完全装好了

在编译Pangolin0.5的时候,也遇见了一些编译问题:参考:视觉SLAM十四讲 Ubuntu20.04 Pangolin 环境配置_Robert_Q的博客-程序员ITS301 - 程序员ITS301

1.error: ‘AV_PIX_FMT_XVMC_MPEG2_MC’ was not declared in this scope

参考:https://github.com/stevenlovegrove/Pangolin/pull/318/files?diff=split&w=0

解决办法:在/Pangolin/CMakeModules/FindFFMPEG.cmake中63,64行

    sizeof(AVFormatContext::max_analyze_duration2);
  }" HAVE_FFMPEG_MAX_ANALYZE_DURATION2

换成

    sizeof(AVFormatContext::max_analyze_duration);
  }" HAVE_FFMPEG_MAX_ANALYZE_DURATION

/Pangolin/src/video/drivers/ffmpeg.cpp中第37行 namespace pangolin上面加上

#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER

第78,79行 TEST_PIX_FMT_RETURN(XVMC_MPEG2_MC); TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);

改为

#ifdef FF_API_XVMC
    TEST_PIX_FMT_RETURN(XVMC_MPEG2_MC);
    TEST_PIX_FMT_RETURN(XVMC_MPEG2_IDCT);
#endif

101-105行改为

#ifdef FF_API_VDPAU
    TEST_PIX_FMT_RETURN(VDPAU_H264);
    TEST_PIX_FMT_RETURN(VDPAU_MPEG1);
    TEST_PIX_FMT_RETURN(VDPAU_MPEG2);
    TEST_PIX_FMT_RETURN(VDPAU_WMV3);
    TEST_PIX_FMT_RETURN(VDPAU_VC1);
#endif

127行改为

#ifdef FF_API_VDPAU
    TEST_PIX_FMT_RETURN(VDPAU_MPEG4);
#endif

2.error: ‘AVFMT_RAWPICTURE’ was not declared in this scope

解决办法,在Pangolin/include/pangolin/video/drivers/ffmpeg.h开头加上

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

参考: https://www.jianshu.com/p/da49a712410f

安装好上述的依赖项,我们就可以对SLAM进行编译了

git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
​
cd ORB_SLAM2
​
chmod +x build.sh
​
./build.sh

常见ERROR:

1.找不到Eigen,可以在Cmakelist.txt里面的findpackage()的最后加上一个NO_MOUDLE参数

2.error: ‘slots_reference’ was not declared in this scope

  • 这个是由于编译器版本不兼容导致的,最新版本的Pangolin使用了c++14,SLAM用的C++11,可以在Cmakelist.txt里面改一下编译器版本,但是不只是这一处需要修改,后续编译还是会出现这种问题,可以按照报错的代码段修改所有关于编译器版本的问题,

  • 也可以直接卸载Pangolin装0.5版本

3.usleep问题:在include文件夹下 System.h 文件中加上

#include 

error: static assertion failed: std::map must have the same value_type as its allocator

  • 在LoopClosing.h中将

    typedef map,
            Eigen::aligned_allocator > > KeyFrameAndPose;

改为

    typedef map,
            Eigen::aligned_allocator > > KeyFrameAndPose;

然后重新编译一下,有可能更改之后还是无法成功编译,可以复制error在google中搜索,我记得有一个方案说明了明确的方案,但是忘记了

4.march=native大坑,有时候编译成功之后,跑demo会出现内存错误,报错是segamentation fault,

删除掉ORBSLAM的Cmakelists中的 -march=native 以及 g2o 的cmakelists中的 -march=native 重新执行ORBSLAM目录下的./build.sh 后就可以正常跑了

5.没有工具包:sudo apt install libcanberra-gtk-module -y

6.网上也看见了别人还遇见了一些坑以及解决方案:ORB-SLAM2运行时遇到的问题_Gone_float的博客-CSDN博客

运行示例

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER

ORB_SLAM2_modified 稠密点云地图重建

除了上述的依赖项,构建点云地图还需要下载PCL库

安装PCL

sudo apt install libpcl-dev

下载源码,编译

git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git

下载之后单独把modified的文件提取出来就好,注意不是zip文件里的modified 把原本 ORB SLAM2 repo 中的 Vocabulary 文件夹和它里面的 ORBvoc.txt.tar.gz 文件拷贝过来,放到 ORB_SLAM2_modified 路径下,之后编译就好

在使用数据之前,需要对 rgbd_dataset_freiburg1_xyz 中的 RGB 文件和 Depth 文件进行匹配。TUM 数据官网 提供了匹配的程序 associate.py,https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools/src/rgbd_benchmark_tools/associate.py

命令为:

python associate.py rgb.txt depth.txt  > association.txt

在对准深度信息和RGB信息的时候会出现一些小坑,是由于python版本不同导致的,报错为:’dict_keys‘ object has no attribute 'remove'

将代码的86,87行的前面加上一个list就好: 也就是改成以下形式

first_keys = list(first_list.keys())

运行实例命令

./bin/rgbd_tum Vocabulary/ORBvoc.bin path_to_settings path_to_sequence path_to_association

Ubuntu 20.04 编译ORB_SLAM2源码(普通模式) + 点云地图构建 + 增加颜色信息_第1张图片

 运行效果如上图。

建立彩色点云地图的方法https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map/issues/10#issuecomment-309663764

按照步骤修改 ~/ORB_SLAM2_modified/include/Tracking.h 和 ~/ORB_SLAM2_modified/src/Tracking.cc,重新编译系统

也会有少少的坑,大致跟着报错修改就好。重新编译就可以了

在黑白点云地图中加入颜色信息

1 ~/ORB_SLAM2_modified/include/Tracking.h

将105行的代码改成上述形式,加入颜色信息

2 ~/ORB_SLAM2_modified/src/Tracking.cc

Ubuntu 20.04 编译ORB_SLAM2源码(普通模式) + 点云地图构建 + 增加颜色信息_第2张图片

将第210行代码改成上述形式。

以及第1142行代码改为以上形式之后,重新编译就可以了。

运行效果

Ubuntu 20.04 编译ORB_SLAM2源码(普通模式) + 点云地图构建 + 增加颜色信息_第3张图片

你可能感兴趣的:(opencv,ubuntu,计算机视觉)