Go to the documentation of this file.00001 #include <pluginlib/class_list_macros.h>
00002 #include <ros/ros.h>
00003 #include <sensor_msgs/PointCloud2.h>
00004 #include <pcl_ros/publisher.h>
00005 #include <pcl_ros/pcl_nodelet.h>
00006 #include <vector>
00007 #include <nodelet/nodelet.h>
00008 #include <math.h>
00009 #include "pcl/io/pcd_io.h"
00010 namespace distance_filter
00011 {
00012 class DistanceFilter : public pcl_ros::PCLNodelet
00013 {
00014 public:
00015 void onInit ();
00016 protected:
00017 using pcl_ros::PCLNodelet::pnh_;
00018 std::string input_cloud_topic_;
00019 std::string output_cloud_topic_;
00020 ros::Subscriber cloud_sub_;
00021 ros::Publisher cloud_pub_;
00022 std::string laser_frame_;
00023
00024 float threshold_;
00025 int cp;
00026 void cloud_cb (const sensor_msgs::PointCloud2ConstPtr& pointcloud2_msg);
00027 public:
00028 DistanceFilter();
00029
00030 ~DistanceFilter();
00031
00032 };
00033 DistanceFilter::DistanceFilter()
00034 {
00035
00036 }
00037 DistanceFilter::~DistanceFilter()
00038 {
00039 ROS_INFO("Shutting down DistanceFilter");
00040
00041 }
00042 void DistanceFilter::onInit()
00043 {
00044 threshold_=6.0;
00045 cp=0;
00046 pcl_ros::PCLNodelet::onInit ();
00047 pnh_->param("input_cloud_topic", input_cloud_topic_, std::string("/nbv_cloud"));
00048 pnh_->param("output_cloud_topic", output_cloud_topic_, std::string("/output_nbv_cloud"));
00049 pnh_->param("laser_frame", laser_frame_, std::string("/laser_tilt_link"));
00050
00051 cloud_sub_=pnh_->subscribe(input_cloud_topic_,1, &DistanceFilter::cloud_cb, this);
00052 cloud_pub_=pnh_->advertise<sensor_msgs::PointCloud2>(output_cloud_topic_,1);
00053 }
00054 void DistanceFilter::cloud_cb(const sensor_msgs::PointCloud2ConstPtr& pointcloud2_msg)
00055 {
00056 ros::Time start_time = ros::Time::now();
00057 pcl::PointCloud<pcl::PointXYZ> input_pointcloud,output_point_cloud;
00058 pcl::fromROSMsg(*pointcloud2_msg, input_pointcloud);
00059 ROS_INFO("number of points in pointcloud is: %d ",input_pointcloud.points.size());
00060 output_point_cloud.points.resize(input_pointcloud.points.size());
00061 output_point_cloud.header=input_pointcloud.header;
00062 geometry_msgs::Point viewpoint;
00063 viewpoint.x=0.0;
00064 viewpoint.y=0.0;
00065 viewpoint.z=0.0;
00066 for (unsigned int i=0;i<input_pointcloud.points.size();i++)
00067 {
00068 float d=sqrt(pow(viewpoint.x-input_pointcloud.points[i].x,2)+pow(viewpoint.y-input_pointcloud.points[i].y,2)+pow(viewpoint.z-input_pointcloud.points[i].z,2));
00069 if (d<threshold_)
00070 {
00071 output_point_cloud.points[cp].x=input_pointcloud.points[i].x;
00072 output_point_cloud.points[cp].y=input_pointcloud.points[i].y;
00073 output_point_cloud.points[cp].z=input_pointcloud.points[i].z;
00074 cp++;
00075
00076 }
00077 }
00078 output_point_cloud.points.resize(cp);
00079
00080 cloud_pub_.publish(output_point_cloud);
00081 ROS_INFO("Number of filtered pointcloud is: %d ",output_point_cloud.points.size());
00082
00083
00084
00085
00086 }
00087
00088 }
00089 PLUGINLIB_DECLARE_CLASS(autonomous_mapping, DistanceFilter, distance_filter::DistanceFilter, nodelet::Nodelet);