PCL:可视化点云

11
我正在尝试使用PCL CloudViewer可视化点云。问题是,我对C++还比较陌生,我找到了两个教程first演示如何创建PointCloud和second演示如何可视化PointCloud。然而,我无法将这两个教程结合起来。
以下是我想到的代码:
#include <iostream>

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

int main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ> cloud;
  
  // Fill in the cloud data
  cloud.width    = 5;
  cloud.height   = 1;
  cloud.is_dense = false;
  cloud.points.resize (cloud.width * cloud.height);

  for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
  }

  pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
  viewer.showCloud (cloud);

  while (!viewer.wasStopped ())
  {
  }

  return (0);
}

但是甚至不能编译:
error: no matching function for call to   
‘pcl::visualization::CloudViewer::showCloud(pcl::PointCloud<pcl::PointXYZ>&)’

我正在做类似的事情。只是想知道你最终是否能够解决错误并构建你的项目? - tauseef_CuriousGuy
4个回答

10

你的错误信息告诉了你需要做什么:

error: no matching function for call to ‘pcl::visualization::CloudViewer::showCloud(pcl::PointCloud<pcl::PointXYZ>&)’

请查看CloudViewer文档以了解此成员函数需要哪些参数:http://docs.pointclouds.org/1.5.1/classpcl_1_1visualization_1_1_cloud_viewer.html

在那里,我们可以看到它需要一个const MonochromeCloud::ConstPtr &cloud,而不是您传递的原始引用。这是来自boost的智能指针的typedef:

typedef boost::shared_ptr<const PointCloud<PointT> > pcl::PointCloud< PointT >::ConstPtr

因此,当您创建云时,您需要将其包装在这些智能指针之一中,而不是将其作为局部变量。类似以下内容(未经测试):

所以当你创建云时,你需要使用这些智能指针来封装它,而不是将其声明为局部变量。类似以下代码(未经测试):

pcl::MonochromeCloud::ConstPtr cloud(new pcl::PointCloud<pcl::PointXYZ>());
然后,当您传递变量“cloud”时,它将具有正确的类型,您不会收到报告的错误。您还需要将cloud.foo更改为cloud->foo
查看您提供的第二个示例,他们也这样做:
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);

9
直接回答你的问题:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr ptrCloud(&cloud);

接下来在查看器中放入ptrCloud,这是它所期望的:

viewer.showCloud (ptrCloud);

1
如果有其他人正在搜索如何在ROS中实现此操作,可以简单地使用以下方法完成:
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>

typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;

class cloudHandler
{
public:
    cloudHandler():viewer("Cloud Viewer")
    {
        pcl_sub = nh.subscribe("/camera/depth_registered/points", 10, &cloudHandler::cloudCB, this);
        viewer_timer = nh.createTimer(ros::Duration(0.1), &cloudHandler::timerCB,this);
    }

    void cloudCB(const sensor_msgs::PointCloud2 &input)
    {
        pcl::PointCloud<pcl::PointXYZRGB> cloud;
        pcl::fromROSMsg (input, cloud);
        viewer.showCloud(cloud.makeShared());
    }

    void timerCB(const ros::TimerEvent&)
    {
        if(viewer.wasStopped())
            {
                ros::shutdown();
            }
    }

protected:
    ros::NodeHandle nh;
    ros::Subscriber pcl_sub;
    pcl::visualization::CloudViewer viewer;
    ros::Timer viewer_timer;    
};

int main(int argc, char** argv)
{
    ros::init(argc, argv, "pcl_visualize");
    cloudHandler handler;
    ros::spin();
    return 0;
}

这些包可能需要更彻底的清理 :)


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接