ORB-SLAM2学习笔记1之Ubuntu20.04+ROS-noetic安装ORB-SLAM2

文章目录

  • 0 引言
  • 1 安装依赖
    • 1.1 opencv安装
    • 1.2 Eigen3安装
    • 1.3 Pangolin安装
    • 1.4 其他
  • 2 编译安装ORB-SLAM2
    • 2.1 build.sh
    • 2.2 build_ros.sh

0 引言

ORB-SLAM2是一种用于单目、双目和RGB-D相机的视觉SLAM(同时定位与地图构建)系统。它由萨拉戈萨大学和伦敦帝国学院的研究人员开发,并于2016年首次发布。

该系统基于ORB特征检测器和描述子,这是一种快速且具有鲁棒性的特征提取方法。ORB-SLAM2使用了多种技术,包括相机姿态估计、特征匹配、回环检测和地图优化等,以实现高精度的定位和地图构建。它还支持实时运行,并且可以在没有先验地图的情况下进行自适应构建。ORB-SLAM2已成为许多研究和工业应用中的常用SLAM系统之一。

本文主要包括Ubuntu20.04系统下,并已安装对应的ROS-noetic机器人系统,在此基础上如何一步步安装ORB-SLAM2的依赖库,比如OpenCVEigen3Pangolin,最后安装非ROS版本ROS版ORB-SLAM2,以及安装过程中遇到的问题和解决问题的办法。

本文系统:

  • Ubuntu20.04系统
  • ROS-noetic机器人系统

1 安装依赖

1.1 opencv安装

建议下载源码编译安装的方式,OpenCV-release下载地址,可以选择OpenCV3的版本,比如OpenCV-3.4.16版本,找到对应版本,点击Sources下载即可。

# 安装OpenCV依赖
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
# 进入到OpenCV下载文件夹目录,新开终端,这里以3.4.16版本为例
unzip opencv-3.4.16.zip
# 编译安装
cd opencv-3.4.16/
mkdir build
cd build
# cmake
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES ..
# make
make -j4
# install
sudo make install

安装后可进行测试

cd opencv-3.4.16/samples/cpp/example_cmake
cmake .
make
./opencv_example
# 笔记本有摄像头的话,会自动打开,如下图

请添加图片描述
也可以用以下命令查看安装的版本

pkg-config --modversion opencv
# 3.4.16

1.2 Eigen3安装

eigen3 一般已经安装了,可用如下命令查看:

# 查看前18行,可自行调整
cat /usr/include/eigen3/Eigen/src/Core/util/Macros.h | head -n 18

比如出现如下所示,eigen版本是3.3.7

#ifndef EIGEN_MACROS_H
#define EIGEN_MACROS_H#define EIGEN_WORLD_VERSION 3
#define EIGEN_MAJOR_VERSION 3
#define EIGEN_MINOR_VERSION 7

如果确定没有安装,可用如下命令直接安装:

sudo apt-get install libeigen3-dev

1.3 Pangolin安装

同样也是源码编译安装,Pangolin下载地址,本文用的是Pangolin-0.6版本,进入后选择v0.6,然后点击source code(zip)下载即可。

# 安装依赖库
sudo apt-get update
sudo apt-get install libxkbcommon-dev
sudo apt-get install wayland-protocols
sudo apt install libglew-dev
# 进入到Pangolin下载文件夹目录,新开终端,这里以0.6版本为例
unzip Pangolin-0.6.zip
cd Pangolin-0.6/
mkdir build
cd build
# cmake
cmake ..
# make
make -j4
# install
sudo make install

安装可能出现的问题

  1. make时缺少pybind11.h的报错问题
fatal error: pybind11/pybind11.h: No such file or directory30 | #include <pybind11/pybind11.h> 

解决办法:由于下载的Pangolin-0.6.zip,解压后external/pybind11文件夹下是空的,所以找不到,当然CMakeLists.txt中也有find_package(pybind11 QUIET),所以有以下两种办法解决,本文用第二种解决了编译错误。

  • 1.安装pybind11:python3 -m pip install pybind11pip install pybind11
  • 2.下载pybind11源码解压后放到external/pybind11文件夹下,比如下载了pybind11-2.10.4.zip,解压的pybind11-2.10.4文件夹中的所有文件放到external/pybind11文件夹下

1.4 其他

  1. DBoW2 and g2o两个库已经包含在官方工程的ORB-SALM2-->Thirdparty文件夹中,同时官方也把这两个库的安装命令写到了编译安装脚本build.sh中。

  2. ORB-SLAM2也有ROS版本,所以也需要安装ROS机器人系统,如果是Ubuntu20.04,那么就安装对应的ROS-noetic版本。

2 编译安装ORB-SLAM2

2.1 build.sh

以下是非ROS版本ORB_SLAM2安装:

# 比如home下新开终端,确定下载的路径
# 下载ORB_SLAM2
git clone https://github.com/raulmur/ORB_SLAM2.git
cd ORB_SLAM2
chmod +x build.sh
./build.sh

编译出现的问题:
问题1error: ‘usleep’ was not declared in this scope

解决办法ORB_SLAM2/include/System.h头文件中添加

#include<unistd.h>

问题2LoopClosing.h 中eigen类别定义问题

解决办法ORB_SLAM2/include/ORBextractor.h中如下修改

// Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;

问题3OpenCV头文件引用问题
解决办法ORB_SLAM2/include/ORBextractor.h中注释掉cv.h,新增如下两行

// #include <opencv/cv.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>

2.2 build_ros.sh

以下是ROS版ORB_SLAM2安装:
打开build_ros.sh文件中可以看到,ROS版ORB_SLAM2/Examples/ROS/ORB_SLAM2/目录下,对应的编译build也是在对应的文件夹下。

# 冒号后的 PATH 替换成自己的ORB_SLAM2工程保存目录
# 添加以下export到 ~/.bashrc 中,可以 vim ~/.bashrc,添加到最后一行
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
source ~/.bashrc
# 给.sh脚本权限
chmod +x build_ros.sh
# 编译
./build_ros.sh

编译可能出现的问题:
问题1ROS-noetic中OpenCV4ORB_SLAM2中OpenCV3不匹配的问题

/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_imgproc.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgproc.so.3.4
/usr/bin/ld: warning: libopencv_core.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_core.so.3.4
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZNK2cv8FileNodecviEv'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libopencv_core.so.4.2.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/Stereo.dir/build.make:179: ../Stereo] Error 1
make[1]: *** [CMakeFiles/Makefile2:514: CMakeFiles/Stereo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

解决办法
因为ORB_SLAM2用的OpenCV3,刚刚1.1小节中安装的也是OpenCV3,但是Ubuntu20.04对应的ROS noetic自带的是OpenCV4,而cv_bridge链接的是OpenCV4,所以,与OpenCV3存在冲突,解决方法如下:

根据报错提示,进入libopencv_imgcodecs.so.4.2libopencv_proc.so.4.2所在位置/usr/lib/x86_64-linux-gnu/目录下,然后复制到ORB_SLAM2的ROS版本的lib目录中

# PATH替换成自己的ORB_SLAM2工程保存目录
cd /usr/lib/x86_64-linux-gnu/
sudo cp libopencv_imgproc.so.4.2 PATH/ORB_SLAM2/lib/libopencv_imgproc.so.4.2
sudo cp libopencv_core.so.4.2 PATH/ORB_SLAM2/lib/libopencv_core.so.4.2

然后在ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt中添加两个lib的路径${PROJECT_SOURCE_DIR}/../../../lib/libopencv_core.so.4.2${PROJECT_SOURCE_DIR}/../../../lib/libopencv_imgproc.so.4.2

# ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt文件中添加
set(LIBS 
${OpenCV_LIBS} 
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
# for opencv4
${PROJECT_SOURCE_DIR}/../../../lib/libopencv_core.so.4.2
${PROJECT_SOURCE_DIR}/../../../lib/libopencv_imgproc.so.4.2

然后回到ORB_SLAM2的工程目录下,重新执行./build_ros.sh,如下,不再报错,编译成功。

[ 22%] Linking CXX executable ../MonoAR
[ 22%] Linking CXX executable ../RGBD
[ 33%] Linking CXX executable ../Mono
[ 44%] Linking CXX executable ../Stereo
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../../../../lib/libORB_SLAM2.so, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../../../../lib/libORB_SLAM2.so, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by /usr/local/lib/libopencv_highgui.so.3.4.16, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../../../../lib/libORB_SLAM2.so, may conflict with libopencv_core.so.4.2
[100%] Built target Stereo
[100%] Built target RGBD
[100%] Built target Mono
[100%] Built target MonoAR

问题2rosdep的问题

[rospack] Error: could not call python function 'rosdep2.rospack.init_rospack_interface'CMake Error at /opt/ros/melodic/share/ros/core/rosbuild/public.cmake:129 (message):Failed to invoke rospack to get compile flags for package 'ORB_SLAM2'.Look above for errors from rospack itself.  Aborting.  Please fix thebroken dependency!Call Stack (most recent call first):/opt/ros/melodic/share/ros/core/rosbuild/public.cmake:207 (rosbuild_invoke_rospack)CMakeLists.txt:4 (rosbuild_init)-- Configuring incomplete, errors occurred!

解决办法:
手动执行修复rosdep

sudo rosdep fix-permissions

但解决这个问题后,又出现下述的问题3

问题3libboost_system.so链接不到的问题

collect2: error: ld returned 1 exit status
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line

解决办法:
手动添加-lboost_systemORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt,如下所示:

set(LIBS 
${OpenCV_LIBS} 
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
# 解决libboost_system.so链接不到的问题
-lboost_system

然后回到ORB_SLAM2的工程目录下,重新执行./build_ros.sh,如下,不再报错,编译成功。

[ 11%] Linking CXX executable ../Mono
[ 22%] Linking CXX executable ../RGBD
[ 33%] Linking CXX executable ../MonoAR
[ 44%] Linking CXX executable ../Stereo
[ 55%] Built target RGBD
[ 66%] Built target Mono
[ 88%] Built target MonoAR
[100%] Built target Stereo

Reference:

  • https://github.com/raulmur/ORB_SLAM2
  • https://stackoverflow.com/questions/46396204/affdex-cpp931-fatal-error-pybind11-pybind11-h-no-such-file-or-directory-in
  • https://stackoverflow.com/questions/61758906/building-cpp-with-pybind11



须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/23331.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python_paramiko_与linux交互

一、基础功能介绍 # codingutf-8 import paramiko from time import sleep# 建立通信 transport paramiko.Transport((192.168.0.7, 22)) print(transport) # <paramiko.Transport at 0x5745ed0 (unconnected)># 建立连接 transport.connect(usernameroot, password1…

Vue3+ts;枚举(enum);Partial全部可选/Pick选一部分/配置 svg 图标/unplugin-vue-components组件自动按需加载

项目的创建 使用 create-vue 脚手架创建项目。 1.执行创建命令 pnpm create vue # or npm init vuelatest # or yarn create vue2.选择项目依赖内容。 ✔ Project name: … //项目名 ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router …

ChatGPT:利用人工智能助推教育创新

当前&#xff0c;世界正需要一个更加开放的、更加个性化的学习空间&#xff0c;学生的个性发展和生存发展应该被关注和尊重&#xff0c;课程应该引导学生掌握有用的东西&#xff0c;学生之间的差距应该被正视&#xff0c;教育成功的标准也要被重新定义。过去&#xff0c;我们总…

全网最完整,接口测试总结彻底打通接口自动化大门,看这篇就够了......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试 前言 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递…

【Spring Cloud系列】Hystrix应用详解

【Spring Cloud系列】Hystrix应用详解 文章目录 【Spring Cloud系列】Hystrix应用详解一、概述二、什么是Hystix三、Hystrix作用四、Hystrix设计原则五、Hystrix实现原理5.1 隔离5.2 熔断5.3 降级服务降级主要用于什么场景呢实现服务降级需要考虑几个问题降级分类 5.4 缓存请求…

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…

RPC和HTTP区别是什么?

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;RPC和HTTP区别是什么&#xff1f; ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的…

latex3【排版】

多行公式排版&#xff1a;&#xff08;gather、align、split、cases&#xff09; \section{多行公式}%gather环境\begin{gather} abba \\ abcbaccbacab\end{gather}\begin{gather*} abba \\ abcbaccbacab\end{gather*}​\begin{gather} abba \\ 123 \notag …

第十五章——友元、异常

友元 类并非只能拥有友元函数&#xff0c;也可以将类作为友元。在这种情况下&#xff0c;友元类的所有方法都可以访问原始类的私有成员和保护成员。因此尽管友元被授予从外部访问类的私有部分的权限&#xff0c;但它们并不与面向对象的编程思想相悖&#xff0c;相反提高了共有…

【高效】极致简化vuex.js(仅需6行代码),让快速敏捷开发不是梦!

vuex.js import Vue from vue; import Vuex from vuex; Vue.use(Vuex); // 设置vuex所有变量 let state {_qiangGe: false,//需要添加全局变量就在此处回车添加一个即可&#xff0c;非常方便&#xff01;&#xff01;&#xff01; }, getters {}, mutations {}, actions …

重塑未来的1课:组装式交付新引擎——华为云智能化低代码平台

HDC期间可参与Astro注册抽奖&#xff0c;活动详情见文末&#xff01; 紧跟低代码技术飞速发展——华为云Astro智能工作流惊艳HDC.Cloud 2023&#xff01; 企业对未来智能化组装式交付的期待已不是空想。智能化低代码即将重新定义传统交付模式&#xff0c;密切连接AI科技与创造…

万字解读 | 数据可视化平台--FineBI

什么是BI 学习目标 知道什么是BI 知道FineBI的优势 1. 商业智能: BI&#xff08;Business Intelligence&#xff09;是指通过收集、分析和解释企业内外部数据&#xff0c;为企业决策提供支持和指导的一种技术和工具。商业智能的目标是帮助企业管理者和决策者更好地理解企业…