C++ updatePointCloud函数导致vector::reserve的std::length\u错误

C++ updatePointCloud函数导致vector::reserve的std::length\u错误,c++,point-cloud-library,C++,Point Cloud Library,好了,伙计们,在我最后一个问题之后,我在应用程序上做了更多的工作。 同样,我有两个视口,显示两个不同的点云。视口中的当前选定点将使用白色亮显。为了更好地理解,我将在这里放一张图片: 使用Enter键,我可以将两个点(每个视口一个)存储在两个点云中,这两个点云称为storedCloudLeft和storedCloudRight。这些点是注册的对应点。因此,用户在左视口中选择一个点,它将存储在storedCloudLeft中。对的人也是一样 如果存储了点,它们将使用红色显示。见下图: 因此,假设

好了,伙计们,在我最后一个问题之后,我在应用程序上做了更多的工作。 同样,我有两个视口,显示两个不同的点云。视口中的当前选定点将使用白色亮显。为了更好地理解,我将在这里放一张图片:

使用Enter键,我可以将两个点(每个视口一个)存储在两个点云中,这两个点云称为
storedCloudLeft
storedCloudRight
。这些点是注册的对应点。因此,用户在左视口中选择一个点,它将存储在
storedCloudLeft
中。对的人也是一样

如果存储了点,它们将使用红色显示。见下图:

因此,假设用户在设置这些点时出错,希望删除点云中的最后一对点。用户可以使用BackSpace键执行此操作。这将调用以下函数:

void resetStoredPointClouds(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud, std::string cloud_id) {
   // Remove the last point
   cloud->erase(cloud->end() - 1);
   // Update the point clouds using a red color
   pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> red(cloud, 235, 19, 19);
   viewer->updatePointCloud(cloud, red, cloud_id);
}
抱歉,我从不调用
reserve
-函数。如果用户试图为一个向量保留太多的索引,以至于超过了它的最大大小,则通常会抛出
reserve
的length_错误

所以,起初我认为这个错误消息的来源是删除点的错误处理。但使用同样的错误。所以我试着调试整件事。现在是最奇怪的部分:当运行上述代码时,甚至不会发生此错误。它出现在
主功能
-之后

viewer->spinOnce (100);
已经跑了一段时间了。经过更多的实验,我发现当未执行
updatePointCloud
-命令时,错误消息不会显示。但是,如果我在调试器中执行此步骤,则不会显示任何错误

这在很多方面令人困惑。长度错误与
updatePointCloud
-语句有什么关系?为什么不使用调试器引发此错误?为什么只有在云中存储了三个或更多点时才会发生这种情况?我做错了什么?我有一种感觉,我把事情搞砸了,只是找不到相应的部分

有人知道该怎么做以及如何解决这个问题吗?或者这是一个已知的错误?这是使用此功能的好方法吗?任何帮助都将不胜感激


Bakefish

好的,所以我做了更多的研究,我非常确定这个错误的原因是
updatePointCloud
方法中的一个bug。下已经存在github问题

不知道这个错误到底是如何发生的,但幸运的是,这个问题有一个解决方法

因此,如果另一个有此问题,请使用函数
removePointCloud
替换
uodatePointCloud
,然后为相应的云替换
addPointCloud
。关于性能,它比仅仅更新要慢,但现在它应该做到这一点

这个问题已经被证实了。。。希望他们能尽快解决

编辑:PCL1.11现在被重新发布,该版本修复了此问题

viewer->spinOnce (100);