pcl::PointCloud在共享内存中



我正在寻找一种在两个进程之间共享pcl::PointCloud的方法,而不使用磁盘上的文件。特别是,我对使用boost共享内存库来实现我的范围感兴趣。

我刚刚为发件人尝试了以下说明:

void * pSharedMemory = ... ; // from wherever
pcl::PointCloud<pcl::PointXYZ>::Ptr ptr = ... ; // from wherever
memcpy ( pSharedMemory , static_cast<void const*>(ptr.get()) , sizeof(pcl::PointCloud<pcl::PointXYZ>) ) ;

以及接收器的以下内容:

template <typename T> nothing ( T* ) { }
void * pSharedMemory = ... ; // from wherever
pcl::PointCloud<pcl::PointXYZ>::Ptr ptr ( static_cast<pcl::PointCloud<pcl::PointXYZ>*>(pSharedMemory) , &nothing<pcl::PointCloud<pcl::PointXYZ> > ) ; // sets the destructor to do nothing

发送器似乎可以工作,因为我可以从内存中可视化PointCloud,但在客户端,对象是正确创建和填充的,但当我试图访问应该包含云的点的points属性时,我遇到了分段错误。所有其他属性(如宽度、高度…(都填充了正确的值。

如何解决此问题并访问点结构?或者还有其他方法可以达到我的范围吗??

问题是当指针在内部使用时,例如在矢量实现中:

using   VectorType = std::vector< PointT, Eigen::aligned_allocator< PointT > >;

using   CloudVectorType = std::vector< PointCloud< PointT >, Eigen::aligned_allocator< PointCloud< PointT > > >;

这些指针将仅在";原始的";地址空间,并且首先不要指向共享地址空间内部。即使他们这样做了,内存也可能在每个进程中映射到不同的地址,因此使用它们仍然是未定义的行为。

由于PCL不允许您覆盖分配器,这是一条死胡同,因为即使您可以让它使用进程间分配器(在内部使用像boost::interprocess::offset_ptr<>这样的富指针(,这些也不能很容易地满足特征分配器强加的额外对齐要求。

在共享内存中共享复杂的数据结构是非常可能的,但库的构建必须考虑到这一点——至少允许您选择/参数化容器/分配器选项。PCL目前不是这样一个库。

此时,您可以考虑在进程之间序列化数据。对于您的用例来说,这可能过于昂贵,因此在这种情况下,您可能需要查看另一个库。

相关内容

  • 没有找到相关文章

最新更新