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

news2024/11/28 20:46:00

文章目录

  • 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 directory
   30 | #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

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

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

#include<unistd.h>

问题2:LoopClosing.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;

问题3:OpenCV头文件引用问题
解决办法: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

编译出现的问题:
问题1:ROS-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

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.coloradmin.cn/o/741757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试之常用测试用例设计方法

本文讲解了软件测试的四种常用测试用例设计的方法 目录 大纲 等价类划分 边界值分析方法 边界值分析方法 判定表法 场景法 错误推荐法&#xff08;剩下几个小时需要上线&#xff09; 前言 软件测试描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句…

嘉立创EDA练习

https://lceda.cn/page/download https://prodocs.lceda.cn/cn/faq/client/index.html 基础电子电路知识&#xff1a; 基础操作 Shiftf&#xff1a;调出元件库 嘉立创打样只能10cmX10cm之内 过孔的放置 检查DRC(是否有连线错误) 导出Gerber 导出坐标文件 坐标文件一般…

使用docker 部署k8s集群

目录 一、环境准备&#xff1a; 二、master节点修改hosts&#xff0c; 配置主机可达 三、将桥接的IPv4流量传递到iptables的链 四、配置 daemon.json&#xff0c;设置cgroup的管理方式为systemd及配置阿里云镜像加速 五、添加yum源 六、安装 kubeadm&#xff0c;kubelet …

Android Java代码与JNI交互字符串转换(四)

🔥 Android Studio 版本 🔥 🔥 创建JNIString.java 🔥 package com.cmake.ndk1.jni;public class JNIString {static{System.loadLibrary("string-lib");}public native String callNativeString(String str);public native void stringMethod(String str)…

凯迪仕智能锁包揽行业五项大奖 K70 Pro Max再现品牌非凡实力

第25届建博会于7月11日落幕。Kaadas凯迪仕第10年受邀参展&#xff0c;凭借508㎡的超大展馆和重磅新品K70“千里眼”智能锁震撼亮相&#xff0c;各圈层网红云集打卡直播以及众多主流及行业媒体聚集报道&#xff0c;人头攒动&#xff0c;再掀行业新热潮。 值得一提的是&#xff…

Arcgis Pro NDVI(植被指数)导出RGB

在arcgis中计算的NDVI栅格数据&#xff0c;取值范围为-1到1&#xff0c;直接导出JPG或者PNG&#xff0c;会出现导出错误的问题&#xff1a; 导出出错&#xff0c; 设置导出格式为TIFF&#xff0c;然后选中使用渲染器&#xff0c;勾选强制RGB颜色&#xff0c;即可导出你选择的色…

IIS实现http跳转https的重定向方法

整体流程为&#xff1a; 1、安装SSL证书&#xff1b;2、下载安装URL Rewrite模块&#xff1b;3、配置“URL重写”规则&#xff0c;或者修改web.config配置文件。 一、安装部署证书 首先安装SSL证书。 二、安装URL ReWrite扩展 URL ReWrite扩展下载地址https://www.iis.net/…

C语言学生信息管理系统

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 1. 用户界面: 提供一个简洁的文本界面&#xff0c;用户可…

windows 系统数据结构化组织

wmi 类枚举 枚举类实例 命令行查询类属性 Get-WmiObject -Query "select * from Win32_NTLogEvent where EventCode 104"wbemtest 查询 eventvwr 查看验证

Package amstex Error: Package `amstex‘ is obsolete, substituting `amsmath‘.

报错原文&#xff1a; Package amstex Error: Package amstex is obsolete, substituting amsmath.包 “amstex” 已过时&#xff0c;替换为 “amsmath” 将 改为 我本意是在公式中加入文本&#xff0c;用一下\text{文本} &#xff0c;之前要导入amstex&#xff0c;现在该包…

内存泄漏检测组件

文章目录 一、内存泄漏概述1.1 什么是内存泄漏1.2 内存泄漏导致的后果1.3 内存泄漏解决思路 二、宏定义方法2.1 宏定义2.2 检测位置2.3 结果分析 三、hook方法3.1 hook3.2 检测位置3.3 递归调用3.4 结果分析3.5 addr2line 四、__libc_malloc 和 __libc_free 一、内存泄漏概述 …

Linux 进度条

文章目录 一、理解回车换行二、认识行缓冲1、代码一、二&#xff08;回车换行理解&#xff09;2、代码三、四&#xff08;sleep函数和ffush函数理解&#xff09; 三、简单倒计时1、效果展示2、倒计时代码3、实现过程分析 四、进度条1、效果展示2、进度条代码   makefile   …

Mac上快速将视频转化为GIF动图

1、找到需要转为GIF的视频&#xff0c;使用QuickTime Player打开&#xff0c;找到屏幕左上角的QuickTime Player菜单&#xff0c;点击【编辑】-【修剪】 2、视频下方会出现一个时间轴&#xff0c;拖动选取自己想要的时间段&#xff0c;修剪完成后保存 3、右键剪辑好的视频&…

前端学习——Web API (Day4)

日期对象 实例化 日期对象方法 案例 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content…

【前端】网页开发精讲与实战 CSS Day 2

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;前端 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有…

『点云处理任务 』用PCL库 还是 深度学习模型?

深度学习和PCL库都可以用来做点云处理任务&#xff0c;但是二者侧重点有所不同。 1、PCL库&#xff08;点云库&#xff09;是一个专门用于点云处理和三维几何分析的开源类库&#xff0c;常用于以下任务&#xff1a; 1、点云滤波&#xff1a;用于去除噪音、下采样和平滑等操作&…

GM/T0015-2012学习笔记

GM/T0015-2012学习笔记 文章目录 GM/T0015-2012学习笔记数字证书数字证书特性用户证书形式 数字证书格式DER资料1资料2 //TODO 吐槽一下&#xff1a;既然是标准&#xff0c;就应该是广而告知&#xff0c;被一些信息查的网站&#xff0c;高价出售。 我从“密码行业标准化技术委…

一文读懂单分子标签UMI

背景 在整理分子标签&#xff08;unique molecular identifier&#xff0c;UMI&#xff09;之前&#xff0c;先了解下&#xff1a; NGS 中潜在的错误来源有哪些&#xff1f; 1. 来源建库过程&#xff1a;文库制备、靶向序列捕获和测序均涉及 DNA 聚合酶以及扩增步骤。这些过程…

和LangChain CEO一起讲解深度学习在数据领域的应用;如何识别语音DeepFake?

&#x1f989; AI新闻 &#x1f680; 如何识别语音DeepFake&#xff1f; 摘要&#xff1a;加拿大滑铁卢大学的研究人员开发了一种语音DeepFake软件&#xff0c;成功qipian语音认证系统概率高达99%。其他安全研究人员也开始应对这一技术挑战&#xff0c;亚马逊研究人员尝试检查…

【实验四】多态

1、完成第133页实验题目2 import java.util.Scanner;public class Application{private UserDao dao;public Application(UserDao dao){this.daodao;}public void setDao(UserDao dao){this.dao dao;}public void registe()//注册函数{Scanner scnnew Scanner(System.in);//获…