publish point cloud xyz
i wrote a ros node for kinect pointcloud 2 to pass through filter and publish it to a topic. But when i run the node, it give me this error
/usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<t>::type boost::shared_ptr<t>::operator*() const [with T = pcl::PointCloud<pcl::pointxyz>; typename boost::detail::sp_dereference<t>::type = pcl::PointCloud<pcl::pointxyz>&]: Assertion `px != 0' failed. Aborted (core dumped)
I cant seem to fix this problem. please help
class Listener
{
public:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_passthrough;
void callback(const sensor_msgs::PointCloud2ConstPtr& kinect_output);
};
// end class
void Listener::callback(const sensor_msgs::PointCloud2ConstPtr& kinect_output)
{
pcl::PCLPointCloud2::Ptr pc2 (new pcl::PCLPointCloud2());
pcl_conversions::toPCL (*kinect_output, *pc2);
pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.setInputCloud (pc2);
sor.setLeafSize(0.01f,0.01f,0.01f);
sor.filter(*cloud_filtered);// filter the point cloud
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudXYZ (new pcl::PointCloud<pcl::PointXYZ>);//object cloud for point cloud type XYZ
pcl::fromPCLPointCloud2(*cloud_filtered,*cloudXYZ);
//create passthrough filter object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud (cloudXYZ);
pass.setFilterFieldName("z");
pass.setFilterLimits(0.5, 1.5);
pass.filter(*cloud_passthrough);
}
int main (int argc, char **argv)
{
ros::init (argc, argv, "PointCloud2_to_pointCloudXYZ");
ros::NodeHandle nh;
Listener listener;
ros::Publisher pub = nh.advertise<pcl::PointCloud<pcl::PointXYZ> >("/filtered", 1000);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
cloud -> points = listener.cloud_passthrough->points;
ros::Rate loop_rate(10);
ros::Subscriber sub = nh.subscribe <sensor_msgs::PointCloud2> ("/camera/depth/points",1000,&Listener::callback, &listener);
while (ros::ok())
{
pub.publish (cloud);
ros::spinOnce();
loop_rate.sleep();
}//end while loop
return 0;
}//end main
Must be the intraprocesd in node. How can i go about it?