PCL使用VoxelGrid出现Segmentation fault (core dumped)的解决办法

news/2024/12/1 0:22:22/

今天调个程序,需要对一个点云进行下采样处理,本来很简单的事情,但是总在函数退出的时候出现Segmentation fault,之前是将其独立编译为一个二进制文件,下采样后的点云保存后再退出。这样就算出错也没事,反正数据出来了我哪管bug洪水滔天 😎。

但是在数据量比较大的需求中,这个下采样功能就不能再独立为二进制文件了,因此我不得不修复这个问题。花费了好久终于把这个问题修复了。这个问题就是PCL的问题,只能是利用另一种方式绕过这个bug,得到的结果是一样的,这个放心。现在我把问题及解决方案整理如下

问题引出

简单来说,我需要对一个点云进行下采样,cloudin是原始点云,cloudout是下采样后的点云,关键函数摘出来如下所示:

void downscale(pcl::PointCloud<pcl::PointXYZ>::Ptr cloudin, float leafsize,pcl::PointCloud<pcl::PointXYZ>::Ptr cloudout)
{LOG(INFO) << "cloudin size: " << cloudin->points.size();pcl::VoxelGrid<pcl::PointXYZ> downSizeFilterCorner;downSizeFilterCorner.setLeafSize(leafsize, leafsize, leafsize);downSizeFilterCorner.setInputCloud(cloudin);downSizeFilterCorner.filter(*cloudout);LOG(INFO) << "cloudout size: " << cloudout->points.size();
}

执行后,代码输入如下所示,整体功能都能运行,但是在结束,进行内存释放时候,出现了Segmentation fault (core dumped)

I0628 test_pclVoxelGrid.cpp] cloudin size: 473300
I0628 test_pclVoxelGrid.cpp] cloudout size: 19180
Segmentation fault (core dumped)

问题分析

利用valgrind工具进行内存检查valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./build/test_pclVoxelGrid,代码中存在内存溢出问题。

==21349== 306,880 bytes in 1 blocks are definitely lost in loss record 249 of 249
==21349==    at 0x4C330B5: malloc (vg_replace_malloc.c:431)
==21349==    by 0x5AF1A88: Eigen::internal::aligned_malloc(unsigned long) (in /usr/lib/x86_64-linux-gnu/libpcl_filters.so.1.8.1)
==21349==    by 0x5B057D0: std::vector<pcl::PointXYZ, Eigen::aligned_allocator<pcl::PointXYZ> >::_M_default_append(unsigned long) (in /usr/lib/x86_64-linux-gnu/libpcl_filters.so.1.8.1)
==21349==    by 0x5CE4D28: pcl::VoxelGrid<pcl::PointXYZ>::applyFilter(pcl::PointCloud<pcl::PointXYZ>&) (in /usr/lib/x86_64-linux-gnu/libpcl_filters.so.1.8.1)
==21349==    by 0x1218CC: pcl::Filter<pcl::PointXYZ>::filter(pcl::PointCloud<pcl::PointXYZ>&) (in test_pclVoxelGrid)
==21349==    by 0x118127: main (in test_pclVoxelGrid)
==21349==
==21349== LEAK SUMMARY:
==21349==    definitely lost: 306,880 bytes in 1 blocks
==21349==    indirectly lost: 0 bytes in 0 blocks
==21349==      possibly lost: 0 bytes in 0 blocks
==21349==    still reachable: 81,172 bytes in 1,006 blocks
==21349==         suppressed: 0 bytes in 0 blocks
==21349==
==21349== For lists of detected and suppressed errors, rerun with: -s
==21349== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

在gg上搜了一大圈,大部分给出的建议是取消"c++11",或者用"c++11"重新编译下自己使用的PCL库,但这些都不现实,终于在《Segmentation fault when deallocating pcl::PointCloud》找到了解决办法。

pcl::PointCloud<pcl::PointXYZ>转为pcl::PCLPointCloud2后下采样,然后再还原为原始格式点云,就可以规避这个问题了。

解决方案

前面的downscale更换为如下代码

void downscale(pcl::PointCloud<pcl::PointXYZ>::Ptr cloudin, float leafsize,pcl::PointCloud<pcl::PointXYZ>::Ptr cloudout)
{pcl::PCLPointCloud2::Ptr tmpcloud(new pcl::PCLPointCloud2());pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());LOG(INFO) << "cloudin size: " << cloud->points.size();pcl::toPCLPointCloud2(*cloudin, *tmpcloud);pcl::VoxelGrid<pcl::PCLPointCloud2> sor;sor.setInputCloud(tmpcloud);sor.setLeafSize(leafsize, leafsize, leafsize);sor.filter(*cloud_filtered);pcl::fromPCLPointCloud2(*cloud_filtered, *cloudout);LOG(INFO) << "cloudout size: " << cloudout->points.size();
}

执行后,代码输入如下所示,输出的结果是一样的,而且也没有前面的错误了,问题Solved 💪 。

I0628 test_pclVoxelGrid.cpp] cloudin size: 473300
I0628 test_pclVoxelGrid.cpp] cloudout size: 19180

终于干掉了这个Bug,请叫我铲B官😎 。


http://www.ppmy.cn/news/626442.html

相关文章

vscode python 自定义函数无法跳转到定义处,且定义处无法展示所有调用该函数的位置

问题描述 在vscode中编写python代码&#xff0c;在自定义类的forward函数中调用该类的成员函数&#xff0c;但在调用处无法通过ctrl鼠标左键直接跳转到该成员函数的定义中&#xff0c;系统显示找不到函数声明。同时&#xff0c;在该函数的定义处无法通过ctrl鼠标左键展示项目中…

FPS(CF、CS GO、PUBG、APEX、瓦罗兰) AI YOLOV5 自瞄 模型 权重

YOLOV5的各种AI自瞄权重&#xff0c;有需要的联系 联系方式 如果对上面的资源有需要&#xff0c;私聊或者留言或者进入下面项目了解详细内容 联系方式 加我时&#xff0c;请备注所需要的权重 https://gitee.com/wcx895278175/cf-ai-yolov5-self-aiming

嘿!柠檬

【暖瓶盖】838485【暖瓶盖】

强烈推荐深蓝网络电视

一会儿一场经典的战役将要开始了&#xff0c;如果没有机会在电视面前看世界杯的兄弟们&#xff0c;只能在网上看了&#xff0c;但是大家一直推崇的PPLIVE到关键时刻掉链子。这里&#xff0c;在下推荐一款炒好的网络电视--深蓝网络电视&#xff0c;一点不卡&#xff0c;现在我的…

百度智能云 × 酷开网络 | 让电视回归电视的智能秘诀

面对屏幕越来越大、画质愈发精良的电视机&#xff0c;你是不是经常有这样的感觉&#xff1a;打开电视机&#xff0c;新闻、电视剧、电影、综艺、纪录片……内容选择太多&#xff0c;手足无措&#xff0c;最后随便播放点什么&#xff0c;然后去做别的事情&#xff0c;让电视机成…

网络直播电视之寻找直播地址(下)

接上文&#xff0c;上文中提到获取网络直播电视地址的方法&#xff0c;但是大量信息需要人工的方式进行处理&#xff0c;过于麻烦。所以本文针对三级的XML解析和下载工作进行处理。 技术点&#xff1a;1、利用tinyXML完成XML的解析工作 tinyxml下载 2、利用libcurl完成xml的下…

5G已难拉动收入增长,运营商对于高投入的5G左右为难

随着三大运营商的5G用户数突破10亿&#xff0c;5G已很难拉动ARPU的增长了&#xff0c;表现出来的业绩就是增长快速放缓&#xff0c;工信部披露的数据显示移动数据业务收入增长已接近于零。 工信部发布了“2023年1&#xff0d;5月份通信业经济运行情况”显示三大运营商的移动数据…