pcl::PointCloud 在共享内存中

pcl::PointCloud in shared memory

我正在寻找一种在不使用磁盘文件的情况下在两个进程之间共享 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

发件人似乎可以工作,因为我能够从内存中可视化点云,但在客户端正确创建和填充了对象,但是当我尝试访问点属性时出现分段错误那应该包含云的点。所有其他属性(如宽度、高度等)都填充了正确的值。

如何解决这个问题并访问积分结构?或者还有其他方法可以实现我的范围吗??

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

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

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

因为 PCL 不允许你覆盖分配器,这是一个死胡同,因为即使你可以让它使用 interprocess-allocators (在内部使用像 boost::interprocess::offset_ptr<> 这样的丰富指针),这些不会很容易地满足 Eigen 分配器强加的额外对齐要求。

它是 very possible to share complicated datastructures in shared memory,但在构建库时必须牢记这一点,至少允许您 choose/parameterize container/allocator 选择。 PCL 目前还没有这样的图书馆。

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