From 7a3ea8f2163ac0d3c3fd3a7dfdaeb84d46805219 Mon Sep 17 00:00:00 2001 From: jmackay2 Date: Wed, 9 Jul 2025 23:06:41 -0400 Subject: [PATCH 1/2] Fix SampleConsensusModel constructor to not use a virtual function --- .../include/pcl/sample_consensus/sac_model.h | 47 +++++++------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/sample_consensus/include/pcl/sample_consensus/sac_model.h b/sample_consensus/include/pcl/sample_consensus/sac_model.h index 39f066a7254..3a9bcb6ef0d 100644 --- a/sample_consensus/include/pcl/sample_consensus/sac_model.h +++ b/sample_consensus/include/pcl/sample_consensus/sac_model.h @@ -101,41 +101,14 @@ namespace pcl } public: - /** \brief Constructor for base SampleConsensusModel. - * \param[in] cloud the input point cloud dataset - * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false) - */ - SampleConsensusModel (const PointCloudConstPtr &cloud, bool random = false) - : input_ () - , radius_min_ (-std::numeric_limits::max ()) - , radius_max_ (std::numeric_limits::max ()) - , samples_radius_ (0.) - , samples_radius_search_ () - , rng_dist_ (new boost::uniform_int<> (0, std::numeric_limits::max ())) - , custom_model_constraints_ ([](auto){return true;}) - { - if (random) - rng_alg_.seed (std::random_device()()); - else - rng_alg_.seed (12345u); - - // Sets the input cloud and creates a vector of "fake" indices - setInputCloud (cloud); - - // Create a random number generator object - rng_gen_.reset (new boost::variate_generator > (rng_alg_, *rng_dist_)); - } - /** \brief Constructor for base SampleConsensusModel. * \param[in] cloud the input point cloud dataset * \param[in] indices a vector of point indices to be used from \a cloud * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false) */ - SampleConsensusModel (const PointCloudConstPtr &cloud, - const Indices &indices, - bool random = false) + SampleConsensusModel (const PointCloudConstPtr &cloud, const Indices &indices = Indices(), const bool random = false) : input_ (cloud) - , indices_ (new Indices (indices)) + , indices_(new Indices(indices)) , radius_min_ (-std::numeric_limits::max ()) , radius_max_ (std::numeric_limits::max ()) , samples_radius_ (0.) @@ -148,6 +121,13 @@ namespace pcl else rng_alg_.seed (12345u); + // If no indices are provided, use all points + if (indices_->empty()) + { + indices_->resize(cloud->size()); + std::iota(indices_->begin(), indices_->end(), 0); + } + if (indices_->size () > input_->size ()) { PCL_ERROR("[pcl::SampleConsensusModel] Invalid index vector given with size " @@ -160,7 +140,14 @@ namespace pcl // Create a random number generator object rng_gen_.reset (new boost::variate_generator > (rng_alg_, *rng_dist_)); - }; + } + + /** \brief Constructor for base SampleConsensusModel. + * \param[in] cloud the input point cloud dataset + * \param[in] random if true set the random seed to the current time, else set to 12345 (default: false) + */ + SampleConsensusModel (const PointCloudConstPtr &cloud, const bool random = false) + : SampleConsensusModel(cloud, Indices(), random) {}; /** \brief Destructor for base SampleConsensusModel. */ virtual ~SampleConsensusModel () = default; From c95a001fcea35db2402a0abc0e1da8ba5534f73f Mon Sep 17 00:00:00 2001 From: jmackay2 Date: Thu, 10 Jul 2025 00:43:30 -0400 Subject: [PATCH 2/2] add numeric for iota --- sample_consensus/include/pcl/sample_consensus/sac_model.h | 1 + 1 file changed, 1 insertion(+) diff --git a/sample_consensus/include/pcl/sample_consensus/sac_model.h b/sample_consensus/include/pcl/sample_consensus/sac_model.h index 3a9bcb6ef0d..dada7ae0d07 100644 --- a/sample_consensus/include/pcl/sample_consensus/sac_model.h +++ b/sample_consensus/include/pcl/sample_consensus/sac_model.h @@ -48,6 +48,7 @@ #include // for uniform_int #include // for variate_generator #include +#include #include #include