

PCLを用いて、点群の中から平面を抽出することを行いたいです。  
PCLのチュートリアルの中に "[Extracting indices from a
PointCloud](http://vml.sakura.ne.jp/koeda/PCL/tutorials/html/extract_indices.html)"
というものがあり、このコードを実行しようとcmakeを用いてビルドしたところ、以下のようなエラーが発生しました。

チュートリアルに記載されているコードをそのままコピペしてビルドしたので、おそらくライブラリ関係でのエラーかと思うのですが、原因がわかりません。どなたか解決策を教えていただけませんでしょうか。

extract_indices.cpp

[code]

    #include <iostream>
    #include <pcl/ModelCoefficients.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/sample_consensus/method_types.h>
    #include <pcl/sample_consensus/model_types.h>
    #include <pcl/segmentation/sac_segmentation.h>
    #include <pcl/filters/voxel_grid.h>
    #include <pcl/filters/extract_indices.h>
    
    int
    main (int argc, char** argv)
    {
      sensor_msgs::PointCloud2::Ptr cloud_blob (new sensor_msgs::PointCloud2), 
      cloud_filtered_blob (new sensor_msgs::PointCloud2);
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>), 
      cloud_p (new pcl::PointCloud<pcl::PointXYZ>), cloud_f (new 
      pcl::PointCloud<pcl::PointXYZ>);
    
      // Fill in the cloud data
      pcl::PCDReader reader;
      reader.read ("table_scene_lms400.pcd", *cloud_blob);
    
      std::cerr << "PointCloud before filtering: " << cloud_blob->width * cloud_blob->height << 
      " data points." << std::endl;
    
      // Create the filtering object: downsample the dataset using a leaf size of 1cm
      pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;
      sor.setInputCloud (cloud_blob);
      sor.setLeafSize (0.01f, 0.01f, 0.01f);
      sor.filter (*cloud_filtered_blob);
    
      // Convert to the templated PointCloud
      pcl::fromROSMsg (*cloud_filtered_blob, *cloud_filtered);
    
      std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered- 
      >height << " data points." << std::endl;
    
      // Write the downsampled version to disk
      pcl::PCDWriter writer;
      writer.write<pcl::PointXYZ> ("table_scene_lms400_downsampled.pcd", *cloud_filtered, 
      false);
    
      pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
      pcl::PointIndices::Ptr inliers (new pcl::PointIndices ());
      // Create the segmentation object
      pcl::SACSegmentation<pcl::PointXYZ> seg;
      // Optional
      seg.setOptimizeCoefficients (true);
      // Mandatory
      seg.setModelType (pcl::SACMODEL_PLANE);
      seg.setMethodType (pcl::SAC_RANSAC);
      seg.setMaxIterations (1000);
      seg.setDistanceThreshold (0.01);
    
      // Create the filtering object
      pcl::ExtractIndices<pcl::PointXYZ> extract;
    
      int i = 0, nr_points = (int) cloud_filtered->points.size ();
      // While 30% of the original cloud is still there
      while (cloud_filtered->points.size () > 0.3 * nr_points)
      {
        // Segment the largest planar component from the remaining cloud
        seg.setInputCloud (cloud_filtered);
        seg.segment (*inliers, *coefficients);
        if (inliers->indices.size () == 0)
        {
          std::cerr << "Could not estimate a planar model for the given dataset." << std::endl;
          break;
        }
    
        // Extract the inliers
        extract.setInputCloud (cloud_filtered);
        extract.setIndices (inliers);
        extract.setNegative (false);
        extract.filter (*cloud_p);
        std::cerr << "PointCloud representing the planar component: " << cloud_p->width * 
        cloud_p->height << " data points." << std::endl;
    
        std::stringstream ss;
        ss << "table_scene_lms400_plane_" << i << ".pcd";
        writer.write<pcl::PointXYZ> (ss.str (), *cloud_p, false);
    
        // Create the filtering object
        extract.setNegative (true);
        extract.filter (*cloud_f);
        cloud_filtered.swap (cloud_f);
        i++;
      }
    
      return (0);
    }
    
[/code]

ビルド結果

[code]

    /home/------/pcl/extract_indices/extract_indices.cpp: In function ‘int main(int, char**)’:
    /home/------/pcl/extract_indices/extract_indices.cpp:15:8: error: ‘pcl::PointCloud2’ has not 
    been declared
       pcl::PointCloud2::Ptr cloud_blob (new sensor_msgs::PointCloud2), cloud_filtered_blob (new sensor_msgs::PointCloud2);
            ^~~~~~~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:20:43: error: ‘cloud_blob’ was not declared in this scope
       reader.read ("table_scene_lms400.pcd", *cloud_blob);
                                               ^~~~~~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:20:43: note: suggested alternative: ‘cloud_f’
       reader.read ("table_scene_lms400.pcd", *cloud_blob);
                                               ^~~~~~~~~~
                                               cloud_f
    /home/------/pcl/extract_indices/extract_indices.cpp:25:18: error: ‘sensor_msgs’ was not declared in this scope
       pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;
                      ^~~~~~~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:25:42: error: template argument 1 is invalid
       pcl::VoxelGrid<sensor_msgs::PointCloud2> sor;
                                              ^
    /home/------/pcl/extract_indices/extract_indices.cpp:26:7: error: request for member ‘setInputCloud’ in ‘sor’, which is of non-class type ‘int’
       sor.setInputCloud (cloud_blob);
           ^~~~~~~~~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:27:7: error: request for member ‘setLeafSize’ in ‘sor’, which is of non-class type ‘int’
       sor.setLeafSize (0.01f, 0.01f, 0.01f);
           ^~~~~~~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:28:7: error: request for member ‘filter’ in ‘sor’, which is of non-class type ‘int’
       sor.filter (*cloud_filtered_blob);
           ^~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:28:16: error: ‘cloud_filtered_blob’ was not declared in this scope
       sor.filter (*cloud_filtered_blob);
                    ^~~~~~~~~~~~~~~~~~~
    /home/------/pcl/extract_indices/extract_indices.cpp:28:16: note: suggested alternative: ‘cloud_filtered’
       sor.filter (*cloud_filtered_blob);
                    ^~~~~~~~~~~~~~~~~~~
                    cloud_filtered
    /home/------/pcl/extract_indices/extract_indices.cpp:31:8: error: ‘fromROSMsg’ is not a member of ‘pcl’
       pcl::fromROSMsg (*cloud_filtered_blob, *cloud_filtered);
            ^~~~~~~~~~
    In file included from /home/------/pcl/extract_indices/extract_indices.cpp:6:0:
    /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h: In function ‘void __static_initialization_and_destruction_0(int, int)’:
    /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h:99:3: warning: ‘pcl::SAC_SAMPLE_SIZE’ is deprecated: This map is deprecated and is kept only to prevent breaking existing user code. Starting from PCL 1.8.0 model sample size is a protected member of the SampleConsensusModel class [-Wdeprecated-declarations]
       SAC_SAMPLE_SIZE (sample_size_pairs, sample_size_pairs + sizeof (sample_size_pairs) / sizeof (SampleSizeModel));
       ^~~~~~~~~~~~~~~
    /usr/include/pcl-1.8/pcl/sample_consensus/model_types.h:99:3: note: declared here
    CMakeFiles/extract_indices.dir/build.make:62: recipe for target 
    'CMakeFiles/extract_indices.dir/extract_indices.cpp.o' failed
    make[2]: *** [CMakeFiles/extract_indices.dir/extract_indices.cpp.o] Error 1
    CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/extract_indices.dir/all' failed
    make[1]: *** [CMakeFiles/extract_indices.dir/all] Error 2
    Makefile:83: recipe for target 'all' failed
    make: *** [all] Error 2
    
[/code]


CC BY-SA 4.0
2021-01-13T02:42:06.883
73258
2021-01-16T01:25:02.567
2021-01-13T05:30:40.870
3060
20022
question
c++ ubuntu build cmake
PCLのチュートリアル"Extracting indices from a PointCloud"がビルドできない


参考にしたサイトのバージョンが古かったようです。  
最新版のチュートリアルを試したところ、無事ビルドできました。


CC BY-SA 4.0
2021-01-16T01:25:02.567
73336
2021-01-16T01:25:02.567
20022
73258
answer