点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?



当我进入点云库(PCL(时,我遇到了一些困惑,即何时在没有这个的情况下用::Ptr节来声明点云。

它似乎以任何一种方式工作,例如,这两个程序都编译、运行和产生预期的结果(将随机的 20 点云写入文件(:

// WriteCloud.cpp
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
int main(void)
{
std::cout << "nn" << "starting program" << "nn";
pcl::PointCloud<pcl::PointXYZ> cloud;    // !!! without ::Ptr !!!
int numPoints = 20;
for (int i = 0; i < numPoints; i++)
{
pcl::PointXYZ point;
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points.push_back(point);
}
// for simplicity, use an "unorganized" cloud, "width" = num points, "height" = 1
cloud.width = (int)cloud.points.size();
cloud.height = 1;
pcl::io::savePCDFileASCII("my_cloud.pcd", cloud);
std::cout << "nn" << "program complete" << "nn";
return (0);
}

// WriteCloudPtr.cpp
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
int main(void)
{
std::cout << "nn" << "starting program" << "nn";
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);      // !!! with ::Ptr !!!
int numPoints = 20;
for (int i = 0; i < numPoints; i++)
{
pcl::PointXYZ point;
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points.push_back(point);
}
// for simplicity, use an "unorganized" cloud, "width" = num points, "height" = 1
cloud->width = (int)cloud->points.size();
cloud->height = 1;
pcl::io::savePCDFileASCII("my_cloud.pcd", *cloud);
std::cout << "nn" << "program complete" << "nn";
return (0);
}

对于应该使用哪个有经验法则吗? 更具体地说,以下是我的一些问题:

-在所有 PCL GitHub 示例中 https://github.com/PointCloudLibrary/pcl/tree/master/examples 程序都使用::Ptr,而在网站上,大多数(但不是全部(示例都使用::Ptr。 此外,在大多数情况下,我发现不使用::Ptr的示例似乎很旧。 基于此,我的印象是::Ptr通常被认为是当前的PCL标准,这是正确的吗?

-非::Ptr方式似乎更简单,非::Ptr方式有什么不明显的缺点吗? 在有人说"将这些传递给函数会制作云的副本,因此效率低下"之前,我会通过引用传递,以免不必要地制作副本。

-显然::Ptrboost::shared_ptr的typedef(本质上是重命名(。 尽管如此,在不必要的情况下使用指针还是让我感到不舒服,因为在奇怪的情况下可能会发生有趣的事情。 例如,这篇文章的公认答案 从 pcl::P ointCloud 创建一个 pcl::P ointCloud::P tr 提到了一种奇怪的转换情况,这似乎可能导致崩溃。 在某些情况下,使用::Ptr方式是否存在 PCL 用户应注意的风险?

恕我直言,将PointCloud的函数参数定义为PointCloud::Ptr是 PCL 中的一个设计缺陷,因为这些函数不关心对象是在堆栈上还是在堆上分配的,也不利用所有权。

对于您的问题,当您知道对象会变得非常大时,将对象声明为指针,否则坚持使用非指针版本。

最新更新