使用PCL合并点云时触发Segmentation fault错误的修复咨询
问题:PCL拼接全局点云时触发段错误
场景描述
从图像序列提取兴趣点,使用PCL库拼接所有关键帧点云生成全局地图。p是单关键帧提取并变换后的点云,globalMap是存储全局点云的智能指针,执行*globalMap += *p时触发段错误。
相关代码
generatePointCloud(pKF); pcl::PointCloud<pcl::PointXYZRGBA>::Ptr p(new pcl::PointCloud<pcl::PointXYZRGBA>); // Eigen::Matrix<double,4,4> Converter::toMatrix4d(const Sophus::SE3f &T) pcl::transformPointCloud(*(pKF->mptrPointCloud), *(p), Converter::toMatrix4d(pKF->GetPoseInverse())); { std::unique_lock<std::mutex> lck(mMutexGlobalMap); std::cout<<"MutexGlobalMap "<<std::endl; if (globalMap == nullptr) { std::cout<<"NUll pointer "<<std::endl; } else { std::cout<<"not empty "<<std::endl; } if (p == nullptr) { std::cout<<"NULL POINTER "<<std::endl; } else { std::cout<<"not empty "<<std::endl; } if (p->size() > 0) { std::cout<<" P size "<<std::endl; cout<< p->size() <<endl; } else { cout<< p->size() <<endl; } if (globalMap->size() > 0) { std::cout<<" global map size "<<std::endl; cout<< globalMap->size() <<endl; } else { cout<< globalMap->size() <<endl; } // Check the type of globalMap std::cout << "Type of globalMap: " << typeid(*globalMap).name() << std::endl; // Check the type of p std::cout << "Type of p: " << typeid(*p).name() << std::endl; *globalMap += *p; }
调试输出
Start processing sequence ... Images in the sequence: 5178 First KF:0; Map init KF:0 New Map created with 575 points receive a keyframe, 0 receive a keyframe, 1 receive a keyframe MutexGlobalMap not empty not empty P size 13415 0 Type of globalMap: N3pcl10PointCloudINS_12PointXYZRGBAEEE Type of p: N3pcl10PointCloudINS_12PointXYZRGBAEEE Added the point to the global map tmp init Setting Input Cloud 13415 receive a keyframe, 2 not empty not empty P size 13346 global map size 13415 Type of globalMap: N3pcl10PointCloudINS_12PointXYZRGBAEEE Type of p: N3pcl10PointCloudINS_12PointXYZRGBAEEE Segmentation fault (core dumped)
错误栈信息
Thread 4 "rgbd_tum" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fffd75b7700 (LWP 72283)] __GI___libc_free (mem=0xb6934) at malloc.c:3102 3102 malloc.c: No such file or directory.
修复方案
确保
globalMap的有效初始化
确认globalMap是通过合法方式创建的智能指针,例如:globalMap = pcl::PointCloud<pcl::PointXYZRGBA>::Ptr(new pcl::PointCloud<pcl::PointXYZRGBA>);避免使用未初始化的野指针,或指向已释放内存的失效指针。
严格保证线程安全
所有对globalMap的操作(包括初始化、重置、修改、读取)都必须在mMutexGlobalMap锁的保护下执行,防止多线程竞态导致指针状态异常。替换点云拼接方式
改用insert方法替代+=运算符,避免PCL运算符内部潜在的内存管理问题:globalMap->insert(globalMap->end(), p->begin(), p->end());验证
pKF->mptrPointCloud的有效性
检查generatePointCloud(pKF)是否正确初始化了pKF->mptrPointCloud,确保该指针指向合法的点云内存,避免transformPointCloud写入非法内存破坏堆结构。启用PCL调试模式排查
编译时添加-DPCL_DEBUG宏,输出PCL内部内存管理的详细日志,定位具体的内存错误点。
内容的提问来源于stack exchange,提问作者Iscelia
相关产品推荐
相关产品推荐

