【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps
【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps
终于一次轮到了讲自己的paper了 hahaha,写个中文的解读放在博客方便大家讨论
- Title Picture

-
Reference and prenotes
paper: https://arxiv.org/abs/2307.07260
code: https://github.com/KTH-RPL/DynamicMap_Benchmark
b站:地图动态障碍物去除总结 ITSC’23: A Dynamic Points Removal Benchmark in Point Cloud Maps
1. Motivation
主要就是2019年末在公司的时候,做一个教育平台的无人驾驶小车项目的时候 从头开始部署autoware发现,建图中会有我们来来回回走动的 点云,当时其实就想了一种和 ndt slam 直接结合的方式去除,不过比较稚嫩+工程的想法所以后续也没有什么总结,隐约记得:最后还是 人手动去除的障碍物 毕竟也就三幅图 😃
直到 2023年初 来了KTH后 天明又提了这个需求 问我能不能自动去掉Leica动态图,他人手标了KTH的图标了1个月,所以当时就又投入到这个idea的调研了,最后就是这一篇 + 后续两篇方案 的输出,那么开始进入正题

如图是截取KITTI 07的部分地图,因为有semanticKITTI的标注信息 所以我们把动态物体用黄色表示出来了,这个动态物体如果不在建图中去掉 可能会导致:
- 定位出现问题,因为有大量不属于静态的点云出现在地图里导致错误的feature
- 全局规划 无法规划,如上图 如果直接作为全局规划的global map,那么这一条路可能都不会被选择,有时候还可以绕路解决 但是如果黄色点再多 则直接gg 【不过这一点在自动驾驶中可能不会那么大的影响 因为大部分都会做地图矢量 OpenDrive的形式】
- 建筑测量时,导致大量不准确的判断,主要就是用全站仪进行收集时,莱卡虽然内置去除 但是当数量较多时,也无法做到输出干净的地图
Contribution
那么对比之前方案 和 这篇的贡献主要在于:
- 现有的方案 没有一个通用的基准测试以便后续研究者能够直接使用 一种格式进行测试 评估,所以我们在此总结了之前的方案,采用统一格式进行整理 删除多余的部分,给出一条更focus在这个任务上的benchmark
- 之前的方案大多都是在仿真或KITTI上进行,而且都是64线雷达等,此篇我们同时还标注了 av2 32线大城市数据,semindoor 16线 半室内数据 并开放给大家一起评估使用。【后续随着两篇的出版还会 再开出 128线,莱卡全站仪数据】
- 这篇提出基准的同时 也告诉了大家如何分析各个方案的问题并将其改进,比如我们选用了之前方案经常对比的octomap进行演示进行改进
2. Benchmark
基准测试包含四个方案 Removert,ERASOR,原octomap,改进后octomap,那么先整理一下方案 说明一下各自缺点 然后进入到实验给大家对应起各个问题

首先图2,3指示了三个方案各自的问题 【部分问题erasor文章中也进行了探讨 如果感兴趣 可以点进paper查看reference进行阅读】:
- raycasting:采用雷达点 都是从中心射出去的性质,判断这条线的穿过部分都是空的点,但是会有:雷达角度 和稀疏雷达 导致的误判断动态点,删除了过多的点
- visiting-based:采用可视区域(但是我在总结的时候 一直感觉和raycasting的基本差不多 没啥区别),也就是 <一个激光点的光路穿过了另一个激光点,那么另一个激光点就是动态点 引用> Fig 2. © 可以看到如果超过一定高度的动态障碍物会导致 车顶部的点云无法有效被去除
- height-threshold:也就是ERASOR的方案,用地图和当前scan的高度差异来判断,然后去除这个高度下的所有点,Fig 3. 指示了缺点:需要针对传感器高度,场景内出现的高度物体来进行调参,但是也避免不了无法找到一个合适的阈值解决一个场景内所有的高度,如果调高了会误删除很多点,如果调低了会 留下一些动态点
以下为方法总结:

我们的改进主要是针对benchmark和实验发现的问题进行的,在原始的octomap前加入了噪音去除,地面分割,然后octomap会根据每次scan的 给整个空间的每个voxel occupancy value 也就是这个voxel被占据的概率,最后运行完所有,我们根据概率阈值进行筛选动静态
同时需要注意的是 得益于octomap © 方案是唯一的不需要先验原始地图的,也就是后续如果能对时间进行改进 可以做到实时建图,最后直接输出clean map
3. Experiment
我们引入了新的两个数据集:
- AV2 的一个序列,配置为两个VLP32,上下连起来的中心放置方式 周边建筑物较高
- semindoor 我们自己在建筑楼下收集的数据,配置为一个VLP16,放在一个在地上的小车上
还有就是评估metric从 voxel-level 换成了 point-level,这样就不会对gt进行任何形式的处理 比如降采样等,也能保证最精准的评估,对标后续建筑领域的测量评估(全站仪)
定性分析 (看图)
首先趁热打铁,刚刚大家读完了 各个方案缺点,正好从实验可视化的角度看一看:


-
raycasting的问题 在图7的(d) 中得到了非常明显的体现,也就是 地面角度和雷达稀疏性 导致去掉了过多静态点,给地面造成了空洞 空洞的形状也正如雷达的ring
-
关于车顶部点云无法去除 在KITTI05的数据中体现较多 因为文章篇幅 原文并没有能展示
-
height-based 在图6的© 可以看到树木的trunk 很规律的被高度截断,还有图中的其他部分 限于篇幅没有截图所有的,还有图7© 也可以看到一小块墙壁的高度面删除
那么从可视化角度,(note:ERASOR 我调过参,因为对高度阈值需要准确 16线的小车上不同于KITTI av2的也和kitti的高度不一样 所以为了对他们公平,就用了不同的config,其他的基本保持一个参数 比如我们改进后的octomap w GF阈值都是默认的一个
ERASOR和octomap w GF表现是比较好的,考虑下游任务,如果更追求精准度 octomap w GF更好,如果更追求去除的干净程度给部分不依赖 plane feature的localization用 可能ERASOR更好,预告:后续的两篇方法在时间和精度上均能够超过octomap w GF,欢迎大家star repo 以追踪信息
定量分析(看表)
- SA:静态点的准确率
- DA:动态点的准确率
- AA:联合准确率, S A × D A \sqrt{SA \times DA} SA×DA,因为我可以去掉所有的点 让我的DA 100%,也就是一个点都不去让SA 100%,所以需要一个联合准确率去做最终的判断

从表的信息可以看出经过 benchmark指导 改进后的octomap w GF在大多时候表现还是较为优越的,虽然这并不是我们的最后结果(benchmark 比较站在中立的角度)
Fig 5指示了 没有标出来的动态点都在动态点哪个位置分布上,可以看到 基本都在动态点的周围,也就是说 后续可能经过一个cluster 距离的简单聚类 会再次提升DA的值(这也就是我们benchmark的意义:如何分析 - 分析后如何改进)
表二则是指示了 w GF后我们的速度提升 20-30%,当然还是不如Removert和ERASOR快,但是 在审的两篇方法为主 均在速度上有极大的提升
4. Conclusion
结论就是,这篇benchmark 大概就是给大家进行现有方案的总结,并且实验分析,改进其中一个老方案,给大家看到benchmark paper的意义,也可以说是survey paper(其实主要还是每个方法都有自己的格式 对比的都不开源 所以干脆自己干 搞一个 造福大家 一键生成与复现
最后就是 这个动态去除pipeline + simple ndt slam,可以做到给大家一条龙服务,需要做的就是rosbag record /point_cloud,录下你的雷达数据即可!
- rosbag record
- 🔥 run simple_ndt_slam
- 🔥 run DynamicMap_Benchmark 其中任一方法均可
所有的代码和README均已完善,欢迎大家一起交流,如果有数据集 自己标了gt想要贡献的话 就更好啦!Stay tuned with us (因为后面还有更多方案会加进来哦
赠人点赞 手有余香 😆;正向回馈 才能更好开放记录 hhh
相关文章:

【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps
【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps 终于一次轮到了讲自己的paper了 hahaha,写个中文的解读放在博客方便大家讨论 Title Picture Reference and prenotes paper: https://arxiv.org/abs/2307.07260 …...

2023年传媒行业中期策略 AIGC从三个不同层次为内容产业赋能
基本面和新题材共振,推动传媒互联网行情上涨 AIGC 概念带动,传媒板块领涨 A 股 2023 年第一个交易日(1 月 3 日)至 6 月 2 日,申万传媒指数区间涨幅高达 48.38%,同时期沪深 300 跌幅为 0.25%,…...

iOS上架App Store的全攻略
iOS上架App Store的全攻略 第一步:申请开发者账号 在开始将应用上架到App Store之前,你需要申请一个开发者账号。 1.1 打开苹果开发者中心网站:https://developer.apple.com/ 1.2 使用Apple ID和密码登录(如果没有账号则需要注册…...

操作系统——多个类别产品的生产者-消费者问题(王道视频p33、课本ch6)
1.问题解剖——得到的是 1个“互斥信号量” 3个“同步信号量” 其中特别注意,对于盘子plate可以清空的设计4个对象的,但是只用这一个同步信号量就可以实现 2.代码—— 3.由于这里的同步信号量的初值都是1,所以,即使不设置互斥信…...

uniapp(uncloud) 使用生态开发接口详情5(云公共模块)
1.uniCloud官网 云对象中云公共模块: 网站: https://uniapp.dcloud.net.cn/uniCloud/cf-common.html // 官网介绍 cloudfunctions├─common // 云函数公用模块目录| └─hello-common // 云函数公用模块| ├─package.json| └─index.js // 公用模块代码࿰…...

Oracle数据中如何在 where in() 条件传参
一、问题场景描述 在sql 条件中,如何在 where in()中想传入参数,如果直接 where in(:seqList),当传入单个值,seqList: ‘80’ 是没问题的,但是初入多个值时,seqList: ‘80,90’ ,因缺少单引号&…...

Python:函数篇(每周练习)
编程题: Python第四章作业(初级) (educoder.net) 题一:无参无返回值函数 def print_hi_human(): # 函数名用小写字母print("人类,你好!")if __name__ __main__:print_hi_human() 题二&#…...
为Element Plus封装业务组件FormDialog,将所有需要填写表单的弹窗组件封装,方便快速配置
使用FormDialog组件能够对表单弹窗进行快速配置,不用每次单独写弹窗表单业务组件,快速实现表单弹窗业务功能。 调用页面demo.vue validateRules.js引用 <script setup lang"ts"> import FormDialog from /components/FormDialog/index…...
ubuntu 设置和取消代理
背景 因为国内环境限制,在 linux 上安装一些软件的时候,因为限制就安装不了, 此时就可以通过设置代理的方式来规避这种问题,下面是具体的设置方式 步骤 sudo vim /etc/profile.d/proxy.sh添加以下内容到文件中 export http_pro…...

YOLOv7-PTQ量化部署
目录 前言一、PTQ量化浅析二、YOLOv7模型训练1. 项目的克隆和必要的环境依赖1.1 项目的克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改模型配置文件3.2 修改数据配置文件3.3 训练模型3.4 mAP测试 三、…...

【网络协议】聊聊ICMP与ping是如何测试网络联通性
ICMP协议格式 ping是基于iCMP协议工作的,ICMP全称Internet Control Message Protocol,就是互联网控制报文协议。其实就是有点类似于古代行军打仗,哨探进行前方探明具体情况。 IMCP本身处于网络层,将报文封装在IP包里,…...

nginx tomcat 动静分离
动静分离: 访问静态和动态页面分开 实现动态和静态页面负载均衡。 五台虚拟机 实验1,动静分离 思路: 需要设备:三台虚拟机 一台nginx 代理又是静态 两台tomcat 请求动态页面 在全局模块中配置upstream tomcat 新建location…...

java读取指定文件夹下的全部文件,并输出文件名,文件大小,文件创建时间
import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.*; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { try { Path startingDir Paths.get("你的目…...

leetcode 105. 从前序与中序遍历序列构造二叉树
2023.10.21 本题需要根据前序遍历序列和中序遍历序列来构造出一颗二叉树。类似于从中序与后序遍历序列构造二叉树 。使用递归, java代码如下: /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …...

【试题039】 多个逻辑或例题
题目:设int n;,执行表达式(n0)||(n1)||(n2)||(n3)后,n的值是?代码分析: //设int n; , 执行表达式(n 0) || (n 1) ||(n 2) ||(n 3)后, n的值是?int n;printf("n%d\n", (n 0) || (n 1) || (n 2) || (n 3));//分析࿱…...

打卡go学习第一天
8.1 下面展示一些 代码。 package mainimport ("fmt""net""os""time" )type Clock struct {Name stringAddr string } func main() {clocks : []Clock{{Name: "New York", Addr: "localhost:8000"…...
julia 笔记: 流程控制
1 复合表达式 用一个表达式有序地计算若干子表达式,并返回最后一个子表达式的值 1.1 begin代码块 z beginx 1y 2x yend z #3begin x 1; y 2; x y end #3 1.2 ;链 (x 1; y 2; x y) #3(x 1; y 2; x y) 3 2 条件表达式 x1 y2if x < yprintln(&q…...
【c++】 跟webrtc学周期性任务:tgcalls 5 网络超时检查
tgcalls 网络超时检查 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\NetworkManager.cppPostDelayedTask 使用的是rtc thread 方法 PostDelayedTask :G:\CDN\P2P-DEV\Libraries\tg_owt\src\rtc_base\thread.htemplate <class Closure,typename st…...
面试算法33:变位词组
题目 给定一组单词,请将它们按照变位词分组。例如,输入一组单词[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”],这组单词可以分成3组,分别是[“eat”,“…...

【C语言】每日一题(旋转数组)
旋转数组,链接奉上 目录 方法:创建额外的数组:整体思路:代码实现: 数组反转:整体思路:代码实现:小插曲: 方法: 创建额外的数组: 整体思路: 创建一个额外的…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...