在Ubantu22.04中运行ORB_SLAM3并进行源码解析

news/2024/7/7 17:29:36/文章来源:https://www.cnblogs.com/lowcost/p/18284773

在Ubantu22.04中运行ORB_SLAM3并进行源码解析

1.ORB_slam3简介

ORB-SLAM3 是一款前沿的即时定位与建图(SLAM)系统,专为大规模环境下的实时定位与三维重建设计。系统兼容多种视觉传感器配置,包括单目、立体双目以及RGB-D相机。ORB-SLAM3 采用 Oriented FAST 和 Rotated BRIEF(ORB)算法进行特征点检测与匹配,确保了在复杂场景下的高度准确性和稳健性。本文将在香橙派AIpro的环境下运行这些内容。

2.安装并调试ORB_SLAM3

(1)下载源码
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
运行这个命令会有一个名为ORB_SLAM3的文件夹
(2)安装依赖
① Pangolin
git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
等待下载完成后
cd Pangolin sudo ./scripts/install_prerequisites.sh cmake -B build cmake --build build -t pypangolin_pip_install
② opencv
由于香橙派的系统自带opencv环境,所以不需要安装,但是需要安装相对应的python环境,首先需要知道安装的opencv版本,使用以下命令:
Pkg-config --modversion opencv4
我的版本是4.5.4,故使用以下命令安装opencv-python
pip install opencv-python==4.5.4.64
③ Eigen3
香橙派的系统自带这个,如果没有可以通过以下命令来安装:
git clone https://github.com/eigenteam/eigen-git-mirror安装
cd eigen-git-mirror mkdir build cd build cmake .. sudo make install

(3)编译
首先修改CMakelist.txt文件,在头部加入以下代码
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON)

由于build.sh中包括make命令,但是香橙派AIpro采用4核8线程故采用 make -j 8来加快速度。使用以下命令 将make部分的代码修改为make -j 8:
cd ORB_SLAM3 sudo gedit build.sh

然后运行以下命令
cd ORB_SLAM3 chmod +x build.sh ./build.sh
(4)测试
选择合适的测试集进行测试,使用以下命令安装TUM测试集:

mkdir -p TUM/rgbd_dataset_freiburg1_xyz
cd TUM/rgbd_dataset_freiburg1_xyz
wget https://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_xyz.tgz
tar -xzvf rgbd_dataset_freiburg1_xyz.tgz
rm rgbd_dataset_freiburg1_xyz.tgz

由于我安装时associate.txt为空,所以需要加一个python代码来写入associate.txt,安装以下步骤:
touch associate.py sudo gedit associate.py
然后写入以下代码:

点击查看代码
#!/usr/bin/env python3import sysdef read_file_list(filename):with open(filename) as f:lines = f.readlines()list = []for line in lines:if line[0] == "#":continueline = line.strip().split()if len(line) < 2:continuelist.append((float(line[0]), line[1]))return listdef associate(first_list, second_list, offset, max_difference):matches = []second_list = [(b + offset, a) for a, b in [(a, float(b)) for a, b in second_list]]second_dict = dict(second_list)for a, b in first_list:best_match = Nonebest_diff = float("inf")for c in second_dict:diff = abs(a - c)if diff < best_diff:best_diff = diffbest_match = cif best_diff < max_difference:matches.append((a, b, second_dict[best_match]))matches.sort()return matchesif len(sys.argv) < 3:print("Usage: associate.py first_file second_file [offset] [max_difference]")sys.exit(1)first_file = sys.argv[1]second_file = sys.argv[2]offset = 0.0if len(sys.argv) > 3:offset = float(sys.argv[3])max_difference = 0.02if len(sys.argv) > 4:max_difference = float(sys.argv[4])first_list = read_file_list(first_file)second_list = read_file_list(second_file)matches = associate(first_list, second_list, offset, max_difference)for a, b, c in matches:print(a, b, c)

写入完成后运行这个命令:
Python3 associate.py TUM/rgbd_dataset_freiburg1_xyz/rgb.txt TUM/rgbd_dataset_freiburg1_xyz/depth.txt > TUM/rgbd_dataset_freiburg1_xyz/associate.txt
最后运行这个命令:
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml TUM/rgbd_dataset_freiburg1_xyz TUM/rgbd_dataset_freiburg1_xyz/associate.txt
演示效果如下:

(5)使用ORB_slam3调用奥比中光gemini pro
在ORB_slam3文件夹下创建任意一个文件夹,随便取名字,我的文件夹名称为cam_ws,这次先不调用它的深度功能,在cam_ws中创建3个文件,分别为run_slam.cpp,CMakelist.txt以及Setting.yml
首先在ORB_slam3的examples文件夹中找到TUM1.yaml并且复制到cam_ws上改名为Setting.yaml
然后把以下代码复制到run_slam.cpp上

点击查看代码

#include &lt;opencv2/opencv.hpp&gt;
include &lt;opencv2/opencv.hpp&gt;
#include "System.hint main(int argc, char **argv) {
if (argc != 3) {std::cerr &lt;&lt; "Usage: ./run_slam path_to_vocabulary path_to_settings" &lt;&lt; std::endl;return 1;}// Initialize ORB_SLAM3 systemORB_SLAM3::System SLAM(argv[1], argv[2], ORB_SLAM3::System::MONOCULAR, true);// Open cameracv::VideoCapture cap(0);if (!cap.isOpened()) {
std::cerr &lt;&lt; "Error: Unable to open camera" &lt;&lt; std::endl;return 1;}cv::Mat frame;while (cap.read(frame)) {SLAM.TrackMonocular(frame, cv::getTickCount());// Display the frame
cv::imshow("Frame", frame);if (cv::waitKey(1) == 27) {break; // Stop the loop if 'Esc' key is pressed}}
// Stop all threads
SLAM.Shutdown();return 0;}

再把以下代码复制到CMakelist.txt上:

点击查看代码
cmake_minimum_required(VERSION 3.10)
project(run_slam)find_package(OpenCV REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(Pangolin REQUIRED)include_directories(
${OpenCV_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
${Pangolin_INCLUDE_DIRS}
/home/HwHiAiUser/ORB_SLAM3/include
/home/HwHiAiUser/ORB_SLAM3
/usr/include/eigen3
/home/HwHiAiUser/ORB_SLAM3/Thirdparty/Sophus
/home/HwHiAiUser/ORB_SLAM3/include/CameraModels
)add_executable(run_slam run_slam.cpp)target_link_libraries(run_slam
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
/home/HwHiAiUser/ORB_SLAM3/lib/libORB_SLAM3.so
)

最后再建一个build文件夹,运行以下程序:
cmake ..
build -j4

然后再通过以下shell指令实现调用:
./run_slam /path/to/ORBvoc.txt /path/to/Settings.yaml
/path/to是你的文件夹位置,结果图如下:

3.ORB_slam3源码解析

(1)源代码结构概览
ORB-SLAM3 的源代码经过精心设计,分为多个核心组件:
① 主程序:程序的入口点,负责初始化和调度。
② 跟踪模块:处理相机位姿估计和特征点追踪。
③ 局部映射:管理局部地图的构建与优化。
④ 闭环检测:执行循环闭合检测及相应的地图优化。
⑤ 可视化工具:提供图形界面展示系统状态。
⑥ 工具箱:集合了一系列辅助函数和通用模块。
(2)系统架构解析
① 输入模块
系统接受来自单目、双目及RGB-D相机的视觉输入,配合IMU数据,通过ORB算法提取特征点,而IMU数据则用于运动补偿,提高位姿估计的准确性。
② 跟踪模块
ORB-SLAM3 的 跟踪模块 在原有基础上融入了IMU数据处理,不仅提高了位姿估计的实时性,还增强了系统的鲁棒性。模块能实时计算当前帧在地图中的位姿,并智能判断是否将当前帧标记为关键帧,对于视觉惯性模式,通过融合惯性测量单元的信息,优化位姿估计,当跟踪丢失时,系统能在地图集内寻找重定位机会,必要时切换激活地图,确保系统的连续运行。
③ 局部建图模块
局部建图模块 负责将关键帧和地图点整合至当前激活地图中,通过视觉或视觉惯性束调整(BA)技术优化地图,确保地图的精准度与效率。
④ 闭环检测与地图合并
闭环检测与地图合并模块 在系统中扮演重要角色,它持续监测新加入的关键帧,一旦发现闭环,立即执行闭环校正或地图融合,维持地图的全局一致性。
⑤ Atlas【地图集】模块
Atlas 模块作为多子图系统,由多个独立的地图构成。当前帧所在地图为激活地图,当跟踪失败时,该地图转为非激活状态,系统随即初始化新的激活地图,保证系统的持续运作。Atlas 模块维护着一个激活地图供跟踪模块使用,同时局部建图模块依据新关键帧信息持续优化地图。此外,Atlas 中还包括未激活地图,整个系统利用词袋模型构建关键帧信息库,用于地图的重定位、闭环检测和融合。
(3)源码解析
① 主程序启动流程

在 main.cc 文件中,系统启动流程如下所示:

点击查看代码
int main(int argc, char **argv)
{// 初始化ROS环境ros::init(argc, argv, "orb_slam3");ros::NodeHandle nh;// 创建SLAM系统实例ORB_SLAM3::System SLAM(vocabularyFile, settingsFile, ORB_SLAM3::System::STEREO, true);// 设置图像与IMU数据的抓取器ImageGrabber ig(nh, &SLAM);// 订阅图像和IMU数据流ros::Subscriber subImgs = nh.subscribe("/camera/image_raw", 1, &ImageGrabber::GrabStereo, &ig);ros::Subscriber subImu = nh.subscribe("/imu/data", 1, &ImageGrabber::GrabImu, &ig);// 主循环while(ros::ok()){ros::spinOnce();std::this_thread::sleep_for(std::chrono::milliseconds(1));}// 关闭SLAM系统SLAM.Shutdown();return 0;
}

② 特征检测与匹配

特征检测与匹配发生在 Tracking 模块中,具体通过 ORBextractor 类和 Matcher 类实现:

点击查看代码
class Tracking
{
public:void TrackMonocular(const cv::Mat &im, const double &timeStamp);private:ORBextractor *mpORBextractor;Matcher *mpMatcher;
};

③ 姿态估计与跟踪

Track() 函数负责姿态估计与跟踪,实现如下:

点击查看代码

void Tracking::TrackMonocular(const cv::Mat &im, const double &timeStamp)
{// 初始化位姿估计// 特征点的跟踪// 基于优化算法对当前帧的位姿进行精调// 更新局部地图// 评估跟踪效果
}

④ 局部地图管理
LocalMapping 模块的 Run() 函数持续处理新加入的关键帧:

点击查看代码
class LocalMapping
{
public:void Run();private:// ...其他成员变量...
};

具体实现中会调用 InsertKeyFrame() 和 UpdateMap() 方法来管理地图点和关键帧。

⑤ 闭环检测与地图优化

点击查看代码

LoopClosing 模块通过 Run() 函数持续运行,检测闭环并优化地图:class LoopClosing
{
public:void Run();private:// ...其他成员变量...
};

⑥ 可视化与监控

Viewer 类的 Run() 方法实现了对系统状态的实时监控:

点击查看代码

class Viewer
{
public:void Run();private:// ...其他成员变量...
};

此方法利用OpenGL技术展示3D视图,让用户直观了解SLAM系统的运行状态。
以上代码片段仅为简化示例,实际应用中,每个类和方法都有更复杂的内部实现。
(4)结论与展望
ORB-SLAM3 以其模块化的架构,实现了高效、精确的特征点检测、跟踪、局部地图管理和闭环检测。通过对核心源码的解析,我们深入了解了其工作原理,包括但不限于主程序启动流程、特征检测与匹配、姿态估计与跟踪、局部地图管理、闭环检测与地图优化,以及可视化工具的运用。未来,ORB-SLAM3 有望在计算机视觉和机器人技术领域发挥更为重要的作用,通过持续的技术革新和应用场景拓展,推动SLAM系统性能的不断提升。

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

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

相关文章

Joplin主题样式及markdown渲染样式更改

本文详细介绍了如何在Joplin笔记软件中更改主题样式和Markdown渲染样式,提供了具体的操作步骤和代码示例,帮助用户自定义Joplin的外观,使其更加美观和符合个人喜好。前言 Joplin是一款极佳的笔记软件,拥有开源、免费、可自定义程度高等多种优点,但其默认的软件主题和Markd…

模拟集成电路设计系列博客——9.2 电平转换器

模拟集成电路设计 9.2 电平转换器 电平转换器是集成电路设计中的一个重要部分,常用于芯片多电压域低功耗设计和I/O中。我们知道在集成电路中,I/O电压与Core电压常常处于两个不同的电压域,因此我们需要使用电平转换器(level shifter)来将I/O电压降低到Core电压,或者将Core…

泛语言计划 第二弹 函数

开始之前,我们先复习一下数学中是怎么定义函数的。 数集A和B,如果A所有数在B中都存在且只有一个数与之对应,则称B是A的函数 由此,我们可以看出一个关键词:对应。 编程中的函数也一样,只是编程中不一定是数,也可以是布尔值、字符串,甚至操作。 这个A集,我们叫他参数,B…

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署) 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要快速、持久耐用、可靠且…

想要流程化办公,不妨了解拖拽式报表设计器!

看看拖拽式报表设计器是如何为客户降低成本、提高效率,携手进入产业分工新时代。当前,经济发展越来越快,经济水平提升的同时也给职场人提成了更高的要求。很多领域的客户都希望能实现降本、提质、增效,进入流程化办公新时代,可以先来了解低代码技术平台、拖拽式报表设计器…

代码随想录算法训练营第四十九天 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

300.最长递增子序列 题目链接 文章讲解 视频讲解动规五部曲:dp[i]: 表示考虑元素i的最长子序列为dp[i] 递推公式:dp[i] = max(dp[j] + 1, dp[i]); 初始化:dp[i] = 1; 每个元素单独算一个子序列长度为1 遍历顺序:从前向后遍历 打印dp数组class Solution { public:int length…

基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点

1.程序功能描述LEACH的原理在于它将传感器节点分为两类:簇头节点和普通节点。普通节点将数据发送给距离自己最近的簇头节点,然后簇头节点将收集到的数据融合后发送给基站。这种机制可以减少网络中节点的能耗,并且能够提高数据融合比例,减少传输数据量。本课题将分别对比lea…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位,对于信息学奥赛已经不陌生了,部分同学也已经开始踏入信息学的旅程,但前路茫茫,让我相信关注本号的各位,对于信息学奥赛已经不陌生了,部分同学也已经开始踏入信息学的旅程,但前路茫茫,让我们一起看看已经取得成就的同学的经历吧。今天要介绍的这位同…

VPS折腾记七搭建稍后阅读应用

1.简介 看微信公众号的时候,文章太长,可以收藏起来,但是等到晚上看的时候,发现作者已经删除了,很遗憾。wallabag能够收藏文章并且保存到服务器,让我们可以稍后阅读,而且也不怕文章丢失。 wallabag is a self hostable application for saving web pages: Save and class…

基于PSO粒子群优化的CNN-LSTM的时间序列回归预测matlab仿真

1.算法运行效果图预览 2.算法运行软件版本 matlab2022a3.部分核心程序for i=1:Iterifor j=1:Npeoprng(i+j)if func_obj(x1(j,:))<pbest1(j)p1(j,:) = x1(j,:);%变量pbest1(j) = func_obj(x1(j,:));endif pbest1(j)<gbest1g1 = p1(j,:);%变量gbest1 = pbest1(j);end…

关于领域驱动设计,大家都理解错了

翻遍整个互联网,我发现,关于领域驱动设计,大家都**理解错了**。 今天,我们尝试通过一篇文章的篇幅,给大家展示一个完全不同的视角,把“领域驱动设计”这六个字解释清楚。 ## 领域驱动设计学习资料现状领域驱动设计的概念提出已经有20年的时间了,整个互联网充斥着大量书籍…

7.4日BootlLoad总结

最近在研究单片机远程升级方法,看了网上许多资料后了解到,远程升级就是用IAP方法去烧写flash区,而IAP方法在EEPROM中有用到,也就是所说的掉电记忆,掉电不丢失的情况,而相较于51单片机,网上的资料大多是有关STM32单片机的,且使用操作系统,适合于芯片内存较大的芯片,分…

(一):小程序与服务器的链接

首原文写于18年5月,因不再想继续使用C站,现将主要文件迁移至博客园。文中涉及技术部分已相对过时,但依旧对初始web的小朋友具有一定参考价值,权且玩乐。 环境IDE:myeclipse,服务器容器Tomcat,服务端主要用servlet。创建servlet小程序与服务器链接(前端和后端的交互)的…

可视化数据看板/数字孪生大屏到底有没有实际价值?详解数据可视化的实用价值

数据驾驶舱/数据看板/可视化大屏的实际价值,取决于使用者的实际需求。华而不实?华就是实! 关于可视化大屏最广泛的争议,便是对其“华而不实”的批评,认为可视化大屏缺乏技术含量,只是一钟比较高级的“装饰品”,更是一种典型的“面子工程”。这种偏见乍一看似乎有其道理,…

osg使用整理(12):SSAO屏幕空间环境光遮蔽

一、基础概念 1、SSAO:通过将褶皱、孔洞和非常靠近墙面变暗的方法,近似模拟间接光照。SSAO称为屏幕空间环境光遮蔽 ,使用屏幕空间场景的深度而不是真实的几何体数据来确定遮蔽量,速度快效果好。2、实现原理:根据物体表面法线方向生成一个半球随机深度采样,主要看物体周围…

比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象?

本文主要分析了大学生电子计算机类比赛中“卷”“祖传老项目”“找关系”的现象,结合自身实践经验,给出了相应的解决方案。比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象? 正文 目前现状 对于大部分的比赛小白来说,对当前比赛的现…

2024.7.4 鲜花

今日推歌 natural Will you hold the line. 只有你还没有放弃。 When every one of them is giving up or giving in, tell me. 当其他所有人都停止了尝试,被挫折磨尽了希望。 In this house of mine,Nothing ever comes without a consequence or cost, tell me. 我所在之处,…

【python+selenium的web自动化】—— 控制浏览器

前言: 需本教程以Edge做测试,且谷歌、火狐等浏览器的逻辑都一样需要使用 selenium 模块操作 Edge 浏览器。 一、先通过pip install 模块 把selenium模块安装了,可以加一个中国源提升速度。pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple二、需要下载Edg…

Python自动化之控制浏览器

前言: 需本教程以Edge做测试,且谷歌、火狐等浏览器的逻辑都一样需要使用 selenium 模块操作 Edge 浏览器。 一、先通过pip install 模块 把selenium模块安装了,可以加一个中国源提升速度。pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple二、需要下载Edg…

设计模式-设计原则与设计模式总结

设计原则,是设计模式的基础。在实际开发中,并不是一定要求所有代码都遵循设计原则,我们需要综合考虑人力、时间、成本、质量,不是可以追求完美,要在设当的场景遵循合适的设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。 设计模式(Design Pattern)是前…