1、下载CSF源码、CMake编译
下载CSF
先在CSF-master中新建build文件夹
设置 CMake路径,然后步骤1,2,3
(好像要用VS打开CSF,在Release下运行生成CSF.lib库)
2、新建项目,在VS中配置
在VS中的项目属性中配置依赖项
添加CSF.lib很关键
3、代码中导入
导入CSF.lib
#include "E:\1_My_Reserch\CSF001\CSF-master\src\CSF.h"
#include "E:\1_My_Reserch\CSF001\CSF-master\src\point_cloud.h"
4、利用CSF分离地面和非地面点
#include <vector>
#include "Cfg.h"
#include "E:\1_My_Reserch\CSF001\CSF-master\src\CSF.h"
#include "E:\1_My_Reserch\CSF001\CSF-master\src\point_cloud.h"
#include <locale.h>
#include <time.h>
#include <cstdlib>
#include <cstring>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main(int argc, char* argv[])
{
//加载点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("0404.pcd", *cloud) == -1) {
PCL_ERROR("Could not read the file input cloud\n");
return -1;
}
//将pcl点云转换成CSF输入格式
std::vector<csf::Point> points;
for (const auto& pt : cloud->points) {
points.emplace_back(pt.x, pt.y, pt.z);
}
//创建CSF对象,并设置参数
CSF csf;
csf.setPointCloud(points);
csf.params.bSloopSmooth = true;
csf.params.cloth_resolution = 1.0;
csf.params.rigidness = 3;
csf.params.time_step = 0.65;
csf.params.class_threshold = 0.5; //设置阈值分割地面与非地面点
//运行CSF算法
std::vector<int> groundIndexes, offGroundIndexes;
csf.do_filtering(groundIndexes, offGroundIndexes);
//创建地面、非地面点云
pcl::PointCloud<pcl::PointXYZ>::Ptr groundCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr offGroundCloud(new pcl::PointCloud<pcl::PointXYZ>);
for (const auto& index : groundIndexes) {
groundCloud->points.push_back(cloud->points[index]);
}
for (const auto& index : offGroundIndexes) {
offGroundCloud->points.push_back(cloud->points[index]);
}
//保存地面、非地面点云
pcl::io::savePCDFileBinary("ground.pcd", *groundCloud);
pcl::io::savePCDFileBinary("offGround.pcd", *offGroundCloud);
return 0;
}
5、CSF算法参数设置
-
cloth_resolution:
- 说明:布料的分辨率,控制模拟的细致程度。
- 影响:较高的值会导致更精细的结果,但计算量增加。
-
rigidness:
- 说明:模拟布料的刚性。
- 影响:较高的值会使得布料更难变形,适用于更平坦的地面。
-
time_step:
- 说明:每次模拟迭代的时间步长。
- 影响:较小的值可以增加模拟的稳定性,但会增加计算时间。
-
bSloopSmooth:
- 说明:布料是否使用平滑处理。
- 影响:开启后可以减少噪声,但可能会导致地面细节丢失。
-
class_threshold:
- 说明:分类阈值,用于区分地面和非地面点。
- 影响:较高的值会将更多点归类为地面,较低的值则相反。
-
max_iterations(可选):
- 说明:最大迭代次数。
- 影响:限制模拟的次数,避免计算过长时间。
-
damping(可选):
- 说明:阻尼系数,控制布料运动的阻力。
- 影响:增加阻尼会使布料运动更平稳,适合处理震动。
调整建议
- 实验:不同应用场景可能需要不同的参数设置,建议多次实验调整。
- 性能考虑:在计算资源有限的情况下,可以适当降低
cloth_resolution
和增加time_step
。 - 结果验证:在实际应用中对比不同参数设置的结果,以找到最佳配置。
6、报错
- 运行一半报错,卡住不动
解决:
原保存pcd代码为
//保存地面、非地面点云
pcl::io::savePCDFileASCII("ground.pcd", *groundCloud);
pcl::io::savePCDFileASCII("offGround.pcd", *offGroundCloud);
后改为
//保存地面、非地面点云
pcl::io::savePCDFileBinary("ground.pcd", *groundCloud);
pcl::io::savePCDFileBinary("offGround.pcd", *offGroundCloud);
参考链接: PCL点云处理之CSF布料模拟滤波(五十九)