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

⌈ 传知代码 ⌋ 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:

  1. 首先安装 ORBSLAM3,去到 ORBSLAM3 github 官网下载并构建最新的 ORBSLAM3 函数。
    安装 ROS2 Humble(Robot Operating System 2) 和其相应的依赖包,并运行测试程序确保其可以正常运行。

  2. 把 Tello ROS2 github 的 ROS2 工作空间下载下来并构造其环境。

  3. 把作为 ROS2 和 ORBSLAM3 的连接包 ORBSLAM3 ROS2 Wrapper 下载下来并构造其环境。
    一切准备就绪后先打开 Tello 无人机,并在 Ubuntu 系统里连接上 Tello 的 WiFi。

  4. 在 Tello ROS2 的工作环境里运行代码:

colcon build --packages-select tello_msg
colcon buildsoure install/setup.bash
ros2 launch src/launch.py
  1. 进入下载并构建好的 ORBSLAM3 文件夹里,找到 ORBvoc.txt 和在路径

  2. /ORB_SLAM3/Examples/Monocular 下的 EuRoC.yaml 文件并复制他们的绝对路径。

  3. 在 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函数

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

Vue组件之间的通信

一、通信方式 Props 和 Events&#xff1a;通过父组件传递 props 给子组件&#xff0c;子组件使用 $emit 发送事件到父组件。Event Bus&#xff1a;使用一个中央事件总线来跨组件通信。Vuex&#xff1a;使用 Vuex 进行全局状态管理&#xff0c;以便在任何组件间共享状态。Prov…...

【AI 绘画】模型转换与快速生图(基于diffusers)

AI 绘画- 模型转换与快速生图&#xff08;基于diffusers&#xff09; 1. 本章介绍 本次主要展示一下不同框架内文生图模型转换&#xff0c;以及快速生成图片的方法。 SDXL文生图 2. sdxl_lightning基本原理 模型基本原理介绍如下 利用蒸馏方法获取小参数模型。首先&#x…...

甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文

论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…...

leetcode线段树(2940. 找到 Alice 和 Bob 可以相遇的建筑)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑…...

用于不平衡医疗数据分类的主动SMOTE

一、主动学习如何应用于不平衡数据的处理 首先&#xff0c;主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点&#xff0c;而是通过不确定性和多样性采样来智能地进行样本选择&#xff0c;这是主动学习的两种技术。 在数据不平衡的情况下&…...

linux文件更新日期与系统日期比较

项目说明&#xff1a; 要获取linux系统中某目录下最新文件的修改时间并与当前系统时间进行比较&#xff0c;可以使用以下步骤&#xff1a; 使用 ls 命令获取最新文件的修改时间。 使用 date 命令获取当前时间。 计算时间差并打印结果。 实例脚本如下&#xff1a; #!/bin/…...

leetCode - - - 哈希表

目录 1.模拟行走机器人&#xff08;LeetCode 874&#xff09; 2.数组的度&#xff08;LeetCode 697&#xff09; 3.子域名访问次数&#xff08;LeetCode 811&#xff09; 4.字母异位词分组&#xff08;LeetCode 49&#xff09; 5.小结 1.常见的哈希表实现 2.遍历Map 1.模…...

NGINX自动清理180天之前的日志

需求描述 日志每天会以天为单位产生一个日志&#xff0c;不清理的话会越来越多。这里写一个Lua自定定时清理日志目录下的日志文件。 依赖安装 安装 lfs 模块 yum install luarocks yum install lua-develluarocks install luafilesystem 创建模拟旧文件 创建了一个1月的旧…...

jackson 轻松搞定接口数据脱敏

一、简介 实际的业务开发过程中&#xff0c;我们经常需要对用户的隐私数据进行脱敏处理&#xff0c;所谓脱敏处理其实就是将数据进行混淆隐藏&#xff0c;例如下图&#xff0c;将用户的手机号、地址等数据信息&#xff0c;采用*进行隐藏&#xff0c;以免泄露个人隐私信息。 如…...

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&#xff0c;cp达到类似效果...

第九届世界渲染大赛在哪里提交作品呢?

自第九届世界渲染大赛开放投稿以来&#xff0c;已经过去了10天。在这段时间里&#xff0c;众多CG爱好者已经完成了他们的动画创作。然而&#xff0c;许多参赛者对于如何提交他们的作品仍然感到困惑。接下来&#xff0c;让我们一起了解具体的投稿流程和入口&#xff0c;确保每位…...

fastjson(autoType)反序列化漏洞

1. 温少和他的fastjson 阿里巴巴的 FastJSON&#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON&#xff0c;是一个高性能的 Java JSON 处理库&#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名&#xff0c;并在…...

Java入门基础16:集合框架1(Collection集合体系、List、Set)

集合体系结构 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的。 collection集合体系 Collection的常用方法 package com.itchinajie.d1_collection;import java.util.ArrayList; import java.util.HashSet;/* * 目…...

Qt如何调用接口

在Qt中&#xff0c;你可以使用QNetworkAccessManager类来调用API。以下是一个简单的示例&#xff1a; cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> int main(int arg…...

Android14之解决编译libaaudio.so报错问题(二百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…...

【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37350 随着人工智能技术的飞速发展&#xff0c;AI已经成为当今时代的重要驱动力。本报告将聚焦于人工智能AI行业的最新动态&#xff0c;涵盖客户服务、体验营销、资产管理以及国产AI大模型应用等多个领域。通过深入研究和分析&#xff0c;我们…...

干货分享|如何使用Stable Diffusion打造会说话的数字人?

数字人已不是什么新鲜名词了。在许多领域&#xff0c;尤其是媒体和娱乐领域&#xff0c;经常可以看到卡通形象的人物或逼真的虚拟主持人。在Stable Diffusion中&#xff0c;我们可以上传一段录制好的音频文件&#xff0c;然后使用SadTalker插件&#xff0c;将音频和图片相结合&…...

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 运行程序 三、运行…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...