我正在使用最新版本的PCL处理.pcd文件。我正在使用PCL可视化器可视化整个云,同时从格式化的点创建最多两个新的云,以为这些点添加一些颜色。但是,有时在可视化新云时会收到此错误:
libc++abi.dylib: terminating with uncaught exception of type std::length_error: allocator<T>::allocate(size_t n) 'n' exceeds maximum supported size
由于updatePointCloud函数而发生。该行是:
viewer->updatePointCloud(cloud, *visualization_handler, cloud_name);
代码在.pcd文件处理和可视化过程中的特定位置崩溃,但是尚不清楚为什么此功能在大多数时间都能正常运行,但有时会导致异常。什么会造成问题?这可能与PCL的这一已知问题有关吗? :https://github.com/PointCloudLibrary/pcl/issues/2386
谢谢
编辑:
我已经通过正确处理处理和查看云的联合线程解决了该问题。种族状况可能正在发生。我正在使用互斥锁来处理云(过滤器,创建感兴趣的区域等),然后使用另一个锁来仅查看处理过的云,而不是以前是通过在可视化线程中处理点云来完成的。
要指定,我正在使用UnaNancyOwen中的以下代码可视化pcap文件: https://gist.github.com/UnaNancyOwen/9f9459d3c10f7a6325ebebabda9865f7
所有对云的处理都在这里进行(第76行中建议的地方):
// Retrieved Point Cloud Callback Function
boost::mutex mutex;
boost::function<void( const pcl::PointCloud<PointType>::ConstPtr& )> function =
[ &cloud, &mutex ]( const pcl::PointCloud<PointType>::ConstPtr& ptr ){
boost::mutex::scoped_lock lock( mutex );
/* Point Cloud Processing */
/* ACTUALLY DO ALL PROCESSING HERE */
cloud = ptr;
};
在可视化步骤中可以访问云的位置不是其他诱人的位置:
while( !viewer->wasStopped() ){
// Update Viewer
viewer->spinOnce();
boost::mutex::scoped_try_lock lock( mutex );
if( lock.owns_lock() && cloud ){
// Update Point Cloud
/* NO PROCESSING OF THE POINT CLOUD TO AVOID FAULT */
handler->setInputCloud( cloud );
if( !viewer->updatePointCloud( cloud, *handler, "cloud" ) ){
viewer->addPointCloud( cloud, *handler, "cloud" );
}
}
}
请随时添加有关种族状况可能如何发生的建议。
谢谢!