2

我正在寻找一种在两个进程之间共享 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,但在客户端,对象已正确创建和填充,但是当我尝试访问应该包含点的点属性时出现分段错误云的。所有其他属性(如宽度、高度等)都填充了正确的值。

如何解决此问题并访问积分结构?还是有另一种方法来实现我的范围?

4

1 回答 1

3

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

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<>内部的富指针),这些也不会轻易满足 Eigen 分配器强加的额外对齐要求.

It is very possible to share complicated datastructures in shared memory, but the library must have been built with that in mind at least allowing you to choose/parameterize the container/allocator choices. PCL is not such a library at this time.

At this point you could consider serializing data between processes. This might be too costly for your use case, so in that case you might need to look at another library.

于 2022-02-11T00:27:56.770 回答