点云地面滤波--布料模拟滤波(CSF)

1基本原理

总体思路:
如下图所示,原始点云被倒置过来,然后一块布从上方掉落到倒置的表面。通过分析布的节点与相应的LIDAR点之间的相互作用,可以确定布的最终形状,并将其用作将原始点分类为地面和非地面。
在这里插入图片描述

1.1什么是布料模拟

布料模拟是3D计算机图形学的术语。它也称为布料建模,用于在计算机程序中模拟衣服布料。在计算图形学中,可以将一块布认为由具有质量和互连的粒子组成的网格,称为质量弹簧模型(mass spring model)。下图显示了mass spring model结构。网格节点上的粒子没有大小,但分配了恒定质量。
粒子在三维空间中的位置决定了布的位置和形状。在此模型中,粒子之间的互连被建模为“虚拟弹簧”,它连接两个粒子并遵守胡克定律。为了充分描述布的特性,已经定义了三种类型的弹簧:剪切弹簧,牵引弹簧和屈曲弹簧。
在这里插入图片描述

粒子的位置和速度取决于作用在粒子上的力。根据牛顿的第二定律,位置和力之间的关系由等式(1)确定:
m ∂ X ( t ) ∂ t 2 = F e x t ( X , t ) + F i n t ( X , t ) (1) m \frac{\partial X(t)}{\partial t^2}=F_{e x t}(X, t)+F_{i n t}(X, t)\tag{1} mt2X(t)=Fext(X,t)+Fint(X,t)(1)
其中x表示粒子在时间t上的位置;fext(x,t)代表外力,由重力和碰撞力组成,fint(x,t)代表位置x和时间t处的粒子的内力(由粒子互相连接产生)。由于内部和外力随时间t的变化而变化,因此通常通过数值方法(例如,Euler方法)求解方程(1)。

1.2修改布料模拟

为了使布料模拟适应地面滤波,需要做以下修改:
(1)将粒子的运动限制为沿垂直方向,因此可以通过比较粒子和地形的高度值来实现地面点云检测
(2)当粒子到达地面时,设置粒子为不可移动
(3)将作用在粒子上的力分解为2个力。首先考虑重力对粒子的作用,当在重力作用下,粒子到达地面时,此时将粒子变为不可移动状态,此时可以忽略碰撞力。其次根据内力改变粒子位置。
其过程如下图所示:

在这里插入图片描述

CSF中的主要步骤:(a)初始状态。一块布倒置放在的激光雷达点云上方; (b)在重力的影响下计算每个粒子的位移。因此,某些粒子可能会出现在地面下。 (c)交叉检查。对于那些在地下的粒子,他们被移动在地面上并设置为无法移动的(蓝色粒子); (d)考虑内部力量。根据粒子之间的内力移动可移动的粒子(红色粒子)。

1.3布料滤波

根据1.2对布料模拟的修改,布料滤波可以分为两个部分:
首先考虑外力
在外力中,我们仅从重力中计算每个粒子的位移(忽略碰撞力),即,内力等于零的求解方程(1)。
X ( t + Δ t ) = 2 X ( t ) − X ( t − Δ t ) + G m Δ t 2 (2) X(t+\Delta t)=2 X(t)-X(t-\Delta t)+\frac{G}{m} \Delta t^2\tag{2} X(t+Δt)=2X(t)X(tΔt)+mGΔt2(2)
其中m是粒子的质量(通常将m设置为1),而∆T是时间步长。这个方程式非常简单。给定时间步长和初始位置,可以直接计算当前位置,因为G是常数。
其次,考虑内力部分
仅遍历每个spring(spring由每两个粒子组成),而非遍历每个粒子。对于每个spring,我们比较了构成当前spring的两个粒子之间的高度差。因此,二维(2-D)问题被抽象为一维(1-D)问题,如下图所示:
在这里插入图片描述

当使用内力移动粒子的运动方向时,两个具有不同高度值的粒子将尝试移动到同一水平面。
如果两个连接的粒子都是可移动的,我们将它们以相反的方向移动。如果其中一个是不可移动的,那么另一个将被移动。否则,如果这两个粒子具有相同的高度值,则它们都不会移动。因此,每个粒子的位移(向量)可以通过以下公式计算:
d ⃗ = 1 2 b ( p i → − p 0 → ) ⋅ n ⃗ (3) \vec{d}=\frac{1}{2} b\left(\overrightarrow{p_i}-\overrightarrow{p_0}\right) \cdot \vec{n}\tag{3} d =21b(pi p0 )n (3)
d ⃗ \vec{d} d 表示粒子位移向量, b b b:粒子可移动时等于1,否则等于0, p 0 ⃗ , p i ⃗ \vec{p_0},\vec{p_i} p0 ,pi 分别表示粒子与其近邻粒子的当前位置(坐标)向量, n ⃗ = ( 0 , 0 , 1 ) \vec{n}=(0,0,1) n =(0,0,1)表示垂直方向的单位向量。
内力作用下的移动过程是一个迭代过程,用rigidness表示迭代次数。每次移动距离为之前距离的二分之一,设两个粒子原始距离为VD,则rigidness=1,两个粒子之间的距离变为 1 2 V D \frac{1}{2}VD 21VD,rigidness=2,两个粒子之间的距离变为 1 4 V D \frac{1}{4}VD 41VD,rigidness=3,两个粒子之间的距离变为 1 8 V D \frac{1}{8}VD 81VD,其过程如下图:
在这里插入图片描述

CSF总体过程:
首先,我们将布粒子和LIDAR点投射到同一水平平面,然后在此2D平面中找到每个布粒子的最近的激光点云(称为对应点,CP)。定义了一个相交高度值(IHV)以记录CP的高度差值(投影之前)。IHV表示粒子能到达的最低位置,即如果粒子达到由该值定义的最低位置,则不能再向前移动。在每次迭代期间,我们将粒子的当前高度值(CHV)与IHV进行比较;如果CHV等于或低于IHV,则将粒子移回IHV的位置并使粒子无法移动。
在经过外力和内力计算之后获得了近似的真实地形,然后通过使用点云到点云的距离计算原始LIDAR点云和模拟粒子之间的距离。距离小于阈值HCC的LIDAR点被归类为地面点,而其余点为非地面点。
CSF具体过程

  • 1使用某些第三方软件(例如CloudCompare)进行自动或手动异常点云(噪点)处理。
  • 2.倒置原始的LIDAR点云。
  • 3.初始化布料网格。根据用户定义的网格分辨率(GR)确定粒子数。布的初始位置通常设置在最高点上方。
  • 4将所有LIDAR点和网格粒子投影到水平面,并在该平面中找到每个网格粒子的CP,然后记录IHV。
  • 5对于每个网格粒子,如果该粒子可移动,则计算受重力影响的位置,并将该布粒子的高度与IHV进行比较。如果粒子的高度等于或小于IHV,则将该粒子放置在IHV的高度上,并将其设置为“无法移动”
  • 6对于每个网格粒子,计算受内力影响的每个粒子的位移
  • 7重复(5)-(6)。当所有粒子的最大高度变化(M_HV)足够小时,或者超过用户指定的最大迭代次数时,布料模拟过程将终止。
  • 8计算云到网格粒子和激光元点云之间的云距离。
  • 9分离地面点。对于每个LIDAR点云,如果与模拟粒子的距离小于HCC,则将该点归为地面点云,否则将其归为非地面点。

1.4后处理(可选)

对于陡峭的斜坡,该算法可能会产生相对较大的误差,因为模拟布料会出现在陡峭的斜坡上方,并且由于粒子之间的内部约束,不能使得粒子非常紧密的贴合陡峭地形,因此布料模拟不能适合陡峭地形,下图中说明了这种现象。
在这里插入图片描述

可以通过后处理方法来解决陡峭地形问题,该方法通过平滑陡峭地形的坡度实现。这种后处理方法在每个可移动粒子的四个相邻邻域中找到一个不可移动的粒子,并比较了CP的高度值。如果高度差位于阈值(HCP)之内,则可移动粒子将其移至地面并设置为无法移动。例如,对于图6中的点d,我们发现该点A是来自D的四个相邻邻居的不可动态粒子。然后,我们比较C和B之间的高度值(分别为D和A的CPs)。如果高度差异小于HCP,则该候选点D将移至C,并将其设置为不可移动的。我们重复此过程,直到正确处理所有可移动粒子(将其设置为无法移动或保持可移动)。
为了实施后处理,应遍历所有可移动粒子,如果我们行扫描布网,结果可能会受到此特定扫描方向的影响。因此,我们首先构建了一组强连接的组件(SCC),每个SCC包含一组连接的可移动粒子。在SCC中,它通常包含两种粒子,那些至少有一个不可移动的邻居标记为M1型的粒子,而其他粒子则标记为M2(见图7)。使用M1作为初始种子,我们为SCC执行优先遍历,如下图所示,从1到18的一一处理可移动粒子。
在这里插入图片描述

至此完成布料模拟滤波。

2使用

代码开源在GitHub->csf
另外csf已经集成在cloudcompare上。

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CSF(Common Spatial Filtering)地面点云滤波是在点云处理中最为常用的一种滤波算法,它能够在滤掉大部分噪声的同时,提取出地面点云。那么,具体如何安装CSF地面点云滤波呢? 首先,需要准备好环境。CSF地面点云滤波采用C++语言编写,需要在安装前确保以下环境已配置:GCC编译器、PCL(Point Cloud Library)库和Boost库。 其次,下载CSF地面点云滤波源码并进行编译。我们可以从GitHub上下载CSF地面点云滤波的源代码,并使用以下命令进行编译: ``` mkdir build cd build cmake .. make ``` 最后,可以将编译好的程序以库的形式安装到系统中。使用以下命令安装: ``` make install ``` 完成上述步骤后,CSF地面点云滤波就已经安装好了。需要注意的是,使用时需要在代码中引用正确的头文件、链接库文件和设置参数,才能够顺利地进行地面点云滤波。 ### 回答2: CSF(Consistent Spatial Filtering)地面点云滤波算法是一种用于去除地面点的算法,可以应用于各种地物的三维重建,例如建筑物、植被和道路等。它可以将无序的点云数据转换为有序的栅格数据,从而更好地进行后续分析和建模。 安装CSF地面点云滤波算法步骤如下: 第一步:下载csf源码 在GitHub上可以找到CSF库,可以从该网页下载csf的源码。下载之后可以使用Cmake来编译安装。 第二步:安装依赖库 在使用CSF算法之前,需要先安装几个依赖库:Eigen和PCL。Eigen是用来进行矩阵计算的库,而PCL是一个强大的点云处理库。 第三步:编译CSF算法源码 使用Cmake进行编译。编译后应该可以在build文件夹下找到csf_ground_filter文件。 第四步:执行csf_ground_filter 在命令行中输入“./csf_ground_filter input.pcd output.pcd”,其中input.pcd是输入的点云文件名,output.pcd是输出的文件名。 第五步:查看输出结果 使用PCL提供的可视化工具PointCloudVie,载入输出的点云文件output.pcd,即可在可视化窗口中查看结果。在处理道路、建筑物和植被等点云数据时,可以根据数据特征对参数进行调整,以得到更好的滤波效果。 以上是CSF地面点云滤波算法安装的基本步骤,需要根据自己的具体情况进行调整。不同的应用场景建议对参数进行优化,以达到最佳效果。 ### 回答3: CSF(中文意思为聚类平面滤波器)是一种有效的地面点云滤波技术,主要用于去除地面点云数据中的杂乱点,从而提高数据处理的精度和效率。安装CSF地面点云滤波软件需要完成以下步骤: 第一步,安装必要的软件和工具。CSF使用C ++进行编写,因此您需要安装Visual Studio 2013或更高版本的C ++运行库,以及PointCloud库和Eigen库。 第二步,下载和编译CSF源代码。下载csf-master,将其解压缩到您的计算机硬盘上。打开Visual Studio,选择“打开项目”,找到解压缩后的文件夹,并选择“Sln”文件。然后选择“生成”菜单,编译源代码并生成二进制文件。 第三步,安装PCL(点云库)。PCL库是一个非常有用的工具库,可以用于处理地面点云数据。您可以在pcl网站上下载PCL,并根据操作系统的不同,使用适当的设置来安装它。 第四步,安装Eigen库。Eigen库是一种线性代数库,可用于处理向量和矩阵。您可以在Eigen库网站上下载该库,并使用适当的设置来进行安装。 第五步,安装CSF的依赖项。CSF依赖于FLANN和Boost库,因此需要先安装它们,这样才能使用CSF滤波器。 第六步,编写CSF滤波器程序。使用您熟悉的编辑器或开发环境,在您的C ++项目中包括csf.h文件和所需的库文件,以创建CSF滤波器程序。然后,您可以使用该程序对点云数据进行滤波,以去除地面点云数据中的噪声和杂点。 通过以上几个步骤,您可以轻松地安装和使用CSF地面点云滤波器,提高数据的精度和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值