3d激光雷达开发(voxel滤波)

Posted 费晓行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3d激光雷达开发(voxel滤波)相关的知识,希望对你有一定的参考价值。

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        有一种滤波方法,被称之为基于体素网格的下采样滤波。虽然名字听上去有点拗口,其实功能并不复杂。它的中心思想就是在一个网格的空间内,只能有一个点。这么做的一个好处就是,对于一些稠密空间的点云,可以极大地降低数据的个数,这对减少计算量来说是大有裨益的。原来的代码在这https://pcl.readthedocs.io/projects/tutorials/en/master/voxel_grid.html#voxelgrid。这里为了查看效果,所以添加了一些额外代码。

1、准备voxel_grid.cpp代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>

int
main ()

  pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
  pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());

  // Fill in the cloud data
  pcl::PCDReader reader;
  // Replace the path below with the path where you saved your file
  reader.read ("table_scene_lms400.pcd", *cloud); // Remember to download the file first!

  std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height 
       << " data points (" << pcl::getFieldsList (*cloud) << ")." << std::endl;

  // Create the filtering object
  pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
  sor.setInputCloud (cloud);
  sor.setLeafSize (0.01f, 0.01f, 0.01f);
  sor.filter (*cloud_filtered);

  std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height 
       << " data points (" << pcl::getFieldsList (*cloud_filtered) << ")." << std::endl;

  pcl::PCDWriter writer;
  writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered, 
         Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);

  pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered_blob(new pcl::PointCloud<pcl::PointXYZ>);
  pcl::fromPCLPointCloud2(*cloud_filtered, *cloud_filtered_blob);
  viewer.showCloud(cloud_filtered_blob);
  while (!viewer.wasStopped())
  
  

  return (0);

2、代码分析

        整个代码里面,最重要的其实就是 sor.setLeafSize (0.01f, 0.01f, 0.01f);这句话。

3、准备CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(voxel_grid)

find_package(PCL 1.2 REQUIRED)

include_directories($PCL_INCLUDE_DIRS)
link_directories($PCL_LIBRARY_DIRS)
add_definitions($PCL_DEFINITIONS)

add_executable (voxel_grid voxel_grid.cpp)
target_link_libraries (voxel_grid $PCL_LIBRARIES)

4、生成sln文件,开始编译

        mkdir build & cd build & cmake ..

        不出意外,应该可以编译成功的,

5、运行voxel_grid.exe文件

        直接运行,可能缺少dll,最好补全一下。

         此外,还要准备一个pcd点云数据文件,文件名是table_scene_lms400.pcd。

        运行起来,可以看一下前后点云的个数,

        还可以顺便看一下点云的显示效果,

        

注:

        点云显示这部分,1、按住鼠标左键左右移动、上下移动可以旋转;2、按住鼠标左键和ctrl,可以平面内360旋转;3、按住鼠标左键和shift,可以拖动点云;4、滚动鼠标中轮,可以放大和缩小。

 

以上是关于3d激光雷达开发(voxel滤波)的主要内容,如果未能解决你的问题,请参考以下文章

3d激光雷达开发(基于统计滤波)

3d激光雷达开发(ransac的思想)

3d激光雷达开发(欧几里得聚类算法)

3d激光雷达开发(入门)

3d激光雷达开发(平面映射)

3d激光雷达开发(法向量预测)