Patchwork++:基于点云的快速、稳健的地面分割方法
1. 背景
论文发表在2022IROS,是Patchwork的改进版本。算法通过数学方法进行快速而鲁棒性很强的地面分割,在智能机器人上的可操作性非常强。通过微调算法,可以应用于16-beams等多种规格的激光雷达。由于激光雷达点云数据标注的难度非常大,生产中自制数据集的成本很高,我做了一些对比实验,和RandLA-Net,Cylinder3D,GndNet,PVKD等机器学习模型进行比较,在分割地面这一任务上,用自制数据集测试,Patchwork++的表现远好于其他。
本文对 Patchwork 和 Patchwork++ 两篇论文作分析和介绍,简单讲述论文作者的思路和数学原理,最后展示根据需求修改后的算法表现效果——在不同设备上表现依然迅速稳健。
2. 摘要
传统数学方法,采用求反射梯度与地面对比的思路,对于高度有差别的平面难以识别(如低矮路沿),分割出的地面不是很合适。论文提出一种鲁棒性很强的分割方法,基于 Patchwork 的思路进行改进,自适应地调整参数,效果提升明显,运行速度极快。
3. 理论
Patchwork++ 的基本理论思路和 Patchwork 类似,下面将结合两篇论文,对方法中的每个步骤进行说明和讲解。

3.1. Problem Definition 问题定义
对地面分割做数学建模:对于所有的点云表示为,对点集进行二分类,分为G地面和N非地面,其中包括车辆,行人,植被,墙体等。其研究目标是最大化TP,最小化FN和FP,对于点集P可以有以下表示:
3.2. RNR: Reflected Noise Removal 反射噪声去除
思路:取出距离传感器较近的、高度小于某阈值,强度小于某阈值的数据点,这些点被认为是噪声点。实际情况下,由于激光雷达穿透效应,在地面以下偶尔也会产生噪声点,将其称为虚拟噪声,用一个自动更新的高度阈值,认为该阈值以下的点都为噪声,将其去除。

实现:维护两个阈值,高度阈值和强度阈值
,高度阈值在 A-GLE 环节自动更新。
需要自动更新,其原因在于如果采用固定值
,在向下陡坡的场景中,就会去除真实的地面点,造成数据缺失。如下图所示,(a) 表示GT,红色点表示为高度较低的地面;(b) 表示用定值 基于直接高度去除了真值(Patchwork方法);(c) 表示在 Patchwork 算法下造成了比较严重的欠分割情况;(d) 表示 Patchwork++ 算法维护一个自动更新的
,成功识别到了高度较低/下降坡度的地面。

3.3. CZM: Concentric Zone Model 同心区域模型
思路:用设计的扇区分割路面,用扇区拟合路面几何形态。基于路面非平坦假设,不应直接估计地面,而是通过假设非平坦地面有多个小块bin,在小块之内地面是平坦的。以往的方法用统一的极坐标系表示扇区S,再将扇区S划分为规则间隔的BIN。范用性不强,有以下两个缺陷:
- 稀疏问题:随距离增长,点云越发稀疏,难以找到正确的平面。
- 代表性问题:靠近原点的bin太小,难以表示扇区的空间特征,有时会导致扇区内地面法向量估计失败。

实现:以一种不增加计算复杂度的方式在bin之间分配适当的密度,数学模型如下:
全点集P被分为多个zone,每个zone由不同面积大小的bin组成,定义为:
其中,表示为zone,
表示zone的个数,那么
表示为:
和
表示
的最小和最大向径边界;同样被划分为多个
个bins,对于不同的zone,bin的大小也不同。在这里,
的定义为:
其中,,且
,对于全局最小边界
,其用于考虑移动平台或车辆附近的空旷情况。
实际实现,对于分别被称为中心区、四分之一区、半区和外区,统称为一个central zone,其中
的bin大小被设置的更大,以解决稀疏性问题和表示性问题。其计算方法为:
3.4. R-VPF: Region-wise Vertical Plane Fitting 区域垂直平面拟合
思路:由于路面可能存在一些高低差,在拟合时认为高程差不多的平面为同一个路面。拟合平面前,找到每个bin中的垂直点子集,将bin内的垂直平面找到并作过滤掉,拟合出更准确的平面。由于 PCA(点云主成分析)对于异常点敏感,经过这一步骤处理后可适用范围更广。

实现:利用 CMZ 分割得到的bin,设第n个bin为,通过以下4个步骤得到估计出的垂直点
:
以如下操作对bin进行k次迭代,挑选出足够的种子点集。
- 预选种子点集
进行k次迭代,每次迭代选取”一些”(论文原句)高度最低的点,求这些点的平均值,以及该子集的单位法向量
,代表 PCA 后最小特征值对应的归一化后的单位特征向量。
- 潜在垂直平面点集
对第k次迭代的种子点集,挑选出潜在的垂直平面点集
,公式如下:
其中,k = 1时,即种子点集为第n个bin的全部点。每次迭代时
,即上一次的种子点集减去之前迭代出的所有垂直点;
表示估计的垂直平面的距离阈值。
- 二值化验证点集
对第k次迭代的潜在垂直平面点集,二值验证出认为真正垂直的点集
,公式如下:
其中,表示z轴方向的单位法向量
,
是估计平面的单位法向量的阈值(点的法向量和
z轴法向量做点乘,两个单位向量的点乘结果就是夹角的cos值,判断该值与90度的相近程度。在范围内,由这次迭代的潜在点找到的垂直点集,可以被认为是垂直点集;否则,这次的垂直点集,不能认为是垂直的)。
最后,累积所有的垂直点得到总的垂直点集,
表示总的迭代次数,公式如下:
3.5. R-GPF: Region-wise Ground Plane Fitting 区域地面拟合
思路:估计局部地面,将局部地面合并。对 R-VPF 处理后的各个bin进行PCA,取第三个特征代表高度特征。采用 PCA 在速度上至少比 RANSAC 快两倍,进行预处理后,效果类似。通俗来讲,设置一个阈值,每次迭代更新阈值,3次迭代后挑选出合适的地面种子点。
实现:对以上操作得到的bin进行计算,数学模型如下:
对zone内n个bin内的点集命名为,共计有
个这样的集合。如果一个 zone内有足够多的bin,即可以认为足够拟合平面,选取z最低的点作为种子点。令
作为
个种子点的z的平均值,则初始的地面的估计如下:
其中函数返回点的高度值,
表示种子点挑选高度阈值。第一次估计的地面点,是z高度不大于平均高度与高度阈值之和
的点集。
算法经过l次迭代计算出bin的地面拟合,第l次迭代的地面法向量为
。接着计算地面系数
:
其中,是第l次迭代,所有被分类为地面的点的平均值,用l次迭代得到的地面估计的平均点与法向量点乘,可以反映两个向量之间的投影值。第l+1次迭代的地面估计值计算公式为:
其中,,
表示平面高度阈值。实验证明,当
即进行3次迭代的效果最好。
3.6. A-GLE: Adaptive Ground Likelihood Estimation 自适应地面似然估计
思路:对上一步处理后得到的bin内种子点做处理,估计一个bin是否为地面。从 Uprightness 垂直度、Elevation 高程差
和 Flatness 平整度
三个方向设计。
实现:从Patchwork 的 GLE 步骤讲起,如下设计函数用于评估bin为是否为平面:
Uprightness :为了使
中大部分点都归属于地面(尽可能为TP),对每个zone的法向量
做如下操作:
其中,,
为设置的角度阈值,这部分实际计算为bin内法向量与X-Y平面的夹角,当夹角趋于
时,意味着bin拟合的区域平面越平整。
在论文中被经验化地设置为
,即拟合出的区域平面的最大倾斜角度为
。
Elevation :为了解决高度不同的平面计算得到一样的垂直度,而误把一些建筑物或车辆顶部当作地面的误检,引入高程差计算项,具体如下:
其中为使
呈指数增长的自适应中点函数;如果
,即距离太远,则不予考虑,认为该平面仅由平整度和垂直度考虑。当bin的平均高度
时,即认为其为地面的可能性较高,输出值大于0.5;反之,认为其为地面的可能性较低,输出值小于0.5。
Flatness :为增加上坡地面的判断,利用高度判断的结果,对一些坡度较高的上坡地面进行拟合。
当时,地面已经足够平整,无需计算该项;当
时,需要判断其是否是可能的上坡路面。其中,
为一个设定的系数,目的是使得函数结果更明显;
表示bin的平整度,
为设定的平整度阈值,计算方法如下:
为bin的 PCA 特征,按降序排列。
最后,对所有bin统一以上三个方面,计算出整个点云的拟合平面,统计
的bin的集合,即为所拟合出的路面。
改进:不难发现,GLE 中设计了许多参数,根据不同环境需要有不同的选择;在选择参数时,尤其是在计算高程差所用的
、计算平整度
时所用的
非常耗时。Patchwork++论文基于 GLE 提出 A-GLE,为方便描述,将原先的
更换为
,即高程相关用e表示,平整度相关用f表示。

为解决该问题,Patchwork++论文基于 GLE 提出 A-GLE,一种自适应的参数调整方法,同时更新 RNR 步骤的高度阈值。
Elevation e:用 Definite Ground 表示 CZM 步骤中第m个zone,计算
满足平面拟合标准。
令为
中bin的
的集合,基于
,对高程标准阈值
进行更新:
其中,表示集合均值,
表示集合标准差,
为 CZM 中第m个ring的标准差修正增益,是定值。
Flatness f:由于将空间划分为bin,经过 PCA 计算得到的特征值和
是直接基于点云的,拟合出的平面会有坐标系未对齐的问题,导致平面拟合出现错误。这里对原先算法作纠正,直接用
平面法向量代替平整度估计。
类似的,令为
中
的集合,基于
,对平整度标准阈值
进行更新:
其中,表示 CZM 中第m个ring的标准差修正增益,是定值。
Noise Removal Height h:思路类似。
其中,表示距离传感器最近的一环zone中的种子点z的集合,
为需要移除的高度边界。
3.7. TGR: Temporal Ground Revert 临时地面还原
思路:对 A-GLE 处理后估计的地面进行纠正,恢复一些被误检的bin。一个bin内可能存在部分异常点使得地面拟合失效(例如崎岖的草地),计算值很可能超过阈值而导致错误估计。这是因为 A-GLE 是随时间推移依据所有的bin更新阈值,在当前时间更新的值会在下次被利用,但当前时间下的估计就会发生偏差;且采用均值加权更新,显然对于一些估计值偏大的bin会出现误检。
其中,为 CZM 第m个ring的标准差,是固定的值;
是
中平整度
的集,对于被拒绝的
的bin,如果其bin满足
,则被纠正为地面。

4. 表现
4.1. 论文数据


4.2. 自测表现
运行环境:
- OS: Ubuntu 20.04.6 LTS
- CPU: 12th Gen Intel® Core™ i7-12700H × 20
- GPU: NVIDIA GeForce RTX 3060 Laptop GPU
- Python: 3.6.13
- Open3D: 0.17.0
运行效果:
- 数据:Velodyne-Puck(VLP-16)在园区内采集。
- 速度:1.8ms-5.1ms,平均在2.6ms。
- 表现:粗略统计,在自制数据集上测试,80%以上的场景在20m半径内正确分割路面,95%以上的场景在10m半径内正确分割路面。

参考文献
Patchwork: Concentric Zone-based Region-wise Ground Segmentation with Ground Likelihood Estimation Using a 3D LiDAR Sensor
Patchwork++: Fast and Robust Ground Segmentation Solving Partial Under-Segmentation Using 3D Point Cloud
论文分享:Patchwork++/Patchwork-基于点云的快速稳健地面分割算法 - 知乎
超详细的激光点云地面分割(可行驶区域提取)方案_激光点云数据的平面分割-CSDN博客
Patchwork++:基于点云的快速、稳健的地面分割方法-腾讯云开发者社区-腾讯云
相关文章:

Patchwork++:基于点云的快速、稳健的地面分割方法
1. 背景 论文发表在2022IROS,是Patchwork的改进版本。算法通过数学方法进行快速而鲁棒性很强的地面分割,在智能机器人上的可操作性非常强。通过微调算法,可以应用于16-beams等多种规格的激光雷达。由于激光雷达点云数据标注的难度非常大&…...

Llama改进之——分组查询注意力
引言 今天介绍LLAMA2模型引入的关于注意力的改进——分组查询注意力(Grouped-query attention,GQA)1。 Transformer中的多头注意力在解码阶段来说是一个性能瓶颈。多查询注意力2通过共享单个key和value头,同时不减少query头来提升性能。多查询注意力可能导致质量下…...

英伟达开源新利器NV-Embed向量模型,基于双向注意力的LLM嵌入模型,MTEB 56项任务排名第一
前言 文本嵌入模型能够将文本信息转化为稠密的向量表示,并在信息检索、语义相似度计算、文本分类等众多自然语言处理任务中发挥着关键作用。近年来,基于解码器的大型语言模型 (LLM) 开始在通用文本嵌入任务中超越传统的 BERT 或 T5 嵌入模型,…...

JVM之【GC-垃圾清除算法】
Java虚拟机(JVM)中的垃圾收集算法主要分为以下几种: 标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark-Compact)分代收集算法(Generational C…...

数据分析每周挑战——心衰患者特征数据集
这是一篇关于医学数据的数据分析,但是这个数据集数据不是很多。 背景描述 本数据集包含了多个与心力衰竭相关的特征,用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体,提供了广泛的生理和生活方式指标&a…...

单例模式(Java实现)
我的相关文章: JavaSE 学习记录-CSDN博客 多线程笔记-CSDN博客 单例模式(Java实现)-CSDN博客 JUC笔记-CSDN博客 注解与反射(Java,类加载机制,双亲委派机制)-CSDN博客 1. 懒汉式线程不安全 pu…...

24.面向对象六大原则
目录介绍 00.面向对象六大原则01.代码单一职责原则02.代码开放封闭原则03.代码里氏替换原则04.代码依赖倒置原则05.代码接口隔离原则06.代码迪米特原则00.面向对象六大原则 六大原则一句话介绍 单一职责原则:指一个类的功能要单一,不能包罗万象。开放封闭原则:指一个模块在扩…...

Vue3-shallowRef与shallowReactive
shallowRef 作用:创建一个响应式数据,但只对顶层属性进行响应式处理。 用法: let myVar shallowRef(initialValue);特点:只跟踪引用值的变化,不关心值内部的属性变化。 shallowReactive 作用:创建一个浅…...

CI/CD(基于ESP-IDF)
主要参考资料 B站乐鑫信息科技《【乐鑫全球开发者大会】DevCon23 #15 |通过 CI/CD 进行流水线开发》 pytest-embedded乐鑫文档: https://docs.espressif.com/projects/pytest-embedded/en/latest/api.html 目录 CI/CD简介乐鑫内部CI/CD测试GitLab CI/CDGitHub Actio…...

聚观早报 | 东风奕派eπ008将上市;苹果Vision Pro发布会
聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月3日消息 东风奕派eπ008将上市 苹果Vision Pro发布会 特斯拉Model 3高性能版开售 小米14推送全新澎湃OS系统 …...

k8s牛客面经篇
k8s的pod版块: k8s的网络版块: k8s的deployment版块: k8s的service版块: k8s的探针板块: k8s的控制调度板块: k8s的日志监控板块: k8s的流量转发板块: k8s的宏观版块:...

第9周 基于MinIO与OSS实现分布式与云存储
第9周 基于MinIO与OSS实现分布式与云存储 1. 基于mybatis-plus数据修改非空属性忽略更新2. 文件上传3. 分布式文件存储3.1 文件存储架构演变4. Minio docker安装5. 文件服务整合minio依赖minio API测试yml配置minio信息minio配置类业务:上传文件6. 云存储阿里OSS:要钱6.1 依赖6…...

【Linux内核-编程指南】
■ IPC组件 添加链接描述 ■ ■ ■ ■ ■...

Go 编程风格指南 - 最佳实践
Go 编程风格指南 - 最佳实践 原文:https://google.github.io/styleguide/go 概述 | 风格指南 | 风格决策 | 最佳实践 注意: 本文是 Google Go 风格 系列文档的一部分。本文档是 规范性(normative) 但不是强制规范(canonical),并且从属于Goo…...

awk的应用
步骤一:awk的基本用法 1)基本操作方法 格式1:awk [选项] [条件]{指令} 文件 格式2:前置指令 | awk [选项] [条件]{指令} 其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。 …...

【网络原理】HTTP|认识请求“报头“|Host|Content-Length|Content-Type|UA|Referer|Cookie
目录 认识请求"报头"(header) Host Content-Length Content-Type User-Agent(简称UA) Referer 💡Cookie(最重要的一个header,开发&面试高频问题) 1.Cookie是啥? 2.Cookie怎么存的? …...

深入React Hoooks:从基础到自定义 Hooks
使用 useContext useContext 是另一个常用的 Hook,它可让我们在函数组件中轻松访问 React 的 context。如果你的应用程序依赖于一些全局状态,或者你希望避免将 props 一层一层地传递到子组件,context 很有用。你可以在父组件设置一个值&…...

9.7 Go语言入门(映射 Map)
Go语言入门(映射 Map) 目录六、映射 Map1. 声明和初始化映射1.1 使用 make 函数1.2 使用映射字面量 2. 映射的基本操作2.1 插入和更新元素2.2 访问元素2.3 检查键是否存在2.4 删除元素2.5 获取映射的长度 3. 遍历映射4. 映射的注意事项4.1 映射的零值4.2…...

过期视频怎么恢复?如何从手机、电脑和其他设备中恢复?
过期视频是指那些被误删、丢失或因系统升级等原因而无法正常访问的视频文件。这些视频可能包含了我们珍贵的回忆、重要的信息或者具有商业价值的内容。过期视频的恢复可以帮助我们找回失去的数据,减少损失,提高工作效率和生活质量。过期视频怎么恢复&…...

LeetCode刷题第2题
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …...

mysql执行拼接的sql语句
在MySQL中,可以使用 CONCAT() 函数来拼接SQL语句。但是,请注意,直接拼接SQL语句可能会导致SQL注入问题,因此应当使用参数化查询来避免这个问题。 以下是一个使用 CONCAT() 函数拼接SQL语句的例子: SET tableName us…...

使用 pm2 或 screen 等工具来管理和后台运行你的 Node.js 应用
使用 pm2 或 screen 等工具来管理和后台运行你的 Node.js 应用。 使用 pm2 pm2 是一个用于 Node.js 应用的进程管理工具,提供了守护进程、日志管理和应用重启等功能。 安装 pm2: npm install pm2 -g启动你的 Node.js 应用: pm2 start se…...

leetcode4 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.00000 解释&a…...

水库大坝安全监测系统建设方案
一、背景 随着自动化技术的进步,大部分水库大坝不同程度地实现了安全监测自动化。但仍存在以下问题: 1、重建轻管,重视安全监测系统建设,不够重视运行维护。 2、缺乏系统性、综合性及相关性的资料分析功能。 3、软件大多为数据…...

单片机的内存映射和重映射
内存映射 在单片机内,不管是RAM还是ROM还是寄存器,他们都是真实存在的物理存储器,为了方便操作,单片机会给每一个存储单元分配地址,这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…...

详解和实现数据表格中的行数据合并功能
theme: smartblue 前言 需求场景: 在提供了数据查看和修改的表格视图中(如table、a-table等…),允许用户自行选择多行数据,依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时,页面会即时反…...

深度学习-05-反向传播理论知识
深度学习-05-反向传播理论知识 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动…...

黑马程序员——Spring框架——day04——SpringMVC基础
目录: SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…...

SpaceX间接「颠覆」了手机?星链如何直连手机通信?
SpaceX 旗下的星链项目推出了一个极具颠覆性的技术——direct to cell(DTC),即通过卫星直接与手机建立通信。这项技术无需对手机进行任何改装,大多数普通手机都可以直接接入星链的卫星网络,实现全球范围内的手机信号覆…...

初识C++ · 模拟实现stack和Queue
目录 前言: 1 Stack 1.1 双端队列 2 Queue 前言: 经历了list三个自定义类型的洗礼,来个简单的放松放松,即栈和队列: 文档记录的,栈和队列是一种容器适配器,它们不属于stl,但是它…...