(02)Cartographer源码无死角解析-(46) 2D栅格地图→CastRay()函数与贝汉明(Bresenham)算法

news2024/9/23 9:32:06

讲解关于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官方认证
 

一、前言

在上一篇博客中,解答了如下两个疑问:

疑问 1 \color{red} 疑问1 疑问1→ 为什么Grid2D::FinishUpdate()函数中,栅格值为什么需要减去 kUpdateMarker?
疑问 3 \color{red} 疑问3 疑问3 → ProbabilityGrid::ApplyLookupTable() 函数中对于cell的更新比较奇怪,代码为:*cell = table[*cell]。

但是在分析 ProbabilityGridRangeDataInserter2D::Insert() 函数的时候,其调用了一个十分重要的函数 CastRays(),对于该函数并没有进行具体的分析,接下来就是对该函数进行讲解了。不过在这之前,需要了解一下贝汉明(Bresenham)算法。

需要提前理解的是,把点云数据插入到栅格地图,其本质上就是对栅格地图的更新。更新步骤为:根据最新采集到的雷达点,在与地图匹配后,把雷达点插入到当前地图中,其本质是对栅格地图概率的更新。这里的更新包括两部分,其一是对hit点的概率更新,其二是对CastRay完成激光射线状地图更新,即对一条直线所经过的栅格进行概率值更新。

对于上述过程应该还是很好理解的,hit 表示激光发射光子打中的点,说明其是障碍物,那么源码中使用 hit_table_ 表格对 cell 进行更新。从雷达传感器原点到 hit 点连接的射线其经过的区域记为 miss,对应的 cell 栅格表示其没有障碍物,所以需要使用 miss_table_ 表格对 cell 进行更新。下图是雷达扫描的模型仿真:

在这里插入图片描述

图一

红色部分表示之前探索过的区域,灰色部分表示目前正在探索的区域。可以看到一条条由机器人(雷达原点)发射而出的一条条射线。这些射线经过的区域为miss,其终点位置为hit。对于一种特殊情况,那就是大范围区域没有障碍物,但是雷达只能探索到有限距离,该情况后续我们再进行具体分析。

那么显然,对于 hit 点的更新十分简单,直接调用 ProbabilityGrid::ApplyLookupTable() 函数更新即可。但是对于hit 射线经过经过区域 miss 所对应的 cell 都要进行更新,显然会复杂一些。

对与 miss 区域 cell 的更新,主要解决的问题,就是一条由雷达原点发射出来的点云射线,其会经过那些 cell 或者说栅格,如下图所示:
在这里插入图片描述

图二

若机器上处于上图绿色圆圈Robot栅格位置,打出一个光子,即一个点云数据为上图红色圆圈hit栅格位置,那么要求得,就是这两个栅格中心连接的直线,所经过的栅格区域,也就是上图的 miss。
 

二、贝汉明(Bresenham)算法

这里说的贝汉明(Bresenham)算法,并非原版的贝汉明(Bresenham)算法,而是Cartographer中改版过后的贝汉明(Bresenham)算法。Cartographer 中为了让地图地图更加精细,

 
 
 

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

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

相关文章

PCB设计完成后,为什么经常要拼版及拼版注意事项

通常我们在完成PCB设计的时候,有一些板子我们通常是需要进行拼版的,那么我们为什么要拼版,哪种情况下需要拼版呢?不拼是否可以呢?1、PCB生产制作尺寸要求 一般来说面积比较小的板子我们是需要进行拼版,一般…

MATLAB APP 设计实践(一)UART通信(下篇)

引言上篇介绍了 MATLAB App 的基本内容,本篇就结合UART发送数据的具体案例介绍开发过程。文末给出设计源文件、设计的可执行文件的下载链接,以及App的实际使用视频(与FPGA开发板进行调试验证)。前文链接:MATLAB APP 设…

MySQL 分区(innode引擎的讲解)

目录 一.InnoDB逻辑存储结构 段 区 页 二.分区概述 分区 三.分区类型 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。 段 段就是…

【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

文章目录基本原理绘图层次定义距离基本原理 和Birch聚类相似,层次聚类也是一种依赖树结构实现的聚类方法,其核心概念是相似度。根据相似度,可以将所有样本组织起来,从而构建一棵层次聚类树。 其中Birch算法的核心,叫…

MyBatis【多表查询与动态SQL使用】

MyBatis【多表查询与动态SQL使用】🍎一.MyBatis多表查询🍒1.1 一对一查询🍒1.2 一对多查询🍎二.动态SQL使用🍒2.1 if 标签使用🍒2.2 trim 标签使用🍒2.3 where 标签使用🍒2.4 set 标…

ARX测试_绘制道路横断面

本文迁移自本人网易博客,写于2011年1月12日,ARX测试_绘制道路横断面 - lysygyy的日志 - 网易博客 (163.com)1、已提供道路的图形,获取用户输入的两点,并在两点间画一条虚线。计算这条直线与多少条直线相交,若数量不等于…

振弦采集模块多通道专用寄存器

振弦采集模块多通道专用寄存器 多通道频率、温度值寄存器 51~58( 0x33~0x3A) 位 符号 值 描述 默认值 bit15:0 频率/温度值 0 单通道模块时,寄存器 51 内为频率值,寄存器 55 内为温度值 4 通道模块时,寄存器 51~54 内…

如何去学习PMP考试的《PMBOK》

首先,是PMP考试的核心教材:《PMBOK指南》,目前已经出道第七版了,大家如果有备考的需要要赶紧买一本来学习。 其次,是《汪博士解读PMP》,目前出到第6版,这本书是对PMBOK中各领域知识点的深入浅出…

机械臂速成小指南(二十一):几何雅可比矩阵

👨‍🏫🥰🥳需要机械臂相关资源的同学可以在评论区中留言哦🤖😽🦄指南目录📖:🎉🎉机械臂速成小指南(零点五):机…

煤矿皮带跑偏撕裂智能检测算法 opencv

煤矿皮带跑偏撕裂智能检测算法能够通过pythonopencv深度学习技术实时监测运输皮带的状况,当监测到皮带出现撕裂跑偏时,立刻抓拍告警并中止皮带的运输。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Py…

动态博客系统

Halo 是我折腾过的众多博客系统里面,最好、最容易上手的动态博客系统之一( solo 也是),轻快,简洁,功能强大。 正文 上周末正在募集团队一起写算法题,群里讨论需要一个网站来存放文章&#xff…

C++ 语法基础课 习题6 —— 函数

文章目录例题1. 804.n的阶乘2. 805.x和y的最大值3. 808.最大公约数4. 811.交换数值5. 812.打印数字6. 813.打印矩阵7. 819.递归求阶乘8. 820.递归求斐波那契数列例题 1. 804.n的阶乘 Acwing 804.n的阶乘 #include<iostream> using namespace std;int fact(int n) {if(…

MFC高级控件RichEdit2.0的使用

MFC高级控件RichEdit的使用MFC高级控件RichEdit的使用MFC控件设置焦点&#xff0c;实现回车后编辑框内容清空&#xff0c;焦点停留在该编辑框内MFC高级控件RichEdit的使用 RichEdit控件&#xff0c;可以设置编辑框内不同的行、不同的段落有不同的字体、颜色。 效果如下&#xf…

Python--文件基本操作

文件的存储方式 在计算机中&#xff0c;文件是以 二进制的方式保存在磁盘上的 文本文件和二进制文件 文本文件 可以使用文本编辑软件查看本质上还是二进制文件二进制文件 保存的内容 不是给人直接阅读的&#xff0c;而是提供给其它软件使用的二进制文件不能使用 文件编辑软件…

NTN(一) 基本架构

R17将NTN纳入了3GPP规范&#xff0c;NTN是 non-terrestrial networks非地面网络缩写&#xff0c;通过卫星或无人机平台实现NR通信&#xff0c;在地面网络设备无法普及的地方&#xff0c;采用NTN覆盖&#xff0c;进一步提升覆盖范围。例如在沙漠、海洋等极限区域&#xff0c;采用…

TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP-数据格式 数据偏移 占4位&#xff0c;取值范围是0x0101~0x1111乘以4就是首部长度&#xff08;Header Length&#xff09; 保留 占6位&#xff0c;目前全为0 有些资料中&#xff0c…

虚幻C++ 关于怎么打印日志

虚幻C 关于怎么打印日志 先打开日志窗口认识一下! 这个就是日志窗口了&#xff01; 可以对信息进行过滤&#xff01; 也可以只显示某种日志&#xff01; 认识完界面了&#xff01;开始写代码啦&#xff01; 老规矩&#xff0c;先给一个入口函数&#xff01; #include &qu…

社交电商红利期,怎么抓住这一波自带流量

自拼多多依靠社交电商模式跃升为行业前三时&#xff0c;社交电商模式就被众多学者以及电商人士研究&#xff0c;过去一年&#xff0c;亚马逊、Starday、TikTok等跨境电商服务平台纷纷推出“直播”功能&#xff0c;试图跟上社交电商发展红利期&#xff0c;为平台抓取更多流量。而…

原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧

我们要做的效果是如下&#xff0c;就像这个app一样底部的每个菜单点击是有动画的&#xff1a; 此问题来源于我们的一位ui设计师他无法制作Lottie动画无法输出.json格式给到我们的安卓工程师&#xff0c;因此还有一种方法就是做个gif图&#xff0c;而这个目前他也不会只有给大家…

Mysql 索引 以及 SQL 优化 (自用笔记)

(笔记来源 https://www.bilibili.com/video/BV1Kr4y1i7ru?p88&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 3.索引 3.1索引的语法 3.1索引的性能分析 3.1.1查看SQL执行频率 增删改为主的SQL的一般不需要优化 查询居多的SQL则需要优化 3.1.2慢查询的日志 记录了超过…