(02)Cartographer源码无死角解析-(48) 2D点云扫描匹配→扫描匹配基本原理讲解,代码总体框架梳理

news2024/12/23 23:14:14

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下:
(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885
 
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证
 

一、前言(Scan match原理)

通过前面你的一系列博客,已经知道 Cartographer 中的概率栅格图是如何建立的了。不过需要注意的一点是该地图并不仅仅是保存下来给来看的,其还会被点云扫描匹配使用到,点云扫描匹配目的是估算位姿(该部分内容后面会详细讲解)。在 slam 中分为 Scan match 与 Point cloud match,通常情况下前者指的就是2D扫描匹配,后者指的是3D点云匹配。为了方便后续代码的理解,这里简单介绍一下扫描匹配的原理,先来看下图(理想位姿):
在这里插入图片描述

图一:理想位姿

1、方格 → 所有的栅格组成。
2、黑色方格 → 障碍物,光子会被阻碍,形成点云数据。
3、白色方格 → 空闲区域,表示没有障碍物,光子可以直接穿过。
4、紫色多边形 → 代表机器人,当然也可以理解为雷达传感器原点,或者点云数据的原点。
5、黄色圆形 → 点云数据。

从上图来看,可见所有的点云数据都与障碍物重叠了,说明此时估算出来的位姿十分正确,这里称为理想位置。但是系统在运行的过程中并非是这样的。这里假设我们由传感器数据(Imu、GPS、里程计) 等估算出来的位姿如下所示:
在这里插入图片描述

图二:初始位姿
容易看出上图估算出来的位姿是存在偏差的,假设传感器估算出来的初始位姿,是不太准确的,那么问题就来了,如何根据初始位姿求解出理想位姿呢?首先,通常来说理想位姿需要在初始位姿的一定范围之内(也就是说,传感器的误差不能太大了),基于这个前提,再来分析上图。

根据图示可以看出初始位姿与理想位姿在位置与姿态上都存在差异,也就是说由初始位姿变换到理想位姿,其平移与旋转可能都需要发生改变。基于这个原理,最简单的一种扫描方式就是暴力匹配,也就是在位移与角度上维度上进行遍历,流程如下:

1、设定初始位姿
2、位移扫描匹配遍历
3、角度扫描匹配遍历。
4、评分标准

初始位姿可以直接由传感器估算出来,先来看下图,
在这里插入图片描述

图三:位姿遍历

绿色区域 1-6 表示需要遍历的区域,也就是理想位姿的平移处于该区域内,也就是位移扫描匹配需要遍历绿色区域1-6。蓝色的箭头表示角度遍历的方向。该箭头的起点就是角度开始遍历的起点,终点就是角度遍历的终点。

如上图所示,假设从从1号方格开始第一次遍历,Robot角度为-35°(假设平行y轴为0°),记为 1_(-35)。需要主意的是,Robot 与点云需要一直保持相对禁止,Robot位姿如何变换,点云则需做同样的变换。在 1_(-35) 的位置上,我们希望所有的点云都能够与黑色方格(障碍物)完全匹配,但是显然是不行的,所以改变一下角度,这里假设角分辨率为5°,那么下次利用 1_(-30) 的 Robot 与点云位姿与黑色方格进行匹配,依此一下,进行位姿和角度上的遍历,如下:

1_(-35)   1_(-30)   1_(-25) ......  1_(30)   1_(35)
2_(-35)   2_(-30)   2_(-25) ......  2_(30)   2_(35)
......
6_(-35)   6_(-30)   6_(-25) ......  6_(30)   2_(35)

其可以按行遍历,也可以按列遍历,每一个上述 Robot 与点云位姿与黑色方格进行匹配之后,我们都需要进行一次评分,在这个例子中会匹配6x(70/5)=6x14=84次,也就是说这里需要进行84次评分。那么问题来了,如何进行评分,才能体现出匹配结果的优劣呢?

从上图可以很直观的看出点云与障碍物重叠度越高,则匹配效果越好。结合前面的内容,这里假设存在 n n n 个点云,其每个点云对应的方格记为 c e l l i cell_i celli c e l l i cell_i celli 对应被占用的概率为 p i p_i pi,那么每次匹配的得分可以记为 s x = ( ∑ i = 1 n p i ) / n s_x=(\sum _{i=1}^np_i)/n sx=(i=1npi)/n。然后认为所有匹配(84次)得分中最高的 s m a x s_{max} smax 为最优匹配。也就是图一的理想匹配。

注意 \color{red} 注意 注意 这里讲解的仅仅是一种十分简单的方式,实际工程的实现并非如此简单,需要考虑很多的东西,比如通常情况下,点云与黑色方格很难完全匹配,也就是说不存在精确解,那么只能通过迭代的方式求得最优解。除此之外,还有涉及到其他的很多技巧,后续会进行部分讲解。

Cartographer 中的扫描匹配主要是参考:A Flexible and Scalable SLAM System with Full 3D Motion Estimation 实现,有兴趣的朋友可以好好阅读一下。
 

二、框架梳理→预备讲解

下面来看看源码中是如何进行扫描匹配的,该篇不可不对细节进行刨析,了解基本流程即可,下一篇博客再进行细节上的分析。首先找到

 
 
 

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

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

相关文章

项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(二)

DhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是最完善的甘特图图表库。 这篇文章给大家讲解如何利用dhtmlxGantt加载任务日期。 DhtmlxGantt正版试用下载(qun:764148812&#x…

【Linux】进程状态、优先级和进程切换

大家好我是沐曦希💕 文章目录一、操作系统进程1.运行队列2.进程状态二、Linux进程状态三、两个特殊进程1.僵尸进程2.孤儿进程四、进程优先级1.优先级概念2.查看系统进程3.PRI和NI4.nice值的更改5.特性五、进程切换1.并发2.进程如何切换一、操作系统进程 什么是进程…

axios拦截器、ElementUI组件的使用

一、axios拦截器 1、axios模块的作用 是对基于http请求的封装。在浏览器对异步请求对象XMLHttpRequest进行封装 2、拦截器 ​ (1)请求拦截器:对客户端发起的请求进行统一的前期处理(token、时间戳、cookie等) ​ …

电脑软件经常出现程序未响应是什么原因?及4种解决方法总结

对于电脑小白来说,电脑经常会出现一下莫名其妙的问题,下面我总结的这些方法可以帮大家排除电脑的问题,让电脑速度如飞。资源不足:如果您的电脑资源不足,比如内存或 CPU 使用率过高,那么程序可能会变得不稳定…

【Linux操作系统】多线程(二)

文章目录4. 线程池5. 单例模式5.1 饿汉模式5.2 懒汉模式6. STL、智能指针和线程安全6.1 STL中的容器是否是线程安全的6.2 智能指针是否是线程安全的6.3 其他常见的各种锁7. 读者写者模型7.1 基本概念7.2 读写锁7.3 基本操作7.4 优先级4. 线程池 介绍 一种线程使用模式。线程过…

论文分享 | MnTTS2: 开源的多说话人蒙古语TTS数据集

本次分享内蒙古大学蒙古文信息处理重点实验室、蒙古文智能信息处理技术国家地方联合工程研究中心及语音理解与生成实验室 (S2LAB) 共同发布的开源多说话人蒙古语语音合成数据集及其基线模型。相关论文《MnTTS2: An Open-Source Multi-Speaker Mongolian Text-to-Speech Synthes…

【Java编程进阶】Java异常详解

推荐学习专栏:Java 编程进阶之路【从入门到精通】,从入门到就业精通,买不了吃亏,买不了上当!! 文章目录1. 异常2. 异常的体系3. Error4. 异常产生的过程5. throw 关键字6. 异常处理6.1 throws 关键字6.2 tr…

基于Node.js和vue的师生互助平台

摘 要随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&am…

Jetpack Compose中的软键盘与焦点控制

FocusRequester 与 FocusManager 在 Compose 中,可以通过 FocusRequester 与 FocusManager 这两个对象可以主动在代码中控制焦点获取和取消焦点,其中FocusRequester可以用来获取焦点,通过调用它的requestFocus()方法来实现,而 Fo…

脚手架搭建Vue项目

以上创建的方式发现一直存在config目录 换种方式 卸载脚手架命令 npm uninstall vue-cli -g 重新安装 npm install vue/cli -g 1.vue create 项目名 2.模板选择,通过键盘上下键来选择,我们选择第三个 自定义 这三个选择分别是 vue2 / vue3 默认模板…

12.Isaac教程--未来工厂中的搬运车

未来工厂中的搬运车 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录未来工厂中的搬运车运行模拟器搬运车送货申请自动小车运输的行为树导航与感知互通仅限自主导航申请仅适用于感知训练模型物体检测模型(DetectNetv2&#x…

JSP SSM家教管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSPSSM家教管理系统 是一套完善的系统源码,对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助,系统具有完整的源代码和数据库,以及相应配套的设计文档,系 统主要采用B/S模式开发。 研究的基本内容…

5.5、TCP 的拥塞控制

在某段时间若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏\color{red}对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就…

CSDN第22场周赛

1.写在前面的话22场周赛的详情总比赛第7名了,hhhCSDN周赛非常能够锻炼码代码的能力,无论是在平常的练习题目当中,还是每次的周赛中,题目有难有易,每次周赛的题目出的十分具有代表性,参加了将近20场的周赛&a…

批量PDF文件合并用什么软件?这两个宝藏软件赶快收藏起来

我们在工作中经常有很多处理过的PDF文件,我们经常会将这些文件进行保存,以防日后需要使用,但是太多的PDF文件真的会占用很多存储空间,所以我们可以将各类PDF文件合并在一起,这样也方便以后观看,但是逐个合并…

Docker容器实时日志查看器Dozzle

什么是 Dozzle? Dozzle 是一个小型轻量级应用程序,具有基于 Web 的界面来监控 Docker 日志。Dozzle不存储任何日志文件,仅用于实时监控您的容器日志。 先看个官方的动图 老苏已转成了视频,源文件地址:https://github.c…

制造型企业离不开MES?MES系统有什么应用场景

随着工业物联网的迅速发展,设备监测也成为MES系统中的一个关键环节。过去我们所收集到的资料,也许只是一种记录的作用,随着联网的设备越来越多以及大数据、云计算等技术的发展,数据的价值越来越高。数据收集不再仅仅是一种简单的记…

Codeforces Round #841 (Div. 2) (A--D)

[TOC](Codeforces Round #841 (Div. 2)(A–D)) A、 Joey Takes Money 1、题目 2、思路 3、代码 #include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef unsigned long long ll;int main(){ll t;cin>>t;while(t--){int…

新书赠送丨《中国金融科技发展概览:创新与应用前沿》

我国金融科技发展日新月异&#xff0c;人工智能、云计算、大数据等新兴数字技术与实体经济及金融业的深度融合&#xff0c;推动我国数字经济快速发展&#xff0c;也深刻改变着我国金融业的服务业态和经营模式。过去的一年&#xff0c;金融机构实现核心技术自主可控成为热点&…

影响因子14.65:16S全长测序+低丰度简化菌群,提供根腐病防控新视角

背景介绍当土壤中病原体入侵时&#xff0c;植物可以动态调节其根际微生物并适应这种生物胁迫。植物招募的保护性微生物群落中通常包含一些低丰度的类群&#xff0c;其作用尚不清楚。本研究首先分析了健康和患病黄芪之间根系微生物群落结构的差异&#xff0c;依据患病黄芪根部的…