ROS学习笔记(18):建图与定位(2)

0.前言

上文提到现在的我们已经进入到了SLAM领域的学习,会涉及到大量专业知识,作为一个自学的大三(好吧也快大四了)萌新并不能保证每次文章的专业性和准确性,所以,本人推荐大家能自己去查阅一些相关书籍和论文,并不关乎你一定要在多短的时间内学会这门课程,更希望大家能更热爱学习的感觉而不是只关注如何短期获取得成绩快感。

1.扫描匹配

在谷歌的SLAM算法Cartographe当中扫描匹配相当重要的一个模块。

1.扫描匹配的作用

1.参看上图可知雷达的扫描是以一个固定的弧度增量来进行扫描的,这种扫描方式是由一个个不连续的点构成的,即使我们看着很像是连续的(因为他足够密集),但slam地图的构建必须保证地图的连续性(地图不能在某个地方断开,这样就是一堵墙出现了一个小洞一样),扫描匹配就需要将雷达获取到的一个个不连续的点进行连接是生成一条条连续的线,并且尽可能的与现实贴合,这就是ros的点云。

2.移动机器人是会移动的,当移动机器人位姿变化时,雷达扫描到的环境就出现了变化(如下图1),还是一样的,我们希望地图是连续的,匹配扫描就需要将位姿变化前的地图和位姿变化后的地图进行匹配,使他们连续起来,这里就是使用最大特征提取的办法了。

图1

注释:实际的实现方式请自行翻看相关书籍或论文。

2.扫描匹配一些轶事

轶事1:高速位姿改变

激光雷达和摄像头是按照一定时间进行一次数据采集的,当移送机器人的位姿改变过快时,就会产生上一次的采集数据和下一次采集的数据完全没有相同特征点 ,这时就完全无法进行特征匹配了。(当然随着雷达和摄像头的不断迭代,这种情况越来越少了。)因此想要提高扫描的匹配度,要么提高设备的性能,要么降低速度。

轶事2:场景高度重复

当移动机器人出现在一个高度重复的场景里时,机器人是很难判断自己是否进行了位姿改变的(有点像鬼打墙),高度相似的特征是的地图拼接十分困难。(当然这种情况极少出现。)

以下就是因移动机器人位姿改变导致扫描匹配效果差的图片:

2.使用ICP的扫描匹配

ICP(Iterative Closest Point),中文称为迭代最近点,主要使用在点云配准,目标是计算两个点云间的变换。

网上有大佬对ICP的解读:

【PCL】—— 点云配准ICP(Iterative Closest Point)算法_icp点云配准-CSDN博客

这让我想起了数字化中国一些古老建筑和文物。

1.ICP的原理

使用蓝色和红色的点进行连线排列,这些线段就是点云(point cloud)。

拥有了点云后,蓝色线点云上的每个点都开始寻找红色线点云上与他最近的点,这一步通常称为数据关联。找到了这些点之后进行变换,使这些点云尽可能的重叠到一起。在不断的迭代过后使得点云间的距离不再变换或达到某个可接受的阈值。

注释:最小距离计算和变换是分开进行的,第一步是计算点云的质心,这可以方便后一步的点云的相互变换,第二步就是用奇异值分解(SDV)来计算出本次变换的最佳变换。当匹配效果最佳时,点云的协方差将是最小。(当然通常不使用spd而是使用最小二乘法来进行不断的迭代,直到结果达到阈值。)

ICP迭代的目标就是找到M_{opt}:

M_{opt}=argmin_{M} \sum_{i}((M\cdot s_i-d_i)\cdot n_i)^2

注释:有空我来手算一遍这个公式。

2.扫描重叠机制 

机器人处在一个环境当中时,会有两种确立扫描标记点的位姿的坐标,一种是以环境中某个固定点为基准坐标建立的全局坐标系;另一种是以机器人为基准坐标建立的本地坐标系。

下图2为机器人在某位姿情况下对A、B、C三点进行扫描后映射在两种不同坐标系下的状态:

图2

下图3为机器人进行位姿调整后,重新获取到同样的点在两种坐标系下的状态:

图3

通过观察机器人位姿变换前后两种坐标系中三点的的状态,可以快速发现使用全局坐标系时同样的点在坐标系下的状态是一致的;使用局部坐标系时同样的点在坐标系下的状态发生了改变,下图为使用局部坐标系下的机器人获取到的点状态情况。

  图3

既然使用局部坐标系发生位姿变换时,同样的点在坐标系的状态不一样,那就需要进行扫描匹配将同样的点的状态进行统一重叠,这一步也就是将局部坐标系构建成全局坐标系(可理解为以第一个局部坐标系为全局坐标系,后续的局部坐标系都进行里程计等传感器进行数据采集后计算出相对变换),如下图是未将同样的点进行扫描匹配时产生的情况:

3.扫描匹配的难点

1.第一个难点:经过前文的对扫描匹配的学习,我们已经有了部分认识,但实际扫描匹配过程会出现一个难点:旧的一些点会随着机器人的位姿改变而消失,新的点随着机器人的位姿改变而显现,因为这种情况的发生,对扫描匹配的算法就提出一定的要求。

2.第二个难点:前面是知道了A、B、C三点,这会使计算和变换都简单很多,但现实是根本不知道变换前后的点那些是同一个点。扫描匹配就需要去处理这些问题。

4.简单的解决思路

1.对点间的距离做出简单的评估,这就是现在的评估。

2.对下一时间(t=t+1)扫描得到的每一个点都寻找前一个时间(t=t)距离最近的点进行匹配。

3.使用更好的距离评估方式(类似于icp之类的方式)。

4.不断反复前面的步骤,直到到达了一个可接受的阈值。

注释:当然这并不是最好的方式,但他足够简单。

去了解icp吧,我讲得可能会有点乱:但在b站上能看到大佬对icp的演示视频:

Point Clouds Registration for 3D Reconstruction with Iterative Closest Points_哔哩哔哩_bilibili

在维基百科上也有对icp的介绍:迭代最近点 - 维基百科,自由的百科全书 --- Iterative closest point - Wikipedia

3.结尾

ok,本次内容到此为止,下一篇文章我们来对icp进行演算一遍,加深认识。让我想想暑假的我要备考考研,找个时间也更新一下isaac sim或ros2?我看看能不能拿宇树的go2进行一下演示和学习?不确定,最近想着稍微摆烂一点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛!手机、TV双端聚合,免费可同步!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 有不少小伙伴闲时会选择观看游戏、户外、娱乐等各类的直播,而关注的主播可能驻留在不同直播平台,需要下载多个APP,且切换非常不方便。 所以今天给大…

缓存生命周期管理:探索Memcached的过期策略

缓存生命周期管理:探索Memcached的过期策略 在高效的缓存系统中,过期策略是确保数据时效性的关键。Memcached作为一个简单而强大的分布式内存缓存系统,提供了几种不同的缓存过期策略来满足不同的业务需求。本文将详细介绍Memcached的缓存过期…

OpenHarmony移植小型系统exynos4412(一)

新建芯片解决方案 1、新建目录 芯片解决方案的目录规则为:device/board/{芯片解决方案厂商}/{开发板}。以exynos的fs4412开发板为例,在代码根目录执行如下命令建立目录: mkdir -p device/exynos/fs4412 芯片解决方案目录树的规则如下: device/board └── company # 芯…

自定义动态数据源+事务控制

1:首先yml配置两个数据库的链接 spring:application:name: xxxxmain:banner-mode: OFFdatasource: # 默认数据源 datamarkdruid: # 关闭数据库的 web 访问stat-view-servlet:enabled: falseweb-stat-filter:enabled: falsefilt…

Linux系统之玩转SafeLine防火墙应用

Linux系统之玩转SafeLine防火墙应用 一、SafeLine介绍1.1SafeLine简介1.2 SafeLine功能1.3 SafeLine 的工作原理二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、部署SafeLine4.1 安…

算法训练营day67

题目1&#xff1a; #include <iostream> #include <vector> #include <string> #include <unordered_set> #include <unordered_map> #include <queue>using namespace std;int main() {string beginStr, endStr;int n;cin >> n;ci…

一篇文章搞懂弹性云服务器和轻量云服务器的区别

前言 在众多的云服务器类型中&#xff0c;弹性云服务器和轻量云服务器因其各自的特点和优势&#xff0c;受到了广大用户的青睐。那么&#xff0c;这两者之间到底有哪些区别呢&#xff1f;本文将为您详细解析。 弹性云服务器&#xff1a;灵活多变的计算资源池 弹性云服务器&…

谷粒商城-个人笔记(集群部署篇一)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【LeetCode的使用方法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🔮LeetCode的使用方法 🔮LeetCode 是一个在线编程平台,广泛…

题解:CF1981C(Turtle and an Incomplete Sequence)

题解&#xff1a;CF1981C&#xff08;Turtle and an Incomplete Sequence&#xff09; Part 1&#xff1a;题意理解 地址链接&#xff1a;CF、洛谷。题面翻译&#xff1a;给定一个长度为 n n n 的序列 a a a&#xff0c;其中有一些元素未知&#xff0c;用 − 1 -1 −1 表示…

《昇思25天学习打卡营第7天|函数式自动微分》

文章目录 今日所学&#xff1a;一、函数与计算图二、微分函数与梯度计算三、Stop Gradient四、Auxiliary data五、神经网络梯度计算总结 今日所学&#xff1a; 今天我学习了神经网络训练的核心原理&#xff0c;主要是反向传播算法。这个过程包括将模型预测值&#xff08;logit…

无法定位程序输入点Z9 qt assertPKcS0i于动态链接库F:\code\projects\06_algorithm\main.exe

解决方法&#xff1a; 这个报错&#xff0c;是因为程序在运行时没要找到所需的dll库&#xff0c;如果把这个程序方法中对应库的目录下执行&#xff0c;则可正常执行。即使将图中mingw_64\bin 环境变量上移到msvc2022_64\bin 之前也不可以。 最终的解决方法是在makefile中设置环…

代码随想三刷动态规划篇7

代码随想三刷动态规划篇7 198. 打家劫舍题目代码 213. 打家劫舍 II题目代码 337. 打家劫舍 III题目代码 121. 买卖股票的最佳时机题目代码 198. 打家劫舍 题目 链接 代码 class Solution {public int rob(int[] nums) {if(nums.length1){return nums[0];}if(nums.length2){…

Python基础小知识问答系列-可迭代型变量赋值

1. 问题&#xff1a; 怎样简洁的把列表中的元素赋值给单个变量&#xff1f; 当需要列表中指定几个值时&#xff0c;剩余的变量都收集在一起&#xff0c;该怎么进行变量赋值&#xff1f; 当只需要列表中指定某几个值&#xff0c;其他值都忽略时&#xff0c;该怎么…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务5:ZooKeeper集群安装

任务描述 ZooKeeper是一个开源分布式协调服务&#xff0c;其独特的Leader-Follower集群结构&#xff0c;很好的解决了分布式单点问题。目前主要用于诸如&#xff1a;统一命名服务、配置管理、锁服务、集群管理等场景。大数据应用中主要使用ZooKeeper的集群管理功能。在这里使用…

使用Redis实现消息队列:List、Pub/Sub和Stream的实践

摘要 Redis是一个高性能的键值存储系统&#xff0c;它的多种数据结构使其成为实现消息队列的理想选择。本文将探讨如何使用Redis的List、Pub/Sub和Stream数据结构来实现一个高效的消息队列系统。 1. 消息队列的基本概念 消息队列是一种应用程序之间进行通信的机制&#xff0…

Qt/C++模拟鼠标键盘输入

1、控制鼠标移动 &#xff08;1&#xff09;Qt方案 QScreen* sc QGuiApplication::primaryScreen(); QCursor* c new QCursor(); int deltaX 10; int deltaY 10; c->setPos(sc, c->pos().x() deltaX, c->pos().y() deltaY);&#xff08;2&#xff09;Windows原…

人工智能发展方向的思考:简单与复杂的对立与融合

人工智能&#xff08;AI&#xff09;的迅猛发展&#xff0c;正在以惊人的速度改变着我们的世界。它在很多领域展示了强大的能力&#xff0c;特别是在处理简单、重复的任务方面&#xff0c;AI已经表现出极高的效率和准确性。然而&#xff0c;当面对复杂的业务场景时&#xff0c;…

660错题

不能局部求导,局部洛必达