当前位置: 首页 > news >正文

ubuntu中通过vscode编译调试ORB-SLAM3

为了在orb-slam3的基础上进行二次开发,这几天花了不少精力,终于搞懂怎么在ubuntu系统中像windows里visual studio中一样方便的打断点调试了,在这里把整个过程再重新梳理一下。

1 首先从安装ubuntu 22.04开始

因为是从实验室毕业先辈那里继承来的电脑,电脑里装了ubuntu 16的双系统,16太久了,于是决定删掉重装最新的ubuntu。

首先在windows系统中清空ubuntu系统所在的磁盘,在开机程序中删去ubuntu的启动项。然后通过u盘重装ubuntu最新版。网上的教程都是让自己调整分区,我是按照默认与windows boot manager并存,也成功了。

2 安装ROS2

目前最新的是ROS2,这个安装没啥好说的,注意和ROS2版本要和ubuntu版本对应就好。

3 下载编译ORB-SLAM3

需要先按照官方说明,安装一系列依赖项,第一个是pangolin。

3.1 安装pangolin

首先update和upgraded已有的packages

sudo apt update && sudo apt upgrade

安装依赖项

sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libx11-dev libxmu-dev libglu1-mesa-dev libgl2ps-dev libxi-dev g++ libzip-dev libpng12-dev libcurl4-gnutls-dev libfontconfig1-dev libsqlite3-dev libglew*-dev libssl-dev
sudo apt-get install glew-utils

安装cmake

sudo apt-get install cmake

下载pangolin,放在自己的用户文件夹下就可以

git clone https://github.com/stevenlovegrove/Pangolin

用cmake编译安装

# 创建编译文件夹(在Pangolin文件夹下)
mkdir build && cd build
# 配置编译选项
cmake ..
# 开始编译代码
cmake --build .
# 安装
sudo make install

测试是否成功

# 从Pangolin文件夹进入测试文件夹
cd examples/HelloPangolin
# 创建编译文件夹并编译代码
mkdir build && cd build && cmake .. && make
# 运行即可看到显示结果
./HelloPangolin

3.2 OpenCV

类似的过程,先是依赖项

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libcanberra-gtk-module
sudo apt-get install pkg-config

下载源码,解压到自己的用户文件夹下,我选择的是3.4几

在源码文件夹中创建build文件夹。打开终端cd到build文件夹使用cmake生成makefile

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

执行make

sudo make 

编译完成之后

sudo make install

3.3 Eigen3

sudo apt install libeigen3-dev

测试安装是否成功

dpkg -L libeigen3-dev

DBoW2 and g2o Included in Thirdparty folder,这里不用管,python已经自带在ubuntu 22.04中,注意更新以下pip就好。

以上准备工作完成。

3.4 编译安装ORL-SLAM3

同样的下载,然后解压到用户文件夹下

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3

编译

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

下面就可以运行了,但是坑的地方来了,官方文档写着“Open the script "euroc_examples.sh"(GitHub - electech6/ORB_SLAM3_detailed_comments: Detailed comments for ORB-SLAM3)但我就是找不到这个.sh文件。后来在网上查到,有人说是官方自己删掉了,以前的版本是有的,新版本没了。于是在github上找到这个.sh文件。

我要作的是双目相机方面的东西,所以运行的是Stereo里面的example,所以在euroc_examples.sh"中,我选择的是

#------------------------------------
# Stereo Examples
echo "Launching MH01 with Stereo sensor"

下面的那一个命令

./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml "$pathDatasetEuroc"/MH01 ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt dataset-MH01_stereo

解释一下这条命令,第一部分stereo_euroc是运行stereo_euroc这个可执行文件,第二部分是orb-slam3做回环检测用的,这里不用管。第三部分yaml文件是相机内参。第四部分是euroc数据集的路径,为了运行这个example,需要在euroc官网下载Machine Hall 01这个数据集。官网的数据集解压缩以后,命名是MH_01_easy,所以要把第三部分的改成

/home/username/MH_01_easy

后面是时间戳,为了让多个相机数据,IMU数据对应起来。

把命令改好以后在terminal中运行就可以了。

4 VScode调试ORB-SLAM3

只是在终端中运行是不够的,还要调试二次开发,这里选择vscode作为开发工具,vscode本身只是个文本编辑器,需要安装一些插件扩展。安装vscode简单,不说了,然后安装以下扩展包

C/C++
C++ Intellisense
CMake
CMakeTools

在终端中进入ORB-SLAM3文件夹,用vscode打开

code .

创建c_cpp_properties.jsonctrl + shift + P后输入C/C++: Edit configurations,其中内容可以先保持默认的不做修改。

创建tasks.jsonctrl + shift + P后输入Tasks: Configure Tasks,选择使用模板创建tasks.json,选择Others。这里建议修改为如下内容:

{"version": "2.0.0","tasks": [{"label": "build","type": "shell","command": "./build.sh","group": {"kind": "build","isDefault": true}}]
}

要注意:修改build.sh文件中最下面的DCMAKE_BUILD_TYPEDebug

tasks.json文件的作用就相当于在终端中执行./build

要安装gdb debugger,否则无法生成launch.json

快捷键Ctrl+Shift+D,打开一个launch.json

然后add configuration

里面有两个参数要改

"program": "/home/username/ORB_SLAM3/Examples/Stereo/stereo_euroc",
"args": ["/home/username/ORB_SLAM3/Vocabulary/ORBvoc.txt","/home/username/ORB_SLAM3/Examples/Stereo/EuRoC.yaml","/home/username/MH_01_easy","/home/username/ORB_SLAM3/Examples/Stereo/EuRoC_TimeStamps/MH01.txt"],

这两个参数就对应着终端运行时,输入的命令的4个部分。然后点击RUN AND DEBUG旁边的绿色小三角就可以debug了,打开stereo_euroc.cc文件夹,就可以打断点调试,自己做二次开发了。

以上。

相关文章:

ubuntu中通过vscode编译调试ORB-SLAM3

为了在orb-slam3的基础上进行二次开发,这几天花了不少精力,终于搞懂怎么在ubuntu系统中像windows里visual studio中一样方便的打断点调试了,在这里把整个过程再重新梳理一下。 1 首先从安装ubuntu 22.04开始 因为是从实验室毕业先辈那里继承…...

阿里版 ChatGPT 突然上线!

转自:纯洁的微笑 其实早本月初,就传出过不少阿里要推出类ChatGPT的消息。 前几天率先流出的天猫精灵“鸟鸟分鸟”脱口秀版GPT,就是基于大模型的“压缩版”,已经以其惊艳表现吸引了众目光。 如今“原版大菜”上桌,自然一点即着&a…...

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示: 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…...

MAZDA CX-50没现车怎么办?赶紧去VR看车啊!

爱车一族往往都有过这样的经历:听说某家品牌出了一款心仪的新车,于是一直心心念念想要先睹为快。然而这时候问题就来了:新车从发布到量产上市往往要经历一段过程。没有现车的日子里,就算每天去4S店蹲守也看不到新车。那种心里痒痒…...

结构体全解,适合初学者的一条龙深度讲解(附手绘图详解)

我们知道,C语言是允许我们自己来创造类型的,这些类型就叫做——自定义类型。 自定义类型又包括结构体类型,联合体类型还有枚举类型。 今天的文章,我们就着重讲解这其中的结构体类型。 目录 结构体的声明 1.1结构的基础知识 …...

什么是SD-WAN技术?企业网络优化的利器!

现今,企业网络架构已成为其发展不可或缺的组成部分。针对网络性能优化方面,SD-WAN是一种值得深思熟虑的选择,在企业网络中应用SD-WAN技术能够带来多重好处。 什么是SD-WAN技术以及它是如何工作的? SD-WAN是软件定义的广域网&…...

JAVA练习106- 生命游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-生命游戏 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 4 月12日练习…...

【案例教程】基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作实践技术

【原文链接】: 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作实践技术https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247537049&idx3&sn31ef342c4808aed6fee6ac108b899a33&chksmfe6897f3c91f1ee5c4fa8e4eeea34…...

php7类型约束,严格模式

在PHP7之前,函数和类方法不需要声明变量类型 ,任何数据都可以被传递和返回,导致几乎大部分的调用操作都要判断返回的数据类型是否合格。 为了解决这个问题,PHP7引入了类型声明。 目前有两类变量可以声明类型: 形参&a…...

2023-04-11 无向图的匹配问题

无向图的匹配问题 之所以把无向图的这个匹配问题放到最后讲是因为匹配问题借鉴了有向图中一些算法的思想 1 最大匹配和完美匹配 二分图回顾 二分图:把一个图中的所有顶点分成两部分,如果每条边的两端分别属于不同部分,则这个图是二分图。更多…...

国家出手管人工智能AI了

我是卢松松,点点上面的头像,欢迎关注我哦! 全球都在封杀AI,国家也出手了,人工智能AI的强监管来了!这次反应速度算是很快了。国家出手,AI必须管。 国家网信办拟针对生成式人工智能服务出台管理办法&#…...

day24—选择题

文章目录1.将N条长度均为M的有序链表进行合并,合并以后的链表也保持有序,时间复杂度为(A)2.已知某个哈希表的n个关键字具有相同的哈希值,如果使用二次探测再散列法将这n个关键字存入哈希表,至少要进行&…...

自投递简历以来的第一次面试

投完简历之后HR小姐姐接着就安排了面试,原定时间是今天下午六点,我五点五十进的会议,结果等到六点二十(真的有点不耐烦了说实话)面试官打电话过来了说网络不是很好,所以改成电话面试了。 1、session信息保…...

【C++11】新特性 - 右值引用详解

文章目录STD容器使用右值引用场景移动语义在容器中的使用主要体现在两个方面:移动构造函数和移动赋值运算符。移动语义只对右值有效,对左值无效原因STD容器使用右值引用场景 移动语义在容器中的使用主要体现在两个方面:移动构造函数和移动赋…...

C++学习笔记

C学习笔记函数一般有返回值,构造函数有没有返回值?有返回值,返回一个对象,确定所以没写;在头文件中,防卫式声明,#ifndef…#define … #endif;pass by value或者 reference,传值是整包…...

项目1实现login登录功能方案设计第三版

需求优化点:MySQL表常用功能模块实现方案index页面home页面需求 实现一个登录功能 实现的功能 注册(邮箱注册)登录(邮箱密码)重置密码查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)登出在第2版的基础上进行优化:\ 优化点: VerificationCode(验证码储存库): 增加时间字段…...

Node【七】初识Express框架

文章目录🌟前言🌟Express框架🌟1.什么是框架🌟2.express安装🌟3.创建web服务基本遵循之前的四个步骤:🌟4.路由🌟 由 :请求方式请求路径(1)get发送…...

Android 高通Camera2 Camera Device Close

1、很多人看到这个日志第一感觉可能觉得哪里没有合理释放,于是带着这个思路去进行百度探索 2、一开始我去寻找 ImageReader.OnImageAvailableListener 这个问题 var afterBitmap: Bitmap? null/**监听拍照的图片 */private val imageAvailableListener ImageRead…...

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5

原文:Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的…...

4、浅谈Makefile文件及其简单的使用知识

文章目录1、什么是Makefile?(1)makefile关系到了整个工程的编译规则。(2)makefile带来的好处就是——“自动化编译”(3)make是一个命令工具,是一个解释makefile中指令的命令工具2、为…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时&#xf…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...