⌈ 传知代码 ⌋ 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 运行程序 三、运行…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...