Go to the documentation of this file.00001 #include <iostream>
00002 #include <ros/ros.h>
00003 #include <sensor_msgs/PointCloud2.h>
00004 #include <std_msgs/String.h>
00005 #include <sstream>
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008
00009 #include <boost/bind.hpp>
00010 #include <boost/thread.hpp>
00011
00012
00013 #include <pcl/compression/octree_pointcloud_compression.h>
00014 #include <pcl/io/pcd_io.h>
00015 #include <pcl/point_cloud.h>
00016 #include <pcl/point_types.h>
00017 #include <pcl/ros/conversions.h>
00018
00019 #include <compressed_pointcloud_transport/CompressedPointCloud.h>
00020
00021
00022
00023 typedef pcl::PointXYZRGB PointT;
00024
00025
00026 class Decompressor{
00027
00028 protected:
00029 ros::NodeHandle nh_, pnh_;
00030 ros::Publisher pub_;
00031 boost::shared_ptr<ros::Subscriber> sub_;
00032
00033 pcl::octree::PointCloudCompression<PointT> decoder_;
00034 ros::Timer subscriber_timer_;
00035
00036 public:
00037 Decompressor()
00038 :
00039 nh_()
00040 , pnh_("~")
00041
00042 {
00043
00044 pub_ = nh_.advertise<sensor_msgs::PointCloud2>("output", 1);
00045
00046
00047 sub_.reset(new ros::Subscriber());
00048 *sub_ = nh_.subscribe("input", 2, &Decompressor::cloud_cb, this);
00049
00050 subscriber_timer_ = nh_.createTimer(ros::Duration(1.0), boost::bind(&Decompressor::timerCB, this));
00051
00052 }
00053
00054 protected:
00055
00056 void cloud_cb (const compressed_pointcloud_transport::CompressedPointCloud::ConstPtr& input) {
00057
00058 if(!pub_.getNumSubscribers())
00059 {
00060 ROS_INFO("Got a cloud!");
00061
00062
00063 pcl::PointCloud<PointT>::Ptr pcl_cloud(new pcl::PointCloud<PointT>);
00064 sensor_msgs::PointCloud2::Ptr ros_cloud(new sensor_msgs::PointCloud2);
00065
00066
00067 std::stringstream compressed_data(input->data);
00068
00069
00070 decoder_.decodePointCloud(compressed_data, pcl_cloud);
00071
00072
00073 pcl::toROSMsg(*pcl_cloud, *ros_cloud);
00074
00075
00076 ros_cloud->header = input->header;
00077
00078 ROS_DEBUG_NAMED("decompressor", "Uncompressed cloud with frame [%s] and stamp [%f]", pcl_cloud->header.frame_id.c_str(), pcl_cloud->header.stamp.toSec());
00079
00080 pub_.publish(ros_cloud);
00081 int output_size = sizeof(ros_cloud->data);
00082 int compressed_size = sizeof(input->data);
00083 ROS_DEBUG_NAMED("decompressor", "Published cloud, input size %d bytes, inflated size %d bytes.", compressed_size, output_size);
00084 }
00085 else
00086 ROS_DEBUG_NAMED("decompressor" ,"Received compressed cloud but there are no subscribers; not publishing.");
00087 }
00088
00089 void timerCB()
00090 {
00091 if(pub_.getNumSubscribers())
00092 {
00093 if( !sub_ )
00094 {
00095 ROS_INFO("Making a new subscriber!");
00096 sub_.reset(new ros::Subscriber());
00097 *sub_ = nh_.subscribe("input", 2, &Decompressor::cloud_cb, this);
00098 }
00099 }
00100 else
00101 {
00102 if( sub_)
00103 {
00104 ROS_INFO("Deleting subscriber!");
00105 sub_.reset();
00106 }
00107 }
00108 }
00109 };
00110
00111 int main(int argc, char** argv) {
00112
00113 ros::init(argc, argv, "cloud_decompressor");
00114 Decompressor decomp;
00115
00116 ros::Duration(1.0).sleep();
00117 ros::spin();
00118 }