前言
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卸载
版权归原作者 野马AS 所有, 如有侵权,请联系我们删除。