【问题标题】:PCL: Visualize a point cloudPCL:可视化点云
【发布时间】:2012-04-23 18:41:17
【问题描述】:

我正在尝试使用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>&)’

【问题讨论】:

  • 我正在做类似的事情。只是想知道您是否最终能够解决错误并构建您的项目?

标签: c++ point-cloud-library point-clouds


【解决方案1】:

您的错误消息告诉您需要做什么:

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 &amp;cloud 而不是您传入的原始引用。这是来自 boost 的智能指针的 typedef:

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

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

pcl::MonochromeCloud::ConstPtr cloud(new pcl::PointCloud<pcl::PointXYZ>());

然后,当您传入变量云时,它将具有正确的类型,并且您不会收到您报告的错误。您还必须将您的 cloud.foos 更改为 cloud-&gt;foos。

看看你给的second example,他们也是这样做的:

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);

【讨论】:

    【解决方案2】:

    马上给出答案:

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr ptrCloud(&cloud);
    

    然后在查看器中放入ptrCloud,就是它所期望的:

    viewer.showCloud (ptrCloud);
    

    【讨论】:

      【解决方案3】:

      如果其他人只是在 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;
      }
      

      包含的内容可能会被清理得更多:)

      【讨论】:

        【解决方案4】:

        CloudViewer 的教程pcl cloudviewer tutorialhttp://pointclouds.org/documentation/tutorials/cloud_viewer.php#cloud-viewer 定义点云如下:

        pcl::PointCloud<pcl::PointXYZRGB>**::Ptr** cloud;
        

        但是你已经写了:

        pcl::PointCloud<pcl::PointXYZ> cloud;
        

        所以尝试将云作为 &cloud 而不是云来传递,或者将其声明为指针。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-06
          • 2016-07-31
          • 2014-02-15
          • 2020-09-20
          • 1970-01-01
          • 2015-04-16
          • 2018-01-31
          • 2017-03-11
          相关资源
          最近更新 更多