经典文献阅读之--D-Map(无需射线投射的高分辨率激光雷达传感器的占据栅格地图)
0. 简介
占用地图是机器人系统中推理环境未知和已知区域的基本组成部分。《Occupancy Grid Mapping without Ray-Casting for High-resolution LiDAR Sensors》介绍了一种高分辨率LiDAR传感器的高效占用地图框架,称为D-Map。该框架引入了三个主要创新来解决占用地图的计算效率挑战。首先,我们使用深度图像来确定区域的占用状态,而不是传统的射线投射方法。其次,我们在基于树的地图结构上引入了一种高效的树上更新策略。这两种技术避免了对小单元的冗余访问,显著减少了需要更新的单元数量。第三,我们通过利用LiDAR传感器的低误报率,在每次更新时从地图中删除已知单元。这种方法不仅通过减小地图大小提高了框架的更新效率,还赋予了它一种有趣的递减特性,我们称之为D-Map。为了支持我们的设计,我们提供了深度图像投影的准确性和占用更新的时间复杂度的理论分析。此外,我们在公共和私有数据集上进行了广泛的基准实验,使用了各种LiDAR传感器。我们的框架在与其他最先进方法相比的同时,展示了卓越的效率,同时保持了可比较的映射精度和高内存效率。我们展示了D-Map在手持设备和携带高分辨率LiDAR的航空平台上进行实时占用地图的两个真实世界应用。此外,我们在GitHub上开源了D-Map的实现

图1. 我们提出的框架D-Map作为自主无人机探索古堡任务中的实时高分辨率占据地图模块。(a) 无人机采集的高保真度点云。(b) 场景的鸟瞰图。© 航空平台携带了一台128通道激光雷达(OS1-128)来执行探索任务。本文的附带视频可在Youtube上观看:youtu.be/m5QQPbkYYnA。
1. 主要贡献
在这项工作中,我们提出了一种新颖的映射框架,有效解决了基于激光雷达的占据地图中的上述问题。我们的贡献可以总结如下:
- 我们提出了一种基于深度图像投影的占据状态确定方法,以减轻传统射线投射技术中的计算负载。这种基于投影的方法可以对任意大小的单元进行占据状态的确定,从而在大规模环境中实现后续的高效更新。
- 我们提出了一种基于混合地图结构的新颖的树上更新策略,以提供计算和内存效率之间的卓越平衡。混合地图结构将未知空间存储在八叉树上,从而实现对大规模未知空间的内存高效表示,而占据空间则存储在哈希网格地图上。在效率方面,所提出的策略允许在八叉树上确定大单元的占据状态,从而避免对小单元进行不必要的更新,提高了效率。
- 我们利用激光雷达测量的低误报率,直接在每次更新时删除具有确定状态(即占据或空闲)的单元。这种方法使我们的地图结构具有递减性质,因此我们将我们的框架称为D-Map,提供更高的计算效率和更少的内存使用。
- 我们对所提出的占据状态确定方法的准确性进行了深入分析,并对D-Map中的更新和查询的时间复杂度进行了分析。具体而言,我们推导出了一个分析函数,用于量化与深度图像分辨率相关的准确性损失。对D-Map上的更新的时间复杂度分析为我们相对于依赖射线投射的最先进方法的卓越性能提供了理论支持。
- 我们在Github上提供了D-Map的实现:github.com/hku-mars/D-Map,以促进我们工作的可复现性和进一步的发展。
2. 综述
图2展示了提出的D-Map框架的概述。橙色块中勾勒的地图结构在第V-A节中进行了解释。它由两部分组成:占用地图和未知地图。绿色块表示占用更新策略的流程。在每次更新时,从传感器姿态处的点云生成深度图像(详见第IV-A节)。随后,在深度图像上构建2D段树,以实现高效的占用状态确定(详见第IV-B节和第IV-C节)。更新未知地图的整个过程在第V-B节中进行了描述,并总结如下。单元提取模块从八叉树上按照从最大到最小的尺寸收回未知单元,将它们投影到深度图像上,并确定它们的占用状态。确定为已知的单元直接从地图中移除,而未知的单元保留下来,而未确定的单元则被分割成更小的单元以进一步确定占用状态。这种由粗到细的过程可以直接对大单元进行更新,而无需查询每个小单元。此外,已知单元的移除赋予了我们的框架递减属性,从而在计算和内存方面提供了高效性。

图2. D-Map的框架概述。蓝色块显示了D-Map的输入,包括点云和相应的传感器里程计。
橙色块是D-Map的占据地图结构,由一个哈希网格地图和一个八叉树组成,用于维护占据空间和未知空间。占据更新策略显示在绿色块中,该策略从八叉树中提取感知区域内的单元格,并根据使用深度图像的占据状态确定方法进行操作。
3. 深度图像上的占用状态确定
本节描述了如何从传入的点云栅格化深度图像,并确定其占用状态。
3.1 深度图像栅格化
为了确定占用状态,由激光雷达传感器捕获的点云被栅格化成当前传感器姿态下的深度图像。为确保状态确定的准确性,深度图像的分辨率应足够小,以便从地图到深度图像的单元格的投影区域大于一个像素。如图3所示,我们使用以下方程确定深度图像分辨率 ψ m a p ψ_{map} ψmap相对于地图分辨率d和激光雷达的检测范围 R R R:

然而,高分辨率地图将导致一个巨大尺寸的高分辨率深度图像,其中许多像素为空,这是由于点云数量远远小于深度图像的尺寸所致。为了解决这个问题,我们通过LiDAR角分辨率来限制深度图像的分辨率,这是激光雷达发射和接收的两个激光脉冲之间的最小角度。具体来说,我们定义标准深度图像分辨率 ψ I ψ_I ψI为

其中 ψ l i d a r ψ_{lidar} ψlidar 是激光雷达的角分辨率。请注意,为了定义简单起见,我们不区分垂直和水平角分辨率。此外,当相邻点投影到同一像素时,我们保留最小深度值。
3.2 2-D Segment Tree
为了确定地图中单元格的占用状态,采用了一个两步过程,首先将单元格投影到深度图像上,然后比较投影深度与相应区域的最小和最大深度值。由于单元格在深度图像上的投影区域随单元格位置而变化,因此采用了2-D段树结构来加快对深度图像上最小和最大值的高效查询,具体如下所述。段树是一种完全平衡的二叉树,通过表示一组区间来高效提供范围查询[53]。图4描述了通过1-D段树查询最小值的过程。段树通过递归地将数组一分为二来构建,直到每个节点包含一个单独的元素。由于段树上的每个节点表示数组的一个区间,因此在构建过程中预处理区间中的值的总体信息,如最小值和最大值,以加速后续查询。在查询时,段树使用一部分节点(图4中的着色节点)检索查询区间的最小表示。结果是通过总结从检索节点中获取的信息,比直接查询更少的操作得到的。在1-D段树上的查询时间复杂度为 O ( l o g N ) O(log N) O(logN),其中N是离散数组中的元素数量,而直接查询的时间复杂度为 O ( N ) O(N) O(N)。将1-D段树扩展为2-D结构的方法涉及构建“段树的段树”,如[54]中提出的。外层的段树通过行来分割2-D数组,对外部段树的每个节点,构建一个1-D内部段树来维护覆盖行的列信息。2-D段树上的查询首先搜索外部树,找到代表被查询区域覆盖的行的节点,然后遍历相应节点上的内部段树,以检索被覆盖的列。最后,从检索节点上存储的信息中总结出被查询区域的结果。在2-D数组大小为 N × M N×M N×M的情况下,2-D段树上的查询时间复杂度为 O ( l o g N l o g M ) O(log N log M) O(logNlogM),而直接查询的时间复杂度为 O ( N 2 ) O(N^2) O(N2)。给定从点云光栅化的深度图像,我们构建了一个2-D段树来维护每个树节点上的最小和最大深度值,分别表示为 d M i n dMin dMin和 d M a x dMax dMax。此外,我们还跟踪了在每个节点覆盖区域内由点云占据的像素数量,表示为 d S u m dSum dSum。

图3. 该图说明了地图分辨率 d d d、检测范围 R R R和深度图分辨率 ψ m a p ψ_{map} ψmap之间的空间关系。

图4. 该图示例了在一维段树上快速查询像素范围[2, 7]内最小值的示例。从段树的根节点开始,范围查询沿着树递归搜索,直到当前节点范围完全被查询范围覆盖为止,此时将返回在树构建过程中保存在节点上的节点范围的最小值。在这个示例中,范围[2, 7]导致四个节点分别表示范围[2, 2],[3, 4],[5, 6]和[7, 7]。范围的最小值可以高效地从这四个节点中获取,而不是计算数组中的六个元素。
3.3 占用状态确定(重点内容)
我们以五个单元格为例介绍了我们确定单元格占用状态的方法原理,如图5所示,编号从1到5。我们首先根据单元格是否完全位于激光雷达感知区域内对其进行分类。如图5(b)中的俯视图所示,Grid 1、Grid 2和Grid 3完全位于感知区域内,而Grid 4和Grid 5只有部分位于其中。在完全位于感知区域内的单元格中,Grid 3由于位于观察环境中所有物体的前方而被确定为已知;Grid 1由于位于物体后方而被确定为未知。Grid 2的占用状态仍未确定,因为其一部分位于物体前方,另一部分位于物体后方。对于部分位于感知区域内的单元格,Grid 5由于位于物体后方而被确定为未知。虽然位于物体前方,但Grid 4的占用状态由于其位置并非完全位于感知区域内而仍未确定。
…详情请参照古月居
相关文章:
经典文献阅读之--D-Map(无需射线投射的高分辨率激光雷达传感器的占据栅格地图)
0. 简介 占用地图是机器人系统中推理环境未知和已知区域的基本组成部分。《Occupancy Grid Mapping without Ray-Casting for High-resolution LiDAR Sensors》介绍了一种高分辨率LiDAR传感器的高效占用地图框架,称为D-Map。该框架引入了三个主要创新来解决占用地图…...
开源免费的定时任务管理系统:Gocron
Gocron:精准调度未来,你的全能定时任务管理工具!- 精选真开源,释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发,是一个轻量级定时任务集中调度和管理系统,用于替代L…...
从零开始详解OpenCV车道线检测
前言 车道线检测是智能驾驶和智能交通系统中的重要组成部分,对于提高道路安全、交通效率和驾驶舒适性具有重要意义。在本篇文章中将介绍使用OpenCV进行车道线的检测 详解 导入包 import cv2 import matplotlib.pyplot as plt import numpy as np读入图像并灰度化…...
【Java代码审计】逻辑漏洞篇
【Java代码审计】逻辑漏洞篇 逻辑漏洞概述常见逻辑漏洞点 逻辑漏洞概述 逻辑漏洞一般是由于源程序自身逻辑存在缺陷,导致攻击者可以对逻辑缺陷进行深层次的利用。逻辑漏洞出现较为频繁的地方一般是登录验证逻辑、验证码校验逻辑、密码找回逻辑、权限校验逻辑以及支…...
SSH简介
SSH,全名叫Secure Shell,你可以想象它是一个超级安全的管道,专门用来远程操控电脑的。就好比你在家用遥控器指挥远处的电视换台,但比这高级多了,因为它是专门为电脑设计的。 为什么需要SSH? 在互联网的早期…...
Oracle的高级分组函数grouping和grouping_id
在网上对Oracle的高级分组函数grouping和grouping_id的讲解并不多,特别是grouping_id,还有解说有误的。经过1天研究,已经完全掌握了两个函数的作用和用法,下面简单的讲述即可明白。下面给大家分享。 GROUPING 函数 语法:grouping(表达式) 作用: GROUPING将超聚…...
SqlServer 查询数据库 和 数据表 大小的语句
–Sqlserver 查询数据库 大小 SELECT * FROM (SELECT DB_NAME(database_id) AS DatabaseName,type_desc AS FileType,name AS FileName,size * 8 / 1024/1024 AS FileSizeGBFROM sys.master_filesWHERE type 0 -- 数据文件AND state 0 -- 在线状态 ) T1 ORDER BY FileSizeG…...
特殊类的设计与单例模式
1、特殊类的设计 如何设计出一个创建出的对象只能在堆上的类?将类的默认构造函数设置为私有,再将类的拷贝构造函数设置为delete,设置静态函数GetObj,内部调用new HeapOnly,这样就只能在堆上开辟空间。 class HeapOnly…...
MySQL从入门到高级 --- 6.函数
文章目录 第六章:6.函数6.1 聚合函数6.2 数学函数6.3 字符串函数6.4 日期函数6.4.1 日期格式 6.5 控制流函数6.5.1 if逻辑判断语句6.5.2 case when语句 6.6 窗口函数6.6.1 序号函数6.6.2 开窗聚合函数6.6.3 分布函数6.6.4 前后函数6.6.5 头尾函数6.6.6 其他函数6.7 …...
Qt---信号和槽
一、信号和槽机制 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号…...
POCEXP编写—文件上传案例
POC&EXP编写—文件上传案例 1. 前言2. 文件上传案例2.1. Burp抓包2.2. 基础代码实践2.2.1. 优化代码 2.3. 整体代码2.3.1. 木马测试 1. 前言 之前的文章基本上都是一些相对来说都是验证类的或者说是一些代码执行类的,相对来说都不是太复杂,而这篇会…...
C#知识|上位机UI设计-详情窗体设计思路及流程(实例)
哈喽,你好啊,我是雷工! 上两节练习记录了登录窗体和主窗体的实现过程,本节继续练习内容窗体的实现,以下为练习笔记。 01 详情窗体效果展示: 02 添加窗体并设置属性 在之前练习项目的基础上添加一个Windows窗体,设置名称为:FrmIPManage.cs 设置窗体的边框和标题栏的外…...
目标检测——印度车辆数据集
引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …...
Zotero Word中插入带超链接的参考文献
Zotero 超链接 找了好多原代码,最接近能实施的为: https://blog.csdn.net/weixin_47244593/article/details/129072589 但是,就是向他说的一样会报错,我修改了代码,遇见报错的地方会直接跳过不执行,事后找…...
如何在服务器上下载,解压github上的代码
在github上找到对应仓库,找到平时download zip的地方,右键它,复制链接。在远程的终端里使用wget 链接 命令就可以得到zip了。 解压方法: -c :新建打包文件 -t :查看打包文件的内容含有哪些文件名 -x &…...
BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担
目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由,会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP,但如果也从IGP学习到了这条路由,就发…...
Docker学习(带图详细)
一、安装docker 参考官方文档:https://docs.docker.com/engine/install/centos/ 查看系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# [rootlocalhost ~]# uname -a Linux localhost.localdomai…...
RabbitMQ 如何使用延迟队列
RabbitMQ 如何使用延迟队列 目录 前置条件场景描述RabbitMQ 延迟队列机制实现步骤 1. 安装 RabbitMQ 延迟队列插件2. 创建延迟队列和交换机3. 发布延迟消息4. 消费延迟消息 示例代码 1. 延迟队列配置2. 发布消息的 Producer 代码3. 消费消息的 Consumer 代码 注意事项 前置条…...
【C++】栈和队列
目录 前言 一、stack 1. 栈的定义 2. 成员函数 二、queue 1. 队列的定义 2. 成员函数 三、priority_queue 1. 优先队列的定义 2. 成员函数 前言 栈和队列是STL中很重要的两个容器,栈的特点是先进后出;队列的特点是先进先出。还有优先队列&…...
常用的预编码算法学习
一、概况 预编码算法的常用实现方式有以下几种: 1. 间隔预编码(Interval Pre-coding):该算法将原始数据分成若干个间隔,然后对每个间隔内的数据进行编码。间隔的长度可以根据具体情况进行选择,常见的间隔长度有固定长度和可变长度两种方式。 2. 迭代预编码(Iterative…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
