updatePointCloud 函数导致 std::length_error for vector::reserve
updatePointCloud-function causes std::length_error for vector::reserve
好的伙计们,在我上一个问题之后,我在应用程序上做了更多的工作。
同样,我有两个显示两个不同点云的视口。视口中当前选定的点使用白色突出显示。我会在这里放一张图片以便更好地理解:
使用 Enter 键,我可以将两个点(每个视口一个)存储在两个点云中,分别称为 storedCloudLeft
和 storedCloudRight
。这些点是用于注册的通信。所以用户在左视口中选择一个点,它将存储在storedCloudLeft
中。对的也是一样。
如果存储点,它们将使用红色显示。看这张照片:
所以,假设用户在设置这些点时犯了错误,想要删除点云中的最后一对点。用户可以使用 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);
}
所以如果有两个点对(这意味着在 storedCloudLeft
和 storedCloudRight
中存储了两个点),我可以通过为每个云调用上面的函数来删除这些点。作品。但是,如果每个点云存储的点超过两个(即三个或更多),就会出现一些真正奇怪的问题。
如果这些点中的一些被删除,所以每个云只剩下两个点并且用户点击 BackSpace 键删除这对,程序会崩溃并显示以下错误消息:
terminate called after throwing an instance of 'std::length_error'
what(): vector::reserve
Afaik 我从不调用 reserve
函数。如果用户试图为向量保留太多索引以致超过其最大大小,通常会抛出 reserve
的 length_error。
所以,起初我认为这个错误消息的来源是删除点的错误处理。但是使用 this tutorial 会出现同样的错误。所以我试着调试整个事情。现在最奇怪的部分来了:当上面的代码是 运行 时,这个错误甚至不会发生。它在
之后出现在 main
函数中
viewer->spinOnce (100);
运行 有一段时间了。经过更多的实验,我发现当 updatePointCloud
-command 没有被执行时,错误信息并没有显示出来。但是,如果我在调试器中执行此步骤,则不会显示任何错误。
这在很多方面都令人困惑。长度错误与 updatePointCloud
-语句有什么关系?为什么不使用调试器抛出此错误?为什么仅当我在云中存储了三个或更多点时才会发生这种情况?我究竟做错了什么?我有一种感觉,我完全把事情搞砸了,我就是找不到相应的部分。
有人知道该怎么做以及如何解决这个问题吗?或者这是一个已知的错误?它甚至是使用此功能的好方法吗?任何帮助将不胜感激!
烤鱼
好的,所以我做了更多的研究,我很确定这个错误的原因是 updatePointCloud
方法中的错误。 this link 下已经有一个 github 问题。
不知道这个错误到底是怎么发生的,但幸运的是,这个问题有一个解决方法。
因此,如果另一个人有此问题,请将 uodatePointCloud
替换为函数 removePointCloud
,然后将 addPointCloud
替换为相应的云。关于性能,它比更新慢,但现在它应该可以解决问题。
问题已经核实...希望他们能尽快解决。
编辑:PCL 1.11 现已发布,该版本已修复此问题。
好的伙计们,在我上一个问题之后,我在应用程序上做了更多的工作。
同样,我有两个显示两个不同点云的视口。视口中当前选定的点使用白色突出显示。我会在这里放一张图片以便更好地理解:
使用 Enter 键,我可以将两个点(每个视口一个)存储在两个点云中,分别称为 storedCloudLeft
和 storedCloudRight
。这些点是用于注册的通信。所以用户在左视口中选择一个点,它将存储在storedCloudLeft
中。对的也是一样。
如果存储点,它们将使用红色显示。看这张照片:
所以,假设用户在设置这些点时犯了错误,想要删除点云中的最后一对点。用户可以使用 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);
}
所以如果有两个点对(这意味着在 storedCloudLeft
和 storedCloudRight
中存储了两个点),我可以通过为每个云调用上面的函数来删除这些点。作品。但是,如果每个点云存储的点超过两个(即三个或更多),就会出现一些真正奇怪的问题。
如果这些点中的一些被删除,所以每个云只剩下两个点并且用户点击 BackSpace 键删除这对,程序会崩溃并显示以下错误消息:
terminate called after throwing an instance of 'std::length_error'
what(): vector::reserve
Afaik 我从不调用 reserve
函数。如果用户试图为向量保留太多索引以致超过其最大大小,通常会抛出 reserve
的 length_error。
所以,起初我认为这个错误消息的来源是删除点的错误处理。但是使用 this tutorial 会出现同样的错误。所以我试着调试整个事情。现在最奇怪的部分来了:当上面的代码是 运行 时,这个错误甚至不会发生。它在
之后出现在main
函数中
viewer->spinOnce (100);
运行 有一段时间了。经过更多的实验,我发现当 updatePointCloud
-command 没有被执行时,错误信息并没有显示出来。但是,如果我在调试器中执行此步骤,则不会显示任何错误。
这在很多方面都令人困惑。长度错误与 updatePointCloud
-语句有什么关系?为什么不使用调试器抛出此错误?为什么仅当我在云中存储了三个或更多点时才会发生这种情况?我究竟做错了什么?我有一种感觉,我完全把事情搞砸了,我就是找不到相应的部分。
有人知道该怎么做以及如何解决这个问题吗?或者这是一个已知的错误?它甚至是使用此功能的好方法吗?任何帮助将不胜感激!
烤鱼
好的,所以我做了更多的研究,我很确定这个错误的原因是 updatePointCloud
方法中的错误。 this link 下已经有一个 github 问题。
不知道这个错误到底是怎么发生的,但幸运的是,这个问题有一个解决方法。
因此,如果另一个人有此问题,请将 uodatePointCloud
替换为函数 removePointCloud
,然后将 addPointCloud
替换为相应的云。关于性能,它比更新慢,但现在它应该可以解决问题。
问题已经核实...希望他们能尽快解决。
编辑:PCL 1.11 现已发布,该版本已修复此问题。