⌈ 传知代码 ⌋ 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 运行程序 三、运行…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...