⌈ 传知代码 ⌋ Visual SLAM函数
💛前情提要💛
本文是传知代码平台中的相关前沿知识与技术的分享~
接下来我们即将进入一个全新的空间,对技术有一个全新的视角~
本文所涉及所有资源均在传知代码平台可获取
以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!
以下内容干货满满,跟上步伐吧~
📌导航小助手📌
- 💡本章重点
- 🍞一. 概述
- 🍞二. 演示效果
- 🍞三.核心逻辑
- 🍞四.使用方式
- 🫓总结
💡本章重点
- Visual SLAM函数
🍞一. 概述
SLAM代表同步定位和地图构建(Simultaneous Localization and Mapping),这一技术的主要含义在于其能让一个计算机通过外界定位传感器所传回的信息,经过算法函数的整合与过滤后可以得出该计算机所对应的代理机器处在的探测环境中的准确位置。在这其中,Visual SLAM便是一个只用环境图像便能实现精准定位的一个SLAM函数,并且还能是吸纳动态构造并实时更新周遭环境地图,让机器人可以在构建出的3D地图里定位和规划路径。
目前在OpenCV中基于视觉的算法函数主要分成三种————SIFT函数、SURF函数、以及ORB函数。三个对比中,SIFT函数是位置识别能力中效果最精确,所构建出的3D地图模型最能还原真实环境的函数,识别能力是最强的,但由于SIFT函数的图像采集层次较多导致它非常的耗费计算机资源,并且它较为复杂的函数识别原理也不利于新手第一次接触;SURF函数和SIFT函数正好相反,SURF函数的识别原理较为简单直接,让它可以在计算资源较为紧迫的环境下进行定位,但它的定位精度即便在多次调试后往往还是存在较大的偏差,并且还会出现0点浮动的情况,比较不适合定位精度要求较高的场景;ORB函数就相当于SIFT函数和SURF函数的结合体,它既可以在调试后得到不错的定位精度,同时还采用了一个效率较高的函数算法,使其不那么的耗费计算机资源。本文章将会以ORBSLAM为主要介绍对象,带大家了解其背后原理并且在Linux Ubuntu系统下展示其效果。
ORBSLAM的背后原理就是围绕着每张图片里的 “角” 的定位,并在后续的图像中追踪 “角” 与 “角” 之间的相对位置变化,从而实现视觉定位。ORBSLAM(Oriented FAST and Rotated BRIEF – SLAM)其实包含了另外两个子函数FAST和BRIEF,其中的FAST函数(Features from Accelerated Segment Test)主要实现了 “角” 的识别,而BRIEF函数(Binary Robust Independent Elementary Features)在FAST函数识别了各个不同的 “角” 后会对每个 “角” 赋上他们相应且独一无二的描述信息。
在对每个特征点进行对比和追踪后,ORBSLAM 函数可以生成相应的3D环境地图,并且还会给出摄像头在地图中的坐标点位置,实现了同步定位和地图构建。
🍞二. 演示效果
此次演示使用了最新的 ORBSLAM3 函数并在 ROS2 Humble 的计算机环境下运行来展示和调节 ORBSLAM3。
运行效果如下:

ORBSLAM3 启动后会开始扫描每一帧图像并提取如图绿色的特征点。

在空间内移动摄像头,ORBSLAM3 可以根据特征点的位置变化来判断摄像头的移动距离,并通过不断的采样来实现如右图所示的云点定位图。

随着摄像头的不断移动,在形成闭环的部分后 ORBSLAM 函数会对已知的点位进行特征点校验,生成一个更加精准的3D地图。
🍞三.核心逻辑
ORBSLAM 分成了两个函数部分,其中的FAST函数首先会分析一张图像里每个像素的强度值,并将其与预定义的阈值进行比较,判断强度变化是否满足角点的标准。为了加快处理速度,FAST 巧妙地利用选定点周围的特定像素子集进行检查。如果这部分像素中足够多的点的强度值与中心像素存在显著差异,那么该点将被标记为潜在角点。然后,通过包含所有邻域像素的更严格检查来确认角点的存在。对于各个合格角点的判断可以从下图理解:

对于左图中的窗口上方的一个像素点 p ,可以从右图看到其相邻的其他像素点。那么 p 点怎么能算一个足够强度的角点呢?对于 p 点而言它根据自身的颜色和亮度被赋予了一个初始强度值 Ip。用户可以根据自己的需求选择一个合适的阈值 t 。在待测试像素周围选取一个包含 16 个像素的圆形区域(这相当于半径为 3 的 Bresenham 圆形)。现在,如果圆形区域 (16 个像素) 中存在一组 n 个连续像素,它们全都比 Ip + t 亮,或者全都比 Ip - t 暗,那么像素 p 就是角点。为了提高算法速度,首先将圆形中的像素 1、5、9 和 13 的强度与 Ip 进行比较。从上图可以明显看出,这四个像素中的至少三个应该满足阈值标准,这样才能存在关键点。如果四個像素值 (I1, I5, I9, I13) 中至少有三个不在 Ip + t 的上方或下方,则 p 不是关键点(角点)。在这种情况下,将像素 p 作为可能的关键点拒绝。否则,如果至少有三个像素高于或低于 Ip + t,则检查所有 16 个像素,并查看是否有 12 个连续像素符合标准。符合上述的像素点就被FAST函数判定成了合格的角点,后续对图像中的每个像素点都进行同样的操作即可判断出每个角点所在的位置。
FAST函数找到了每个角点的位置后,BRIEF函数会选取图像中的关键点及其周围的小块区域 (局部图像块)。 接着,在局部图像块内,BRIEF 会定义一系列简单的测试,例如比较相邻像素的强度值 (较暗或较亮)。 基于这些测试的结果,BRIEF 生成一个由 0 和 1 组成的二进制字符串,称为描述符。描述符中的每一位对应一个测试,0 代表测试点较暗,1 代表较亮。BRIEF函数的逻辑描述可以简写成如下方程:

巧妙之处在于测试的选取经过精心设计,使得 BRIEF 描述符能够捕获关键点周围的局部图像结构信息。 即使图像发生光照变化、几何形变等轻微扰动,BRIEF 描述符仍能保持相对稳定,展现出良好的鲁棒性。 最后,在进行关键点匹配时,BRIEF 描述符的相似度可以通过汉明距离(Hamming Distance)进行计算。汉明距离计算简单高效,进一步提升了算法的整体效率。
🍞四.使用方式
下面会基于 Ubuntu 22.04 和 ROS2 安装相应的包后用 Tello 的摄像头来运行 ORBSLAM3:
-
首先安装 ORBSLAM3,去到 ORBSLAM3 github 官网下载并构建最新的 ORBSLAM3 函数。
安装 ROS2 Humble(Robot Operating System 2) 和其相应的依赖包,并运行测试程序确保其可以正常运行。 -
把 Tello ROS2 github 的 ROS2 工作空间下载下来并构造其环境。
-
把作为 ROS2 和 ORBSLAM3 的连接包 ORBSLAM3 ROS2 Wrapper 下载下来并构造其环境。
一切准备就绪后先打开 Tello 无人机,并在 Ubuntu 系统里连接上 Tello 的 WiFi。 -
在 Tello ROS2 的工作环境里运行代码:
colcon build --packages-select tello_msg
colcon buildsoure install/setup.bash
ros2 launch src/launch.py
-
进入下载并构建好的 ORBSLAM3 文件夹里,找到 ORBvoc.txt 和在路径
-
/ORB_SLAM3/Examples/Monocular 下的 EuRoC.yaml 文件并复制他们的绝对路径。
-
在 ORBSLAM3 ROS2 Wrapper 的工作环境里运行代码:
colcon build --packages-select orbslam3
colcon buildsource install/setup.bash
ros2 run orbslam3 mono <ORBvoc.txt的绝对路径> <EuRoC.yaml的绝对路径>
上述步骤运行完毕后 ROS2 会调用 ORBSLAM3 里的函数,并对 Tello 提供的摄影图像进行方位和姿态判断,可以拿着 Tello 无人机绕房间走一圈验证定位结果。
🫓总结
综上,我们基本了解了“一项全新的技术啦” 🍭 ~~
恭喜你的内功又双叒叕得到了提高!!!
感谢你们的阅读😆
后续还会继续更新💓,欢迎持续关注📌哟~
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨
【传知科技 – 了解更多新知识】
相关文章:
⌈ 传知代码 ⌋ Visual SLAM函数
💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...
Vue组件之间的通信
一、通信方式 Props 和 Events:通过父组件传递 props 给子组件,子组件使用 $emit 发送事件到父组件。Event Bus:使用一个中央事件总线来跨组件通信。Vuex:使用 Vuex 进行全局状态管理,以便在任何组件间共享状态。Prov…...
【AI 绘画】模型转换与快速生图(基于diffusers)
AI 绘画- 模型转换与快速生图(基于diffusers) 1. 本章介绍 本次主要展示一下不同框架内文生图模型转换,以及快速生成图片的方法。 SDXL文生图 2. sdxl_lightning基本原理 模型基本原理介绍如下 利用蒸馏方法获取小参数模型。首先&#x…...
甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文
论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…...
leetcode线段树(2940. 找到 Alice 和 Bob 可以相遇的建筑)
前言 经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个下标从 0 开始的正整数数组 heights ,其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i ,且存在 i < j 的建筑…...
用于不平衡医疗数据分类的主动SMOTE
一、主动学习如何应用于不平衡数据的处理 首先,主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点,而是通过不确定性和多样性采样来智能地进行样本选择,这是主动学习的两种技术。 在数据不平衡的情况下&…...
linux文件更新日期与系统日期比较
项目说明: 要获取linux系统中某目录下最新文件的修改时间并与当前系统时间进行比较,可以使用以下步骤: 使用 ls 命令获取最新文件的修改时间。 使用 date 命令获取当前时间。 计算时间差并打印结果。 实例脚本如下: #!/bin/…...
leetCode - - - 哈希表
目录 1.模拟行走机器人(LeetCode 874) 2.数组的度(LeetCode 697) 3.子域名访问次数(LeetCode 811) 4.字母异位词分组(LeetCode 49) 5.小结 1.常见的哈希表实现 2.遍历Map 1.模…...
NGINX自动清理180天之前的日志
需求描述 日志每天会以天为单位产生一个日志,不清理的话会越来越多。这里写一个Lua自定定时清理日志目录下的日志文件。 依赖安装 安装 lfs 模块 yum install luarocks yum install lua-develluarocks install luafilesystem 创建模拟旧文件 创建了一个1月的旧…...
jackson 轻松搞定接口数据脱敏
一、简介 实际的业务开发过程中,我们经常需要对用户的隐私数据进行脱敏处理,所谓脱敏处理其实就是将数据进行混淆隐藏,例如下图,将用户的手机号、地址等数据信息,采用*进行隐藏,以免泄露个人隐私信息。 如…...
Nginx 正则表达式与rewrite
目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…...
tekton什么情况下在Dockerfile中需要用copy
kaniko配置如下 如果docker中的workDir跟tekton中的workDir不一致需要copy。也可以通过mv,cp达到类似效果...
第九届世界渲染大赛在哪里提交作品呢?
自第九届世界渲染大赛开放投稿以来,已经过去了10天。在这段时间里,众多CG爱好者已经完成了他们的动画创作。然而,许多参赛者对于如何提交他们的作品仍然感到困惑。接下来,让我们一起了解具体的投稿流程和入口,确保每位…...
fastjson(autoType)反序列化漏洞
1. 温少和他的fastjson 阿里巴巴的 FastJSON,也被称为 Alibaba FastJSON 或阿里巴巴 JSON,是一个高性能的 Java JSON 处理库,用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名,并在…...
Java入门基础16:集合框架1(Collection集合体系、List、Set)
集合体系结构 Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。 collection集合体系 Collection的常用方法 package com.itchinajie.d1_collection;import java.util.ArrayList; import java.util.HashSet;/* * 目…...
Qt如何调用接口
在Qt中,你可以使用QNetworkAccessManager类来调用API。以下是一个简单的示例: cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> int main(int arg…...
Android14之解决编译libaaudio.so报错问题(二百二十七)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…...
【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37350 随着人工智能技术的飞速发展,AI已经成为当今时代的重要驱动力。本报告将聚焦于人工智能AI行业的最新动态,涵盖客户服务、体验营销、资产管理以及国产AI大模型应用等多个领域。通过深入研究和分析,我们…...
干货分享|如何使用Stable Diffusion打造会说话的数字人?
数字人已不是什么新鲜名词了。在许多领域,尤其是媒体和娱乐领域,经常可以看到卡通形象的人物或逼真的虚拟主持人。在Stable Diffusion中,我们可以上传一段录制好的音频文件,然后使用SadTalker插件,将音频和图片相结合&…...
OrangePi AIpro学习4 —— 昇腾AI模型推理 C++版
目录 一、ATC模型转换 1.1 模型 1.2 ATC工具 1.3 实操模型转换 1.4 使用ATC工具时的一些关键注意事项 1.5 ATC模型转换命令举例 二、运行昇腾AI模型应用样仓程序 2.1 程序目录 2.2 下载模型和模型转换 2.3 下载图片和编译程序 2.4 解决报错 2.5 运行程序 三、运行…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
