VoxelGrid滤波器可以对密集的点云进行稀疏,减少计算机处理大量点云数据的压力;
RadiusOutlierRemoval统计每个点周边的邻近点个数,过滤掉离群的点。
将点云数据滤波并转化成PointCloud2在ros中发布的demo如下:
#include <pcl/io/pcd_io.h> #include <pcl/impl/point_types.hpp> #include <pcl_ros/point_cloud.h> #include <pcl_conversions/pcl_conversions.h> #include <pcl/filters/voxel_grid.h> #include <pcl/filters/radius_outlier_removal.h> #include <sensor_msgs/PointCloud2.h> boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> pcl_cloud(new pcl::PointCloud<pcl::PointXYZ>()); ……//建立点云数据 ……//建立点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_cloud_ptr(pcl_cloud); boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> pcl_vg_cloud(new pcl::PointCloud<pcl::PointXYZ>()); pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_vg_cloud_ptr(pcl_vg_cloud); boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> pcl_ror_cloud(new pcl::PointCloud<pcl::PointXYZ>()); pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ror_cloud_ptr(pcl_ror_cloud); //Use VoxelGrid to make points sparse pcl::VoxelGrid<pcl::PointXYZ> sor; sor.setInputCloud (pcl_cloud_ptr); sor.setLeafSize (0.08, 0.1, 0.1); sor.filter (*pcl_vg_cloud_ptr); //Use RadiusOutlierRemoval to remove the point whitch is far away to others pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem; outrem.setInputCloud(pcl_vg_cloud_ptr); outrem.setRadiusSearch(0.5); outrem.setMinNeighborsInRadius (3); outrem.filter (*pcl_ror_cloud_ptr); //transfrom and publish sensor_msgs::PointCloud2Ptr msg_pointcloud(new sensor_msgs::PointCloud2); pcl::toROSMsg(*pcl_ror_cloud, *msg_pointcloud); msg_pointcloud->header.frame_id = optical_frame_id_[RS_STREAM_DEPTH];; msg_pointcloud->header.stamp = ros::Time::now(); pointcloud_publisher_.publish(*msg_pointcloud);
以上是学习笔记。如果不妥,多多指教!