Cartographer构建多分辨率栅格地图的原理

一、前言

在Cartographer中,利用分支定界法进行回环检测,需要对子图构建多分辨率栅格地图。

其实现源码在fast_correlative_scan_matcher_2d.cc中的PrecomputationGrid2D构造函数中。这部分代码有些难读,但花点时间也能理解。

本文将摆脱繁琐的代码,从原理层面介绍多分辨栅格地图的构建。并在文章结尾处,提供可视化栅格地图的数据代码。

二、原理

1. 栅格地图数据格式

在构建多分辨率栅格地图时,使用的是占据概率p离散化化到0〜255的uint8值,离散化公式为:

在Cartographer中,占据概率p的范围为0.1〜0.9。

在多分辨率栅格地图中,存储的是占据概率p离散化到0〜255的uint8变量,离散化公式为:

value=\textup{RoundToInt}(\frac{p-0.1}{0.9-0.1}*255)

 \textup{RoundToInt}()为四舍五入到整数的函数。

占据概率越大,数值越接近255,占据概率越小,数值越接近0。

将一张子图栅格地图,以255-value为灰度值,通过opencv可视化出来,如下图所示:

图中黑色区域为激光点打到的障碍物,白色区域代表完全空闲区域;

灰色区域需分情况讨论:数值小于127时,空闲概率更大;数值大于127时,占用概率更大。

图片与栅格值的对应关系如下:

2. 滑动窗口降采样

定义取最大值滑动窗口,如下图所示。width为窗口尺寸,窗口内的最大值输出到右下角蓝色格子中。

假设有一张7x7的栅格地图,用width=2的滑动窗口进行处理,第一个处理点为地图左上角点,此时窗口内只有一个值,直接保存到结果中,如下图所示:

然后将逐次滑动窗口横向(x方向)移动一格,将窗口内的最大值写入到结果中,直到窗口遍历完该行所有格子。由于窗口本身存在尺寸,输出栅格会多出(width-1)列,如下图所示:

遍历完一行后,将窗口纵向(y方向)移动一格,重复遍历行操作,直到所有行遍历完成。同理,输出栅格也会多出(width-1)行,如下图所示:

用width=4的窗口,对栅格地图进行将采样,结果如下所示:

假设原始栅格地图尺寸为[h, w],经过width的滑动窗口处理后,将采样后地图尺寸变为[h+width-1, w+width-1]。

3. 多分辨栅格地图可视化

在Cartographer的回环检测中,默认构建7层不同分辨率的栅格地图,层数参数在pose_graph.lua中,如下图。

7层对应的滑动窗口的width分别为:

2^{0}=1,2^{1}=2,2^{2}=4,2^{3}=8,2^{4}=16,2^{5}=32,2^{6}=64

其中第一层的滑动窗口width=1,本质上就是原始地图。

接下来,取cartographer中一个子图进行多分辨栅格地图的可视化,如下列图片所示。

可以看到,图像变得越来越粗糙。

三、可视化代码和数据

1. 保存栅格地图为txt文件

在cartographer/mapping/internal/2d/scan_matching/fast_correlative_scan_matcher_2d.cc中的PrecomputationGrid2D::PrecomputationGrid2D()函数末尾,添加以下代码,将多分辨率栅格地图保存为txt文件:(注意修改文件目录名)

  // 保存多分辨栅格地图为txt文件static int idx = 0;static int depth = 7;int pre_id = idx / depth;int suffix_id = idx % depth;string f_name = "/home/trail/depth7/" + to_string(pre_id) + "-" + to_string(suffix_id) + ".txt";ofstream f(f_name);f << wide_limits_.num_y_cells << " " << wide_limits_.num_x_cells << endl;for(int i=0; i<wide_limits_.num_y_cells; i++){for(int j=0; j<wide_limits_.num_x_cells; j++){f << setw(4) << (int)cells_[j + i * wide_limits_.num_x_cells];}f << endl;}f << endl;f.close();idx++;

2. txt文件可视化

编写python代码,读取txt文件内容,用cv2进行可视化:

import cv2
import numpy as npdef ReadGrid(txt):with open(txt, 'r') as f:line = f.readline()height = int(line.split(' ')[0])width = int(line.split(' ')[1])print(height, width)img = np.zeros((height, width, 1), np.uint8)lines = f.readlines()for idy, line in enumerate(lines):pixels = [d.strip() for d in line.split()]for idx, data in enumerate(pixels):img[idy, idx] = 255 - int(pixels[idx])return img    submap_id = 0
depth = 7
imgs = [ReadGrid("/home/trail/depth7/%d-%d.txt" % (submap_id, i)) for i in range(depth)]        
while 1:for i in range(depth):cv2.imshow(str(i), imgs[i])key = cv2.waitKey(30)

3. 数据

本文可视化所使用的txt文本和python脚本,已上传到个人资源:

 https://download.csdn.net/download/Jeff_zjf/88369796

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

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

相关文章

许战海战略文库|无增长则消亡:大型制造集团增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。在过去的100年里,全球经济周期的时间长度明显缩短,周期内的波动也更为剧烈。联合国教科文组织的研究表明&#xff0c;18世纪知识更新的周期约为80到…

社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试

云帐房网络科技有限公司&#xff08;以下简称为“云帐房”&#xff09;成立于2015年3月&#xff0c;以“成为最值得信赖的税务智能公司”为愿景&#xff0c;运用人工智能、大数据等互联网技术&#xff0c;结合深厚的财税行业服务经验&#xff0c;为代账公司和中大型企业提供智能…

浅谈Deep Learning 与 Machine Learning 与Artificial Intelligence

文章目录 三者的联系与区别 三者的联系与区别 “Deep Learning is a kind of Machine Learning, and Machine Learning is a kind of Artificial Intelligence.” 人工智能&#xff08;AI&#xff09;&#xff0c;机器学习&#xff08;Machine Learning&#xff0c;简称ML&am…

Web服务(Web Service)

简介 Web服务&#xff08;Web Service&#xff09;是一种Web应用开发技术&#xff0c;用XML描述、发布、发现Web服务。它可以跨平台、进行分布式部署。 Web服务包含了一套标准&#xff0c;例如SOAP、WSDL、UDDI&#xff0c;定义了应用程序如何在Web上实现互操作。 Web服务的服…

gogs git 服务器极速搭建

背景 小型团队合作中&#xff0c;需要代码托管在内网&#xff0c;gitlab 等搭建比较复杂&#xff0c;经过一番搜寻发现gogs满足需求 基本用户管理后台管理面板&#xff0c;能在web端查看管理安装配置极简 安装配置 gogs是支持多个平台&#xff0c;这里我们选择ubuntu 1.下载git…

QT windows dpi变化导致的界面异常处理

问题&#xff1a;已经在UI界面中利用布局设计好界面&#xff0c;但是运行程序后显示的界面出现错乱&#xff0c;而且在做出一些修改后重新构建&#xff0c;运行时界面无变化。 目录 一、解决UI设计界面与运行时显示界面不一致的问题 1、导致该现象的原因有&#xff1a;显示屏…

Windows安装cuda和cudnn教程最新版(2023年9月)

文章目录 cudacudnn cuda 查看电脑的cuda最高驱动版本&#xff08;适用于N卡电脑-Nvidia&#xff09; winR打开命令行&#xff0c;输入nvidia-smi 右上角cuda -version就是目前支持的最高cuda版本&#xff0c;目前是12.2 nvidia官网下载cuda 下载地址&#xff1a;https://d…

最优化方法——Matlab实现黄金分割法一维搜索

文章目录 黄金分割法一维搜索原理算法流程&#xff1a; Matlab代码命令行窗口结果打印&#xff1a;更换匿名函数&#xff1a; 《最优化方法》教材上写成表的答案&#xff1a;黄金分割法的一些性质 黄金分割法一维搜索原理 若保留区间为[x1,b],我们得到的结果是一致的. 该方法称…

深入了解队列数据结构:定义、特性和实际应用

文章目录 &#x1f34b;引言&#x1f34b;队列的定义&#x1f34b;队列的实现&#x1f34b;队列的应用&#x1f34b;练习题&#x1f34b;结语 &#x1f34b;引言 队列&#xff08;Queue&#xff09;是计算机科学中一种重要的数据结构&#xff0c;它常用于各种应用程序中&#x…

SoftwareTest3 - 要了人命的Bug

软件测试基础篇 一 . 如何合理的创建一个 Bug二 . Bug 等级2.1 崩溃2.2 严重2.3 一般2.4 次要 三 . Bug 的生命周期四 . 跟开发产生争执应该怎么解决 Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足…

php之导入导出csv文件

一、导入csv文件 1、创建导入页面 <!DOCTYPE html> <html lang"zh-CN"> <meta charset"UTF-8"> <head><title>文件提交表单</title> </head> <body> <form action"test5.php" method"…

【软件测试】测试中的风险有哪些?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; ​那么到底都有哪些风险要注意呢?如何解决呢?另外这些风险如何在计划中写明呢&#xff0c;不会写“张三…