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 …...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
