updatePointCloud-函数会导致 vector::reserve 的 std::length_error。

问题描述 投票:0回答:1

好吧,伙计们,在我的上一个问题之后,我在应用程序上做了一些更多的工作.再次,我有两个视口,显示两个不同的点云。在一个视口中,当前选择的点会用白色高亮显示。我在这里放一张图片以便更好的理解。Highlighted points

使用Enter键,我可以将两个点(每个视口一个)存储在两个点云中,这两个点云叫做 storedCloudLeftstoredCloudRight. 这些点是一个注册的对应点。所以用户在左视窗中选择一个点,它将被存储在 storedCloudLeft. 右边的也一样。

如果点被存储,它们将用红色显示。请看这张图片。Stored points

所以,假设用户在设置这些点时犯了一个错误,想要删除点云中的最后一个点对。用户可以使用BackSpace-Key来实现。这将调用以下函数。

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);
}

所以如果有两个点对(这意味着,在 storedCloudLeftstoredCloudRight 存储了两个点),我只需对每个云调用上述函数就可以删除这些点,一切都能正常工作。但是如果每个点云存储了两个以上的点(这意味着三个或更多),一些真正奇怪的问题就会出现。

如果其中一些点被删除了,所以每朵云只剩下两个点,而用户点击BackSpace来删除这对点,程序就会崩溃,出现以下错误信息。

terminate called after throwing an instance of 'std::length_error' 
what():  vector::reserve

Afaik I never call the reserve-函数。和一个 length_error 的 reserve 通常是在用户试图为一个向量保留太多索引,以至于超过了它的最大尺寸时被抛出。

所以,一开始我以为这个错误信息的来源是删除点的处理不好。但是使用 本教程 传递了同样的错误。于是我试着调试了一下整个过程。现在最奇怪的部分来了。 这个错误甚至没有发生在上述代码运行的时候。它出现在 main-后的功能

viewer->spinOnce (100);

已经运行了一段时间。经过一些实验,我发现,当在 updatePointCloud-命令没有被执行。但如果我在调试器中进行这一步,没有显示任何错误。

这在很多方面都让人困惑。长度错误和这个命令有什么关系?updatePointCloud-语句?为什么使用调试器没有抛出这个错误?为什么只有当我在云中存储了三个或更多的点时才会发生这种情况?我到底做错了什么?我有一种感觉,我把什么东西完全搞乱了,我只是没有找到相应的部分。

有人知道该怎么做,如何解决这个问题吗?还是说这是一个已知的bug?它甚至是一个很好的方法来使用这个功能吗?任何帮助将是非常感激的

烤鱼

c++ point-cloud-library
1个回答
0
投票

好吧,我做了一些更多的研究,我很肯定,这个错误的原因是一个错误的内部的 updatePointCloud 方法。已经有一个github问题在 这个环节.

不知道这个错误到底是怎么发生的,但幸运的是,这个问题有一个变通的方法。

所以,万一有其他的人有这个问题,就把这个问题的 uodatePointCloud 与功能 removePointCloud 然后 addPointCloud 为相应的云。关于性能,比单纯的更新要慢,但目前应该可以做到。

这个问题已经被验证了......希望他们能尽快修复。

EDIT:PCL 1.11已经重新发布,这个问题在该版本中得到了修复。

© www.soinside.com 2019 - 2024. All rights reserved.