2016-04-03 70 views
3

私はpcl1_ptrApcl1_ptrBpcl1_ptrCためにこれらの定義を使用して、例えばpcl::PointCloud2pcl::PointCloudPointCloudPCL :: PCLPointCloud2の使用

を使用するときと困惑している:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr pcl1_ptrA(new pcl::PointCloud<pcl::PointXYZRGB>); //pointer for color version of pointcloud 
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pcl1_ptrB(new pcl::PointCloud<pcl::PointXYZRGB>); //ptr to hold filtered Kinect image 
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pcl1_ptrC(new pcl::PointCloud<pcl::PointXYZRGB>); //ptr to hold filtered Kinect image 

私は、次のPCLの機能を呼び出すことができます:

pcl::VoxelGrid<pcl::PointXYZRGB> vox; 

vox.setInputCloud(pcl1_ptrA); 

vox.setLeafSize(0.02f, 0.02f, 0.02f); 

vox.filter(*pcl1_ptrB); 

cout<<"done voxel filtering"<<endl; 

cout<<"num bytes in original cloud data = "<<pcl1_ptrA->points.size()<<endl; 

cout<<"num bytes in filtered cloud data = "<<pcl1_ptrB->points.size()<<endl; // ->data.size()<<endl; 

Eigen::Vector4f xyz_centroid; 

pcl::compute3DCentroid (*pcl1_ptrB, xyz_centroid); 

float curvature; 

Eigen::Vector4f plane_parameters; 

pcl::computePointNormal(*pcl1_ptrB, plane_parameters, curvature); //pcl fnc to compute plane fit to point cloud 

Eigen::Affine3f A(Eigen::Affine3f::Identity()); 

pcl::transformPointCloud(*pcl1_ptrB, *pcl1_ptrC, A);  

ただし、代わりにpcl::PCLPointCloud2オブジェクトを使用すると、次のようになります。

pcl::VoxelGrid<pcl::PCLPointCloud2> vox; 

vox.setInputCloud(pcl2_ptrA); 

vox.setLeafSize(0.02f, 0.02f, 0.02f); 

vox.filter(*pcl2_ptrB); 

をしかし、これらはさえコンパイルされません:

pcl::PCLPointCloud2::Ptr pcl2_ptrA (new pcl::PCLPointCloud2()); 

pcl::PCLPointCloud2::Ptr pcl2_ptrB (new pcl::PCLPointCloud2()); 

pcl::PCLPointCloud2::Ptr pcl2_ptrC (new pcl::PCLPointCloud2()); 

この機能は動作します

//the next 3 functions do NOT compile: 

Eigen::Vector4f xyz_centroid; 

pcl::compute3DCentroid (*pcl2_ptrB, xyz_centroid); 

float curvature; 

Eigen::Vector4f plane_parameters; 

pcl::computePointNormal(*pcl2_ptrB, plane_parameters, curvature); 

Eigen::Affine3f A(Eigen::Affine3f::Identity()); 

pcl::transformPointCloud(*pcl2_ptrB, *pcl2_ptrC, A); 

私はどのオブジェクトを受け入れる機能のトラブルの発見を持っています。理想的には、すべてのPCL関数が引数pcl::PCLPointCloud2を受け入れるわけではありませんか?

答えて

1

pcl::PCLPointCloud2は、古いsensors_msgs::PointCloud2を置き換えるROS(ロボットオペレーティングシステム)メッセージタイプです。したがって、ROSと対話するときにのみ使用する必要があります。必要に応じて

を(here例を参照)、PCLは、一つのタイプから他方に変換するための2つの機能を提供する:

void fromPCLPointCloud2 (const pcl::PCLPointCloud2& msg, cl::PointCloud<PointT>& cloud); 
void toPCLPointCloud2 (const pcl::PointCloud<PointT>& cloud, pcl::PCLPointCloud2& msg); 

追加情報

fromPCLPointCloud2toPCLPointCloud2コンバージョン用PCLライブラリ関数であります。 ROSには、代わりに使用する必要がある関数pcl_conversions/pcl_conversions.hのラッパーがあります。これらは、メッセージとテンプレート形式の間で変換する関数の適切な組み合わせを呼び出します。アルバートは言った何のためのフォローアップとして、

1

For ROS Hydro and later (if you are using ROS)、PCLは、ROSからすべての依存関係を削除する作業を行っています。これは、pclが、pclユーザーのAPIの破損を最小限に抑えるために、対応するROSメッセージとほとんど同じクラスのセットを作成したことを意味します。 "now depracated" sensor_msgs::PointCloud2を使用してPointCloudのユーザーが今pcl_conversionsパッケージを使用するように求められ、このパッケージは、変換from/to sensor_msgs::PointCloud2 to/from) pcl::PointCloudを実装し、含まれている必要があります

#include <pcl_conversions/pcl_conversions.h> 

をし、ROSのコードは、次のように変更する必要があります。

void foo(const sensor_msgs::PointCloud2 &pc) 
{ 
    pcl::PCLPointCloud2 pcl_pc; 
    pcl_conversions::toPCL(pc, pcl_pc); 
    pcl::SomePCLFunction(pcl_pc); 
    ... 
} 

また、PCLがありますROSコミュニティによってcatkinパッケージとしてパッケージ化されていないので、pclに直接依存するパッケージは、新しいrosdepルールlibpcl-allとlibpcl-all-devを使用し、CMakeでPCLを使用するためのPCL開発者のガイドラインに従ってください。一般に、これはpackage.xmlのは次のように変更することを意味します:移行ルール上

find_package(PCL REQUIRED) 
... 
include_directories(${PCL_INCLUDE_DIRS}) 
... 
target_link_libraries(<YOUR_TARGET> ${PCL_LIBRARIES}) 

よりhereherehereを見つけることができます。

関連する問題