SLAM-学习笔记(V):安装 ORB SLAM 2

SLAM-学习笔记(V):安装 ORB SLAM 2

ORB-SLAM2 是一个用于单目、双目和 RGB-D 相机的实时 SLAM 库,用于计算相机轨迹和稀疏 3D 重建(在立体和 RGB-D 情况下具有真实比例)。它能够检测循环并实时重新定位摄像机。

raulmur/ORB_SLAM2

依赖

C++11 或 C++0x 编译器

ORB-SLAM2 使用 C++11 的 thread 和 chrono 新功能。

sudo apt-get update
sudo apt-get install  cmake gcc g++ git
sudo apt-get install libblas-dev liblapack-dev

Pangolin

stevenlovegrove/Pangolin

  1. 下载源代码并解压
    Pangolin-0.6.zip
  2. 安装依赖
    sudo apt install libgl1-mesa-dev libglew-dev cmake libpython2.7-dev libwayland-dev libxkbcommon-dev wayland-protocols libepoxy-dev python3-pip -y
    
    python3 -m pip install wheel
    
  3. 构建编译
    cd Pangolin-0.6
    
    cmake -B build
    
    cd build
    
    make -j4
    
    sudo make install
    

Eigen3

安装 ROS Noetic Desktop Full 安装了 Eigen3.3.7,经测可以使用

OpenCV 3.4.5

由于 ORB-SLAM2 代码是基于 OpenCV 2/3 ,但是在安装 ROS Noetic Desktop Full 安装了 OpenCV 4,故需要下载旧版 OpenCV 或修改 ORB-SLAM2 代码

修改代码做适配目前对笔者要求较高,拼尽全力无法完成通过编译,所以选择下载旧版 OpenCV 3.4.5 但是由于系统存在两个版本的 OpenCV 可能会导致出现奇怪的报错

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev libcanberra-gtk*


cd opencv-3.4.5

mkdir build && cd build 

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j8

sudo make install

pkg-config --modversion opencv

安装编译 ORB-SLAM2

安装好上述依赖后,终于可以直接 git clone ORB-SLAM2 的代码然后编译运行了吗?!大错特错。由于 Ubuntu 20.04 配套的 C++ 版本为14,而 ORB-SLAM2 的 CMakeLists 指定了是 11,请修改 ORB-SLAM2 下的 CMakeLists.txt

# Check C++11 or C++0x support
# include(CheckCXXCompilerFlag)
# CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
# CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
# if(COMPILER_SUPPORTS_CXX11)
#    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#    add_definitions(-DCOMPILEDWITHC11)
#    message(STATUS "Using flag -std=c++11.")
# elseif(COMPILER_SUPPORTS_CXX0X)
#    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
#    add_definitions(-DCOMPILEDWITHC0X)
#    message(STATUS "Using flag -std=c++0x.")
# else()
#    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
# endif()

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
if(COMPILER_SUPPORTS_CXX14)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
   add_definitions(-DCOMPILEDWITHC14)
   message(STATUS "Using flag -std=c++14.")
elseif(COMPILER_SUPPORTS_CXX11)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
   add_definitions(-DCOMPILEDWITHC11)
   message(STATUS "Using flag -std=c++11.")
else()
   message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 or C++11 support. Please use a different C++ compiler.")
endif()

还没完,将代码中所有出现 std::chrono::monotonic_clock 的地方替换为 std::chrono::steady_clock

还有一件事。 ORB_SLAM2/include/LoopClosing.h 中大概 50行 的位置,将

typedef map<KeyFrame*,g2o::Sim3 std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;

修改为

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;

然后就可以编译了

cd ORB_SLAM2
chmod +x build.sh
./build.sh

包了这么多碟醋,就是为了这顿饺子
然后下载数据集测试是否成功运行即可!

ORB-SLAM2 ROS

由于上面安装了 OpenCV 3.4.5 ,会导致编译 ROS 节点时出错,这里采用重新编译 cv_bridge 的方法解决这个问题,首先下载好noetic 版本的 cv_bridge

修改 cv_bridge CmakeLists.txt

# set(_opencv_version 4)
# find_package(OpenCV 4 QUIET)
# if(NOT OpenCV_FOUND)
#   message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
#   set(_opencv_version 3)
# endif()
set(_opencv_version 4)

编译安装 cv-bridge

# 卸载 cv-bridge 软件包
sudo apt-get remove ros-noetic-cv-bridge

cd vision_opencv/cv_bridge

mkdir build
cd build

cmake ..

make

sudo make install

最后运行 build_ros.sh

cd ORB_SLAM2
chmod +x build_ros.sh
./build_ros.sh

最后下载数据集测试是否成功运行即可!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值