c++ - 如何在linux中将pcl读取的点云数据写入共享内存?

查看:253
本文介绍了c++ - 如何在linux中将pcl读取的点云数据写入共享内存?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

如题:如何在linux中将pcl读取的点云数据写入共享内存?
我尝试了使用shmat 函数连接到我设置的Ponitcloud中

typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud; 
PointCloud::Ptr output (new PointCloud());
output = (PointCloud::Ptr)shmat(shmid, NULL, 0); 

报错::

思考:是shmat返回shmaddr的地址无法直接赋值给pcl创建的指针,pcl创建的指针是boost::shared_ptr类型,是const类型,无法改变内存地址。
需要用第三方的空指针传递数据。

答:pcl::PointCloud<pal::PointXYZ>指针是const指针,创建需要初始化,同时不能改变其指针地址。需要重新定义指针类型。

———————————————————————8/25—————————————————————————
发现了新的点云类型

PointCloud output;//非指针点云 
//使用PointCloud进行转换
PointCloud* o = &output;
int sizecloud=sizeof(cloud)+3*8*cloud.points.size();
std::cout<<"size:    "<<sizecloud<<"\n"<<std::endl;
int shmid = shmget((key_t)7234, sizecloud , IPC_CREAT|0666);

o = (PointCloud*)shmat(shmid, NULL, 0); 
std::cout<<"o3:    "<<o<<"\n"
            <<"*"<<*o<<"\n"<<std::endl;
            
pcl::copyPointCloud(output, *o);
std::cout<<"o4:    "<<o<<"\n"
            <<"*"<<*o<<"\n"<<std::endl;


现在发现一个问题是pcl的在为pointcloud指针使用了struct创建结构,同时创建了留空指针。同时C++指针是不能留空,自动分配,在共享内存里了非本进程的指针地址,共享指针就会指向错误内存区(0xffffffff...)。产生段错误。
但是进一步报错是malloc.c文件并没有被生成
1.猜测是因为在调试其中没有足够权限。
2.malloc.c函数本身是c动态内存分配的文件,错误出在这个地方有可能是某个不知道的地方出错了。

答:共享内存区创建在了满溢区域,内存不足,导致内存分配出错。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本问题答案在下方评论本人已给出

解决方案

正确姿势:

//令cloud中已有点云数据 
PointCloud cloud;
PointCloud* output;
int sizecloud = sizeof(cloud) + cloud.points.size();
//(key_t)5234是通过fokt函数获取,具体实现将在博客中阐述
int shmid = shmget((key_t))5234, sizecloud ,IPC_CREAT|0666);
output = (PointCloud*)shmat(shmid, NULL, 0); 
pcl::copyPointCloud(cloud, *output);

上次的回答中其实程序已经跑通,但是在创建共享内存的时候出现了错误,导致出现了内存管理错误的问题。
接下拉本人将深入探究共享内存原理和pcl库中的数据结构作详细报告

这篇关于c++ - 如何在linux中将pcl读取的点云数据写入共享内存?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆