从 pcl::people::PersonCluster<PointT> 中提取点云
Extract Point Cloud from a pcl::people::PersonCluster<PointT>
我正在为大学做一个项目,我需要提取人的点云来使用它。我做了一个适配教程代码的ROS节点Ground based rgdb people detection,现在我想在一个主题中发布第一个检测到的集群的点云。
但是我无法提取那个点云,class 的定义在这里定义 person_cluster.h。还有一个 public 成员:
typedef pcl::PointCloud<PointT> PointCloud;
所以要将其转换为 sensor_msgs::PointCloud2
我这样做:
pcl_conversions::fromPCL(clusters.at(0).PointCloud,person_msg);
其中 person_msg
是 PointCLoud2
消息,clusters
是 pcl::people::PersonCluster<PointT>
的矢量,我只想发布第一个点云,因为我假设现场只有一个人
编译器给我这个错误:
error: invalid use of ‘pcl::people::PersonCluster::PointCloud’
pcl_conversions::fromPCL(clusters.at(0).PointCloud,person_msg);
我对C++的了解不多,无法克服这个错误。谷歌搜索该错误似乎是在您不 "define" 和 class 时出现的,但我怀疑在 pcl 库中他们定义了错误的 class。
对于那些感兴趣的人,我解决了我的问题。
在 pcl 的论坛中,我找到了一个 post,我使用的人员检测器的同一开发人员给出了答案。
所以基本上:
// Get cloud after voxeling and ground plane removal:
PointCloudT::Ptr no_ground_cloud (new PointCloudT);
no_ground_cloud = people_detector.getNoGroundCloud();
// Show pointclouds of every person cluster:
PointCloudT::Ptr cluster_cloud (new PointCloudT);
for(std::vector<pcl::people::PersonCluster<PointT> >::iterator it = clusters.begin(); it != clusters.end(); ++it)
{
if (it->getPersonConfidence() > min_confidence)
{
// Create the pointcloud with points belonging to the current cluster:
cluster_cloud->clear();
pcl::PointIndices clusterIndices = it->getIndices(); // cluster indices
std::vector<int> indices = clusterIndices.indices;
for(unsigned int i = 0; i < indices.size(); i++) // fill cluster cloud
{
PointT* p = &no_ground_cloud->points[indices[i]];
cluster_cloud->push_back(*p);
}
// Visualization:
viewer.removeAllPointClouds();
viewer.removeAllShapes();
pcl::visualization::PointCloudColorHandlerRGBField<PointT> rgb(cluster_cloud);
viewer.addPointCloud<PointT> (cluster_cloud, rgb, "cluster_cloud");
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cluster_cloud");
viewer.spinOnce(500);
}
}
实际上我无法在传感器消息 PointCloud2 中转换这种类型的点云,甚至尝试在 pcl::PointCloud<pcl::PointXYZ>
中转换该点云。
一个有效的解决方案是使用 cluster_cloud
一种 pcl::PointCloud<pcl::PointXYZ>
的类型,然后使用类型的发布者
pcl::PointCloud<pcl::PointXYZ>
这样:
ros::Publisher person_pub = nh.advertise<PointCloud>("personPointCloud", 1000);
不管怎样,它没有发布任何东西,rviz 没有显示任何东西。但是viever显示的是检测到的人的点云。由于那个点云不是我预期的那样(如果你移动手臂,算法不会给你所有的手臂)它对我的项目没有用,所以我放弃了它。
所以在ros中发布还是有问题,但是获取点云的问题解决了。
我正在为大学做一个项目,我需要提取人的点云来使用它。我做了一个适配教程代码的ROS节点Ground based rgdb people detection,现在我想在一个主题中发布第一个检测到的集群的点云。
但是我无法提取那个点云,class 的定义在这里定义 person_cluster.h。还有一个 public 成员:
typedef pcl::PointCloud<PointT> PointCloud;
所以要将其转换为 sensor_msgs::PointCloud2
我这样做:
pcl_conversions::fromPCL(clusters.at(0).PointCloud,person_msg);
其中 person_msg
是 PointCLoud2
消息,clusters
是 pcl::people::PersonCluster<PointT>
的矢量,我只想发布第一个点云,因为我假设现场只有一个人
编译器给我这个错误:
error: invalid use of ‘pcl::people::PersonCluster::PointCloud’ pcl_conversions::fromPCL(clusters.at(0).PointCloud,person_msg);
我对C++的了解不多,无法克服这个错误。谷歌搜索该错误似乎是在您不 "define" 和 class 时出现的,但我怀疑在 pcl 库中他们定义了错误的 class。
对于那些感兴趣的人,我解决了我的问题。
在 pcl 的论坛中,我找到了一个 post,我使用的人员检测器的同一开发人员给出了答案。 所以基本上:
// Get cloud after voxeling and ground plane removal:
PointCloudT::Ptr no_ground_cloud (new PointCloudT);
no_ground_cloud = people_detector.getNoGroundCloud();
// Show pointclouds of every person cluster:
PointCloudT::Ptr cluster_cloud (new PointCloudT);
for(std::vector<pcl::people::PersonCluster<PointT> >::iterator it = clusters.begin(); it != clusters.end(); ++it)
{
if (it->getPersonConfidence() > min_confidence)
{
// Create the pointcloud with points belonging to the current cluster:
cluster_cloud->clear();
pcl::PointIndices clusterIndices = it->getIndices(); // cluster indices
std::vector<int> indices = clusterIndices.indices;
for(unsigned int i = 0; i < indices.size(); i++) // fill cluster cloud
{
PointT* p = &no_ground_cloud->points[indices[i]];
cluster_cloud->push_back(*p);
}
// Visualization:
viewer.removeAllPointClouds();
viewer.removeAllShapes();
pcl::visualization::PointCloudColorHandlerRGBField<PointT> rgb(cluster_cloud);
viewer.addPointCloud<PointT> (cluster_cloud, rgb, "cluster_cloud");
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cluster_cloud");
viewer.spinOnce(500);
}
}
实际上我无法在传感器消息 PointCloud2 中转换这种类型的点云,甚至尝试在 pcl::PointCloud<pcl::PointXYZ>
中转换该点云。
一个有效的解决方案是使用 cluster_cloud
一种 pcl::PointCloud<pcl::PointXYZ>
的类型,然后使用类型的发布者
pcl::PointCloud<pcl::PointXYZ>
这样:
ros::Publisher person_pub = nh.advertise<PointCloud>("personPointCloud", 1000);
不管怎样,它没有发布任何东西,rviz 没有显示任何东西。但是viever显示的是检测到的人的点云。由于那个点云不是我预期的那样(如果你移动手臂,算法不会给你所有的手臂)它对我的项目没有用,所以我放弃了它。
所以在ros中发布还是有问题,但是获取点云的问题解决了。