Библиотека облаков точек (PCL) - практическое правило для случая, когда :: Ptr следует использовать при объявлении облака точек? - PullRequest
0 голосов
/ 23 сентября 2019

Когда я попадаю в библиотеку облаков точек (PCL), я сталкиваюсь с некоторой путаницей в отношении того, когда объявлять облака точек с ::Ptr стихами без этого.

Кажется, что это работает в любом случае, напримеробе эти программы компилируют, запускают и производят ожидаемые результаты (записывая в файл случайное облако из 20 точек):

// WriteCloud.cpp

#include <iostream>

#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>

int main(void)
{
  std::cout << "\n\n" << "starting program" << "\n\n";

  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 << "\n\n" << "program complete" << "\n\n";

  return (0);
}

и

// WriteCloudPtr.cpp

#include <iostream>

#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>

int main(void)
{
  std::cout << "\n\n" << "starting program" << "\n\n";

  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 << "\n\n" << "program complete" << "\n\n";

  return (0);
}

Существует ли эмпирическое правило какдля чего следует использовать?Более конкретно, вот несколько вопросов, которые у меня есть:

-Во всех примерах PCL GitHub https://github.com/PointCloudLibrary/pcl/tree/master/examples программы используют ::Ptr, и на веб-сайте большинство (но не все) примеровиспользуйте ::Ptr.Кроме того, по большей части примеры, которые я нашел без использования ::Ptr, кажутся очень старыми.Исходя из всего этого, у меня сложилось впечатление, что ::Ptr обычно считается текущим стандартом PCL, верно ли это?

- Способ не ::Ptr кажется более простым, есть ли недостатокне-1021 * способ, который не очевиден?Прежде чем кто-то скажет, что «передача их в функцию создаст копию облака и, следовательно, будет неэффективной», я хотел бы перейти по ссылке, чтобы не делать копий без необходимости.

-Clearly ::Ptr является typedef (по существупереименование) boost::shared_ptr.Тем не менее, мне неудобно использовать указатели, когда в этом нет необходимости, поскольку в странных ситуациях могут происходить забавные вещи.Например, в принятом ответе на этот пост Создание pcl :: PointCloud :: Ptr из pcl :: PointCloud упоминается странная ситуация преобразования, которая может вызвать сбой.Существуют ли риски, связанные с использованием способа ::Ptr в определенных ситуациях, о которых должны знать пользователи PCL?

1 Ответ

1 голос
/ 23 сентября 2019

ИМХО, это недостаток дизайна в PCL, определяющий аргументы функции для PointCloud как PointCloud::Ptr, так как функциям не важно, размещен ли объект в стеке или в куче, и при этом они не используютдомовладения.

На ваш вопрос, объявите ваши объекты как указатели, когда вы знаете, что ваш объект станет очень большим, в противном случае придерживайтесь версии без указателя.

...